r193685 - Recover instead of crashing on MS assembly when no target is loaded

Alp Toker alp at nuanti.com
Wed Oct 30 07:29:28 PDT 2013


Author: alp
Date: Wed Oct 30 09:29:28 2013
New Revision: 193685

URL: http://llvm.org/viewvc/llvm-project?rev=193685&view=rev
Log:
Recover instead of crashing on MS assembly when no target is loaded

It's possible to embed the frontend in applications that haven't initialized
backend targets so we need to handle this condition gracefully.

Added:
    cfe/trunk/test/Index/ms-asm-no-target.cpp
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
    cfe/trunk/lib/Parse/ParseStmt.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=193685&r1=193684&r2=193685&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Wed Oct 30 09:29:28 2013
@@ -23,6 +23,8 @@ def err_asm_empty : Error<"__asm used wi
 def err_inline_ms_asm_parsing : Error<"%0">;
 def err_msasm_unsupported_arch : Error<
   "Unsupported architecture '%0' for MS-style inline assembly">;
+def err_msasm_unable_to_create_target : Error<
+  "MS-style inline assembly is not available: %0">;
 }
 
 let CategoryName = "Parse Issue" in {

Modified: cfe/trunk/lib/Parse/ParseStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseStmt.cpp?rev=193685&r1=193684&r2=193685&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseStmt.cpp (original)
+++ cfe/trunk/lib/Parse/ParseStmt.cpp Wed Oct 30 09:29:28 2013
@@ -2104,9 +2104,15 @@ StmtResult Parser::ParseMicrosoftAsmStat
   if (UnsupportedArch)
     Diag(AsmLoc, diag::err_msasm_unsupported_arch) << TheTriple.getArchName();
     
+  std::string Error;
+  const std::string &TT = TheTriple.getTriple();
+  const llvm::Target *TheTarget = llvm::TargetRegistry::lookupTarget(TT, Error);
+  if (!TheTarget)
+    Diag(AsmLoc, diag::err_msasm_unable_to_create_target) << Error;
+
   // If we don't support assembly, or the assembly is empty, we don't
   // need to instantiate the AsmParser, etc.
-  if (UnsupportedArch || AsmToks.empty()) {
+  if (UnsupportedArch || !TheTarget || AsmToks.empty()) {
     return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, StringRef(),
                                   /*NumOutputs*/ 0, /*NumInputs*/ 0,
                                   ConstraintRefs, ClobberRefs, Exprs, EndLoc);
@@ -2118,11 +2124,6 @@ StmtResult Parser::ParseMicrosoftAsmStat
   if (buildMSAsmString(PP, AsmLoc, AsmToks, TokOffsets, AsmString))
     return StmtError();
 
-  // Find the target and create the target specific parser.
-  std::string Error;
-  const std::string &TT = TheTriple.getTriple();
-  const llvm::Target *TheTarget = llvm::TargetRegistry::lookupTarget(TT, Error);
-
   OwningPtr<llvm::MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TT));
   OwningPtr<llvm::MCAsmInfo> MAI(TheTarget->createMCAsmInfo(*MRI, TT));
   // Get the instruction descriptor.

Added: cfe/trunk/test/Index/ms-asm-no-target.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/ms-asm-no-target.cpp?rev=193685&view=auto
==============================================================================
--- cfe/trunk/test/Index/ms-asm-no-target.cpp (added)
+++ cfe/trunk/test/Index/ms-asm-no-target.cpp Wed Oct 30 09:29:28 2013
@@ -0,0 +1,9 @@
+// RUN: c-index-test -test-load-source all -triple x86_64-apple-darwin10 -fasm-blocks -Wno-microsoft %s 2>&1 | FileCheck %s
+
+// Test that we diagnose when the application hasn't initialized LLVM targets
+// supporting the MS-style inline asm parser.
+
+void Break() {
+  __asm { int 3 }
+}
+// CHECK: error: MS-style inline assembly is not available





More information about the cfe-commits mailing list