diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/PIC16/PIC16TargetAsmInfo.cpp | 23 | ||||
-rw-r--r-- | llvm/lib/Target/PIC16/PIC16TargetAsmInfo.h | 8 | ||||
-rw-r--r-- | llvm/lib/Target/TargetAsmInfo.cpp | 17 |
3 files changed, 30 insertions, 18 deletions
diff --git a/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.cpp b/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.cpp index c2b519d893d..fedb0b82ca3 100644 --- a/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.cpp +++ b/llvm/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/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.h b/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.h index abbb5042752..9b934b039d9 100644 --- a/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.h +++ b/llvm/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/llvm/lib/Target/TargetAsmInfo.cpp b/llvm/lib/Target/TargetAsmInfo.cpp index 985f41533e3..1ed9a716b4d 100644 --- a/llvm/lib/Target/TargetAsmInfo.cpp +++ b/llvm/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(); |