diff options
author | Chris Lattner <sabre@nondot.org> | 2009-08-06 16:39:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-08-06 16:39:58 +0000 |
commit | 24f654c8a4d14066233480f683d3b0dececf374a (patch) | |
tree | 8fc582c6e608f042aaeee1d7d6601747acf44d82 /lib/Target/TargetLoweringObjectFile.cpp | |
parent | e0161ea1050fd4107f3307b1e25b3aac02c2ba16 (diff) |
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! :)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78319 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/TargetLoweringObjectFile.cpp')
-rw-r--r-- | lib/Target/TargetLoweringObjectFile.cpp | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 23e549a42b..6aca6da8af 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<char> &Str) const { Str.push_back(','); @@ -689,6 +689,12 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, } 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 { assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); @@ -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<char> &Str) const { // FIXME: Inefficient. |