mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-11 11:34:02 +00:00
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:
parent
d814b21509
commit
71d259bc4b
@ -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
|
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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";
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user