[mips] Report correct location when "erroring" about the use of $at when it's not available.

Summary: This removes the FIXMEs from test/MC/Mips/mips-noat.s.

Reviewers: dsanders

Reviewed By: dsanders

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

llvm-svn: 211168
This commit is contained in:
Matheus Almeida 2014-06-18 14:46:05 +00:00
parent 5c14b06940
commit 7de68e77aa
2 changed files with 16 additions and 14 deletions

View File

@ -203,7 +203,7 @@ class MipsAsmParser : public MCTargetAsmParser {
unsigned getGPR(int RegNo); unsigned getGPR(int RegNo);
int getATReg(); int getATReg(SMLoc Loc);
bool processInstruction(MCInst &Inst, SMLoc IDLoc, bool processInstruction(MCInst &Inst, SMLoc IDLoc,
SmallVectorImpl<MCInst> &Instructions); SmallVectorImpl<MCInst> &Instructions);
@ -1149,9 +1149,15 @@ void MipsAsmParser::expandMemInst(MCInst &Inst, SMLoc IDLoc,
// but for stores we must use $at. // but for stores we must use $at.
if (isLoad && (BaseRegNum != RegOpNum)) if (isLoad && (BaseRegNum != RegOpNum))
TmpRegNum = RegOpNum; TmpRegNum = RegOpNum;
else else {
TmpRegNum = getReg( int AT = getATReg(IDLoc);
(isGP64()) ? Mips::GPR64RegClassID : Mips::GPR32RegClassID, getATReg()); // At this point we need AT to perform the expansions and we exit if it is
// not available.
if (!AT)
return;
TmpRegNum =
getReg((isGP64()) ? Mips::GPR64RegClassID : Mips::GPR32RegClassID, AT);
}
TempInst.setOpcode(Mips::LUi); TempInst.setOpcode(Mips::LUi);
TempInst.addOperand(MCOperand::CreateReg(TmpRegNum)); TempInst.addOperand(MCOperand::CreateReg(TmpRegNum));
@ -1408,10 +1414,11 @@ bool MipsAssemblerOptions::setATReg(unsigned Reg) {
return true; return true;
} }
int MipsAsmParser::getATReg() { int MipsAsmParser::getATReg(SMLoc Loc) {
int AT = Options.getATRegNum(); int AT = Options.getATRegNum();
if (AT == 0) if (AT == 0)
TokError("Pseudo instruction requires $at, which is not available"); reportParseError(Loc,
"Pseudo instruction requires $at, which is not available");
return AT; return AT;
} }

View File

@ -10,11 +10,10 @@
test1: test1:
lw $2, 65536($2) lw $2, 65536($2)
# FIXME: It would be better if the error pointed at the mnemonic instead of the newline
# ERROR: mips-noat.s:[[@LINE+4]]:1: error: Pseudo instruction requires $at, which is not available
test2: test2:
.set noat .set noat
lw $2, 65536($2) lw $2, 65536($2) # ERROR: mips-noat.s:[[@LINE]]:9: error: Pseudo instruction requires $at, which is not available
# Can we switch it back on successfully? # Can we switch it back on successfully?
# CHECK-LABEL: test3: # CHECK-LABEL: test3:
@ -25,10 +24,6 @@ test3:
.set at .set at
lw $2, 65536($2) lw $2, 65536($2)
# FIXME: It would be better if the error pointed at the mnemonic instead of the newline
# ERROR: mips-noat.s:[[@LINE+4]]:1: error: Pseudo instruction requires $at, which is not available
test4: test4:
.set at=$0 .set at=$0
lw $2, 65536($2) lw $2, 65536($2) # ERROR: mips-noat.s:[[@LINE]]:9: error: Pseudo instruction requires $at, which is not available
# ERROR-NOT: error