Propagate clang attribute to IR

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

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

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