diff options
-rw-r--r-- | include/llvm/MC/MCContext.h | 6 | ||||
-rw-r--r-- | include/llvm/MC/MCSection.h | 6 | ||||
-rw-r--r-- | lib/MC/MCContext.cpp | 23 |
3 files changed, 22 insertions, 13 deletions
diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index 24dbc40479..a8187cce6f 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -42,12 +42,14 @@ namespace llvm { /// objects. BumpPtrAllocator Allocator; + friend class MCSection; public: MCContext(); ~MCContext(); - /// GetSection - Get or create a new section with the given @param Name. - MCSection *GetSection(const StringRef &Name); + /// GetSection - Look up a section with the given @param Name, returning + /// null if it doesn't exist. + MCSection *GetSection(const StringRef &Name) const; /// CreateSymbol - Create a new symbol with the specified @param Name. /// diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h index 48ffa2facd..024bc6c33a 100644 --- a/include/llvm/MC/MCSection.h +++ b/include/llvm/MC/MCSection.h @@ -25,13 +25,13 @@ namespace llvm { class MCSection { std::string Name; private: - friend class MCContext; - MCSection(const StringRef &_Name) : Name(_Name) {} - MCSection(const MCSection&); // DO NOT IMPLEMENT void operator=(const MCSection&); // DO NOT IMPLEMENT + MCSection(const StringRef &_Name, MCContext &Ctx); public: + static MCSection *Create(const StringRef &_Name, MCContext &Ctx); + const std::string &getName() const { return Name; } }; diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 6c74dcd9ec..5f3f125169 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -14,22 +14,29 @@ #include "llvm/MC/MCValue.h" using namespace llvm; -MCContext::MCContext() -{ +MCContext::MCContext() { } MCContext::~MCContext() { } -MCSection *MCContext::GetSection(const StringRef &Name) { - MCSection *&Entry = Sections[Name]; - - if (!Entry) - Entry = new (*this) MCSection(Name); +MCSection *MCContext::GetSection(const StringRef &Name) const { + StringMap<MCSection*>::const_iterator I = Sections.find(Name); + return I != Sections.end() ? I->second : 0; +} + - return Entry; +MCSection::MCSection(const StringRef &_Name, MCContext &Ctx) : Name(_Name) { + MCSection *&Entry = Ctx.Sections[Name]; + assert(Entry == 0 && "Multiple sections with the same name created"); + Entry = this; } +MCSection *MCSection::Create(const StringRef &Name, MCContext &Ctx) { + return new (Ctx) MCSection(Name, Ctx); +} + + MCSymbol *MCContext::CreateSymbol(const StringRef &Name) { assert(Name[0] != '\0' && "Normal symbols cannot be unnamed!"); |