[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