Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -433,8 +433,8 @@ // TODO: see how can we get this info. bool abiUsesSoftFloat() const { return false; } - /// Warn if RegNo is the current assembler temporary. - void warnIfAssemblerTemporary(int RegNo, SMLoc Loc); + /// Warn if RegIndex is the same as the current AT. + void warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc); }; } @@ -543,7 +543,7 @@ /// target. unsigned getGPR32Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); - AsmParser.warnIfAssemblerTemporary(RegIdx.Index, StartLoc); + AsmParser.warnIfRegIndexIsAT(RegIdx.Index, StartLoc); unsigned ClassID = Mips::GPR32RegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); } @@ -2202,15 +2202,10 @@ llvm_unreachable("Implement any new match types added!"); } -void MipsAsmParser::warnIfAssemblerTemporary(int RegIndex, SMLoc Loc) { - if ((RegIndex != 0) && - ((int)AssemblerOptions.back()->getATRegIndex() == RegIndex)) { - if (RegIndex == 1) - Warning(Loc, "used $at without \".set noat\""); - else - Warning(Loc, Twine("used $") + Twine(RegIndex) + " with \".set at=$" + - Twine(RegIndex) + "\""); - } +void MipsAsmParser::warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc) { + if (RegIndex != 0 && AssemblerOptions.back()->getATRegIndex() == RegIndex) + Warning(Loc, "used $at (currently $" + Twine(RegIndex) + + ") without \".set noat\""); } void Index: test/MC/Mips/set-at-directive-explicit-at.s =================================================================== --- test/MC/Mips/set-at-directive-explicit-at.s +++ test/MC/Mips/set-at-directive-explicit-at.s @@ -1,32 +1,34 @@ # RUN: llvm-mc %s -triple=mipsel-unknown-linux -show-encoding -mcpu=mips32r2 \ # RUN: 2>%t1 | FileCheck %s # 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 -# $1 when written by the user. + +# Check that the assembler can handle the documented syntax for ".set at" and +# will set the correct value for $at. +# Note that writing $at is always the same as writing $1. + .text foo: # 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 jr $at # 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 jr $1 # 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 jr $at # 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 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] .set at=$2 jr $at @@ -41,12 +43,11 @@ jr $at # 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 jr $s0 # 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 jr $16 -# WARNINGS-NOT: warning