From bf9ac228f7f90c776434db4ca8be457632fd225d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 24 Jul 2009 18:34:27 +0000 Subject: [PATCH] make SectionForGlobal non-virtual, add a hook for pic16 to do its "address=" hack. llvm-svn: 76989 --- llvm/include/llvm/Target/TargetAsmInfo.h | 17 +++++++++++---- llvm/lib/Target/PIC16/PIC16TargetAsmInfo.cpp | 23 ++++++++++---------- llvm/lib/Target/PIC16/PIC16TargetAsmInfo.h | 8 ++++++- llvm/lib/Target/TargetAsmInfo.cpp | 17 ++++++++++----- 4 files changed, 43 insertions(+), 22 deletions(-) diff --git a/llvm/include/llvm/Target/TargetAsmInfo.h b/llvm/include/llvm/Target/TargetAsmInfo.h index 8b2679090e1a..419f5fbe6290 100644 --- a/llvm/include/llvm/Target/TargetAsmInfo.h +++ b/llvm/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/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.cpp b/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.cpp index c2b519d893d2..fedb0b82ca3a 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(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 abbb5042752a..9b934b039d95 100644 --- a/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.h +++ b/llvm/lib/Target/PIC16/PIC16TargetAsmInfo.h @@ -91,7 +91,13 @@ namespace llvm { const std::vector &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 985f41533e35..1ed9a716b4dc 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();