mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
implement mc asmparser support for '.', which gets the
current PC. rdar://7834775 We now produce an identical .o file compared to the cctools assembler for something like this: _f0: L0: jmp L1 .long . - L0 L1: jmp A .long . - L1 .zerofill __DATA,_bss,A,0 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101227 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ff1ef6bdf1
commit
d305035155
@ -42,7 +42,7 @@ public:
|
|||||||
Plus, Minus, Tilde,
|
Plus, Minus, Tilde,
|
||||||
Slash, // '/'
|
Slash, // '/'
|
||||||
LParen, RParen, LBrac, RBrac, LCurly, RCurly,
|
LParen, RParen, LBrac, RBrac, LCurly, RCurly,
|
||||||
Star, Comma, Dollar, Equal, EqualEqual,
|
Star, Dot, Comma, Dollar, Equal, EqualEqual,
|
||||||
|
|
||||||
Pipe, PipePipe, Caret,
|
Pipe, PipePipe, Caret,
|
||||||
Amp, AmpAmp, Exclaim, ExclaimEqual, Percent, Hash,
|
Amp, AmpAmp, Exclaim, ExclaimEqual, Percent, Hash,
|
||||||
|
@ -74,6 +74,11 @@ AsmToken AsmLexer::LexIdentifier() {
|
|||||||
while (isalnum(*CurPtr) || *CurPtr == '_' || *CurPtr == '$' ||
|
while (isalnum(*CurPtr) || *CurPtr == '_' || *CurPtr == '$' ||
|
||||||
*CurPtr == '.' || *CurPtr == '@')
|
*CurPtr == '.' || *CurPtr == '@')
|
||||||
++CurPtr;
|
++CurPtr;
|
||||||
|
|
||||||
|
// Handle . as a special case.
|
||||||
|
if (CurPtr == TokStart+1 && TokStart[0] == '.')
|
||||||
|
return AsmToken(AsmToken::Dot, StringRef(TokStart, 1));
|
||||||
|
|
||||||
return AsmToken(AsmToken::Identifier, StringRef(TokStart, CurPtr - TokStart));
|
return AsmToken(AsmToken::Identifier, StringRef(TokStart, CurPtr - TokStart));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,6 +209,7 @@ MCSymbol *AsmParser::CreateSymbol(StringRef Name) {
|
|||||||
/// primaryexpr ::= (parenexpr
|
/// primaryexpr ::= (parenexpr
|
||||||
/// primaryexpr ::= symbol
|
/// primaryexpr ::= symbol
|
||||||
/// primaryexpr ::= number
|
/// primaryexpr ::= number
|
||||||
|
/// primaryexpr ::= '.'
|
||||||
/// primaryexpr ::= ~,+,- primaryexpr
|
/// primaryexpr ::= ~,+,- primaryexpr
|
||||||
bool AsmParser::ParsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
|
bool AsmParser::ParsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
|
||||||
switch (Lexer.getKind()) {
|
switch (Lexer.getKind()) {
|
||||||
@ -253,6 +254,17 @@ bool AsmParser::ParsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
|
|||||||
EndLoc = Lexer.getLoc();
|
EndLoc = Lexer.getLoc();
|
||||||
Lex(); // Eat token.
|
Lex(); // Eat token.
|
||||||
return false;
|
return false;
|
||||||
|
case AsmToken::Dot: {
|
||||||
|
// This is a '.' reference, which references the current PC. Emit a
|
||||||
|
// temporary label to the streamer and refer to it.
|
||||||
|
MCSymbol *Sym = Ctx.CreateTempSymbol();
|
||||||
|
Out.EmitLabel(Sym);
|
||||||
|
Res = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None, getContext());
|
||||||
|
EndLoc = Lexer.getLoc();
|
||||||
|
Lex(); // Eat identifier.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
case AsmToken::LParen:
|
case AsmToken::LParen:
|
||||||
Lex(); // Eat the '('.
|
Lex(); // Eat the '('.
|
||||||
return ParseParenExpr(Res, EndLoc);
|
return ParseParenExpr(Res, EndLoc);
|
||||||
|
@ -61,3 +61,14 @@ n:
|
|||||||
|
|
||||||
|
|
||||||
movw $8, (42)+66(%eax)
|
movw $8, (42)+66(%eax)
|
||||||
|
|
||||||
|
// "." support:
|
||||||
|
_f0:
|
||||||
|
L0:
|
||||||
|
jmp L1
|
||||||
|
.long . - L0
|
||||||
|
L1:
|
||||||
|
jmp A
|
||||||
|
.long . - L1
|
||||||
|
|
||||||
|
.zerofill __DATA,_bss,A,0
|
||||||
|
Loading…
Reference in New Issue
Block a user