OSDN Git Service

[Hexagon] Give better error messages for solo instruction errors
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>
Mon, 1 May 2017 20:06:01 +0000 (20:06 +0000)
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>
Mon, 1 May 2017 20:06:01 +0000 (20:06 +0000)
Patch by Colin LeMahieu.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301827 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp
lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h
test/MC/Hexagon/PacketRules/solo.s [new file with mode: 0644]
test/MC/Hexagon/multiple_errs.s [new file with mode: 0644]

index 43f7581..36e0aee 100644 (file)
@@ -484,16 +484,16 @@ bool HexagonMCChecker::checkRegisters() {
 
 // Check for legal use of solo insns.
 bool HexagonMCChecker::checkSolo() {
-  if (HexagonMCInstrInfo::isBundle(MCB) &&
-      HexagonMCInstrInfo::bundleSize(MCB) > 1) {
+  if (HexagonMCInstrInfo::bundleSize(MCB) > 1)
     for (auto const &I : HexagonMCInstrInfo::bundleInstructions(MCB)) {
       if (llvm::HexagonMCInstrInfo::isSolo(MCII, *I.getInst())) {
-        reportError(
-            "instruction cannot appear in packet with other instructions");
+        SMLoc Loc = I.getInst()->getLoc();
+        reportError(Loc, "Instruction is marked `isSolo' and "
+                         "cannot have other instructions in "
+                         "the same packet");
         return false;
       }
     }
-  }
 
   return true;
 }
@@ -575,8 +575,12 @@ void HexagonMCChecker::reportErrorNewValue(unsigned Register) {
 }
 
 void HexagonMCChecker::reportError(llvm::Twine const &Msg) {
+  reportError(MCB.getLoc(), Msg);
+}
+
+void HexagonMCChecker::reportError(SMLoc Loc, llvm::Twine const &Msg) {
   if (ReportErrors)
-    Context.reportError(MCB.getLoc(), Msg);
+    Context.reportError(Loc, Msg);
 }
 
 void HexagonMCChecker::reportWarning(llvm::Twine const &Msg) {
index c1a29ea..69c0ef2 100644 (file)
@@ -118,7 +118,6 @@ class HexagonMCChecker {
   bool checkSolo();
   bool checkShuffle();
   bool checkSlots();
-  bool checkSize();
 
   static void compoundRegisterMap(unsigned &);
 
@@ -141,6 +140,7 @@ public:
   bool check(bool FullCheck = true);
   void reportErrorRegisters(unsigned Register);
   void reportErrorNewValue(unsigned Register);
+  void reportError(SMLoc Loc, llvm::Twine const &Msg);
   void reportError(llvm::Twine const &Msg);
   void reportWarning(llvm::Twine const &Msg);
 };
diff --git a/test/MC/Hexagon/PacketRules/solo.s b/test/MC/Hexagon/PacketRules/solo.s
new file mode 100644 (file)
index 0000000..86107d5
--- /dev/null
@@ -0,0 +1,5 @@
+# RUN: not llvm-mc -arch=hexagon -filetype=asm %s 2>%t; FileCheck %s <%t
+
+{ brkpt
+  r0 = r0 }
+# CHECK: 3:3: error: Instruction is marked `isSolo' and cannot have other instructions in the same packet
diff --git a/test/MC/Hexagon/multiple_errs.s b/test/MC/Hexagon/multiple_errs.s
new file mode 100644 (file)
index 0000000..cd04c0e
--- /dev/null
@@ -0,0 +1,10 @@
+# RUN: not llvm-mc -arch=hexagon -filetype=asm %s 2> %t; FileCheck %s < %t
+#
+
+{
+  if (!p0) r0=r1;
+  if (!p0) r0=r2;
+  trap0(#15);
+}
+# CHECK: error: register `R0' modified more than once
+# CHECK: error: Instruction is marked `isSolo' and cannot have other instructions in the same packet