]> granicus.if.org Git - clang/commitdiff
[Clang][CodeGen] support alias attribute w/ gnu_inline
authorNick Desaulniers <ndesaulniers@google.com>
Thu, 12 Sep 2019 19:53:35 +0000 (19:53 +0000)
committerNick Desaulniers <ndesaulniers@google.com>
Thu, 12 Sep 2019 19:53:35 +0000 (19:53 +0000)
Summary:
r369705 did not consider the addition of gnu_inline on function
declarations of alias attributed functions. This resulted in a reported
regression in the clang-9-rc4 release from the Zig developers building
glibc, which was observable as a failed assertion:

llvm-project/clang/lib/AST/Decl.cpp:3336: bool
clang::FunctionDecl::isInlineDefinitionExternallyVisible() const:
Assertion `(doesThisDeclarationHaveABody() || willHaveBody()) && "Must
be a function definition"' failed.

Alias function declarations do not have bodies, so allow us to proceed
if we have the alias function attribute but no body/definition, and add
a test case.  The emitted symbols and their linkage matches GCC for the
added test case.

Link: https://bugs.llvm.org/show_bug.cgi?id=43268
Reviewers: aaron.ballman, rsmith, erichkeane, andrewrk

Reviewed By: andrewrk

Subscribers: cfe-commits, andrewrk, hans, srhines

Tags: #clang

Differential Revision: https://reviews.llvm.org/D67455

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

lib/AST/Decl.cpp
test/CodeGen/alias.c

index 1d28f03b0646fe08bed56ce07c57a405d5facc42..b27ac907b8bc2bfee504f8152cc33827fb92cb68 100644 (file)
@@ -3348,7 +3348,8 @@ SourceRange FunctionDecl::getExceptionSpecSourceRange() const {
 /// an externally visible symbol, but "extern inline" will not create an
 /// externally visible symbol.
 bool FunctionDecl::isInlineDefinitionExternallyVisible() const {
-  assert((doesThisDeclarationHaveABody() || willHaveBody()) &&
+  assert((doesThisDeclarationHaveABody() || willHaveBody() ||
+          hasAttr<AliasAttr>()) &&
          "Must be a function definition");
   assert(isInlined() && "Function must be inline");
   ASTContext &Context = getASTContext();
index 46568ee900c12928ebb420bcf3d01e27a4d37494..f5bdf3c0587e8bf1a7a9ee3ae8b7c07189379353 100644 (file)
@@ -99,3 +99,8 @@ static int test10_foo __attribute__((alias("test10")));
 // CHECKGLOBALS-NOT: @test11_foo = dso_local
 void test11(void) {}
 static void test11_foo(void) __attribute__((alias("test11")));
+
+// Test that gnu_inline+alias work.
+// CHECKGLOBALS: @test12_alias = alias void (), void ()* @test12
+void test12(void) {}
+inline void test12_alias(void) __attribute__((gnu_inline, alias("test12")));