mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
add trivial support for passing label definitions through the MCStreamer.
This is suboptimal in several aspects, see the commented out assertion. I need to talk to Daniel about this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74057 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
98d5982e00
commit
c69485e34d
@ -56,6 +56,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 *CreateSymbol(MCAtom *Atom, const char *Name);
|
MCSymbol *CreateSymbol(MCAtom *Atom, const char *Name);
|
||||||
|
|
||||||
|
/// 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 *GetOrCreateSymbol(const char *Name);
|
||||||
|
|
||||||
/// CreateTemporarySymbol - Create a new temporary symbol inside @param Atom
|
/// CreateTemporarySymbol - Create a new temporary symbol inside @param Atom
|
||||||
/// with the specified @param Name.
|
/// with the specified @param Name.
|
||||||
///
|
///
|
||||||
|
@ -84,8 +84,8 @@ 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
|
// FIXME: We need to enforce that we aren't printing atoms which are more
|
||||||
// complicated than the assembler understands.
|
// complicated than the assembler understands.
|
||||||
assert(Symbol->getAtom()->getSection() == CurSection &&
|
//assert(Symbol->getAtom()->getSection() == CurSection &&
|
||||||
"The label for a symbol must match its section!");
|
// "The label for a symbol must match its section!");
|
||||||
OS << Symbol->getName() << ":\n";
|
OS << Symbol->getName() << ":\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,6 +44,20 @@ MCSymbol *MCContext::CreateSymbol(MCAtom *Atom, const char *Name) {
|
|||||||
return Entry = new (*this) MCSymbol(Atom, Name, false);
|
return Entry = new (*this) MCSymbol(Atom, 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MCSymbol *MCContext::CreateTemporarySymbol(MCAtom *Atom, const char *Name) {
|
MCSymbol *MCContext::CreateTemporarySymbol(MCAtom *Atom, const char *Name) {
|
||||||
// If unnamed, just create a symbol.
|
// If unnamed, just create a symbol.
|
||||||
if (Name[0] == '\0')
|
if (Name[0] == '\0')
|
||||||
|
@ -185,6 +185,12 @@ bool AsmParser::ParseStatement() {
|
|||||||
if (Lexer.Lex() == asmtok::Colon) {
|
if (Lexer.Lex() == asmtok::Colon) {
|
||||||
// identifier ':' -> Label.
|
// identifier ':' -> Label.
|
||||||
Lexer.Lex();
|
Lexer.Lex();
|
||||||
|
|
||||||
|
// Since we saw a label, create a symbol and emit it.
|
||||||
|
// FIXME: If the label starts with L it is an assembler temporary label.
|
||||||
|
// Why does the client of this api need to know this?
|
||||||
|
Out.EmitLabel(Ctx.GetOrCreateSymbol(IDVal));
|
||||||
|
|
||||||
return ParseStatement();
|
return ParseStatement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,17 +17,20 @@
|
|||||||
#include "AsmLexer.h"
|
#include "AsmLexer.h"
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
class MCContext;
|
||||||
class MCInst;
|
class MCInst;
|
||||||
class MCStreamer;
|
class MCStreamer;
|
||||||
|
|
||||||
class AsmParser {
|
class AsmParser {
|
||||||
AsmLexer Lexer;
|
AsmLexer Lexer;
|
||||||
|
MCContext &Ctx;
|
||||||
MCStreamer &Out;
|
MCStreamer &Out;
|
||||||
|
|
||||||
struct X86Operand;
|
struct X86Operand;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AsmParser(SourceMgr &SM, MCStreamer &OutStr) : Lexer(SM), Out(OutStr) {}
|
AsmParser(SourceMgr &SM, MCContext &ctx, MCStreamer &OutStr)
|
||||||
|
: Lexer(SM), Ctx(ctx), Out(OutStr) {}
|
||||||
~AsmParser() {}
|
~AsmParser() {}
|
||||||
|
|
||||||
bool Run();
|
bool Run();
|
||||||
|
@ -139,10 +139,9 @@ static int AssembleInput(const char *ProgName) {
|
|||||||
// it later.
|
// it later.
|
||||||
SrcMgr.setIncludeDirs(IncludeDirs);
|
SrcMgr.setIncludeDirs(IncludeDirs);
|
||||||
|
|
||||||
// FIXME: don't leak streamer, own.
|
|
||||||
MCContext Ctx;
|
MCContext Ctx;
|
||||||
OwningPtr<MCStreamer> Str(createAsmStreamer(Ctx, outs()));
|
OwningPtr<MCStreamer> Str(createAsmStreamer(Ctx, outs()));
|
||||||
AsmParser Parser(SrcMgr, *Str.get());
|
AsmParser Parser(SrcMgr, Ctx, *Str.get());
|
||||||
return Parser.Run();
|
return Parser.Run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user