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.
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 ""; }
// 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();
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)) {
}
}
}
-
- // 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
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
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;
// 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();