MCParser: introduce Note and use it for ARM AsmParser
authorSaleem Abdulrasool <compnerd@compnerd.org>
Tue, 7 Jan 2014 02:28:31 +0000 (02:28 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Tue, 7 Jan 2014 02:28:31 +0000 (02:28 +0000)
Introduce a new virtual method Note into the AsmParser.  This completements the
existing Warning and Error methods.  Use the new method to clean up the output
of the unwind routines in the ARM AsmParser.

llvm-svn: 198661

llvm/include/llvm/MC/MCParser/MCAsmParser.h
llvm/lib/MC/MCParser/AsmParser.cpp
llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
llvm/test/MC/ARM/eh-directive-cantunwind-diagnostics.s
llvm/test/MC/ARM/eh-directive-fnstart-diagnostics.s

index 1d15534..0389caa 100644 (file)
@@ -118,6 +118,10 @@ public:
                                 const MCInstPrinter *IP,
                                 MCAsmParserSemaCallback &SI) = 0;
 
+  /// Note - Emit a note at the location \p L, with the message \p Msg.
+  virtual void Note(SMLoc L, const Twine &Msg,
+                    ArrayRef<SMRange> Ranges = None) = 0;
+
   /// Warning - Emit a warning at the location \p L, with the message \p Msg.
   ///
   /// \return The return value is true, if warnings are fatal.
index 4b83144..451ae7a 100644 (file)
@@ -211,6 +211,7 @@ public:
     AssemblerDialect = i;
   }
 
+  virtual void Note(SMLoc L, const Twine &Msg, ArrayRef<SMRange> Ranges = None);
   virtual bool Warning(SMLoc L, const Twine &Msg,
                        ArrayRef<SMRange> Ranges = None);
   virtual bool Error(SMLoc L, const Twine &Msg,
@@ -537,6 +538,11 @@ void AsmParser::printMacroInstantiations() {
                  "while in macro instantiation");
 }
 
+void AsmParser::Note(SMLoc L, const Twine &Msg, ArrayRef<SMRange> Ranges) {
+  printMessage(L, SourceMgr::DK_Note, Msg, Ranges);
+  printMacroInstantiations();
+}
+
 bool AsmParser::Warning(SMLoc L, const Twine &Msg, ArrayRef<SMRange> Ranges) {
   if (FatalAssemblerWarnings)
     return Error(L, Msg, Ranges);
index b57527c..be148ca 100644 (file)
@@ -190,6 +190,9 @@ class ARMAsmParser : public MCTargetAsmParser {
   MCAsmParser &getParser() const { return Parser; }
   MCAsmLexer &getLexer() const { return Parser.getLexer(); }
 
+  void Note(SMLoc L, const Twine &Msg, ArrayRef<SMRange> Ranges = None) {
+    return Parser.Note(L, Msg, Ranges);
+  }
   bool Warning(SMLoc L, const Twine &Msg,
                ArrayRef<SMRange> Ranges = None) {
     return Parser.Warning(L, Msg, Ranges);
@@ -8245,7 +8248,7 @@ bool ARMAsmParser::parseDirectiveFPU(SMLoc L) {
 bool ARMAsmParser::parseDirectiveFnStart(SMLoc L) {
   if (FnStartLoc.isValid()) {
     Error(L, ".fnstart starts before the end of previous one");
-    Error(FnStartLoc, "previous .fnstart starts here");
+    Note(FnStartLoc, "previous .fnstart starts here");
     return false;
   }
 
@@ -8280,12 +8283,12 @@ bool ARMAsmParser::parseDirectiveCantUnwind(SMLoc L) {
   }
   if (HandlerDataLoc.isValid()) {
     Error(L, ".cantunwind can't be used with .handlerdata directive");
-    Error(HandlerDataLoc, ".handlerdata was specified here");
+    Note(HandlerDataLoc, ".handlerdata was specified here");
     return false;
   }
   if (PersonalityLoc.isValid()) {
     Error(L, ".cantunwind can't be used with .personality directive");
-    Error(PersonalityLoc, ".personality was specified here");
+    Note(PersonalityLoc, ".personality was specified here");
     return false;
   }
 
@@ -8304,12 +8307,12 @@ bool ARMAsmParser::parseDirectivePersonality(SMLoc L) {
   }
   if (CantUnwindLoc.isValid()) {
     Error(L, ".personality can't be used with .cantunwind directive");
-    Error(CantUnwindLoc, ".cantunwind was specified here");
+    Note(CantUnwindLoc, ".cantunwind was specified here");
     return false;
   }
   if (HandlerDataLoc.isValid()) {
     Error(L, ".personality must precede .handlerdata directive");
-    Error(HandlerDataLoc, ".handlerdata was specified here");
+    Note(HandlerDataLoc, ".handlerdata was specified here");
     return false;
   }
 
@@ -8338,7 +8341,7 @@ bool ARMAsmParser::parseDirectiveHandlerData(SMLoc L) {
   }
   if (CantUnwindLoc.isValid()) {
     Error(L, ".handlerdata can't be used with .cantunwind directive");
-    Error(CantUnwindLoc, ".cantunwind was specified here");
+    Note(CantUnwindLoc, ".cantunwind was specified here");
     return false;
   }
 
index 640cc30..9eca164 100644 (file)
@@ -24,7 +24,7 @@ func1:
 @ CHECK: error: .personality can't be used with .cantunwind directive
 @ CHECK:        .personality __gxx_personality_v0
 @ CHECK:        ^
-@ CHECK: error: .cantunwind was specified here
+@ CHECK: note: .cantunwind was specified here
 @ CHECK:        .cantunwind
 @ CHECK:        ^
         .fnend
@@ -44,7 +44,7 @@ func2:
 @ CHECK: error: .handlerdata can't be used with .cantunwind directive
 @ CHECK:        .handlerdata
 @ CHECK:        ^
-@ CHECK: error: .cantunwind was specified here
+@ CHECK: note: .cantunwind was specified here
 @ CHECK:        .cantunwind
 @ CHECK:        ^
         .fnend
@@ -64,7 +64,7 @@ func3:
 @ CHECK: error: .cantunwind can't be used with .personality directive
 @ CHECK:        .cantunwind
 @ CHECK:        ^
-@ CHECK: error: .personality was specified here
+@ CHECK: note: .personality was specified here
 @ CHECK:        .personality __gxx_personality_v0
 @ CHECK:        ^
         .fnend
@@ -84,7 +84,7 @@ func4:
 @ CHECK: error: .cantunwind can't be used with .handlerdata directive
 @ CHECK:        .cantunwind
 @ CHECK:        ^
-@ CHECK: error: .handlerdata was specified here
+@ CHECK: note: .handlerdata was specified here
 @ CHECK:        .handlerdata
 @ CHECK:        ^
         .fnend
index 75ddd9f..fe2ba03 100644 (file)
@@ -24,7 +24,7 @@ func1:
 @ CHECK: error: .fnstart starts before the end of previous one
 @ CHECK:        .fnstart
 @ CHECK:        ^
-@ CHECK: error: previous .fnstart starts here
+@ CHECK: note: previous .fnstart starts here
 @ CHECK:        .fnstart
 @ CHECK:        ^
 func2: