aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-03-17 20:39:25 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-03-17 20:39:25 +0000
commit47e384298245b707d6dd986f5eb0646103cf06fd (patch)
tree8f4cb4add0cdb6bb6752b9ceaa21ffaa7c6c5522 /llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
parent5f0dd6162c941a32e89052f8848799df0553b7c7 (diff)
downloadllvm-47e384298245b707d6dd986f5eb0646103cf06fd.zip
llvm-47e384298245b707d6dd986f5eb0646103cf06fd.tar.gz
llvm-47e384298245b707d6dd986f5eb0646103cf06fd.tar.bz2
COFF: Let globals with private linkage reside in their own section
Summary: COFF COMDATs (for selection kinds other than 'select any') require at least one non-section symbol in the symbol table. Satisfy this by morally enhancing the linkage from private to internal. Reviewers: rafael Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D8374 llvm-svn: 232539
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp')
-rw-r--r--llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index 725b824..5a8367e 100644
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -927,6 +927,11 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
StringRef COMDATSymName = Sym->getName();
return getContext().getCOFFSection(Name, Characteristics, Kind,
COMDATSymName, Selection);
+ } else {
+ SmallString<256> TmpData;
+ getNameWithPrefix(TmpData, GV, true, Mang, TM);
+ return getContext().getCOFFSection(Name, Characteristics, Kind, TmpData,
+ Selection);
}
}
@@ -948,6 +953,25 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
return DataSection;
}
+void TargetLoweringObjectFileCOFF::getNameWithPrefix(
+ SmallVectorImpl<char> &OutName, const GlobalValue *GV,
+ bool CannotUsePrivateLabel, Mangler &Mang, const TargetMachine &TM) const {
+ if (GV->hasPrivateLinkage() &&
+ ((isa<Function>(GV) && TM.getFunctionSections()) ||
+ (isa<GlobalVariable>(GV) && TM.getDataSections()))) {
+ SmallString<256> Tmp;
+ Mang.getNameWithPrefix(Tmp, GV, /*CannotUsePrivateLabel=*/false);
+ if (Tmp.startswith(".L"))
+ OutName.append(Tmp.begin() + 2, Tmp.end());
+ else if (Tmp.startswith("L"))
+ OutName.append(Tmp.begin() + 1, Tmp.end());
+ else
+ OutName.append(Tmp.begin(), Tmp.end());
+ return;
+ }
+ Mang.getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
+}
+
const MCSection *TargetLoweringObjectFileCOFF::getSectionForJumpTable(
const Function &F, Mangler &Mang, const TargetMachine &TM) const {
// If the function can be removed, produce a unique section so that