[PATCH 1/2] ld: Add --pdb option

Martin Storsjö martin@martin.st
Mon Oct 10 10:27:31 GMT 2022


On Mon, 10 Oct 2022, Mark Harmstone wrote:

> On 7/10/22 13:16, Martin Storsjö wrote:
>> On Mon, 3 Oct 2022, Martin Storsjö wrote:
>> 
>>> On Mon, 3 Oct 2022, Mark Harmstone wrote:
>>> 
>>>> Hi Martin,
>>>> 
>>>>> As I assume you're aware, lld's mingw port also supports PDB generation 
>>>>> - and the description of this option also sounds like it's chosen to 
>>>>> match lld's option for outputting PDB files - that's good!
>>>> 
>>>> Yes, that's right. One notable difference is that the parameter here is 
>>>> optional, unlike with lld, making it a lot easier to fit this into e.g. 
>>>> CMake toolchain files or LDFLAGS.
>>> 
>>> LLD also has got that behaviour, since 
>>> https://github.com/llvm/llvm-project/commit/2c52ddf31f5421c5373923535b958b84c79772e3 
>>> in 2019. That's in particular why I wanted to make sure that this case 
>>> works the same in binutils too.
>>> 
>>>> It looks like the equals sign is mandatory when providing optional 
>>>> parameters, otherwise it interprets the filename as another parameter.
>>> 
>>> Yep, that's the case in LLD too.
>>> 
>>> Unfortunately I didn't think of this behaviour initially when I first 
>>> added this option - otherwise we could have had e.g. --pdb as a boolean 
>>> option to just output to the default name, and e.g. --output-pdb=<name> if 
>>> you wanted to specify the name. But oh well, "-pdb=" works, and I guess it 
>>> isn't the worst thing in the world.
>>> 
>>>> But it does mean that the form "-pdb=out.pdb" will work on both ld and 
>>>> lld, which I think is the most important thing.
>>> 
>>> TBH, I consider the "-pdb=" case equally important too - that's what most 
>>> people would use in the end.
>> 
>> FWIW, I'm actually a bit concerned about the interop between binutils and 
>> lld here. I don't want interop between binutils and lld to work only for 
>> some subset of the used parameter forms, I'd like it to work for all 
>> commonly used forms.
>> 
>> 
>> First off, the (slightly awkward) syntax that lld uses for an optional 
>> empty output name, "-pdb=" really should be handled by binutils too - 
>> handling that doesn't conflict with anything else and should be simple to 
>> support.
>> 
>> This is the format of the option that I've been recommending people to use, 
>> and this has been in use in third party projects for years already - e.g. 
>> this: 
>> https://code.videolan.org/videolan/vlc/-/blob/master/configure.ac#L429
>> 
>> This should be trivial to support in your patch:
>> 
>> diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
>> index 11216830dd3..538fdf5054b 100644
>> --- a/ld/emultempl/pep.em
>> +++ b/ld/emultempl/pep.em
>> @@ -926,7 +926,7 @@ gld${EMULATION_NAME}_handle_option (int optc)
>>        if (emit_build_id == NULL)
>>         emit_build_id = xstrdup (DEFAULT_BUILD_ID_STYLE);
>>        pdb = 1;
>> -      if (optarg)
>> +      if (optarg && optarg[0])
>>         pdb_name = xstrdup (optarg);
>>        break;
>>      }
>> 
>> (And the same for pe.em.)
>> 
>> 
>> Secondly, for explicitly naming an output file, I've documented to end 
>> users that they can use either -Wl,-pdb=<filename> or -Wl,-pdb,<filename> - 
>> see 
>> https://github.com/mstorsjo/llvm-mingw/blob/master/README.md?plain=1#L175.
>> 
>> In the original implementation in the mingw frontend in lld in 2018, the 
>> "-pdb <output>" format was the only format for the option: 
>> https://github.com/llvm/llvm-project/commit/b7d50115ba4900da6db7afb6460ad42ff19ba6a2
>> 
>> Only one year later with the implicit output name, the "-pdb=<output>" and 
>> "-pdb=" form was added: 
>> https://github.com/llvm/llvm-project/commit/2c52ddf31f5421c5373923535b958b84c79772e3
>> 
>> In one of my test scripts, I use the initial form of the option, 
>> -Wl,-pdb,<filename>:
>> https://github.com/mstorsjo/llvm-mingw/blob/master/run-tests.sh#L234
>> 
>> It seems like Wine has picked up on the -Wl,-pdb,<name> form:
>> https://gitlab.winehq.org/wine/wine/-/blob/wine-7.18/tools/winegcc/winegcc.c#L467
>> 
>> Also here are a couple of other cases I found that all seem to use that 
>> form:
>> https://youtrack.jetbrains.com/issue/KT-47175/How-to-generate-kotlin-native-debug-info-filesPDB-on-windows-platform
>> https://git.kernel.dk/?p=fio.git;a=commitdiff;h=76bc30ca118fda404f19c17d97bafdba9779c4c2
>> 
>> So with all these users, I'd be kinda hesitant to change lld's 
>> interpretation of this option form, and to have binutils ld in parallel 
>> interpreting that form differently. What do you think?
>> 
>> 
>> // Martin
> Hi Martin,
>
> Fair enough - I'm not overly wedded to this, and will change it if, as you 
> say, it'll cause issues elsewhere.

Ok, great, thanks!

However this patchset also lost the ability to get an automatically chosen 
output file name, which currently is used via the slightly awkward syntax 
"--pdb=" without an empty parameter.

I see you refactored a bit of code in this revision of the patch, which 
lost that ability. With the patch I'm attaching, applied on top of v1 of 
your patch, I think it behaves as a reasonable compromise; getopt's 
required_argument does allow the --pdb=<name> form too (which I think is 
the one we still should recommend going forward), and passing "--pdb=" 
allows implying the automatic naming behaviour.

// Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-squash-ld-pdb-Switch-the-pdb-option-to-required_argu.patch
Type: text/x-diff
Size: 3629 bytes
Desc: 
URL: <https://sourceware.org/pipermail/binutils/attachments/20221010/e751b4af/attachment.bin>


More information about the Binutils mailing list