Hi Gael,
Thanks a lot for your response, it was very helpful!
How did you manage to access the argument value at the IR stage?
Thanks again,
Tehila.
Gaël Jobin via llvm-dev llvm-dev at lists.llvm.org
Thu Oct 8 01:08:05 PDT 2015
>Hi Tehila,
>I recently added new function attributes to clang/llvm with arguments.
>What I did is the following:
>1. Add your attributes to tools/clang/include/clang/Basic/Attr.td
>def MYATTR : InheritableAttr {
> let Spellings = [GNU<"myattr">, CXX11<"gnu", "myattr">];
> let Args = [DefaultIntArgument<"myargument", 5>];
> let Subjects = SubjectList<[Function]>;
> let Documentation = [Undocumented];
>}
>2. Manage it in tools/clang/lib/CodeGen/CGCall.cpp...
>void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
> const Decl *TargetDecl,
> AttributeListType &PAL,
> unsigned &CallingConv,
> bool AttrOnCallSite) {
>//other code...
>if (TargetDecl) {
>if (TargetDecl->hasAttr<MYEXAMPLEAttr>())
> {
> auto myexample = TargetDecl->getAttr<MYEXAMPLEAttr>();
> FuncAttrs.addAttribute("myexample");
> unsigned myargument = myexample->getMyargument();
>
>
> FuncAttrs.addAttribute("myargument",
>llvm::utostr(myargument));
> }
>//other code...
>}
>//other code...
>}
>3. ...and in tools/clang/lib/Sema/SemaDeclAttr.cpp
>static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
> const AttributeList &Attr,
> bool IncludeCXX11Attributes) {
>//other code...
>switch (Attr.getKind()) {
>case AttributeList::AT_MYEXAMPLE:
> handleMYEXAMPLEAttr(S, D, Attr);
> break;
>//other code...
>}
>
>
>static void handleMYEXAMPLEAttr(Sema &S, Decl *D, const AttributeList
>&Attr) {
> uint32_t myargument = AVMAttr::DefaultMyargument;
>
> if (Attr.getNumArgs() && !checkUInt32Argument(S, Attr,
>Attr.getArgAsExpr(0), myargument))
> return;
>
> D->addAttr(::new (S.Context)
> AVMAttr(Attr.getRange(), S.Context, myargument,
> Attr.getAttributeSpellingListIndex()));
>}
>Then you should have access to it in LLVM IR.
>I may have forgotten some stuff but it should help you get started.
>Regards,
>Gael
>Le jeudi 08 octobre 2015 à 10:02 +0300, Tehila Mayzels via llvm-dev a
>écrit :
>> *Hi,*
>>* *
>> *I'm trying to add a function attribute to clang/llvm.*
>> *I need an attribute that will have an additional information of a*
>> *variable name.*
>> *e.g. I would like to add support for something like:*
>>* *
>> *void foo() __attribute__ ((xyz(v)) {…}*
>>* *
>> *such that on the IR stage I can realize that the function foo has the*
>> *attribute xyz and an argument v that marks variable v (which is a*
>> *variable inside foo) for my needs.*
>>* *
>> *I was able to add a function attribute without an argument, but I*
>> *don't understand how to parse/save/analyze the argument.*
>>* *
>> *I would appreciate any ideas/examples/references.*
>>* *
>> *Thanks a lot,*
>> *Tehila.*
>>* *
>>* *
>> *_______________________________________________*
>> *LLVM Developers mailing list*
>> *[llvm-dev at lists.llvm.org](http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev)*
> *[http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev](http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev)*