mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-27 05:10:41 +00:00
MC: Improve some diagnostics on uses of '.' pseudo-symbol.
llvm-svn: 128289
This commit is contained in:
parent
70235789e1
commit
1cbd2c6c88
@ -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();
|
||||
|
||||
|
12
test/MC/AsmParser/dot-symbol.s
Normal file
12
test/MC/AsmParser/dot-symbol.s
Normal 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
|
Loading…
Reference in New Issue
Block a user