Propagate clang attribute to IR

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Propagate clang attribute to IR

Rinaldini Julien
Hi,

I want to *tag* some functions with some *flags*. I was using annotate((“myFlag”)) and everything was working fine until I tried on ObjC method. It seems that clang just ignore it.

So, to be able to *flag* my functions I’m trying to add a *real* attribute to clang.

I’ve added a new attribute to clang in tools/clang/include/clang/Basic/Attr.td:

def NoFLA : Attr {
  let Spellings = [GNU<"nofla">, CXX11<"gnu", "nofla">];
}

In tools/clang/lib/Sema/SemaDeclAttr.cpp I added my new attribute to the switch that handle it and created my own handler function.
I’m trying to simply pass my attribute to the IR attribute list, but, sadly, I have absolutely no idea how to do that. I looked at others handler but none seems to do that. I also tried to use handleSimpleAttribute, but it doesn’t work either.

Any idea how to do that (or enable annotate on ObjC method)?

Cheers


_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Reply | Threaded
Open this post in threaded view
|

Re: Propagate clang attribute to IR

Aaron Ballman-2
On Tue, Mar 24, 2015 at 9:48 AM, Rinaldini Julien
<[hidden email]> wrote:

> Hi,
>
> I want to *tag* some functions with some *flags*. I was using annotate((“myFlag”)) and everything was working fine until I tried on ObjC method. It seems that clang just ignore it.
>
> So, to be able to *flag* my functions I’m trying to add a *real* attribute to clang.
>
> I’ve added a new attribute to clang in tools/clang/include/clang/Basic/Attr.td:
>
> def NoFLA : Attr {
>   let Spellings = [GNU<"nofla">, CXX11<"gnu", "nofla">];
> }
>
> In tools/clang/lib/Sema/SemaDeclAttr.cpp I added my new attribute to the switch that handle it and created my own handler function.
> I’m trying to simply pass my attribute to the IR attribute list, but, sadly, I have absolutely no idea how to do that. I looked at others handler but none seems to do that. I also tried to use handleSimpleAttribute, but it doesn’t work either.
>
> Any idea how to do that (or enable annotate on ObjC method)?

handleSimpleAttribute takes the parsed attribute (AttributeList entry)
and turns it into a semantic attribute (Attr subclass). You have to
manually handle the semantic attribute in whatever way makes sense for
your attribute. Check out CodeGenModule::ConstructAttributeList for an
example of how function semantic attributes translate into IR
attributes to be passed along to LLVM.

HTH!

~Aaron

_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Reply | Threaded
Open this post in threaded view
|

Re: Propagate clang attribute to IR

Rinaldini Julien

> On 24 Mar 2015, at 14:55, Aaron Ballman <[hidden email]> wrote:
>
> On Tue, Mar 24, 2015 at 9:48 AM, Rinaldini Julien
> <[hidden email]> wrote:
>> Hi,
>>
>> I want to *tag* some functions with some *flags*. I was using annotate((“myFlag”)) and everything was working fine until I tried on ObjC method. It seems that clang just ignore it.
>>
>> So, to be able to *flag* my functions I’m trying to add a *real* attribute to clang.
>>
>> I’ve added a new attribute to clang in tools/clang/include/clang/Basic/Attr.td:
>>
>> def NoFLA : Attr {
>>  let Spellings = [GNU<"nofla">, CXX11<"gnu", "nofla">];
>> }
>>
>> In tools/clang/lib/Sema/SemaDeclAttr.cpp I added my new attribute to the switch that handle it and created my own handler function.
>> I’m trying to simply pass my attribute to the IR attribute list, but, sadly, I have absolutely no idea how to do that. I looked at others handler but none seems to do that. I also tried to use handleSimpleAttribute, but it doesn’t work either.
>>
>> Any idea how to do that (or enable annotate on ObjC method)?
>
> handleSimpleAttribute takes the parsed attribute (AttributeList entry)
> and turns it into a semantic attribute (Attr subclass). You have to
> manually handle the semantic attribute in whatever way makes sense for
> your attribute. Check out CodeGenModule::ConstructAttributeList for an
> example of how function semantic attributes translate into IR
> attributes to be passed along to LLVM.
>
> HTH!
>
> ~Aaron

Hi,

Thx for your answer...

I tried that without any luck:

  static void handleOBF(Sema &S, Decl *D, const AttributeList &Attr) {
    D->addAttr(::new (S.Context)NoFLAAttr(Attr.getRange(), S.Context, Attr.getAttributeSpellingListIndex()));

    // ???????????                  
    llvm::AttrBuilder FuncAttrs;  
    FuncAttrs.addAttribute();
}

In CodeGenModule::ConstructAttributeList it uses a AttrBuilder, I tried there to add a random attribute and it works.
But I’m not understanding how to do that in SemaDeclAttr.cpp.

Cheers

_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Reply | Threaded
Open this post in threaded view
|

Re: Propagate clang attribute to IR

Aaron Ballman-2
On Tue, Mar 24, 2015 at 10:40 AM, Rinaldini Julien
<[hidden email]> wrote:

>
>> On 24 Mar 2015, at 14:55, Aaron Ballman <[hidden email]> wrote:
>>
>> On Tue, Mar 24, 2015 at 9:48 AM, Rinaldini Julien
>> <[hidden email]> wrote:
>>> Hi,
>>>
>>> I want to *tag* some functions with some *flags*. I was using annotate((“myFlag”)) and everything was working fine until I tried on ObjC method. It seems that clang just ignore it.
>>>
>>> So, to be able to *flag* my functions I’m trying to add a *real* attribute to clang.
>>>
>>> I’ve added a new attribute to clang in tools/clang/include/clang/Basic/Attr.td:
>>>
>>> def NoFLA : Attr {
>>>  let Spellings = [GNU<"nofla">, CXX11<"gnu", "nofla">];
>>> }
>>>
>>> In tools/clang/lib/Sema/SemaDeclAttr.cpp I added my new attribute to the switch that handle it and created my own handler function.
>>> I’m trying to simply pass my attribute to the IR attribute list, but, sadly, I have absolutely no idea how to do that. I looked at others handler but none seems to do that. I also tried to use handleSimpleAttribute, but it doesn’t work either.
>>>
>>> Any idea how to do that (or enable annotate on ObjC method)?
>>
>> handleSimpleAttribute takes the parsed attribute (AttributeList entry)
>> and turns it into a semantic attribute (Attr subclass). You have to
>> manually handle the semantic attribute in whatever way makes sense for
>> your attribute. Check out CodeGenModule::ConstructAttributeList for an
>> example of how function semantic attributes translate into IR
>> attributes to be passed along to LLVM.
>>
>> HTH!
>>
>> ~Aaron
>
> Hi,
>
> Thx for your answer...
>
> I tried that without any luck:
>
>   static void handleOBF(Sema &S, Decl *D, const AttributeList &Attr) {
>     D->addAttr(::new (S.Context)NoFLAAttr(Attr.getRange(), S.Context, Attr.getAttributeSpellingListIndex()));
>
>     // ???????????
>     llvm::AttrBuilder FuncAttrs;
>     FuncAttrs.addAttribute();
> }
>
> In CodeGenModule::ConstructAttributeList it uses a AttrBuilder, I tried there to add a random attribute and it works.
> But I’m not understanding how to do that in SemaDeclAttr.cpp.

You can't do it from SemaDeclAttr.cpp. You have to do it from the
CodeGen layer. If you were using handleSimpleAttr in SemaDeclAttr.cpp,
that's the part which hooks the attribute to the function declaration
itself. When functions get code genned, you'd have to lower that
attribute information to the IR layer, and an AttrBuilder is the way
that happens.

~Aaron

_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Reply | Threaded
Open this post in threaded view
|

Re: Propagate clang attribute to IR

Rinaldini Julien

> On 24 Mar 2015, at 15:46, Aaron Ballman <[hidden email]> wrote:
>
> On Tue, Mar 24, 2015 at 10:40 AM, Rinaldini Julien
> <[hidden email]> wrote:
>>
>>> On 24 Mar 2015, at 14:55, Aaron Ballman <[hidden email]> wrote:
>>>
>>> On Tue, Mar 24, 2015 at 9:48 AM, Rinaldini Julien
>>> <[hidden email]> wrote:
>>>> Hi,
>>>>
>>>> I want to *tag* some functions with some *flags*. I was using annotate((“myFlag”)) and everything was working fine until I tried on ObjC method. It seems that clang just ignore it.
>>>>
>>>> So, to be able to *flag* my functions I’m trying to add a *real* attribute to clang.
>>>>
>>>> I’ve added a new attribute to clang in tools/clang/include/clang/Basic/Attr.td:
>>>>
>>>> def NoFLA : Attr {
>>>> let Spellings = [GNU<"nofla">, CXX11<"gnu", "nofla">];
>>>> }
>>>>
>>>> In tools/clang/lib/Sema/SemaDeclAttr.cpp I added my new attribute to the switch that handle it and created my own handler function.
>>>> I’m trying to simply pass my attribute to the IR attribute list, but, sadly, I have absolutely no idea how to do that. I looked at others handler but none seems to do that. I also tried to use handleSimpleAttribute, but it doesn’t work either.
>>>>
>>>> Any idea how to do that (or enable annotate on ObjC method)?
>>>
>>> handleSimpleAttribute takes the parsed attribute (AttributeList entry)
>>> and turns it into a semantic attribute (Attr subclass). You have to
>>> manually handle the semantic attribute in whatever way makes sense for
>>> your attribute. Check out CodeGenModule::ConstructAttributeList for an
>>> example of how function semantic attributes translate into IR
>>> attributes to be passed along to LLVM.
>>>
>>> HTH!
>>>
>>> ~Aaron
>>
>> Hi,
>>
>> Thx for your answer...
>>
>> I tried that without any luck:
>>
>>  static void handleOBF(Sema &S, Decl *D, const AttributeList &Attr) {
>>    D->addAttr(::new (S.Context)NoFLAAttr(Attr.getRange(), S.Context, Attr.getAttributeSpellingListIndex()));
>>
>>    // ???????????
>>    llvm::AttrBuilder FuncAttrs;
>>    FuncAttrs.addAttribute();
>> }
>>
>> In CodeGenModule::ConstructAttributeList it uses a AttrBuilder, I tried there to add a random attribute and it works.
>> But I’m not understanding how to do that in SemaDeclAttr.cpp.
>
> You can't do it from SemaDeclAttr.cpp. You have to do it from the
> CodeGen layer. If you were using handleSimpleAttr in SemaDeclAttr.cpp,
> that's the part which hooks the attribute to the function declaration
> itself. When functions get code genned, you'd have to lower that
> attribute information to the IR layer, and an AttrBuilder is the way
> that happens.
>
> ~Aaron

Hi,

It works, thx for your answer

That’s the part I did not understood before, how the hell the link was done.

Cheers

_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev