diff options
-rw-r--r-- | include/llvm/MC/MCAtom.h | 26 | ||||
-rw-r--r-- | include/llvm/MC/MCContext.h | 15 | ||||
-rw-r--r-- | include/llvm/MC/MCStreamer.h | 1 | ||||
-rw-r--r-- | include/llvm/MC/MCSymbol.h | 13 | ||||
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 21 | ||||
-rw-r--r-- | lib/MC/MCContext.cpp | 23 | ||||
-rw-r--r-- | unittests/MC/AsmStreamerTest.cpp | 6 |
7 files changed, 33 insertions, 72 deletions
diff --git a/include/llvm/MC/MCAtom.h b/include/llvm/MC/MCAtom.h deleted file mode 100644 index f91a96f..0000000 --- a/include/llvm/MC/MCAtom.h +++ /dev/null @@ -1,26 +0,0 @@ -//===- MCAtom.h - Machine Code Atoms ----------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_MC_MCATOM_H -#define LLVM_MC_MCATOM_H - -namespace llvm { - - class MCAtom { - MCSection *Section; - - public: - MCAtom(MCSection *_Section) : Section(_Section) {} - - MCSection *getSection() { return Section; } - }; - -} // end namespace llvm - -#endif diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index 8dabb45..13180e8 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -15,7 +15,6 @@ #include "llvm/Support/Allocator.h" namespace llvm { - class MCAtom; class MCValue; class MCSection; class MCSymbol; @@ -47,14 +46,10 @@ namespace llvm { /// GetSection - Get or create a new section with the given @param Name. MCSection *GetSection(const char *Name); - /// CreateAtom - Create a new atom inside @param Section. - MCAtom *CreateAtom(MCSection *Section); - - /// CreateSymbol - Create a new symbol inside @param Atom with the specified - /// @param Name. + /// CreateSymbol - Create a new symbol with the specified @param Name. /// /// @param Name - The symbol name, which must be unique across all symbols. - MCSymbol *CreateSymbol(MCAtom *Atom, const char *Name); + MCSymbol *CreateSymbol(const char *Name); /// GetOrCreateSymbol - Lookup the symbol inside with the specified /// @param Name. If it exists, return it. If not, create a forward @@ -63,13 +58,13 @@ namespace llvm { /// @param Name - The symbol name, which must be unique across all symbols. MCSymbol *GetOrCreateSymbol(const char *Name); - /// CreateTemporarySymbol - Create a new temporary symbol inside @param Atom - /// with the specified @param Name. + /// CreateTemporarySymbol - Create a new temporary symbol with the specified + /// @param Name. /// /// @param Name - The symbol name, for debugging purposes only, temporary /// symbols do not surive assembly. If non-empty the name must be unique /// across all symbols. - MCSymbol *CreateTemporarySymbol(MCAtom *Atom, const char *Name = ""); + MCSymbol *CreateTemporarySymbol(const char *Name = ""); /// LookupSymbol - Get the symbol for @param Name, or null. MCSymbol *LookupSymbol(const char *Name) const; diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index 7637416..0ce8113 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -11,7 +11,6 @@ #define LLVM_MC_MCSTREAMER_H namespace llvm { - class MCAtom; class MCContext; class MCValue; class MCInst; diff --git a/include/llvm/MC/MCSymbol.h b/include/llvm/MC/MCSymbol.h index 085f765..06f50ae 100644 --- a/include/llvm/MC/MCSymbol.h +++ b/include/llvm/MC/MCSymbol.h @@ -13,20 +13,19 @@ #include <string> namespace llvm { - class MCAtom; - class MCSymbol { - MCAtom *Atom; + MCSection *Section; std::string Name; unsigned IsTemporary : 1; public: - MCSymbol(MCAtom *_Atom, const char *_Name, bool _IsTemporary) - : Atom(_Atom), Name(_Name), IsTemporary(_IsTemporary) {} + MCSymbol(const char *_Name, bool _IsTemporary) + : Section(0), Name(_Name), IsTemporary(_IsTemporary) {} - MCAtom *getAtom() { return Atom; } + MCSection *getSection() const { return Section; } + void setSection(MCSection *Value) { Section = Value; } - const std::string &getName() { return Name; } + const std::string &getName() const { return Name; } }; } // end namespace llvm diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 33d72e2..73d6f04 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -9,7 +9,6 @@ #include "llvm/MC/MCStreamer.h" -#include "llvm/MC/MCAtom.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCSection.h" #include "llvm/MC/MCSymbol.h" @@ -82,20 +81,26 @@ void MCAsmStreamer::SwitchSection(MCSection *Section) { } void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) { - // FIXME: We need to enforce that we aren't printing atoms which are more - // complicated than the assembler understands. - //assert(Symbol->getAtom()->getSection() == CurSection && - // "The label for a symbol must match its section!"); + assert(Symbol->getSection() == 0 && "Cannot emit a symbol twice!"); + assert(CurSection && "Cannot emit before setting section!"); + assert(!getContext().GetSymbolValue(Symbol) && + "Cannot emit symbol which was directly assigned to!"); + OS << Symbol->getName() << ":\n"; + Symbol->setSection(CurSection); } void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCValue &Value, bool MakeAbsolute) { + assert(!Symbol->getSection() && "Cannot assign to a label!"); + if (MakeAbsolute) { OS << ".set " << Symbol->getName() << ", " << Value << '\n'; } else { OS << Symbol->getName() << " = " << Value << '\n'; } + + getContext().SetSymbolValue(Symbol, Value); } void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, @@ -119,12 +124,13 @@ void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, } void MCAsmStreamer::EmitBytes(const char *Data, unsigned Length) { - for (unsigned i = 0; i != Length; ++i) { + assert(CurSection && "Cannot emit contents before setting section!"); + for (unsigned i = 0; i != Length; ++i) OS << ".byte " << (unsigned) Data[i] << '\n'; - } } void MCAsmStreamer::EmitValue(const MCValue &Value, unsigned Size) { + assert(CurSection && "Cannot emit contents before setting section!"); // Need target hooks to know how to print this. switch (Size) { default: @@ -139,6 +145,7 @@ void MCAsmStreamer::EmitValue(const MCValue &Value, unsigned Size) { } void MCAsmStreamer::EmitInstruction(const MCInst &Inst) { + assert(CurSection && "Cannot emit contents before setting section!"); // FIXME: Implement. OS << "# FIXME: Implement instruction printing!\n"; } diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index f7793b9..6c6019c 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -9,7 +9,6 @@ #include "llvm/MC/MCContext.h" -#include "llvm/MC/MCAtom.h" #include "llvm/MC/MCSection.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCValue.h" @@ -30,43 +29,33 @@ MCSection *MCContext::GetSection(const char *Name) { return Entry; } - -MCAtom *MCContext::CreateAtom(MCSection *Section) { - return new (*this) MCAtom(Section); -} -MCSymbol *MCContext::CreateSymbol(MCAtom *Atom, const char *Name) { +MCSymbol *MCContext::CreateSymbol(const char *Name) { assert(Name[0] != '\0' && "Normal symbols cannot be unnamed!"); // Create and bind the symbol, and ensure that names are unique. MCSymbol *&Entry = Symbols[Name]; assert(!Entry && "Duplicate symbol definition!"); - return Entry = new (*this) MCSymbol(Atom, Name, false); + return Entry = new (*this) MCSymbol(Name, false); } -/// GetOrCreateSymbol - Lookup the symbol inside with the specified -/// @param Name. If it exists, return it. If not, create a forward -/// reference and return it. -/// -/// @param Name - The symbol name, which must be unique across all symbols. MCSymbol *MCContext::GetOrCreateSymbol(const char *Name) { MCSymbol *&Entry = Symbols[Name]; if (Entry) return Entry; - // FIXME: is a null atom the right way to make a forward ref? - return Entry = new (*this) MCSymbol(0, Name, false); + return Entry = new (*this) MCSymbol(Name, false); } -MCSymbol *MCContext::CreateTemporarySymbol(MCAtom *Atom, const char *Name) { +MCSymbol *MCContext::CreateTemporarySymbol(const char *Name) { // If unnamed, just create a symbol. if (Name[0] == '\0') - new (*this) MCSymbol(Atom, "", true); + new (*this) MCSymbol("", true); // Otherwise create as usual. MCSymbol *&Entry = Symbols[Name]; assert(!Entry && "Duplicate symbol definition!"); - return Entry = new (*this) MCSymbol(Atom, Name, true); + return Entry = new (*this) MCSymbol(Name, true); } MCSymbol *MCContext::LookupSymbol(const char *Name) const { diff --git a/unittests/MC/AsmStreamerTest.cpp b/unittests/MC/AsmStreamerTest.cpp index d973301..76da23b 100644 --- a/unittests/MC/AsmStreamerTest.cpp +++ b/unittests/MC/AsmStreamerTest.cpp @@ -53,10 +53,8 @@ TEST(AsmStreamer, Sections) { TEST(AsmStreamer, Values) { StringAsmStreamer S; MCSection *Sec0 = S.getContext().GetSection("foo"); - MCSymbol *A = S.getContext().CreateSymbol(S.getContext().CreateAtom(Sec0), - "a"); - MCSymbol *B = S.getContext().CreateSymbol(S.getContext().CreateAtom(Sec0), - "b"); + MCSymbol *A = S.getContext().CreateSymbol("a"); + MCSymbol *B = S.getContext().CreateSymbol("b"); S.getStreamer().SwitchSection(Sec0); S.getStreamer().EmitLabel(A); S.getStreamer().EmitLabel(B); |