aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Target/TargetAsmInfo.h17
-rw-r--r--lib/Target/PIC16/PIC16TargetAsmInfo.cpp23
-rw-r--r--lib/Target/PIC16/PIC16TargetAsmInfo.h8
-rw-r--r--lib/Target/TargetAsmInfo.cpp17
4 files changed, 43 insertions, 22 deletions
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index 8b2679090e..419f5fbe62 100644
--- a/include/llvm/Target/TargetAsmInfo.h
+++ b/include/llvm/Target/TargetAsmInfo.h
@@ -594,6 +594,19 @@ namespace llvm {
return 0;
}
+ /// SectionForGlobal - This hooks returns proper section name for given
+ /// global with all necessary flags and marks.
+ // FIXME: MOVE TO TARGETLOWERING.
+ const Section* SectionForGlobal(const GlobalValue *GV) const;
+
+ /// getSpecialCasedSectionGlobals - Allow the target to completely override
+ /// section assignment of a global.
+ /// FIXME: ELIMINATE
+ virtual const Section *
+ getSpecialCasedSectionGlobals(const GlobalValue *GV,
+ SectionKind::Kind Kind) const{
+ return 0;
+ }
/// SectionKindForGlobal - This hook allows the target to select proper
/// section kind used for global emission.
@@ -601,10 +614,6 @@ namespace llvm {
virtual SectionKind::Kind
SectionKindForGlobal(const GlobalValue *GV) const;
- /// SectionForGlobal - This hooks returns proper section name for given
- /// global with all necessary flags and marks.
-// FIXME: Eliminate this.
- virtual const Section* SectionForGlobal(const GlobalValue *GV) const;
const std::string &getSectionFlags(unsigned Flags) const;
virtual std::string printSectionFlags(unsigned flags) const { return ""; }
diff --git a/lib/Target/PIC16/PIC16TargetAsmInfo.cpp b/lib/Target/PIC16/PIC16TargetAsmInfo.cpp
index c2b519d893..fedb0b82ca 100644
--- a/lib/Target/PIC16/PIC16TargetAsmInfo.cpp
+++ b/lib/Target/PIC16/PIC16TargetAsmInfo.cpp
@@ -203,15 +203,13 @@ PIC16TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV1) const {
// First, if this is an automatic variable for a function, get the section
// name for it and return.
- const std::string name = GV->getName();
- if (PAN::isLocalName(name)) {
+ std::string name = GV->getName();
+ if (PAN::isLocalName(name))
return getSectionForAuto(GV);
- }
// Record Exteranl Var Defs.
- if (GV->hasExternalLinkage() || GV->hasCommonLinkage()) {
+ if (GV->hasExternalLinkage() || GV->hasCommonLinkage())
ExternalVarDefs->Items.push_back(GV);
- }
// See if this is an uninitialized global.
const Constant *C = GV->getInitializer();
@@ -243,10 +241,12 @@ PIC16TargetAsmInfo::~PIC16TargetAsmInfo() {
delete ExternalVarDefs;
}
-// Override the default implementation. Create PIC16sections for variables
-// which have a section name or address.
-const Section*
-PIC16TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
+
+/// getSpecialCasedSectionGlobals - Allow the target to completely override
+/// section assignment of a global.
+const Section *
+PIC16TargetAsmInfo::getSpecialCasedSectionGlobals(const GlobalValue *GV,
+ SectionKind::Kind Kind) const{
// If GV has a sectin name or section address create that section now.
if (GV->hasSection()) {
if (const GlobalVariable *GVar = cast<GlobalVariable>(GV)) {
@@ -260,9 +260,8 @@ PIC16TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
}
}
}
-
- // Use section depending on the 'type' of variable
- return SelectSectionForGlobal(GV);
+
+ return 0;
}
// Create a new section for global variable. If Addr is given then create
diff --git a/lib/Target/PIC16/PIC16TargetAsmInfo.h b/lib/Target/PIC16/PIC16TargetAsmInfo.h
index abbb504275..9b934b039d 100644
--- a/lib/Target/PIC16/PIC16TargetAsmInfo.h
+++ b/lib/Target/PIC16/PIC16TargetAsmInfo.h
@@ -91,7 +91,13 @@ namespace llvm {
const std::vector<PIC16Section*> &getROSections() const {
return ROSections;
}
- virtual const Section *SectionForGlobal(const GlobalValue *GV) const;
+
+ /// getSpecialCasedSectionGlobals - Allow the target to completely override
+ /// section assignment of a global.
+ virtual const Section *
+ getSpecialCasedSectionGlobals(const GlobalValue *GV,
+ SectionKind::Kind Kind) const;
+
};
} // namespace llvm
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index 985f41533e..1ed9a716b4 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -263,10 +263,18 @@ TargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const {
const Section *TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
- // Select section name
+ SectionKind::Kind Kind = SectionKindForGlobal(GV);
+
+ // Select section name.
if (GV->hasSection()) {
+
+ // If the target has special section hacks for specifically named globals,
+ // return them now.
+ if (const Section *TS = getSpecialCasedSectionGlobals(GV, Kind))
+ return TS;
+
// Honour section already set, if any.
- unsigned Flags = SectionFlagsForGlobal(GV, SectionKindForGlobal(GV));
+ unsigned Flags = SectionFlagsForGlobal(GV, Kind);
// This is an explicitly named section.
Flags |= SectionFlags::Named;
@@ -282,9 +290,8 @@ const Section *TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
// 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()) {
- if (const char *Prefix =
- getSectionPrefixForUniqueGlobal(SectionKindForGlobal(GV))) {
- unsigned Flags = SectionFlagsForGlobal(GV, SectionKindForGlobal(GV));
+ if (const char *Prefix = getSectionPrefixForUniqueGlobal(Kind)) {
+ unsigned Flags = SectionFlagsForGlobal(GV, Kind);
// FIXME: Use mangler interface (PR4584).
std::string Name = Prefix+GV->getNameStr();