make SectionForGlobal non-virtual, add a hook for pic16 to do its "address=" hack.

llvm-svn: 76989
This commit is contained in:
Chris Lattner 2009-07-24 18:34:27 +00:00
parent 0b5be94c79
commit bf9ac228f7
4 changed files with 43 additions and 22 deletions

View File

@ -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 ""; }

View File

@ -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

View File

@ -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

View File

@ -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();