MC: Improve some diagnostics on uses of '.' pseudo-symbol.

llvm-svn: 128289
This commit is contained in:
Daniel Dunbar 2011-03-25 17:47:17 +00:00
parent 70235789e1
commit 1cbd2c6c88
2 changed files with 30 additions and 1 deletions

View File

@ -897,12 +897,19 @@ bool AsmParser::ParseStatement() {
return TokError("unexpected token at start of statement");
}
}
} else if (Lexer.is(AsmToken::Dot)) {
// Treat '.' as a valid identifier in this context.
Lex();
IDVal = ".";
} else if (ParseIdentifier(IDVal)) {
if (!TheCondState.Ignore)
return TokError("unexpected token at start of statement");
IDVal = "";
}
// Handle conditional assembly here before checking for skipping. We
// have to do this so that .endif isn't skipped in a ".if 0" block for
// example.
@ -935,6 +942,10 @@ bool AsmParser::ParseStatement() {
// identifier ':' -> Label.
Lex();
// Diagnose attempt to use '.' as a label.
if (IDVal == ".")
return Error(IDLoc, "invalid use of pseudo-symbol '.' as a label");
// Diagnose attempt to use a variable as a label.
//
// FIXME: Diagnostics. Note the location of the definition as a label.
@ -978,7 +989,7 @@ bool AsmParser::ParseStatement() {
return HandleMacroEntry(IDVal, IDLoc, M);
// Otherwise, we have a normal instruction or directive.
if (IDVal[0] == '.') {
if (IDVal[0] == '.' && IDVal != ".") {
// Assembler features
if (IDVal == ".set" || IDVal == ".equ")
return ParseDirectiveSet(IDVal, true);
@ -1306,6 +1317,12 @@ bool AsmParser::ParseAssignment(StringRef Name, bool allow_redef) {
if (Lexer.isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in assignment");
// Error on assignment to '.'.
if (Name == ".") {
return Error(EqualLoc, ("assignment to pseudo-symbol '.' is unsupported "
"(use '.space' or '.org').)"));
}
// Eat the end of statement marker.
Lex();

View File

@ -0,0 +1,12 @@
# Historically 'as' treats '.' as a reference to the current location in
# arbitrary contects. We don't support this in general.
# RUN: not llvm-mc -triple i386-unknown-unknown %s 2> %t
# RUN: FileCheck -input-file %t %s
# CHECK: assignment to pseudo-symbol '.' is unsupported (use '.space' or '.org').
. = . + 8
# CHECK: invalid use of pseudo-symbol '.' as a label
.:
.long 0