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:
Chris Lattner 2010-04-14 04:40:28 +00:00
parent ff1ef6bdf1
commit d305035155
4 changed files with 29 additions and 1 deletions

View File

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

View File

@ -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));
} }

View File

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

View File

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