[lld] r267639 - ELF: Re-implement -u directly and remove CanKeepUndefined flag.
Rafael EspĂndola via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 27 06:41:32 PDT 2016
This is awesome. Thank you so much!
On 26 April 2016 at 20:05, Peter Collingbourne via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: pcc
> Date: Tue Apr 26 19:05:03 2016
> New Revision: 267639
>
> URL: http://llvm.org/viewvc/llvm-project?rev=267639&view=rev
> Log:
> ELF: Re-implement -u directly and remove CanKeepUndefined flag.
>
> The semantics of the -u flag are to load the lazy symbol named by the flag. We
> were previously relying on this behavior falling out of symbol resolution
> against a synthetic undefined symbol, but that didn't quite give us the
> correct behavior, so we needed a flag to mark symbols created with -u so
> we could treat them specially in the writer. However, it's simpler and less
> error prone to implement the required behavior directly and remove the flag.
>
> This fixes an issue where symbols loaded with -u would receive hidden
> visibility even when the definition in an object file had wider visibility.
>
> Differential Revision: http://reviews.llvm.org/D19560
>
> Modified:
> lld/trunk/ELF/Driver.cpp
> lld/trunk/ELF/SymbolTable.cpp
> lld/trunk/ELF/SymbolTable.h
> lld/trunk/ELF/Symbols.cpp
> lld/trunk/ELF/Symbols.h
> lld/trunk/ELF/Writer.cpp
> lld/trunk/test/ELF/undefined-opt.s
>
> Modified: lld/trunk/ELF/Driver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=267639&r1=267638&r2=267639&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Driver.cpp (original)
> +++ lld/trunk/ELF/Driver.cpp Tue Apr 26 19:05:03 2016
> @@ -483,9 +483,7 @@ template <class ELFT> void LinkerDriver:
> if (HasError)
> return; // There were duplicate symbols or incompatible files
>
> - for (StringRef S : Config->Undefined)
> - Symtab.addUndefinedOpt(S);
> -
> + Symtab.scanUndefinedFlags();
> Symtab.scanShlibUndefined();
> Symtab.scanDynamicList();
> Symtab.scanVersionScript();
>
> Modified: lld/trunk/ELF/SymbolTable.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=267639&r1=267638&r2=267639&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.cpp (original)
> +++ lld/trunk/ELF/SymbolTable.cpp Tue Apr 26 19:05:03 2016
> @@ -151,17 +151,7 @@ template <class ELFT> void SymbolTable<E
> template <class ELFT>
> SymbolBody *SymbolTable<ELFT>::addUndefined(StringRef Name) {
> auto *Sym = new (Alloc)
> - UndefinedElf<ELFT>(Name, STB_GLOBAL, STV_DEFAULT, /*Type*/ 0, false);
> - resolve(Sym);
> - return Sym;
> -}
> -
> -// Add an undefined symbol. Unlike addUndefined, that symbol
> -// doesn't have to be resolved, thus "opt" (optional).
> -template <class ELFT>
> -SymbolBody *SymbolTable<ELFT>::addUndefinedOpt(StringRef Name) {
> - auto *Sym = new (Alloc)
> - UndefinedElf<ELFT>(Name, STB_GLOBAL, STV_HIDDEN, /*Type*/ 0, true);
> + UndefinedElf<ELFT>(Name, STB_GLOBAL, STV_DEFAULT, /*Type*/ 0);
> resolve(Sym);
> return Sym;
> }
> @@ -368,6 +358,16 @@ void SymbolTable<ELFT>::addMemberFile(Sy
> addFile(std::move(File));
> }
>
> +// Process undefined (-u) flags by loading lazy symbols named by those flags.
> +template <class ELFT>
> +void SymbolTable<ELFT>::scanUndefinedFlags() {
> + for (StringRef S : Config->Undefined)
> + if (SymbolBody *Sym = find(S))
> + if (auto *L = dyn_cast<Lazy>(Sym))
> + if (std::unique_ptr<InputFile> File = L->getFile())
> + addFile(std::move(File));
> +}
> +
> // This function takes care of the case in which shared libraries depend on
> // the user program (not the other way, which is usual). Shared libraries
> // may have undefined symbols, expecting that the user program provides
>
> Modified: lld/trunk/ELF/SymbolTable.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=267639&r1=267638&r2=267639&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.h (original)
> +++ lld/trunk/ELF/SymbolTable.h Tue Apr 26 19:05:03 2016
> @@ -59,6 +59,7 @@ public:
> DefinedRegular<ELFT> *addIgnored(StringRef Name,
> uint8_t Visibility = llvm::ELF::STV_HIDDEN);
>
> + void scanUndefinedFlags();
> void scanShlibUndefined();
> void scanDynamicList();
> void scanVersionScript();
>
> Modified: lld/trunk/ELF/Symbols.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=267639&r1=267638&r2=267639&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.cpp (original)
> +++ lld/trunk/ELF/Symbols.cpp Tue Apr 26 19:05:03 2016
> @@ -104,7 +104,6 @@ SymbolBody::SymbolBody(Kind K, StringRef
> }
>
> void SymbolBody::init() {
> - CanKeepUndefined = false;
> NeedsCopyOrPltAddr = false;
> CanOmitFromDynSym = false;
> }
> @@ -245,11 +244,8 @@ UndefinedElf<ELFT>::UndefinedElf(StringR
>
> template <typename ELFT>
> UndefinedElf<ELFT>::UndefinedElf(StringRef Name, uint8_t Binding,
> - uint8_t StOther, uint8_t Type,
> - bool CanKeepUndefined)
> - : SymbolBody(SymbolBody::UndefinedElfKind, Name, Binding, StOther, Type) {
> - this->CanKeepUndefined = CanKeepUndefined;
> -}
> + uint8_t StOther, uint8_t Type)
> + : SymbolBody(SymbolBody::UndefinedElfKind, Name, Binding, StOther, Type) {}
>
> template <typename ELFT>
> UndefinedElf<ELFT>::UndefinedElf(const Elf_Sym &Sym)
>
> Modified: lld/trunk/ELF/Symbols.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=267639&r1=267638&r2=267639&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.h (original)
> +++ lld/trunk/ELF/Symbols.h Tue Apr 26 19:05:03 2016
> @@ -177,8 +177,6 @@ public:
> // symbol or if the symbol should point to its plt entry.
> unsigned NeedsCopyOrPltAddr : 1;
>
> - unsigned CanKeepUndefined : 1;
> -
> // The following fields have the same meaning as the ELF symbol attributes.
> uint8_t Type; // symbol type
> uint8_t Binding; // symbol binding
> @@ -325,10 +323,7 @@ template <class ELFT> class UndefinedElf
> public:
> UndefinedElf(StringRef N, const Elf_Sym &Sym);
> UndefinedElf(const Elf_Sym &Sym);
> - UndefinedElf(StringRef Name, uint8_t Binding, uint8_t StOther, uint8_t Type,
> - bool CanKeepUndefined);
> -
> - bool canKeepUndefined() const { return CanKeepUndefined; }
> + UndefinedElf(StringRef Name, uint8_t Binding, uint8_t StOther, uint8_t Type);
>
> uintX_t Size;
>
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=267639&r1=267638&r2=267639&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Tue Apr 26 19:05:03 2016
> @@ -1339,11 +1339,8 @@ template <class ELFT> void Writer<ELFT>:
> if (auto *SS = dyn_cast<SharedSymbol<ELFT>>(Body))
> SS->File->IsUsed = true;
>
> - if (Body->isUndefined() && !S->isWeak()) {
> - auto *U = dyn_cast<UndefinedElf<ELFT>>(Body);
> - if (!U || !U->canKeepUndefined())
> - reportUndefined<ELFT>(Symtab, Body);
> - }
> + if (Body->isUndefined() && !S->isWeak())
> + reportUndefined<ELFT>(Symtab, Body);
>
> if (auto *C = dyn_cast<DefinedCommon>(Body))
> CommonSymbols.push_back(C);
>
> Modified: lld/trunk/test/ELF/undefined-opt.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/undefined-opt.s?rev=267639&r1=267638&r2=267639&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/undefined-opt.s (original)
> +++ lld/trunk/test/ELF/undefined-opt.s Tue Apr 26 19:05:03 2016
> @@ -51,5 +51,16 @@
> # UNK-UNDEFINED-SO-NOT: Name: unknown
> # UNK-UNDEFINED-SO: ]
>
> +# Added undefined symbols should appear in the dynamic table if necessary.
> +# RUN: ld.lld -shared -o %t5 %t.o -u export
> +# RUN: llvm-readobj --dyn-symbols %t5 | \
> +# RUN: FileCheck --check-prefix=EXPORT-SO %s
> +# EXPORT-SO: DynamicSymbols [
> +# EXPORT-SO: Name: export
> +# EXPORT-SO: ]
> +
> .globl _start;
> _start:
> +
> +.globl export
> +export:
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list