[LLVMdev] [lld] Undefined symbols postprocessing
Nick Kledzik
kledzik at apple.com
Mon Feb 23 19:44:08 PST 2015
On Feb 23, 2015, at 2:52 PM, Michael Spencer <bigcheesegs at gmail.com> wrote:
> On Thu, Feb 19, 2015 at 10:40 PM, Denis Protivensky
> <dprotivensky at accesssoftek.com> wrote:
>> Shankar,
>>
>> Okay, I guessed the correct interface.
>> But what about the moment at which the function is called?
>> If it's called from Resolver::resolve(), it doesn't make any difference to
>> me as I cannot determine the need of specific symbols at that time.
>>
>> - Denis.
>
> None of the symbols we are looking up require the full resolver, and
> they are all special linker symbols. I propose two things.
>
> 1. Provide a hook as per what Shankar suggested for the resolver. User
> references to linker defined symbols such as _GLOBAL_OFFSET_TABLE_ get
> created and possibly deadstripped here. The linking context owns the
> atom.
> 2. The ELFLinkingContext gains <Atom
> *getOrCreateLinkerDefinedAtom(StringRef);>. This can be used in passes
> to get the symbols. The hook in (1) would call this to create the
> atoms.
>
> This gives a single place where linker defined atoms are actually
> created, and allows correct deadstripping and object file references
> without doing multiple resolver passes.
As Rui showed, we already have this abstraction. The linking context just adds a magic ArchiveFile. When queried for any “linker defined symbol”, the magic ArchiveFile instantiates the atoms needed.
This is how mach-o handles linker defined symbols like __dso_handle.
-Nick
>
>>
>>
>> On 02/19/2015 08:15 PM, Shankar Easwaran wrote:
>>
>> + Nick
>>
>> On 2/19/2015 9:00 AM, Shankar Easwaran wrote:
>>> On 2/19/2015 3:58 AM, Denis Protivensky wrote:
>>>> Joerg:
>>>>> I propose to add the ability to ignore undefined symbols during initial
>>>>> resolution, and then postprocess only those undefines for the second
>>>>> time
>>>>> after the pass manager execution.
>>>> Do you want to do that before or after dead code elimination?
>>>> I think dead code elimination should be performed after all possible
>>>> object code modifications done by lld. Therefore, it should be done
>>>> after undefines' postprocessing as well.
>>> Gnu does dead code elimination before undefines are reported. So if a
>>> function is not called and it has a undefined reference its would not
>>> be an undef.
>>>>
>>>> Shankar:
>>>>> I propose to add the ability to ignore undefined symbols during initial
>>>>> resolution, and then postprocess only those undefines for the second
>>>>> time
>>>>> after the pass manager execution.
>>>> I came across this same problem, and was planning on adding a
>>>> notifyUndefinedSymbol to the LinkingContext, if the linker wants to add
>>>> a defined symbol and coalesce it, it would be possible.
>>>>
>>>> Do you think this will work for your case too ?
>>>> With this option, I don't see:
>>>> - how to postpone processing and reaction on undefines. If the
>>>> callback is called from within Resolver::resolve(), you should react
>>>> on it immediately, because otherwise the code will still fail in
>>>> Resolver::resolve().
>>>> - how to know if a symbol is needed within the callback body. The
>>>> need of any symbol is determined in some other place. So I need to
>>>> keep a sort of indication (boolean flags, whatever) to know which
>>>> symbols are really needed.
>>>> - the exact interface of notifyUndefinedSymbol callback. If it
>>>> receives `StringRef` name of the undefined symbol, what reaction
>>>> should be? Should it return new symbols to add back to the caller as
>>>> `const Atom*`?
>>> notifyUndefinedSymbol will allow the context to coalesce the undefined
>>> atom with a defined atom.
>>>
>>> Atom *notifyUndefinedSymbol(StringRef name) could be the interface.
>>>
>>>> Thanks,
>>>> Denis.
>>>>
>>>
>>>
>>
>>
>> --
>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by
>> the Linux Foundation
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list