[llvm] r209387 - MC: formalise some assertions into proper errors

Saleem Abdulrasool compnerd at compnerd.org
Wed May 21 19:18:11 PDT 2014


Author: compnerd
Date: Wed May 21 21:18:10 2014
New Revision: 209387

URL: http://llvm.org/viewvc/llvm-project?rev=209387&view=rev
Log:
MC: formalise some assertions into proper errors

Now that clang can be used as an assembler via the IAS, invalid assembler inputs
would cause the assertions to trigger.  Although we cannot recover from the
errors here, nor provide caret diagnostics, attempt to handle them slightly more
gracefully by reporting a fatal error.

Added:
    llvm/trunk/test/MC/COFF/invalid-def.s
    llvm/trunk/test/MC/COFF/invalid-endef.s
    llvm/trunk/test/MC/COFF/invalid-scl-range.s
    llvm/trunk/test/MC/COFF/invalid-scl.s
    llvm/trunk/test/MC/COFF/invalid-type-range.s
    llvm/trunk/test/MC/COFF/invalid-type.s
Modified:
    llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h
    llvm/trunk/lib/MC/WinCOFFStreamer.cpp

Modified: llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h?rev=209387&r1=209386&r2=209387&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h (original)
+++ llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h Wed May 21 21:18:10 2014
@@ -65,6 +65,9 @@ public:
 protected:
   const MCSymbol *CurSymbol;
   void EmitInstToData(const MCInst &Inst, const MCSubtargetInfo &STI) override;
+
+private:
+  LLVM_ATTRIBUTE_NORETURN void FatalError(const Twine &Msg) const;
 };
 }
 

Modified: llvm/trunk/lib/MC/WinCOFFStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFStreamer.cpp?rev=209387&r1=209386&r2=209387&view=diff
==============================================================================
--- llvm/trunk/lib/MC/WinCOFFStreamer.cpp (original)
+++ llvm/trunk/lib/MC/WinCOFFStreamer.cpp Wed May 21 21:18:10 2014
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/ADT/StringExtras.h"
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCAsmLayout.h"
@@ -125,30 +126,39 @@ void MCWinCOFFStreamer::BeginCOFFSymbolD
   assert((!Symbol->isInSection() ||
           Symbol->getSection().getVariant() == MCSection::SV_COFF) &&
          "Got non-COFF section in the COFF backend!");
-  assert(!CurSymbol && "starting new symbol definition in a symbol definition");
+
+  if (CurSymbol)
+    FatalError("starting a new symbol definition without completing the "
+               "previous one");
   CurSymbol = Symbol;
 }
 
 void MCWinCOFFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) {
-  assert(CurSymbol && "StorageClass specified outside of symbol definition");
-  assert((StorageClass & ~0xFF) == 0 &&
-         "StorageClass must only have data in the first byte!");
+  if (!CurSymbol)
+    FatalError("storage class specified outside of symbol definition");
+
+  if (StorageClass & ~0xff)
+    FatalError(Twine("storage class value '") + itostr(StorageClass) +
+               "' out of range");
 
   MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*CurSymbol);
   SD.modifyFlags(StorageClass << COFF::SF_ClassShift, COFF::SF_ClassMask);
 }
 
 void MCWinCOFFStreamer::EmitCOFFSymbolType(int Type) {
-  assert(CurSymbol && "SymbolType specified outside of a symbol definition");
-  assert((Type & ~0xFFFF) == 0 &&
-         "Type must only have data in the first 2 bytes");
+  if (!CurSymbol)
+    FatalError("symbol type specified outside of a symbol definition");
+
+  if (Type & ~0xffff)
+    FatalError(Twine("type value '") + itostr(Type) + "' out of range");
 
   MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*CurSymbol);
   SD.modifyFlags(Type << COFF::SF_TypeShift, COFF::SF_TypeMask);
 }
 
 void MCWinCOFFStreamer::EndCOFFSymbolDef() {
-  assert(CurSymbol && "ending symbol definition without beginning one");
+  if (!CurSymbol)
+    FatalError("ending symbol definition without starting one");
   CurSymbol = nullptr;
 }
 
@@ -239,5 +249,10 @@ void MCWinCOFFStreamer::EmitWin64EHHandl
 void MCWinCOFFStreamer::FinishImpl() {
   MCObjectStreamer::FinishImpl();
 }
+
+LLVM_ATTRIBUTE_NORETURN
+void MCWinCOFFStreamer::FatalError(const Twine &Msg) const {
+  getContext().FatalError(SMLoc(), Msg);
+}
 }
 

Added: llvm/trunk/test/MC/COFF/invalid-def.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-def.s?rev=209387&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/invalid-def.s (added)
+++ llvm/trunk/test/MC/COFF/invalid-def.s Wed May 21 21:18:10 2014
@@ -0,0 +1,6 @@
+# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
+# REQUIRES: asserts
+
+	.def first
+	.def second
+

Added: llvm/trunk/test/MC/COFF/invalid-endef.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-endef.s?rev=209387&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/invalid-endef.s (added)
+++ llvm/trunk/test/MC/COFF/invalid-endef.s Wed May 21 21:18:10 2014
@@ -0,0 +1,5 @@
+# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
+# REQUIRES: asserts
+
+	.endef
+

Added: llvm/trunk/test/MC/COFF/invalid-scl-range.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-scl-range.s?rev=209387&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/invalid-scl-range.s (added)
+++ llvm/trunk/test/MC/COFF/invalid-scl-range.s Wed May 21 21:18:10 2014
@@ -0,0 +1,7 @@
+# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
+# REQUIRES: asserts
+
+	.def storage_class_range
+		.scl 1337
+	.endef
+

Added: llvm/trunk/test/MC/COFF/invalid-scl.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-scl.s?rev=209387&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/invalid-scl.s (added)
+++ llvm/trunk/test/MC/COFF/invalid-scl.s Wed May 21 21:18:10 2014
@@ -0,0 +1,5 @@
+# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
+# REQUIRES: asserts
+
+	.scl 1337
+

Added: llvm/trunk/test/MC/COFF/invalid-type-range.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-type-range.s?rev=209387&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/invalid-type-range.s (added)
+++ llvm/trunk/test/MC/COFF/invalid-type-range.s Wed May 21 21:18:10 2014
@@ -0,0 +1,7 @@
+# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
+# REQUIRES: asserts
+
+	.def invalid_type_range
+		.type 65536
+	.endef
+

Added: llvm/trunk/test/MC/COFF/invalid-type.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-type.s?rev=209387&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/invalid-type.s (added)
+++ llvm/trunk/test/MC/COFF/invalid-type.s Wed May 21 21:18:10 2014
@@ -0,0 +1,5 @@
+# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
+# REQUIRES: asserts
+
+	.type 65536
+





More information about the llvm-commits mailing list