mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
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:
parent
f991ecf723
commit
38cff389af
@ -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.
|
||||
///
|
||||
|
@ -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,
|
||||
|
@ -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 *
|
||||
|
@ -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!");
|
||||
|
||||
|
@ -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 {
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user