summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-11-27 01:18:37 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-11-27 01:18:37 +0000
commit823c9c725d23f7c57e82b004ad8a011dd6dc6603 (patch)
treecd4d3a8bb7073f072e9fe6bc97b6ca18c9593754
parent72d1f9db27e3b5e20b65b95819acf842c3a11172 (diff)
downloadllvm-823c9c725d23f7c57e82b004ad8a011dd6dc6603.tar.gz
llvm-823c9c725d23f7c57e82b004ad8a011dd6dc6603.tar.bz2
llvm-823c9c725d23f7c57e82b004ad8a011dd6dc6603.tar.xz
Use simple section names for COMDAT sections on COFF.
With this patch we use simple names for COMDAT sections (like .text or .bss). This matches the MSVC behavior. When merging it is the COMDAT symbol that is used to decide if two sections should be merged, so there is no point in building a fancy name. This survived a bootstrap on mingw32. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195798 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/TargetLoweringObjectFileImpl.cpp38
-rw-r--r--lib/MC/MCSectionCOFF.cpp23
-rw-r--r--test/MC/COFF/tricky-names.ll6
-rw-r--r--test/MC/COFF/weak-symbol.ll18
4 files changed, 41 insertions, 44 deletions
diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index 59d7b57037..229ccfae28 100644
--- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -723,33 +723,31 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
Mangler *Mang, const TargetMachine &TM) const {
int Selection = 0;
unsigned Characteristics = getCOFFSectionFlags(Kind);
- SmallString<128> Name(GV->getSection().c_str());
+ StringRef Name = GV->getSection();
+ StringRef COMDATSymName = "";
if (GV->isWeakForLinker()) {
Selection = COFF::IMAGE_COMDAT_SELECT_ANY;
Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
- Name.append("$");
- Mang->getNameWithPrefix(Name, GV, false, false);
+ MCSymbol *Sym = getSymbol(*Mang, GV);
+ COMDATSymName = Sym->getName();
}
return getContext().getCOFFSection(Name,
Characteristics,
Kind,
- "",
+ COMDATSymName,
Selection);
}
-static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
+static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) {
if (Kind.isText())
- return ".text$";
+ return ".text";
if (Kind.isBSS ())
- return ".bss$";
- if (Kind.isThreadLocal()) {
- // 'LLVM' is just an arbitary string to ensure that the section name gets
- // sorted in between '.tls$AAA' and '.tls$ZZZ' by the linker.
- return ".tls$LLVM";
- }
+ return ".bss";
+ if (Kind.isThreadLocal())
+ return ".tls";
if (Kind.isWriteable())
- return ".data$";
- return ".rdata$";
+ return ".data";
+ return ".rdata";
}
@@ -760,16 +758,14 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
// If this global is linkonce/weak and the target handles this by emitting it
// into a 'uniqued' section name, create and return the section now.
if (GV->isWeakForLinker()) {
- const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
- SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
- Mang->getNameWithPrefix(Name, GV, false, false);
-
+ const char *Name = getCOFFSectionNameForUniqueGlobal(Kind);
unsigned Characteristics = getCOFFSectionFlags(Kind);
Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
-
- return getContext().getCOFFSection(Name.str(), Characteristics,
- Kind, "", COFF::IMAGE_COMDAT_SELECT_ANY);
+ MCSymbol *Sym = getSymbol(*Mang, GV);
+ return getContext().getCOFFSection(Name, Characteristics,
+ Kind, Sym->getName(),
+ COFF::IMAGE_COMDAT_SELECT_ANY);
}
if (Kind.isText())
diff --git a/lib/MC/MCSectionCOFF.cpp b/lib/MC/MCSectionCOFF.cpp
index 64aa2c5c49..bb35027464 100644
--- a/lib/MC/MCSectionCOFF.cpp
+++ b/lib/MC/MCSectionCOFF.cpp
@@ -20,6 +20,8 @@ MCSectionCOFF::~MCSectionCOFF() {} // anchor.
// should be printed before the section name
bool MCSectionCOFF::ShouldOmitSectionDirective(StringRef Name,
const MCAsmInfo &MAI) const {
+ if (COMDATSymbol)
+ return false;
// FIXME: Does .section .bss/.data/.text work everywhere??
if (Name == ".text" || Name == ".data" || Name == ".bss")
@@ -58,36 +60,41 @@ void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI,
OS << 'r';
if (getCharacteristics() & COFF::IMAGE_SCN_MEM_DISCARDABLE)
OS << 'n';
- OS << "\"\n";
+
+ OS << '"';
if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
+ OS << ",";
switch (Selection) {
case COFF::IMAGE_COMDAT_SELECT_NODUPLICATES:
- OS << "\t.linkonce one_only\n";
+ OS << "one_only,";
break;
case COFF::IMAGE_COMDAT_SELECT_ANY:
- OS << "\t.linkonce discard\n";
+ OS << "discard,";
break;
case COFF::IMAGE_COMDAT_SELECT_SAME_SIZE:
- OS << "\t.linkonce same_size\n";
+ OS << "same_size,";
break;
case COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH:
- OS << "\t.linkonce same_contents\n";
+ OS << "same_contents,";
break;
case COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE:
- OS << "\t.linkonce associative " << Assoc->getSectionName() << "\n";
+ OS << "associative " << Assoc->getSectionName() << ",";
break;
case COFF::IMAGE_COMDAT_SELECT_LARGEST:
- OS << "\t.linkonce largest\n";
+ OS << "largest,";
break;
case COFF::IMAGE_COMDAT_SELECT_NEWEST:
- OS << "\t.linkonce newest\n";
+ OS << "newest,";
break;
default:
assert (0 && "unsupported COFF selection type");
break;
}
+ assert(COMDATSymbol);
+ OS << *COMDATSymbol;
}
+ OS << '\n';
}
bool MCSectionCOFF::UseCodeAlign() const {
diff --git a/test/MC/COFF/tricky-names.ll b/test/MC/COFF/tricky-names.ll
index 6e041d38d3..458aa41fb2 100644
--- a/test/MC/COFF/tricky-names.ll
+++ b/test/MC/COFF/tricky-names.ll
@@ -25,11 +25,11 @@ define weak i32 @"\01??_B?$num_put@_WV?$back_insert_iterator@V?$basic_string@_WU
; ASM-NOT: .globl "@foo.bar"
; READOBJ: Symbol
-; READOBJ: Name: .text$??_B?$num_put@_WV?$back_insert_iterator@V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@std@@@std@@51
-; READOBJ: Section: .text$??_B?$num_put@_WV?$back_insert_iterator@V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@std@@@std@@51
+; READOBJ: Name: .text
+; READOBJ: Section: .text
; READOBJ: Symbol
; READOBJ: Name: ??_B?$num_put@_WV?$back_insert_iterator@V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@std@@@std@@51
-; READOBJ: Section: .text$??_B?$num_put@_WV?$back_insert_iterator@V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@std@@@std@@51
+; READOBJ: Section: .text
; READOBJ: Symbol
; READOBJ: Name: ??__E_Generic_object@?$_Error_objects@H@std@@YAXXZ
; READOBJ: Symbol
diff --git a/test/MC/COFF/weak-symbol.ll b/test/MC/COFF/weak-symbol.ll
index 7f2e87cb75..f23063e59c 100644
--- a/test/MC/COFF/weak-symbol.ll
+++ b/test/MC/COFF/weak-symbol.ll
@@ -8,37 +8,31 @@
; RUN: llc -mtriple=x86_64-pc-mingw32 %s -o - | FileCheck %s --check-prefix=X64
; Mangled function
-; X86: .section .text$_Z3foo
-; X86: .linkonce discard
+; X86: .section .text,"xr",discard,__Z3foo
; X86: .globl __Z3foo
;
-; X64: .section .text$_Z3foo
-; X64: .linkonce discard
+; X64: .section .text,"xr",discard,_Z3foo
; X64: .globl _Z3foo
define weak void @_Z3foo() {
ret void
}
; Unmangled function
-; X86: .section .sect$f
-; X86: .linkonce discard
+; X86: .section .sect,"xr",discard,_f
; X86: .globl _f
;
-; X64: .section .sect$f
-; X64: .linkonce discard
+; X64: .section .sect,"xr",discard,f
; X64: .globl f
define weak void @f() section ".sect" {
ret void
}
; Weak global
-; X86: .section .data$a
-; X86: .linkonce discard
+; X86: .section .data,"r",discard,_a
; X86: .globl _a
; X86: .zero 12
;
-; X64: .section .data$a
-; X64: .linkonce discard
+; X64: .section .data,"r",discard,a
; X64: .globl a
; X64: .zero 12
@a = weak unnamed_addr constant { i32, i32, i32 } { i32 0, i32 0, i32 0}, section ".data"