sink uniquing of sections out of MCContext into the ELF and PECOFF TLOF implementations.

MCContext no longer maintains a string -> section map.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78874 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-08-13 00:37:15 +00:00
parent f991ecf723
commit 38cff389af
6 changed files with 49 additions and 42 deletions

View File

@ -46,16 +46,6 @@ namespace llvm {
public:
MCContext();
~MCContext();
/// GetSection - Look up a section with the given @param Name, returning
/// null if it doesn't exist.
MCSection *GetSection(const StringRef &Name) const;
void SetSection(const StringRef &Name, MCSection *S) {
MCSection *&Entry = Sections[Name];
assert(Entry == 0 && "Multiple sections with the same name created");
Entry = S;
}
/// CreateSymbol - Create a new symbol with the specified @param Name.
///

View File

@ -52,8 +52,9 @@ namespace llvm {
/// of a syntactic one.
bool IsDirective;
MCSectionELF(const StringRef &Name, bool IsDirective, SectionKind K,
MCContext &Ctx);
MCSectionELF(const StringRef &name, bool isDirective, SectionKind K)
: MCSection(K), Name(name), IsDirective(isDirective) {
}
public:
static MCSectionELF *Create(const StringRef &Name, bool IsDirective,
@ -77,8 +78,9 @@ namespace llvm {
/// of a syntactic one.
bool IsDirective;
MCSectionCOFF(const StringRef &Name, bool IsDirective, SectionKind K,
MCContext &Ctx);
MCSectionCOFF(const StringRef &name, bool isDirective, SectionKind K)
: MCSection(K), Name(name), IsDirective(isDirective) {
}
public:
static MCSectionCOFF *Create(const StringRef &Name, bool IsDirective,

View File

@ -183,6 +183,7 @@ protected:
class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
bool HasCrazyBSS;
mutable void *UniquingMap;
protected:
/// TLSDataSection - Section directive for Thread Local data.
///
@ -208,7 +209,10 @@ protected:
public:
TargetLoweringObjectFileELF(// FIXME: REMOVE AFTER UNIQUING IS FIXED.
bool hasCrazyBSS = false)
: HasCrazyBSS(hasCrazyBSS) {}
: HasCrazyBSS(hasCrazyBSS), UniquingMap(0) {}
~TargetLoweringObjectFileELF();
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
@ -302,7 +306,11 @@ public:
class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
mutable void *UniquingMap;
public:
TargetLoweringObjectFileCOFF() : UniquingMap(0) {}
~TargetLoweringObjectFileCOFF();
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
virtual const MCSection *

View File

@ -22,11 +22,6 @@ MCContext::~MCContext() {
// we don't need to free them here.
}
MCSection *MCContext::GetSection(const StringRef &Name) const {
StringMap<MCSection*>::const_iterator I = Sections.find(Name);
return I != Sections.end() ? I->second : 0;
}
MCSymbol *MCContext::CreateSymbol(const StringRef &Name) {
assert(Name[0] != '\0' && "Normal symbols cannot be unnamed!");

View File

@ -27,16 +27,9 @@ MCSection::~MCSection() {
MCSectionELF *MCSectionELF::
Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) {
return new (Ctx) MCSectionELF(Name, IsDirective, K, Ctx);
return new (Ctx) MCSectionELF(Name, IsDirective, K);
}
MCSectionELF::MCSectionELF(const StringRef &name, bool isDirective,
SectionKind K, MCContext &Ctx)
: MCSection(K), Name(name), IsDirective(isDirective) {
Ctx.SetSection(Name, this);
}
void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI,
raw_ostream &OS) const {
if (isDirective()) {
@ -118,16 +111,9 @@ void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI,
MCSectionCOFF *MCSectionCOFF::
Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) {
return new (Ctx) MCSectionCOFF(Name, IsDirective, K, Ctx);
return new (Ctx) MCSectionCOFF(Name, IsDirective, K);
}
MCSectionCOFF::MCSectionCOFF(const StringRef &name, bool isDirective,
SectionKind K, MCContext &Ctx)
: MCSection(K), Name(name), IsDirective(isDirective) {
Ctx.SetSection(Name, this);
}
void MCSectionCOFF::PrintSwitchToSection(const TargetAsmInfo &TAI,
raw_ostream &OS) const {

View File

@ -280,12 +280,25 @@ TargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
//===----------------------------------------------------------------------===//
// ELF
//===----------------------------------------------------------------------===//
typedef StringMap<const MCSectionELF*> ELFUniqueMapTy;
TargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() {
// If we have the section uniquing map, free it.
delete (ELFUniqueMapTy*)UniquingMap;
}
const MCSection *TargetLoweringObjectFileELF::
getELFSection(const char *Name, bool isDirective, SectionKind Kind) const {
if (MCSection *S = getContext().GetSection(Name))
return S;
return MCSectionELF::Create(Name, isDirective, Kind, getContext());
// Create the map if it doesn't already exist.
if (UniquingMap == 0)
UniquingMap = new ELFUniqueMapTy();
ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap;
// Do the lookup, if we have a hit, return it.
const MCSectionELF *&Entry = Map[Name];
if (Entry) return Entry;
return Entry = MCSectionELF::Create(Name, isDirective, Kind, getContext());
}
void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
@ -805,12 +818,25 @@ shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
// COFF
//===----------------------------------------------------------------------===//
typedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
TargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() {
delete (COFFUniqueMapTy*)UniquingMap;
}
const MCSection *TargetLoweringObjectFileCOFF::
getCOFFSection(const char *Name, bool isDirective, SectionKind Kind) const {
if (MCSection *S = getContext().GetSection(Name))
return S;
return MCSectionCOFF::Create(Name, isDirective, Kind, getContext());
// Create the map if it doesn't already exist.
if (UniquingMap == 0)
UniquingMap = new MachOUniqueMapTy();
COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap;
// Do the lookup, if we have a hit, return it.
const MCSectionCOFF *&Entry = Map[Name];
if (Entry) return Entry;
return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext());
}
void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,