Fix Mips Parser error reporting

[mips] On error, ParseDirective should always return false to signify that the
directive was understood.

Reviewers: dsanders, vkalintiris, sdardis

Subscribers: dsanders, llvm-commits, sdardis

Differential Revision: http://reviews.llvm.org/D19929

llvm-svn: 268630
This commit is contained in:
Nirav Dave 2016-05-05 14:15:46 +00:00
parent f8cbd6591f
commit 996fc133b7
2 changed files with 57 additions and 28 deletions

View File

@ -4830,6 +4830,8 @@ bool MipsAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
return false;
}
// FIXME: Given that these have the same name, these should both be
// consistent on affecting the Parser.
bool MipsAsmParser::reportParseError(Twine ErrorMsg) {
MCAsmParser &Parser = getParser();
SMLoc Loc = getLexer().getLoc();
@ -5438,7 +5440,6 @@ bool MipsAsmParser::parseDirectiveCPSetup() {
OperandMatchResultTy ResTy = parseAnyRegister(TmpReg);
if (ResTy == MatchOperand_NoMatch) {
reportParseError("expected register containing function address");
Parser.eatToEndOfStatement();
return false;
}
@ -5985,13 +5986,22 @@ bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI,
}
bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
// This returns false if this function recognizes the directive
// regardless of whether it is successfully handles or reports an
// error. Otherwise it returns true to give the generic parser a
// chance at recognizing it.
MCAsmParser &Parser = getParser();
StringRef IDVal = DirectiveID.getString();
if (IDVal == ".cpload")
return parseDirectiveCpLoad(DirectiveID.getLoc());
if (IDVal == ".cprestore")
return parseDirectiveCpRestore(DirectiveID.getLoc());
if (IDVal == ".cpload") {
parseDirectiveCpLoad(DirectiveID.getLoc());
return false;
}
if (IDVal == ".cprestore") {
parseDirectiveCpRestore(DirectiveID.getLoc());
return false;
}
if (IDVal == ".dword") {
parseDataDirective(8, DirectiveID.getLoc());
return false;
@ -6148,7 +6158,8 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
}
if (IDVal == ".set") {
return parseDirectiveSet();
parseDirectiveSet();
return false;
}
if (IDVal == ".mask" || IDVal == ".fmask") {
@ -6232,8 +6243,10 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
return false;
}
if (IDVal == ".option")
return parseDirectiveOption();
if (IDVal == ".option") {
parseDirectiveOption();
return false;
}
if (IDVal == ".abicalls") {
getTargetStreamer().emitDirectiveAbiCalls();
@ -6246,25 +6259,34 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
return false;
}
if (IDVal == ".cpsetup")
return parseDirectiveCPSetup();
if (IDVal == ".cpreturn")
return parseDirectiveCPReturn();
if (IDVal == ".module")
return parseDirectiveModule();
if (IDVal == ".llvm_internal_mips_reallow_module_directive")
return parseInternalDirectiveReallowModule();
if (IDVal == ".insn")
return parseInsnDirective();
if (IDVal == ".sbss")
return parseSSectionDirective(IDVal, ELF::SHT_NOBITS);
if (IDVal == ".sdata")
return parseSSectionDirective(IDVal, ELF::SHT_PROGBITS);
if (IDVal == ".cpsetup") {
parseDirectiveCPSetup();
return false;
}
if (IDVal == ".cpreturn") {
parseDirectiveCPReturn();
return false;
}
if (IDVal == ".module") {
parseDirectiveModule();
return false;
}
if (IDVal == ".llvm_internal_mips_reallow_module_directive") {
parseInternalDirectiveReallowModule();
return false;
}
if (IDVal == ".insn") {
parseInsnDirective();
return false;
}
if (IDVal == ".sbss") {
parseSSectionDirective(IDVal, ELF::SHT_NOBITS);
return false;
}
if (IDVal == ".sdata") {
parseSSectionDirective(IDVal, ELF::SHT_PROGBITS);
return false;
}
return true;
}

View File

@ -1,23 +1,30 @@
# RUN: not llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 2>%t1
# RUN: FileCheck %s < %t1
# Check only one error per statement.
.text
.set pop
# CHECK: :[[@LINE-1]]:14: error: .set pop with no .set push
# CHECK-NOT: :[[@LINE-1]]:
.set push
.set pop
.set pop
# CHECK: :[[@LINE-1]]:14: error: .set pop with no .set push
# CHECK-NOT: :[[@LINE-1]]:
.set push foo
# CHECK: :[[@LINE-1]]:19: error: unexpected token, expected end of statement
# CHECK-NOT: :[[@LINE-1]]:
.set pop bar
# CHECK: :[[@LINE-1]]:18: error: unexpected token, expected end of statement
# CHECK-NOT: :[[@LINE-1]]:
.set hardfloat
.set push
.set softfloat
add.s $f2, $f2, $f2
# CHECK: :[[@LINE-1]]:9: error: instruction requires a CPU feature not currently enabled
# CHECK-NOT: :[[@LINE-1]]:
.set pop
add.s $f2, $f2, $f2
# CHECK-NOT: :[[@LINE-1]]:9: error: instruction requires a CPU feature not currently enabled
# CHECK-NOT: :[[@LINE-1]]: