Revert "COFF: Emit all MCSymbols rather than filtering out some of them"
authorReid Kleckner <reid@kleckner.net>
Mon, 18 Nov 2013 23:08:12 +0000 (23:08 +0000)
committerReid Kleckner <reid@kleckner.net>
Mon, 18 Nov 2013 23:08:12 +0000 (23:08 +0000)
This reverts commit r190888, to fix PR17967.  The original change wasn't
the right way to get @feat.00 into the object file.  The right fix is to
make @feat.00 be a global symbol.

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

lib/MC/WinCOFFObjectWriter.cpp
lib/Target/X86/X86AsmPrinter.cpp
test/MC/COFF/alias.s
test/MC/COFF/feat00.s
test/MC/COFF/lset0.s [new file with mode: 0755]

index 32523173ee6eb135380d1a20239de64b3f294880..f0f7836e23b3ec35af874b0e3f5be59357180c23 100644 (file)
@@ -154,6 +154,8 @@ public:
   void MakeSymbolReal(COFFSymbol &S, size_t Index);
   void MakeSectionReal(COFFSection &S, size_t Number);
 
+  bool ExportSymbol(MCSymbolData const &SymbolData, MCAssembler &Asm);
+
   bool IsPhysicalSection(COFFSection *S);
 
   // Entity writing methods.
@@ -503,6 +505,18 @@ void WinCOFFObjectWriter::MakeSymbolReal(COFFSymbol &S, size_t Index) {
   S.Index = Index;
 }
 
+bool WinCOFFObjectWriter::ExportSymbol(MCSymbolData const &SymbolData,
+                                       MCAssembler &Asm) {
+  // This doesn't seem to be right. Strings referred to from the .data section
+  // need symbols so they can be linked to code in the .text section right?
+
+  // return Asm.isSymbolLinkerVisible (&SymbolData);
+
+  // For now, all non-variable symbols are exported,
+  // the linker will sort the rest out for us.
+  return SymbolData.isExternal() || !SymbolData.getSymbol().isVariable();
+}
+
 bool WinCOFFObjectWriter::IsPhysicalSection(COFFSection *S) {
   return (S->Header.Characteristics
          & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) == 0;
@@ -605,8 +619,11 @@ void WinCOFFObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm,
 
   for (MCAssembler::const_symbol_iterator i = Asm.symbol_begin(),
                                           e = Asm.symbol_end();
-       i != e; i++)
-    DefineSymbol(*i, Asm, Layout);
+       i != e; i++) {
+    if (ExportSymbol(*i, Asm)) {
+      DefineSymbol(*i, Asm, Layout);
+    }
+  }
 }
 
 void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
index b880f331550d84e3e977d3af14f4fd68c758b608..12584411509daea8b21bd05bbed02ad7e38517ec 100644 (file)
@@ -535,6 +535,7 @@ void X86AsmPrinter::EmitStartOfAsmFile(Module &M) {
       // cause the process to terminate immediately.  LLVM does not know how to
       // register any SEH handlers, so its object files should be safe.
       S->setAbsolute();
+      OutStreamer.EmitSymbolAttribute(S, MCSA_Global);
       OutStreamer.EmitAssignment(
           S, MCConstantExpr::Create(int64_t(1), MMI->getContext()));
     }
index 98ef7e5f1901cac6c53b6dcee0c6f544105f54af..f6f6d46bf6a337132943c1f47d90d38691dd18e0 100644 (file)
@@ -45,15 +45,6 @@ weak_aliased_to_external = external2
 // CHECK-NEXT:     AuxSymbolCount: 0
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: external_aliased_to_local
-// CHECK-NEXT:     Value: 0
-// CHECK-NEXT:     Section: .text (1)
-// CHECK-NEXT:     BaseType: Null (0x0)
-// CHECK-NEXT:     ComplexType: Null (0x0)
-// CHECK-NEXT:     StorageClass: Static (0x3)
-// CHECK-NEXT:     AuxSymbolCount: 0
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
 // CHECK-NEXT:     Name: global_aliased_to_external
 // CHECK-NEXT:     Value: 0
 // CHECK-NEXT:     Section:  (0)
@@ -98,7 +89,7 @@ weak_aliased_to_external = external2
 // CHECK-NEXT:     StorageClass: WeakExternal (0x69)
 // CHECK-NEXT:     AuxSymbolCount: 1
 // CHECK-NEXT:     AuxWeakExternal {
-// CHECK-NEXT:       Linked: external2 (10)
+// CHECK-NEXT:       Linked: external2 (9)
 // CHECK-NEXT:       Search: Library (0x2)
 // CHECK-NEXT:       Unused: (00 00 00 00 00 00 00 00 00 00)
 // CHECK-NEXT:     }
index b8862de1983ec15d8114c1c9779cab3f9e980ab4..d08f407cef58ac27dce111cc3fd9540251e8e2ae 100644 (file)
@@ -1,6 +1,7 @@
 // RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s -o - | llvm-readobj -t | FileCheck %s
 
 "@feat.00" = 123
+.globl @feat.00
 
 // CHECK: Symbol {
 // CHECK:   Name: @feat.00
diff --git a/test/MC/COFF/lset0.s b/test/MC/COFF/lset0.s
new file mode 100755 (executable)
index 0000000..f5020c8
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s -o - | llvm-nm | FileCheck %s
+
+not_global = 123
+global = 456
+.globl global
+.Llocal = 789
+
+// CHECK-NOT: not_global
+// CHECK-NOT: Llocal
+// CHECK: global
+// CHECK-NOT: not_global
+// CHECK-NOT: Llocal