]> granicus.if.org Git - clang/commitdiff
Allow AsmLabel with -fno-gnu-inline-asm
authorSteven Wu <stevenwu@apple.com>
Mon, 11 May 2015 21:14:09 +0000 (21:14 +0000)
committerSteven Wu <stevenwu@apple.com>
Mon, 11 May 2015 21:14:09 +0000 (21:14 +0000)
Summary:
AsmLabel is heavily used in system level and firmware to redirect
function and access platform specific labels. They are also extensively
used in system headers which makes this option unusable for many
users. Since AsmLabel doesn't introduce any assembly code into the
output binary, it shouldn't be considered as inline-asm.

Reviewers: bob.wilson, rnk

Reviewed By: rnk

Subscribers: cfe-commits

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

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

lib/Parse/Parser.cpp
test/Parser/no-gnu-inline-asm.c

index 62113227190ca361132067949b6f6a6ec759fc1b..ed27a9e3953dec146d7659495ac235b86354be8e 100644 (file)
@@ -669,6 +669,11 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,
 
     SourceLocation StartLoc = Tok.getLocation();
     SourceLocation EndLoc;
+
+    // Check if GNU-style InlineAsm is disabled.
+    if (!getLangOpts().GNUAsm)
+      Diag(StartLoc, diag::err_gnu_inline_asm_disabled);
+
     ExprResult Result(ParseSimpleAsm(&EndLoc));
 
     ExpectAndConsume(tok::semi, diag::err_expected_after,
@@ -1253,10 +1258,6 @@ ExprResult Parser::ParseSimpleAsm(SourceLocation *EndLoc) {
   assert(Tok.is(tok::kw_asm) && "Not an asm!");
   SourceLocation Loc = ConsumeToken();
 
-  // Check if GNU-style InlineAsm is disabled.
-  if (!getLangOpts().GNUAsm)
-    Diag(Loc, diag::err_gnu_inline_asm_disabled);
-
   if (Tok.is(tok::kw_volatile)) {
     // Remove from the end of 'asm' to the end of 'volatile'.
     SourceRange RemovalRange(PP.getLocForEndOfToken(Loc),
index d73d6123a0ed42aa0e9aa493f4a38d3a221abedd..7089fa4b7df816dd7cfe729a66c11a1e5cf4d573 100644 (file)
@@ -1,6 +1,10 @@
 // RUN: %clang_cc1 %s -triple i686-apple-darwin -verify -fsyntax-only -fno-gnu-inline-asm
 
 asm ("INST r1, 0"); // expected-error {{GNU-style inline assembly is disabled}}
+
+void foo() __asm("__foo_func"); // AsmLabel is OK
+int foo1 asm("bar1") = 0; // OK
+
 void f (void) {
   long long foo = 0, bar;
   asm volatile("INST %0, %1" : "=r"(foo) : "r"(bar)); // expected-error {{GNU-style inline assembly is disabled}}