From 2d90fbe8be703b1cf3a7c71c048c3968a9af3b90 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 6 Aug 2009 16:39:58 +0000 Subject: [PATCH] Fix several fixmes and clean up code by sinking *all* section creation activity into the target-specific subclasses of TLOF. Before this, globals with explicit sections could be created by the base class. 1. make getOrCreateSection protected, add a new getExplicitSectionGlobal pure virtual method to assign sections to globals with a specified section. 2. eliminate getSpecialCasedSectionGlobals, which is now PIC specific. 3. eliminate the getKindForNamedSection virtual method, which is now just a static method for ELF. 4. Add implementions of getExplicitSectionGlobal for ELF/PECOFF/Darwin/PIC16. They are now all detangled and understandable, woo! :) llvm-svn: 78319 --- .../llvm/Target/TargetLoweringObjectFile.h | 38 +++++++++------- lib/Target/PIC16/PIC16TargetObjectFile.cpp | 36 +++++++-------- lib/Target/PIC16/PIC16TargetObjectFile.h | 6 +-- lib/Target/TargetLoweringObjectFile.cpp | 45 ++++++++++++------- 4 files changed, 71 insertions(+), 54 deletions(-) diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index 630f9d0604b..0972dcde072 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -80,8 +80,7 @@ protected: const MCSection *DwarfRangesSection; const MCSection *DwarfMacroInfoSection; -public: - // FIXME: NONPUB. +protected: const MCSection *getOrCreateSection(const char *Name, bool isDirective, SectionKind K) const; @@ -132,15 +131,6 @@ public: /// section that it should be placed in. virtual const MCSection *getSectionForConstant(SectionKind Kind) const; - /// getKindForNamedSection - If this target wants to be able to override - /// section flags based on the name of the section specified for a global - /// variable, it can implement this. This is used on ELF systems so that - /// ".tbss" gets the TLS bit set etc. - virtual SectionKind getKindForNamedSection(const char *Section, - SectionKind K) const { - return K; - } - /// getKindForGlobal - Classify the specified global variable into a set of /// target independent categories embodied in SectionKind. static SectionKind getKindForGlobal(const GlobalValue *GV, @@ -162,10 +152,17 @@ public: return SectionForGlobal(GV, getKindForGlobal(GV, TM), Mang, TM); } + + + /// getExplicitSectionGlobal - Targets should implement this method to assign + /// a section to globals with an explicit section specfied. The + /// implementation of this method can assume that GV->hasSection() is true. + virtual const MCSection * + getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, + Mangler *Mang, const TargetMachine &TM) const = 0; + /// getSpecialCasedSectionGlobals - Allow the target to completely override /// section assignment of a global. - /// FIXME: ELIMINATE this by making PIC16 implement ADDRESS with - /// getFlagsForNamedSection. virtual const MCSection * getSpecialCasedSectionGlobals(const GlobalValue *GV, Mangler *Mang, SectionKind Kind) const { @@ -224,8 +221,11 @@ public: /// section that it should be placed in. virtual const MCSection *getSectionForConstant(SectionKind Kind) const; - virtual SectionKind getKindForNamedSection(const char *Section, - SectionKind K) const; + + virtual const MCSection * + getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, + Mangler *Mang, const TargetMachine &TM) const; + void getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl &Str) const; @@ -255,6 +255,10 @@ public: SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, const TargetMachine &TM) const; + virtual const MCSection * + getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, + Mangler *Mang, const TargetMachine &TM) const; + virtual const MCSection *getSectionForConstant(SectionKind Kind) const; /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively @@ -275,6 +279,10 @@ class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { public: virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); + virtual const MCSection * + getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, + Mangler *Mang, const TargetMachine &TM) const; + virtual void getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl &Str) const; diff --git a/lib/Target/PIC16/PIC16TargetObjectFile.cpp b/lib/Target/PIC16/PIC16TargetObjectFile.cpp index f15f3321c7c..b09ad305c28 100644 --- a/lib/Target/PIC16/PIC16TargetObjectFile.cpp +++ b/lib/Target/PIC16/PIC16TargetObjectFile.cpp @@ -242,28 +242,26 @@ PIC16TargetObjectFile::~PIC16TargetObjectFile() { /// getSpecialCasedSectionGlobals - Allow the target to completely override /// section assignment of a global. -const MCSection * -PIC16TargetObjectFile::getSpecialCasedSectionGlobals(const GlobalValue *GV, - Mangler *Mang, - SectionKind Kind) const { - // If GV has a sectin name or section address create that section now. - if (GV->hasSection()) { - if (const GlobalVariable *GVar = cast(GV)) { - std::string SectName = GVar->getSection(); - // If address for a variable is specified, get the address and create - // section. - std::string AddrStr = "Address="; - if (SectName.compare(0, AddrStr.length(), AddrStr) == 0) { - std::string SectAddr = SectName.substr(AddrStr.length()); - return CreateSectionForGlobal(GVar, Mang, SectAddr); - } - - // Create the section specified with section attribute. - return CreateSectionForGlobal(GVar, Mang); +const MCSection *PIC16TargetObjectFile:: +getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, + Mangler *Mang, const TargetMachine &TM) const { + assert(GV->hasSection()); + + if (const GlobalVariable *GVar = cast(GV)) { + std::string SectName = GVar->getSection(); + // If address for a variable is specified, get the address and create + // section. + std::string AddrStr = "Address="; + if (SectName.compare(0, AddrStr.length(), AddrStr) == 0) { + std::string SectAddr = SectName.substr(AddrStr.length()); + return CreateSectionForGlobal(GVar, Mang, SectAddr); } + + // Create the section specified with section attribute. + return CreateSectionForGlobal(GVar, Mang); } - return 0; + return getOrCreateSection(GV->getSection().c_str(), false, Kind); } // Create a new section for global variable. If Addr is given then create diff --git a/lib/Target/PIC16/PIC16TargetObjectFile.h b/lib/Target/PIC16/PIC16TargetObjectFile.h index 6cc7054e63b..c2611087b50 100644 --- a/lib/Target/PIC16/PIC16TargetObjectFile.h +++ b/lib/Target/PIC16/PIC16TargetObjectFile.h @@ -59,11 +59,9 @@ namespace llvm { void Initialize(MCContext &Ctx, const TargetMachine &TM); - /// getSpecialCasedSectionGlobals - Allow the target to completely override - /// section assignment of a global. virtual const MCSection * - getSpecialCasedSectionGlobals(const GlobalValue *GV, Mangler *Mang, - SectionKind Kind) const; + getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, + Mangler *Mang, const TargetMachine &TM) const; virtual const MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 23e549a42b0..6aca6da8afe 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -233,20 +233,9 @@ const MCSection *TargetLoweringObjectFile:: SectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, const TargetMachine &TM) const { // Select section name. - if (GV->hasSection()) { - // If the target has special section hacks for specifically named globals, - // return them now. - if (const MCSection *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind)) - return TS; - - // If the target has magic semantics for certain section names, make sure to - // pick up the flags. This allows the user to write things with attribute - // section and still get the appropriate section flags printed. - Kind = getKindForNamedSection(GV->getSection().c_str(), Kind); - - return getOrCreateSection(GV->getSection().c_str(), false, Kind); - } - + if (GV->hasSection()) + return getExplicitSectionGlobal(GV, Kind, Mang, TM); + // Use default section depending on the 'type' of global return SelectSectionForGlobal(GV, Kind, Mang, TM); @@ -381,8 +370,8 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, } -SectionKind TargetLoweringObjectFileELF:: -getKindForNamedSection(const char *Name, SectionKind K) const { +static SectionKind +getELFKindForNamedSection(const char *Name, SectionKind K) { if (Name[0] != '.') return K; // Some lame default implementation based on some magic section names. @@ -407,6 +396,17 @@ getKindForNamedSection(const char *Name, SectionKind K) const { return K; } +const MCSection *TargetLoweringObjectFileELF:: +getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, + Mangler *Mang, const TargetMachine &TM) const { + // Infer section flags from the section name if we can. + Kind = getELFKindForNamedSection(GV->getSection().c_str(), Kind); + + return getOrCreateSection(GV->getSection().c_str(), false, Kind); +} + + + void TargetLoweringObjectFileELF:: getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl &Str) const { Str.push_back(','); @@ -688,6 +688,12 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, SectionKind::getMetadata()); } +const MCSection *TargetLoweringObjectFileMachO:: +getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, + Mangler *Mang, const TargetMachine &TM) const { + return getOrCreateSection(GV->getSection().c_str(), false, Kind); +} + const MCSection *TargetLoweringObjectFileMachO:: SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, const TargetMachine &TM) const { @@ -837,6 +843,13 @@ void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, true, SectionKind::getMetadata()); } +const MCSection *TargetLoweringObjectFileCOFF:: +getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, + Mangler *Mang, const TargetMachine &TM) const { + return getOrCreateSection(GV->getSection().c_str(), false, Kind); +} + + void TargetLoweringObjectFileCOFF:: getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl &Str) const { // FIXME: Inefficient.