From 61bc405795c5902746bb731af0481364ddfa61fa Mon Sep 17 00:00:00 2001 From: Daniel Sanders Date: Fri, 3 Oct 2014 15:37:37 +0000 Subject: [PATCH] [mips] Print warning when using register names not available in N32/64 Summary: The register names t4-t7 are not available in the N32 and N64 ABIs. This patch prints a warning, when those names are used in N32/64, along with a fix-it with the correct register names. Patch by Vasileios Kalintiris Reviewers: dsanders Reviewed By: dsanders Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D5272 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218989 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCParser/MCAsmLexer.h | 1 + lib/MC/MCParser/MCAsmLexer.cpp | 4 +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 30 ++++++++++++++++++++ test/MC/Mips/mips64-register-names-n32-n64.s | 26 +++++++++++++++-- 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/include/llvm/MC/MCParser/MCAsmLexer.h b/include/llvm/MC/MCParser/MCAsmLexer.h index e3d4181e086..59bed0901ad 100644 --- a/include/llvm/MC/MCParser/MCAsmLexer.h +++ b/include/llvm/MC/MCParser/MCAsmLexer.h @@ -74,6 +74,7 @@ public: SMLoc getLoc() const; SMLoc getEndLoc() const; + SMRange getLocRange() const; /// getStringContents - Get the contents of a string token (without quotes). StringRef getStringContents() const { diff --git a/lib/MC/MCParser/MCAsmLexer.cpp b/lib/MC/MCParser/MCAsmLexer.cpp index 530814b006f..795cc85ef54 100644 --- a/lib/MC/MCParser/MCAsmLexer.cpp +++ b/lib/MC/MCParser/MCAsmLexer.cpp @@ -30,3 +30,7 @@ SMLoc AsmToken::getLoc() const { SMLoc AsmToken::getEndLoc() const { return SMLoc::getFromPointer(Str.data() + Str.size()); } + +SMRange AsmToken::getLocRange() const { + return SMRange(getLoc(), getEndLoc()); +} diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 2b416b30e3c..7eda4caa693 100644 --- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -27,6 +27,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/TargetRegistry.h" +#include "llvm/Support/SourceMgr.h" #include using namespace llvm; @@ -101,6 +102,10 @@ class MipsAsmParser : public MCTargetAsmParser { // selected. This usually happens after an '.end func' // directive. + // Print a warning along with its fix-it message at the given range. + void printWarningWithFixIt(const Twine &Msg, const Twine &FixMsg, + SMRange Range, bool ShowColors = true); + #define GET_ASSEMBLER_HEADER #include "MipsGenAsmMatcher.inc" @@ -1619,6 +1624,14 @@ void MipsAsmParser::warnIfAssemblerTemporary(int RegIndex, SMLoc Loc) { } } +void +MipsAsmParser::printWarningWithFixIt(const Twine &Msg, const Twine &FixMsg, + SMRange Range, bool ShowColors) { + getSourceManager().PrintMessage(Range.Start, SourceMgr::DK_Warning, Msg, + { Range }, { SMFixIt(Range, FixMsg) }, + ShowColors); +} + int MipsAsmParser::matchCPURegisterName(StringRef Name) { int CC; @@ -1661,6 +1674,23 @@ int MipsAsmParser::matchCPURegisterName(StringRef Name) { if (!(isABI_N32() || isABI_N64())) return CC; + if (12 <= CC && CC <= 15) { + // Name is one of t4-t7 + AsmToken RegTok = getLexer().peekTok(); + SMRange RegRange = RegTok.getLocRange(); + + StringRef FixedName = StringSwitch(Name) + .Case("t4", "t0") + .Case("t5", "t1") + .Case("t6", "t2") + .Case("t7", "t3") + .Default(""); + assert(FixedName != "" && "Register name is not one of t4-t7."); + + printWarningWithFixIt("register names $t4-$t7 are only available in O32.", + "Did you mean $" + FixedName + "?", RegRange); + } + // Although SGI documentation just cuts out t0-t3 for n32/n64, // GNU pushes the values of t0-t3 to override the o32/o64 values for t4-t7 // We are supporting both cases, so for t0-t3 we'll just push them to t4-t7. diff --git a/test/MC/Mips/mips64-register-names-n32-n64.s b/test/MC/Mips/mips64-register-names-n32-n64.s index ee6f88fe6ab..efe1cdb4804 100644 --- a/test/MC/Mips/mips64-register-names-n32-n64.s +++ b/test/MC/Mips/mips64-register-names-n32-n64.s @@ -1,7 +1,11 @@ -# RUN: llvm-mc %s -triple=mips64-unknown-freebsd -show-encoding | FileCheck %s +# RUN: llvm-mc %s -triple=mips64-unknown-freebsd -show-encoding 2>%t0 \ +# RUN: | FileCheck %s +# RUN: FileCheck -check-prefix=WARNING %s < %t0 +# # RUN: llvm-mc %s -triple=mips64-unknown-freebsd -show-encoding \ -# RUN: -mattr=-n64,+n32 | FileCheck %s - +# RUN: -mattr=-n64,+n32 2>%t1 | FileCheck %s +# RUN: FileCheck -check-prefix=WARNING %s < %t1 +# # Check that the register names are mapped to their correct numbers for n32/n64 # Second byte of addiu with $zero at rt contains the number of the source # register. @@ -23,9 +27,25 @@ daddiu $t0, $zero, 0 # [*] # CHECK: encoding: [0x64,0x0c,0x00,0x00] daddiu $t1, $zero, 0 # [*] # CHECK: encoding: [0x64,0x0d,0x00,0x00] daddiu $t2, $zero, 0 # [*] # CHECK: encoding: [0x64,0x0e,0x00,0x00] daddiu $t3, $zero, 0 # [*] # CHECK: encoding: [0x64,0x0f,0x00,0x00] +# WARNING: mips64-register-names-n32-n64.s:[[@LINE+4]]:9: warning: register names $t4-$t7 are only available in O32. +# WARNING-NEXT: daddiu $t4, $zero, 0 # {{CHECK}}: encoding: [0x64,0x0c,0x00,0x00] +# WARNING-NEXT: ^~ +# WARNING-NEXT: Did you mean $t0? daddiu $t4, $zero, 0 # CHECK: encoding: [0x64,0x0c,0x00,0x00] +# WARNING: mips64-register-names-n32-n64.s:[[@LINE+4]]:9: warning: register names $t4-$t7 are only available in O32. +# WARNING-NEXT: daddiu $t5, $zero, 0 # {{CHECK}}: encoding: [0x64,0x0d,0x00,0x00] +# WARNING-NEXT: ^~ +# WARNING-NEXT: Did you mean $t1? daddiu $t5, $zero, 0 # CHECK: encoding: [0x64,0x0d,0x00,0x00] +# WARNING: mips64-register-names-n32-n64.s:[[@LINE+4]]:9: warning: register names $t4-$t7 are only available in O32. +# WARNING-NEXT: daddiu $t6, $zero, 0 # {{CHECK}}: encoding: [0x64,0x0e,0x00,0x00] +# WARNING-NEXT: ^~ +# WARNING-NEXT: Did you mean $t2? daddiu $t6, $zero, 0 # CHECK: encoding: [0x64,0x0e,0x00,0x00] +# WARNING: mips64-register-names-n32-n64.s:[[@LINE+4]]:9: warning: register names $t4-$t7 are only available in O32. +# WARNING-NEXT: daddiu $t7, $zero, 0 # {{CHECK}}: encoding: [0x64,0x0f,0x00,0x00] +# WARNING-NEXT: ^~ +# WARNING-NEXT: Did you mean $t3? daddiu $t7, $zero, 0 # CHECK: encoding: [0x64,0x0f,0x00,0x00] daddiu $s0, $zero, 0 # CHECK: encoding: [0x64,0x10,0x00,0x00] daddiu $s1, $zero, 0 # CHECK: encoding: [0x64,0x11,0x00,0x00] -- 2.34.1