[PATCH] D13004: Create a new attribute set when the definition is parsed after a declaration of a function

Akira Hatanaka via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 21 11:33:35 PDT 2015


On Mon, Sep 21, 2015 at 11:03 AM, Duncan P. N. Exon Smith <
dexonsmith at apple.com> wrote:

>
> > On 2015-Sep-21, at 01:42, Akira Hatanaka via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
> >
> > ahatanak created this revision.
> > ahatanak added a subscriber: cfe-commits.
> >
> > An assert is triggered when the test case program is compiled with -Oz:
> >
> > Assertion failed: (!F->hasFnAttribute(llvm::Attribute::OptimizeForSize)
> && "OptimizeNone and OptimizeForSize on same function!"), function
> SetLLVMFunctionAttributesForDefinition, file
> /Users/ahatanaka/projects/llvm/git/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp,
> line 831.
> >
> > This patch fixes the assert by clearing the attribute set attached to IR
> function foo1 and creating it again when the function's definition is
> parsed.
> >
> > http://reviews.llvm.org/D13004
> >
> > Files:
> >  lib/CodeGen/CodeGenModule.cpp
> >  test/CodeGen/attr-func-def.c
> >
> > Index: test/CodeGen/attr-func-def.c
> > ===================================================================
> > --- /dev/null
> > +++ test/CodeGen/attr-func-def.c
> > @@ -0,0 +1,18 @@
> > +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.10.0 -emit-llvm -Oz -o
> - %s | FileCheck %s
> > +
> > +// CHECK: define i32 @foo2(i32 %a) [[ATTRS2:#[0-9]+]] {
> > +// CHECK: define i32 @foo1(i32 %a) [[ATTRS1:#[0-9]+]] {
> > +
> > +int foo1(int);
> > +
> > +int foo2(int a) {
> > +  return foo1(a + 2);
> > +}
> > +
> > +__attribute__((optnone))
> > +int foo1(int a) {
> > +    return a + 1;
> > +}
> > +
> > +// CHECK: attributes [[ATTRS2]] = { {{.*}}optsize{{.*}} }
> > +// CHECK: attributes [[ATTRS1]] = { {{.*}}optnone{{.*}} }
> > Index: lib/CodeGen/CodeGenModule.cpp
> > ===================================================================
> > --- lib/CodeGen/CodeGenModule.cpp
> > +++ lib/CodeGen/CodeGenModule.cpp
> > @@ -2643,6 +2643,11 @@
> >
> >   maybeSetTrivialComdat(*D, *Fn);
> >
> > +  // Create the attribute set of the function definition because it
> might differ
> > +  // from that of the function declaration. SetLLVMFunctionAttributes
> cannot be
> > +  // called after GenerateCode is called as it might remove the
> parameter
> > +  // attributes attached by GenerateCode.
> > +  SetLLVMFunctionAttributes(D, FI, Fn);
>
> I'm a bit worried this could have a compile-time impact, since it will
> regenerate all the attributes.  Why don't you just remove optsize if it's
> attached to the function?
>
> (All this attribute-setting is pretty horrible; one of us should fix it
> soon.)
>
>
Removing the conflicting attributes should fix the crash too. I'll come up
with a patch and commit it shortly.


> >   CodeGenFunction(*this).GenerateCode(D, Fn, FI);
> >
> >   setFunctionDefinitionAttributes(D, Fn);
> >
> >
> > <D13004.35214.patch>_______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150921/037dda56/attachment.html>


More information about the cfe-commits mailing list