From: Davide Italiano Date: Thu, 15 Sep 2016 17:54:22 +0000 (+0000) Subject: [IRObjectFile] Handle undefined weak symbols in RecordStreamer. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8471051cc5f5bd249a33813713529050a15d45a5;p=llvm [IRObjectFile] Handle undefined weak symbols in RecordStreamer. Differential Revision: https://reviews.llvm.org/D24594 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281629 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Object/IRObjectFile.cpp b/lib/Object/IRObjectFile.cpp index f86576f3d69..d4eac8cfd43 100644 --- a/lib/Object/IRObjectFile.cpp +++ b/lib/Object/IRObjectFile.cpp @@ -113,10 +113,13 @@ void IRObjectFile::CollectAsmUndefinedRefs( Res |= BasicSymbolRef::SF_Undefined; Res |= BasicSymbolRef::SF_Global; break; - case RecordStreamer::GlobalWeak: + case RecordStreamer::DefinedWeak: Res |= BasicSymbolRef::SF_Weak; Res |= BasicSymbolRef::SF_Global; break; + case RecordStreamer::UndefinedWeak: + Res |= BasicSymbolRef::SF_Weak; + Res |= BasicSymbolRef::SF_Undefined; } AsmUndefinedRefs(Key, BasicSymbolRef::Flags(Res)); } diff --git a/lib/Object/RecordStreamer.cpp b/lib/Object/RecordStreamer.cpp index cd3964ad391..572b960bc85 100644 --- a/lib/Object/RecordStreamer.cpp +++ b/lib/Object/RecordStreamer.cpp @@ -23,8 +23,10 @@ void RecordStreamer::markDefined(const MCSymbol &Symbol) { case Used: S = Defined; break; - case GlobalWeak: + case DefinedWeak: break; + case UndefinedWeak: + S = DefinedWeak; } } @@ -34,15 +36,16 @@ void RecordStreamer::markGlobal(const MCSymbol &Symbol, switch (S) { case DefinedGlobal: case Defined: - S = (Attribute == MCSA_Weak) ? GlobalWeak : DefinedGlobal; + S = (Attribute == MCSA_Weak) ? DefinedWeak : DefinedGlobal; break; case NeverSeen: case Global: case Used: - S = (Attribute == MCSA_Weak) ? GlobalWeak : Global; + S = (Attribute == MCSA_Weak) ? UndefinedWeak : Global; break; - case GlobalWeak: + case UndefinedWeak: + case DefinedWeak: break; } } @@ -53,7 +56,8 @@ void RecordStreamer::markUsed(const MCSymbol &Symbol) { case DefinedGlobal: case Defined: case Global: - case GlobalWeak: + case DefinedWeak: + case UndefinedWeak: break; case NeverSeen: diff --git a/lib/Object/RecordStreamer.h b/lib/Object/RecordStreamer.h index 71337a60591..617d8a43fbd 100644 --- a/lib/Object/RecordStreamer.h +++ b/lib/Object/RecordStreamer.h @@ -15,7 +15,8 @@ namespace llvm { class RecordStreamer : public MCStreamer { public: - enum State { NeverSeen, Global, GlobalWeak, Defined, DefinedGlobal, Used }; + enum State { NeverSeen, Global, Defined, DefinedGlobal, DefinedWeak, Used, + UndefinedWeak}; private: StringMap Symbols; diff --git a/test/Object/X86/nm-bitcodeweak.test b/test/Object/X86/nm-bitcodeweak.test index 3333068bb36..2af09e58988 100644 --- a/test/Object/X86/nm-bitcodeweak.test +++ b/test/Object/X86/nm-bitcodeweak.test @@ -1,6 +1,7 @@ ; RUN: llvm-as %s -o=%t1 ; RUN: llvm-nm %t1 | FileCheck %s +; Check that __libc_blah is reported as defined weak. ; CHECK: W __libc_blah target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" @@ -8,3 +9,5 @@ target triple = "x86_64-unknown-freebsd11.0" module asm ".weak __libc_blah" module asm ".equ __libc_blah, blah" +module asm ".globl blah" +module asm "blah: ret" diff --git a/test/Object/X86/nm-undefinedweak.test b/test/Object/X86/nm-undefinedweak.test new file mode 100644 index 00000000000..d09434629b7 --- /dev/null +++ b/test/Object/X86/nm-undefinedweak.test @@ -0,0 +1,10 @@ +; RUN: llvm-as %s -o=%t1 +; RUN: llvm-nm %t1 | FileCheck %s + +; Check that patatino is reported as undefined weak. +; CHECK: w patatino + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-freebsd11.0" + +module asm ".weak patatino"