From d9d344b48584727c2690cce89f320ad0a09f659c Mon Sep 17 00:00:00 2001 From: Toma Tabacu Date: Mon, 27 Apr 2015 14:05:04 +0000 Subject: [PATCH] [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 llvm-svn: 235881 --- llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 19 +++++++------------ llvm/test/MC/Mips/set-at-directive-explicit-at.s | 23 ++++++++++++----------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 8643bf3..89742c0 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -436,8 +436,8 @@ public: // 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); }; } @@ -546,7 +546,7 @@ public: /// 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); } @@ -2203,15 +2203,10 @@ bool MipsAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 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 diff --git a/llvm/test/MC/Mips/set-at-directive-explicit-at.s b/llvm/test/MC/Mips/set-at-directive-explicit-at.s index 28a7091..d2d1c1d 100644 --- a/llvm/test/MC/Mips/set-at-directive-explicit-at.s +++ b/llvm/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 @@ foo: 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 -- 2.7.4