Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -423,8 +423,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 RegNo is the same as the current AT. + void warnIfRegIsAT(unsigned RegNo, SMLoc Loc); }; } @@ -533,7 +533,7 @@ /// target. unsigned getGPR32Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); - AsmParser.warnIfAssemblerTemporary(RegIdx.Index, StartLoc); + AsmParser.warnIfRegIsAT(RegIdx.Index, StartLoc); unsigned ClassID = Mips::GPR32RegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); } @@ -2194,15 +2194,10 @@ llvm_unreachable("Implement any new match types added!"); } -void MipsAsmParser::warnIfAssemblerTemporary(int RegIndex, SMLoc Loc) { - if ((RegIndex != 0) && - ((int)AssemblerOptions.back()->getATRegNum() == 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::warnIfRegIsAT(unsigned RegNo, SMLoc Loc) { + if (RegNo != 0 && AssemblerOptions.back()->getATRegNum() == RegNo) + Warning(Loc, + "used $at (aka $" + Twine(RegNo) + ") 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,31 +1,33 @@ # 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 (aka $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 (aka $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 (aka $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 (aka $1) without ".set noat" .set at=$at jr $1 -# WARNINGS-NOT: warning: used $at without ".set noat" +# WARNINGS-NOT: warning: used $at (aka $1) without ".set noat" # CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00] .set at=$2 @@ -41,12 +43,12 @@ 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 (aka $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 (aka $16) without ".set noat" .set at=$16 jr $16 # WARNINGS-NOT: warning