]> granicus.if.org Git - llvm/commitdiff
[IRObjectFile] Propagate .weak attribute correctly for ASM symbols.
authorDavide Italiano <davide@freebsd.org>
Wed, 22 Jun 2016 20:48:15 +0000 (20:48 +0000)
committerDavide Italiano <davide@freebsd.org>
Wed, 22 Jun 2016 20:48:15 +0000 (20:48 +0000)
PR: 28256
Differential Revision:  http://reviews.llvm.org/D21616

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273474 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Object/IRObjectFile.cpp
lib/Object/RecordStreamer.cpp
lib/Object/RecordStreamer.h
test/Object/X86/nm-bitcodeweak.test

index 5c943be459bf57f6b19116400771b2b0fddc2730..fdc53e01e36ca31935982f46cf49289bbdb39d29 100644 (file)
@@ -116,6 +116,9 @@ void IRObjectFile::CollectAsmUndefinedRefs(
       Res |= BasicSymbolRef::SF_Undefined;
       Res |= BasicSymbolRef::SF_Global;
       break;
+    case RecordStreamer::GlobalWeak:
+      Res |= BasicSymbolRef::SF_Weak;
+      Res |= BasicSymbolRef::SF_Global;
     }
     AsmUndefinedRefs(Key, BasicSymbolRef::Flags(Res));
   }
index 74d57dee2da19c4f41bdf483181d4e605c755223..f03bd5e5fb9f43365e303b08a1237c7e393b43ec 100644 (file)
@@ -23,21 +23,26 @@ void RecordStreamer::markDefined(const MCSymbol &Symbol) {
   case Used:
     S = Defined;
     break;
+  case GlobalWeak:
+    break;
   }
 }
 
-void RecordStreamer::markGlobal(const MCSymbol &Symbol) {
+void RecordStreamer::markGlobal(const MCSymbol &Symbol,
+                                MCSymbolAttr Attribute) {
   State &S = Symbols[Symbol.getName()];
   switch (S) {
   case DefinedGlobal:
   case Defined:
-    S = DefinedGlobal;
+    S = (Attribute == MCSA_Weak) ? GlobalWeak : DefinedGlobal;
     break;
 
   case NeverSeen:
   case Global:
   case Used:
-    S = Global;
+    S = (Attribute == MCSA_Weak) ? GlobalWeak : Global;
+    break;
+  case GlobalWeak:
     break;
   }
 }
@@ -48,6 +53,7 @@ void RecordStreamer::markUsed(const MCSymbol &Symbol) {
   case DefinedGlobal:
   case Defined:
   case Global:
+  case GlobalWeak:
     break;
 
   case NeverSeen:
@@ -85,7 +91,7 @@ void RecordStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
 bool RecordStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
                                          MCSymbolAttr Attribute) {
   if (Attribute == MCSA_Global || Attribute == MCSA_Weak)
-    markGlobal(*Symbol);
+    markGlobal(*Symbol, Attribute);
   return true;
 }
 
index d8610610c332f764c511afc09bf9ea410e1ef104..71337a60591bda5b6266594dc290872f5785e0c9 100644 (file)
 namespace llvm {
 class RecordStreamer : public MCStreamer {
 public:
-  enum State { NeverSeen, Global, Defined, DefinedGlobal, Used };
+  enum State { NeverSeen, Global, GlobalWeak, Defined, DefinedGlobal, Used };
 
 private:
   StringMap<State> Symbols;
   void markDefined(const MCSymbol &Symbol);
-  void markGlobal(const MCSymbol &Symbol);
+  void markGlobal(const MCSymbol &Symbol, MCSymbolAttr Attribute);
   void markUsed(const MCSymbol &Symbol);
   void visitUsedSymbol(const MCSymbol &Sym) override;
 
index 19af95f1ae80c987b1ef0b198b67d893430dc03c..3333068bb36df7d183d22e62ff054be534af02b8 100644 (file)
@@ -1,7 +1,7 @@
 ; RUN: llvm-as %s -o=%t1
 ; RUN: llvm-nm %t1 | FileCheck %s
 
-; CHECK: T __libc_blah
+; CHECK: W __libc_blah
 
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-freebsd11.0"