[mips] [IAS] Improve warning for using AT with .set noat.

Summary:
Changed the warning message to show the current value of $at, similar to what clang does for typedef's, and renamed warnIfAssemblerTemporary to a more descriptive name.

I also changed the type of variables which store registers from int to unsigned, updated the relevant test and tried to make the related comments clearer.

Reviewers: dsanders

Reviewed By: dsanders

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235881 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Toma Tabacu
2015-04-27 14:05:04 +00:00
parent 659d53e897
commit af3ec2cfd4
2 changed files with 19 additions and 23 deletions

View File

@ -436,8 +436,8 @@ public:
// TODO: see how can we get this info. // TODO: see how can we get this info.
bool abiUsesSoftFloat() const { return false; } bool abiUsesSoftFloat() const { return false; }
/// Warn if RegNo is the current assembler temporary. /// Warn if RegIndex is the same as the current AT.
void warnIfAssemblerTemporary(int RegNo, SMLoc Loc); void warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc);
}; };
} }
@ -546,7 +546,7 @@ public:
/// target. /// target.
unsigned getGPR32Reg() const { unsigned getGPR32Reg() const {
assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!");
AsmParser.warnIfAssemblerTemporary(RegIdx.Index, StartLoc); AsmParser.warnIfRegIndexIsAT(RegIdx.Index, StartLoc);
unsigned ClassID = Mips::GPR32RegClassID; unsigned ClassID = Mips::GPR32RegClassID;
return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
} }
@ -2203,15 +2203,10 @@ bool MipsAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
llvm_unreachable("Implement any new match types added!"); llvm_unreachable("Implement any new match types added!");
} }
void MipsAsmParser::warnIfAssemblerTemporary(int RegIndex, SMLoc Loc) { void MipsAsmParser::warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc) {
if ((RegIndex != 0) && if (RegIndex != 0 && AssemblerOptions.back()->getATRegIndex() == RegIndex)
((int)AssemblerOptions.back()->getATRegIndex() == RegIndex)) { Warning(Loc, "used $at (currently $" + Twine(RegIndex) +
if (RegIndex == 1) ") without \".set noat\"");
Warning(Loc, "used $at without \".set noat\"");
else
Warning(Loc, Twine("used $") + Twine(RegIndex) + " with \".set at=$" +
Twine(RegIndex) + "\"");
}
} }
void void

View File

@ -1,32 +1,34 @@
# RUN: llvm-mc %s -triple=mipsel-unknown-linux -show-encoding -mcpu=mips32r2 \ # RUN: llvm-mc %s -triple=mipsel-unknown-linux -show-encoding -mcpu=mips32r2 \
# RUN: 2>%t1 | FileCheck %s # RUN: 2>%t1 | FileCheck %s
# RUN: FileCheck -check-prefix=WARNINGS %s < %t1 # RUN: FileCheck -check-prefix=WARNINGS %s < %t1
# Check that the assembler can handle the documented syntax
# for ".set at" and set the correct value. The correct value for $at is always # Check that the assembler can handle the documented syntax for ".set at" and
# $1 when written by the user. # will set the correct value for $at.
# Note that writing $at is always the same as writing $1.
.text .text
foo: foo:
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00] # CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
# WARNINGS: :[[@LINE+2]]:11: warning: used $at without ".set noat" # WARNINGS: :[[@LINE+2]]:11: warning: used $at (currently $1) without ".set noat"
.set at=$1 .set at=$1
jr $at jr $at
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00] # CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
# WARNINGS: :[[@LINE+2]]:11: warning: used $at without ".set noat" # WARNINGS: :[[@LINE+2]]:11: warning: used $at (currently $1) without ".set noat"
.set at=$1 .set at=$1
jr $1 jr $1
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00] # CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
# WARNINGS: :[[@LINE+2]]:11: warning: used $at without ".set noat" # WARNINGS: :[[@LINE+2]]:11: warning: used $at (currently $1) without ".set noat"
.set at=$at .set at=$at
jr $at jr $at
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00] # CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
# WARNINGS: :[[@LINE+2]]:11: warning: used $at without ".set noat" # WARNINGS: :[[@LINE+2]]:11: warning: used $at (currently $1) without ".set noat"
.set at=$at .set at=$at
jr $1 jr $1
# WARNINGS-NOT: warning: used $at without ".set noat"
# WARNINGS-NOT: warning: used $at (currently ${{[0-9]+}}) without ".set noat"
# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00] # CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00]
.set at=$2 .set at=$2
jr $at jr $at
@ -41,12 +43,11 @@ foo:
jr $at jr $at
# CHECK: jr $16 # encoding: [0x08,0x00,0x00,0x02] # CHECK: jr $16 # encoding: [0x08,0x00,0x00,0x02]
# WARNINGS: :[[@LINE+2]]:11: warning: used $16 with ".set at=$16" # WARNINGS: :[[@LINE+2]]:11: warning: used $at (currently $16) without ".set noat"
.set at=$16 .set at=$16
jr $s0 jr $s0
# CHECK: jr $16 # encoding: [0x08,0x00,0x00,0x02] # CHECK: jr $16 # encoding: [0x08,0x00,0x00,0x02]
# WARNINGS: :[[@LINE+2]]:11: warning: used $16 with ".set at=$16" # WARNINGS: :[[@LINE+2]]:11: warning: used $at (currently $16) without ".set noat"
.set at=$16 .set at=$16
jr $16 jr $16
# WARNINGS-NOT: warning