aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2013-12-01 04:40:32 +0000
committerBill Wendling <isanbard@gmail.com>2013-12-01 04:40:32 +0000
commitd0cf77ad590633c0e10336e4c59b509140328042 (patch)
tree0ef643f5ab912f6787aad2d1f9fe33c9f686fbd2 /lib
parent11e571c95403c73dc8d12d91a4da2a989c4ccbf5 (diff)
downloadexternal_llvm-d0cf77ad590633c0e10336e4c59b509140328042.zip
external_llvm-d0cf77ad590633c0e10336e4c59b509140328042.tar.gz
external_llvm-d0cf77ad590633c0e10336e4c59b509140328042.tar.bz2
--- Reverse-merging r195823 into '.':
U lib/MC/MCSectionCOFF.cpp U lib/CodeGen/TargetLoweringObjectFileImpl.cpp U test/MC/COFF/weak-symbol.ll U test/MC/COFF/tricky-names.ll G . --- Recording mergeinfo for reverse merge of r195823 into '.': G . git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_34@196036 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/TargetLoweringObjectFileImpl.cpp38
-rw-r--r--lib/MC/MCSectionCOFF.cpp23
2 files changed, 29 insertions, 32 deletions
diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index 229ccfa..59d7b57 100644
--- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -723,31 +723,33 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
Mangler *Mang, const TargetMachine &TM) const {
int Selection = 0;
unsigned Characteristics = getCOFFSectionFlags(Kind);
- StringRef Name = GV->getSection();
- StringRef COMDATSymName = "";
+ SmallString<128> Name(GV->getSection().c_str());
if (GV->isWeakForLinker()) {
Selection = COFF::IMAGE_COMDAT_SELECT_ANY;
Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
- MCSymbol *Sym = getSymbol(*Mang, GV);
- COMDATSymName = Sym->getName();
+ Name.append("$");
+ Mang->getNameWithPrefix(Name, GV, false, false);
}
return getContext().getCOFFSection(Name,
Characteristics,
Kind,
- COMDATSymName,
+ "",
Selection);
}
-static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) {
+static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
if (Kind.isText())
- return ".text";
+ return ".text$";
if (Kind.isBSS ())
- return ".bss";
- if (Kind.isThreadLocal())
- return ".tls";
+ 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";
+ }
if (Kind.isWriteable())
- return ".data";
- return ".rdata";
+ return ".data$";
+ return ".rdata$";
}
@@ -758,14 +760,16 @@ 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 *Name = getCOFFSectionNameForUniqueGlobal(Kind);
+ const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
+ SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
+ Mang->getNameWithPrefix(Name, GV, false, false);
+
unsigned Characteristics = getCOFFSectionFlags(Kind);
Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
- MCSymbol *Sym = getSymbol(*Mang, GV);
- return getContext().getCOFFSection(Name, Characteristics,
- Kind, Sym->getName(),
- COFF::IMAGE_COMDAT_SELECT_ANY);
+
+ return getContext().getCOFFSection(Name.str(), Characteristics,
+ Kind, "", COFF::IMAGE_COMDAT_SELECT_ANY);
}
if (Kind.isText())
diff --git a/lib/MC/MCSectionCOFF.cpp b/lib/MC/MCSectionCOFF.cpp
index bb35027..64aa2c5 100644
--- a/lib/MC/MCSectionCOFF.cpp
+++ b/lib/MC/MCSectionCOFF.cpp
@@ -20,8 +20,6 @@ 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")
@@ -60,41 +58,36 @@ void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI,
OS << 'r';
if (getCharacteristics() & COFF::IMAGE_SCN_MEM_DISCARDABLE)
OS << 'n';
-
- OS << '"';
+ OS << "\"\n";
if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
- OS << ",";
switch (Selection) {
case COFF::IMAGE_COMDAT_SELECT_NODUPLICATES:
- OS << "one_only,";
+ OS << "\t.linkonce one_only\n";
break;
case COFF::IMAGE_COMDAT_SELECT_ANY:
- OS << "discard,";
+ OS << "\t.linkonce discard\n";
break;
case COFF::IMAGE_COMDAT_SELECT_SAME_SIZE:
- OS << "same_size,";
+ OS << "\t.linkonce same_size\n";
break;
case COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH:
- OS << "same_contents,";
+ OS << "\t.linkonce same_contents\n";
break;
case COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE:
- OS << "associative " << Assoc->getSectionName() << ",";
+ OS << "\t.linkonce associative " << Assoc->getSectionName() << "\n";
break;
case COFF::IMAGE_COMDAT_SELECT_LARGEST:
- OS << "largest,";
+ OS << "\t.linkonce largest\n";
break;
case COFF::IMAGE_COMDAT_SELECT_NEWEST:
- OS << "newest,";
+ OS << "\t.linkonce newest\n";
break;
default:
assert (0 && "unsupported COFF selection type");
break;
}
- assert(COMDATSymbol);
- OS << *COMDATSymbol;
}
- OS << '\n';
}
bool MCSectionCOFF::UseCodeAlign() const {