We decided to not worry about Atoms for now, it should be straightforward to

reintroduce them later.

Also, don't require MCSection* when creating a symbol.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74081 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2009-06-24 17:00:42 +00:00
parent d814b21509
commit 71d259bc4b
7 changed files with 33 additions and 72 deletions

View File

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

View File

@ -15,7 +15,6 @@
#include "llvm/Support/Allocator.h" #include "llvm/Support/Allocator.h"
namespace llvm { namespace llvm {
class MCAtom;
class MCValue; class MCValue;
class MCSection; class MCSection;
class MCSymbol; class MCSymbol;
@ -47,14 +46,10 @@ namespace llvm {
/// GetSection - Get or create a new section with the given @param Name. /// GetSection - Get or create a new section with the given @param Name.
MCSection *GetSection(const char *Name); MCSection *GetSection(const char *Name);
/// CreateAtom - Create a new atom inside @param Section. /// CreateSymbol - Create a new symbol with the specified @param Name.
MCAtom *CreateAtom(MCSection *Section);
/// CreateSymbol - Create a new symbol inside @param Atom with the specified
/// @param Name.
/// ///
/// @param Name - The symbol name, which must be unique across all symbols. /// @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 /// GetOrCreateSymbol - Lookup the symbol inside with the specified
/// @param Name. If it exists, return it. If not, create a forward /// @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. /// @param Name - The symbol name, which must be unique across all symbols.
MCSymbol *GetOrCreateSymbol(const char *Name); MCSymbol *GetOrCreateSymbol(const char *Name);
/// CreateTemporarySymbol - Create a new temporary symbol inside @param Atom /// CreateTemporarySymbol - Create a new temporary symbol with the specified
/// with the specified @param Name. /// @param Name.
/// ///
/// @param Name - The symbol name, for debugging purposes only, temporary /// @param Name - The symbol name, for debugging purposes only, temporary
/// symbols do not surive assembly. If non-empty the name must be unique /// symbols do not surive assembly. If non-empty the name must be unique
/// across all symbols. /// across all symbols.
MCSymbol *CreateTemporarySymbol(MCAtom *Atom, const char *Name = ""); MCSymbol *CreateTemporarySymbol(const char *Name = "");
/// LookupSymbol - Get the symbol for @param Name, or null. /// LookupSymbol - Get the symbol for @param Name, or null.
MCSymbol *LookupSymbol(const char *Name) const; MCSymbol *LookupSymbol(const char *Name) const;

View File

@ -11,7 +11,6 @@
#define LLVM_MC_MCSTREAMER_H #define LLVM_MC_MCSTREAMER_H
namespace llvm { namespace llvm {
class MCAtom;
class MCContext; class MCContext;
class MCValue; class MCValue;
class MCInst; class MCInst;

View File

@ -13,20 +13,19 @@
#include <string> #include <string>
namespace llvm { namespace llvm {
class MCAtom;
class MCSymbol { class MCSymbol {
MCAtom *Atom; MCSection *Section;
std::string Name; std::string Name;
unsigned IsTemporary : 1; unsigned IsTemporary : 1;
public: public:
MCSymbol(MCAtom *_Atom, const char *_Name, bool _IsTemporary) MCSymbol(const char *_Name, bool _IsTemporary)
: Atom(_Atom), Name(_Name), IsTemporary(_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 } // end namespace llvm

View File

@ -9,7 +9,6 @@
#include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCAtom.h"
#include "llvm/MC/MCContext.h" #include "llvm/MC/MCContext.h"
#include "llvm/MC/MCSection.h" #include "llvm/MC/MCSection.h"
#include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCSymbol.h"
@ -82,20 +81,26 @@ void MCAsmStreamer::SwitchSection(MCSection *Section) {
} }
void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) { void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) {
// FIXME: We need to enforce that we aren't printing atoms which are more assert(Symbol->getSection() == 0 && "Cannot emit a symbol twice!");
// complicated than the assembler understands. assert(CurSection && "Cannot emit before setting section!");
//assert(Symbol->getAtom()->getSection() == CurSection && assert(!getContext().GetSymbolValue(Symbol) &&
// "The label for a symbol must match its section!"); "Cannot emit symbol which was directly assigned to!");
OS << Symbol->getName() << ":\n"; OS << Symbol->getName() << ":\n";
Symbol->setSection(CurSection);
} }
void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCValue &Value, void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCValue &Value,
bool MakeAbsolute) { bool MakeAbsolute) {
assert(!Symbol->getSection() && "Cannot assign to a label!");
if (MakeAbsolute) { if (MakeAbsolute) {
OS << ".set " << Symbol->getName() << ", " << Value << '\n'; OS << ".set " << Symbol->getName() << ", " << Value << '\n';
} else { } else {
OS << Symbol->getName() << " = " << Value << '\n'; OS << Symbol->getName() << " = " << Value << '\n';
} }
getContext().SetSymbolValue(Symbol, Value);
} }
void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
@ -119,12 +124,13 @@ void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
} }
void MCAsmStreamer::EmitBytes(const char *Data, unsigned Length) { 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'; OS << ".byte " << (unsigned) Data[i] << '\n';
}
} }
void MCAsmStreamer::EmitValue(const MCValue &Value, unsigned Size) { 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. // Need target hooks to know how to print this.
switch (Size) { switch (Size) {
default: default:
@ -139,6 +145,7 @@ void MCAsmStreamer::EmitValue(const MCValue &Value, unsigned Size) {
} }
void MCAsmStreamer::EmitInstruction(const MCInst &Inst) { void MCAsmStreamer::EmitInstruction(const MCInst &Inst) {
assert(CurSection && "Cannot emit contents before setting section!");
// FIXME: Implement. // FIXME: Implement.
OS << "# FIXME: Implement instruction printing!\n"; OS << "# FIXME: Implement instruction printing!\n";
} }

View File

@ -9,7 +9,6 @@
#include "llvm/MC/MCContext.h" #include "llvm/MC/MCContext.h"
#include "llvm/MC/MCAtom.h"
#include "llvm/MC/MCSection.h" #include "llvm/MC/MCSection.h"
#include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCSymbol.h"
#include "llvm/MC/MCValue.h" #include "llvm/MC/MCValue.h"
@ -30,43 +29,33 @@ MCSection *MCContext::GetSection(const char *Name) {
return Entry; 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!"); assert(Name[0] != '\0' && "Normal symbols cannot be unnamed!");
// Create and bind the symbol, and ensure that names are unique. // Create and bind the symbol, and ensure that names are unique.
MCSymbol *&Entry = Symbols[Name]; MCSymbol *&Entry = Symbols[Name];
assert(!Entry && "Duplicate symbol definition!"); 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 *MCContext::GetOrCreateSymbol(const char *Name) {
MCSymbol *&Entry = Symbols[Name]; MCSymbol *&Entry = Symbols[Name];
if (Entry) return Entry; if (Entry) return Entry;
// FIXME: is a null atom the right way to make a forward ref? return Entry = new (*this) MCSymbol(Name, false);
return Entry = new (*this) MCSymbol(0, Name, false);
} }
MCSymbol *MCContext::CreateTemporarySymbol(MCAtom *Atom, const char *Name) { MCSymbol *MCContext::CreateTemporarySymbol(const char *Name) {
// If unnamed, just create a symbol. // If unnamed, just create a symbol.
if (Name[0] == '\0') if (Name[0] == '\0')
new (*this) MCSymbol(Atom, "", true); new (*this) MCSymbol("", true);
// Otherwise create as usual. // Otherwise create as usual.
MCSymbol *&Entry = Symbols[Name]; MCSymbol *&Entry = Symbols[Name];
assert(!Entry && "Duplicate symbol definition!"); 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 { MCSymbol *MCContext::LookupSymbol(const char *Name) const {

View File

@ -53,10 +53,8 @@ TEST(AsmStreamer, Sections) {
TEST(AsmStreamer, Values) { TEST(AsmStreamer, Values) {
StringAsmStreamer S; StringAsmStreamer S;
MCSection *Sec0 = S.getContext().GetSection("foo"); MCSection *Sec0 = S.getContext().GetSection("foo");
MCSymbol *A = S.getContext().CreateSymbol(S.getContext().CreateAtom(Sec0), MCSymbol *A = S.getContext().CreateSymbol("a");
"a"); MCSymbol *B = S.getContext().CreateSymbol("b");
MCSymbol *B = S.getContext().CreateSymbol(S.getContext().CreateAtom(Sec0),
"b");
S.getStreamer().SwitchSection(Sec0); S.getStreamer().SwitchSection(Sec0);
S.getStreamer().EmitLabel(A); S.getStreamer().EmitLabel(A);
S.getStreamer().EmitLabel(B); S.getStreamer().EmitLabel(B);