[ARM,AArch64] Store source location for values in assembly files
authorOliver Stannard <oliver.stannard@arm.com>
Mon, 16 Nov 2015 16:22:47 +0000 (16:22 +0000)
committerOliver Stannard <oliver.stannard@arm.com>
Mon, 16 Nov 2015 16:22:47 +0000 (16:22 +0000)
The MCValue class can store a SMLoc to allow better error messages to be
emitted if an error is detected after parsing. The ARM and AArch64 assembly
parsers were not setting this, so error messages did not have source
information.

Differential Revision: http://reviews.llvm.org/D14645

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

lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
lib/Target/AArch64/MCTargetDesc/AArch64ELFStreamer.cpp
lib/Target/ARM/AsmParser/ARMAsmParser.cpp
lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
test/MC/AArch64/error-location.s [new file with mode: 0644]
test/MC/ARM/error-location.s [new file with mode: 0644]

index a1f32e099e3a633aa0de85e64ee0f873c82aab34..3038ca5f90ab74504ea187cceeea819569d794b9 100644 (file)
@@ -4131,7 +4131,7 @@ bool AArch64AsmParser::parseDirectiveWord(unsigned Size, SMLoc L) {
       if (getParser().parseExpression(Value))
         return true;
 
       if (getParser().parseExpression(Value))
         return true;
 
-      getParser().getStreamer().EmitValue(Value, Size);
+      getParser().getStreamer().EmitValue(Value, Size, L);
 
       if (getLexer().is(AsmToken::EndOfStatement))
         break;
 
       if (getLexer().is(AsmToken::EndOfStatement))
         break;
index caa1cfcb79bdba948e9ace1a4ce539a747a9e802..d26604f5765db9c9837d8f918ec06a1a21391b08 100644 (file)
@@ -130,7 +130,7 @@ public:
   /// if necessary.
   void EmitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) override {
     EmitDataMappingSymbol();
   /// if necessary.
   void EmitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) override {
     EmitDataMappingSymbol();
-    MCELFStreamer::EmitValueImpl(Value, Size);
+    MCELFStreamer::EmitValueImpl(Value, Size, Loc);
   }
 
 private:
   }
 
 private:
index 5724d471d4f701c9f0b088d9e1f41dce6edce4c0..7540c21d36a8b0a16f85934dbd7df53d2a7a9c2e 100644 (file)
@@ -8801,7 +8801,7 @@ bool ARMAsmParser::parseLiteralValues(unsigned Size, SMLoc L) {
         return false;
       }
 
         return false;
       }
 
-      getParser().getStreamer().EmitValue(Value, Size);
+      getParser().getStreamer().EmitValue(Value, Size, L);
 
       if (getLexer().is(AsmToken::EndOfStatement))
         break;
 
       if (getLexer().is(AsmToken::EndOfStatement))
         break;
index 8997f325b5890b671ed6a86dd03fef85f59faf7a..bff5df6e3c451c133d357f9ea4214b44d93df449 100644 (file)
@@ -513,7 +513,7 @@ public:
         getContext().reportFatalError(Loc, "relocated expression must be 32-bit");
 
     EmitDataMappingSymbol();
         getContext().reportFatalError(Loc, "relocated expression must be 32-bit");
 
     EmitDataMappingSymbol();
-    MCELFStreamer::EmitValueImpl(Value, Size);
+    MCELFStreamer::EmitValueImpl(Value, Size, Loc);
   }
 
   void EmitAssemblerFlag(MCAssemblerFlag Flag) override {
   }
 
   void EmitAssemblerFlag(MCAssemblerFlag Flag) override {
diff --git a/test/MC/AArch64/error-location.s b/test/MC/AArch64/error-location.s
new file mode 100644 (file)
index 0000000..988eae7
--- /dev/null
@@ -0,0 +1,5 @@
+// RUN: not llvm-mc -triple aarch64--none-eabi -filetype obj < %s -o /dev/null 2>&1 | FileCheck %s
+
+  .text
+// CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: symbol 'undef' can not be undefined in a subtraction expression
+  .word (0-undef)
diff --git a/test/MC/ARM/error-location.s b/test/MC/ARM/error-location.s
new file mode 100644 (file)
index 0000000..99696a3
--- /dev/null
@@ -0,0 +1,5 @@
+@ RUN: not llvm-mc -triple armv7a--none-eabi -filetype obj < %s -o /dev/null 2>&1 | FileCheck %s
+
+  .text
+@ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: symbol 'undef' can not be undefined in a subtraction expression
+  .word (0-undef)