aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Target/DarwinTargetAsmInfo.h2
-rw-r--r--include/llvm/Target/TargetAsmInfo.h15
-rw-r--r--lib/Target/DarwinTargetAsmInfo.cpp6
-rw-r--r--lib/Target/ELFTargetAsmInfo.cpp6
-rw-r--r--lib/Target/TargetAsmInfo.cpp41
-rw-r--r--lib/Target/X86/X86TargetAsmInfo.cpp42
-rw-r--r--lib/Target/X86/X86TargetAsmInfo.h4
7 files changed, 49 insertions, 67 deletions
diff --git a/include/llvm/Target/DarwinTargetAsmInfo.h b/include/llvm/Target/DarwinTargetAsmInfo.h
index a6f48e1ea3..48f9133923 100644
--- a/include/llvm/Target/DarwinTargetAsmInfo.h
+++ b/include/llvm/Target/DarwinTargetAsmInfo.h
@@ -35,8 +35,6 @@ namespace llvm {
explicit DarwinTargetAsmInfo(const TargetMachine &TM);
virtual const Section* SelectSectionForGlobal(const GlobalValue *GV) const;
- virtual std::string UniqueSectionForGlobal(const GlobalValue* GV,
- SectionKind::Kind kind) const;
virtual bool emitUsedDirectiveFor(const GlobalValue *GV,
Mangler *Mang) const;
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index 112f1051fb..63afe9bd6a 100644
--- a/include/llvm/Target/TargetAsmInfo.h
+++ b/include/llvm/Target/TargetAsmInfo.h
@@ -579,6 +579,16 @@ namespace llvm {
getSectionForMergableConstant(uint64_t Size, unsigned ReloInfo) const;
+ /// getSectionPrefixForUniqueGlobal - Return a string that we should prepend
+ /// onto a global's name in order to get the unique section name for the
+ /// global. This is important for globals that need to be merged across
+ /// translation units.
+ virtual const char *
+ getSectionPrefixForUniqueGlobal(SectionKind::Kind Kind) const;
+
+
+
+
/// SectionKindForGlobal - This hook allows the target to select proper
/// section kind used for global emission.
// FIXME: Eliminate this.
@@ -597,11 +607,6 @@ namespace llvm {
// FIXME: Eliminate this.
virtual const Section* SectionForGlobal(const GlobalValue *GV) const;
- // Helper methods for SectionForGlobal
-// FIXME: Eliminate this.
- virtual std::string UniqueSectionForGlobal(const GlobalValue* GV,
- SectionKind::Kind kind) const;
-
const std::string &getSectionFlags(unsigned Flags) const;
virtual std::string printSectionFlags(unsigned flags) const { return ""; }
diff --git a/lib/Target/DarwinTargetAsmInfo.cpp b/lib/Target/DarwinTargetAsmInfo.cpp
index bc2189e1ef..0ea9bd1666 100644
--- a/lib/Target/DarwinTargetAsmInfo.cpp
+++ b/lib/Target/DarwinTargetAsmInfo.cpp
@@ -204,9 +204,3 @@ DarwinTargetAsmInfo::getSectionForMergableConstant(uint64_t Size,
return ReadOnlySection; // .const
}
-std::string
-DarwinTargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV,
- SectionKind::Kind kind) const {
- llvm_unreachable("Darwin does not use unique sections");
- return "";
-}
diff --git a/lib/Target/ELFTargetAsmInfo.cpp b/lib/Target/ELFTargetAsmInfo.cpp
index 9f1aec3a82..735adce5f2 100644
--- a/lib/Target/ELFTargetAsmInfo.cpp
+++ b/lib/Target/ELFTargetAsmInfo.cpp
@@ -90,13 +90,15 @@ ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
case Function::WeakODRLinkage:
case Function::LinkOnceAnyLinkage:
case Function::LinkOnceODRLinkage:
- std::string Name = UniqueSectionForGlobal(GV, Kind);
+ // FIXME: Use mangler interface (PR4584).
+ std::string Name = getSectionPrefixForUniqueGlobal(Kind)+GV->getName();
unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str());
return getNamedSection(Name.c_str(), Flags);
}
} else if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) {
if (GVar->isWeakForLinker()) {
- std::string Name = UniqueSectionForGlobal(GVar, Kind);
+ // FIXME: Use mangler interface (PR4584).
+ std::string Name = getSectionPrefixForUniqueGlobal(Kind)+GV->getName();
unsigned Flags = SectionFlagsForGlobal(GVar, Name.c_str());
return getNamedSection(Name.c_str(), Flags);
} else {
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index bf543cc4ec..d13a3226cf 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -305,7 +305,8 @@ TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
SectionKind::Kind Kind = SectionKindForGlobal(GV);
if (GV->isWeakForLinker()) {
- std::string Name = UniqueSectionForGlobal(GV, Kind);
+ // FIXME: Use mangler interface (PR4584).
+ std::string Name = getSectionPrefixForUniqueGlobal(Kind)+GV->getName();
unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str());
return getNamedSection(Name.c_str(), Flags);
} else {
@@ -334,34 +335,22 @@ TargetAsmInfo::getSectionForMergableConstant(uint64_t Size,
-std::string
-TargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV,
- SectionKind::Kind Kind) const {
+const char *
+TargetAsmInfo::getSectionPrefixForUniqueGlobal(SectionKind::Kind Kind) const {
switch (Kind) {
- case SectionKind::Text:
- return ".gnu.linkonce.t." + GV->getNameStr();
- case SectionKind::Data:
- return ".gnu.linkonce.d." + GV->getNameStr();
- case SectionKind::DataRel:
- return ".gnu.linkonce.d.rel" + GV->getNameStr();
- case SectionKind::DataRelLocal:
- return ".gnu.linkonce.d.rel.local" + GV->getNameStr();
- case SectionKind::DataRelRO:
- return ".gnu.linkonce.d.rel.ro" + GV->getNameStr();
- case SectionKind::DataRelROLocal:
- return ".gnu.linkonce.d.rel.ro.local" + GV->getNameStr();
- case SectionKind::BSS:
- return ".gnu.linkonce.b." + GV->getNameStr();
+ default: llvm_unreachable("Unknown section kind");
+ case SectionKind::Text: return ".gnu.linkonce.t.";
+ case SectionKind::Data: return ".gnu.linkonce.d.";
+ case SectionKind::DataRel: return ".gnu.linkonce.d.rel.";
+ case SectionKind::DataRelLocal: return ".gnu.linkonce.d.rel.local.";
+ case SectionKind::DataRelRO: return ".gnu.linkonce.d.rel.ro.";
+ case SectionKind::DataRelROLocal: return ".gnu.linkonce.d.rel.ro.local.";
+ case SectionKind::BSS: return ".gnu.linkonce.b.";
case SectionKind::ROData:
case SectionKind::RODataMergeConst:
- case SectionKind::RODataMergeStr:
- return ".gnu.linkonce.r." + GV->getNameStr();
- case SectionKind::ThreadData:
- return ".gnu.linkonce.td." + GV->getNameStr();
- case SectionKind::ThreadBSS:
- return ".gnu.linkonce.tb." + GV->getNameStr();
- default:
- llvm_unreachable("Unknown section kind");
+ case SectionKind::RODataMergeStr: return ".gnu.linkonce.r.";
+ case SectionKind::ThreadData: return ".gnu.linkonce.td.";
+ case SectionKind::ThreadBSS: return ".gnu.linkonce.tb.";
}
return NULL;
}
diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp
index 18bcbdca45..99615dbd8b 100644
--- a/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -256,33 +256,27 @@ X86COFFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
Format |= DW_EH_PE_indirect;
return (Format | DW_EH_PE_pcrel);
- } else {
- if (is64Bit &&
- (CM == CodeModel::Small ||
- (CM == CodeModel::Medium && Reason != DwarfEncoding::Data)))
- return DW_EH_PE_udata4;
- else
- return DW_EH_PE_absptr;
}
+
+ if (is64Bit &&
+ (CM == CodeModel::Small ||
+ (CM == CodeModel::Medium && Reason != DwarfEncoding::Data)))
+ return DW_EH_PE_udata4;
+ return DW_EH_PE_absptr;
}
-std::string
-X86COFFTargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV,
- SectionKind::Kind kind) const {
- switch (kind) {
- case SectionKind::Text:
- return ".text$linkonce" + GV->getName();
- case SectionKind::Data:
- case SectionKind::BSS:
- case SectionKind::ThreadData:
- case SectionKind::ThreadBSS:
- return ".data$linkonce" + GV->getName();
- case SectionKind::ROData:
- case SectionKind::RODataMergeConst:
- case SectionKind::RODataMergeStr:
- return ".rdata$linkonce" + GV->getName();
- default:
- llvm_unreachable("Unknown section kind");
+const char *X86COFFTargetAsmInfo::
+getSectionPrefixForUniqueGlobal(SectionKind::Kind Kind) const {
+ switch (Kind) {
+ default: llvm_unreachable("Unknown section kind");
+ case SectionKind::Text: return ".text$linkonce";
+ case SectionKind::Data:
+ case SectionKind::BSS:
+ case SectionKind::ThreadData:
+ case SectionKind::ThreadBSS: return ".data$linkonce";
+ case SectionKind::ROData:
+ case SectionKind::RODataMergeConst:
+ case SectionKind::RODataMergeStr: return ".rdata$linkonce";
}
return NULL;
}
diff --git a/lib/Target/X86/X86TargetAsmInfo.h b/lib/Target/X86/X86TargetAsmInfo.h
index d3da33e4f3..94bae7ee83 100644
--- a/lib/Target/X86/X86TargetAsmInfo.h
+++ b/lib/Target/X86/X86TargetAsmInfo.h
@@ -53,8 +53,8 @@ namespace llvm {
explicit X86COFFTargetAsmInfo(const X86TargetMachine &TM);
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
bool Global) const;
- virtual std::string UniqueSectionForGlobal(const GlobalValue* GV,
- SectionKind::Kind kind) const;
+ virtual const char *
+ getSectionPrefixForUniqueGlobal(SectionKind::Kind kind) const;
virtual std::string printSectionFlags(unsigned flags) const;
};