From: Chad Rosier Date: Wed, 20 Jun 2012 18:28:37 +0000 (+0000) Subject: [ms-style asm] Change the fatal error to an extension warning. Apparently, this X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=52e4ed949ba52958db1e938860e3b49944ce8680;p=clang [ms-style asm] Change the fatal error to an extension warning. Apparently, this error was asserting on anything that included Windows.h. MS-style inline asm is still dropped, but at least now we're not completely silent about it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158833 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index b2035eaac2..dd3dcabab4 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -4844,6 +4844,9 @@ let CategoryName = "Inline Assembly Issue" in { "invalid use of a cast in a inline asm context requiring an l-value: " "accepted due to -fheinous-gnu-extensions, but clang may remove support " "for this in the future">; + + def warn_unsupported_msasm : ExtWarn< + "MS-style inline assembly is not supported">, InGroup; } let CategoryName = "Semantic Issue" in { diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 9bb9c5c772..1d71cddb6f 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -1683,6 +1683,5 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { } void CodeGenFunction::EmitMSAsmStmt(const MSAsmStmt &S) { - // Analyze the asm string to decompose it into its pieces. - llvm::report_fatal_error("MS-style asm codegen isn't yet supported."); + // MS-style inline assembly is not fully supported, so sema emits a warning. } diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index fb828909c3..0c9d6aa304 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -2673,6 +2673,9 @@ StmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, bool IsSimple, StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, std::string &AsmString, SourceLocation EndLoc) { + // MS-style inline assembly is not fully supported, so emit a warning. + Diag(AsmLoc, diag::warn_unsupported_msasm); + MSAsmStmt *NS = new (Context) MSAsmStmt(Context, AsmLoc, AsmString, EndLoc); diff --git a/test/Parser/MicrosoftExtensions.c b/test/Parser/MicrosoftExtensions.c index cd03ac8c09..fd0c543335 100644 --- a/test/Parser/MicrosoftExtensions.c +++ b/test/Parser/MicrosoftExtensions.c @@ -20,7 +20,7 @@ void * __ptr32 PtrToPtr32(const void *p) void __forceinline InterlockedBitTestAndSet (long *Base, long Bit) { - __asm { + __asm { // expected-warning {{MS-style inline assembly is not supported}} mov eax, Bit mov ecx, Base lock bts [ecx], eax diff --git a/test/Parser/ms-inline-asm.c b/test/Parser/ms-inline-asm.c index 1c8c881dec..2d18195885 100644 --- a/test/Parser/ms-inline-asm.c +++ b/test/Parser/ms-inline-asm.c @@ -3,35 +3,35 @@ #define M __asm int 0x2c #define M2 int -void t1(void) { M } -void t2(void) { __asm int 0x2c } -void t3(void) { __asm M2 0x2c } -void* t4(void) { __asm mov eax, fs:[0x10] } +void t1(void) { M } // expected-warning {{MS-style inline assembly is not supported}} +void t2(void) { __asm int 0x2c } // expected-warning {{MS-style inline assembly is not supported}} +void t3(void) { __asm M2 0x2c } // expected-warning {{MS-style inline assembly is not supported}} +void* t4(void) { __asm mov eax, fs:[0x10] } // expected-warning {{MS-style inline assembly is not supported}} void t5() { - __asm { + __asm { // expected-warning {{MS-style inline assembly is not supported}} int 0x2c ; } asm comments are fun! }{ } - __asm {} + __asm {} // no warning as this gets merged with the previous inline asm } int t6() { - __asm int 3 ; } comments for single-line asm - __asm {} + __asm int 3 ; } comments for single-line asm // expected-warning {{MS-style inline assembly is not supported}} + __asm {} // no warning as this gets merged with the previous inline asm - __asm int 4 + __asm int 4 // no warning as this gets merged with the previous inline asm return 10; } int t7() { - __asm { + __asm { // expected-warning {{MS-style inline assembly is not supported}} push ebx mov ebx, 0x07 pop ebx } } void t8() { - __asm nop __asm nop __asm nop + __asm nop __asm nop __asm nop // expected-warning {{MS-style inline assembly is not supported}} } void t9() { - __asm nop __asm nop ; __asm nop + __asm nop __asm nop ; __asm nop // expected-warning {{MS-style inline assembly is not supported}} } int t_fail() { // expected-note {{to match this}} __asm