diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 32523173ee6..f0f7836e23b 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -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, diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index b880f331550..12584411509 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -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())); } diff --git a/test/MC/COFF/alias.s b/test/MC/COFF/alias.s index 98ef7e5f190..f6f6d46bf6a 100644 --- a/test/MC/COFF/alias.s +++ b/test/MC/COFF/alias.s @@ -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: } diff --git a/test/MC/COFF/feat00.s b/test/MC/COFF/feat00.s index b8862de1983..d08f407cef5 100644 --- a/test/MC/COFF/feat00.s +++ b/test/MC/COFF/feat00.s @@ -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 index 00000000000..f5020c83ef6 --- /dev/null +++ b/test/MC/COFF/lset0.s @@ -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