<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 11, 2016 at 6:03 PM, Aaron Ballman <span dir="ltr"><<a href="mailto:aaron@aaronballman.com" target="_blank">aaron@aaronballman.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, Jul 11, 2016 at 6:47 AM, vivek pandya via cfe-dev<br>
<<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br>
> Hello Clang Developers,<br>
><br>
> I want to add a new attribute which is required to work with function<br>
> declaration as shown in example given below:<br>
><br>
> extern void foo(int param) __attribute__((regmask("R8,R11")));<br>
><br>
> int foo2(int param) {<br>
> foo(param);<br>
> return param;<br>
> }<br>
><br>
> For this I have done following changes:<br>
><br>
> Attr.td<br>
><br>
> def RegMask : Attr {<br>
>   let Spellings = [GNU<"regmask">];<br>
>   let Args = [StringArgument<"ClobbersList">];<br>
>   let Subjects = SubjectList<[Function]>;<br>
>   let Documentation = [Undocumented];<br>
> }<br>
><br>
> lib/Sema/SemaDeclAttr.cpp<br>
><br>
> static void handleRegMaskAttr(Sema &S, Decl *D, const AttributeList &Attr) {<br>
>   // Make sure that there is a string literal as the annotation's single<br>
>   // argument.<br>
>   StringRef Str;<br>
>   if (!S.checkStringLiteralArgumentAttr(Attr, 0, Str))<br>
>     return;<br>
><br>
>   D->addAttr(::new (S.Context)<br>
>              AnnotateAttr(Attr.getRange(), S.Context, Str,<br>
>                           Attr.getAttributeSpellingListIndex()));<br>
>   llvm::dbgs() << "Reg Mask attribute : " << Str << "\n";<br>
> }<br>
><br>
> above method is very similar to handleAnnotateAttr<br>
><br>
> and use this method inside ProcessDeclAttribute method as follows :<br>
><br>
> // Attribute to help interprocedural register allocation<br>
>   case AttributeList::AT_RegMask:<br>
>     handleRegMaskAttr(S, D, Attr);<br>
>     break;<br>
>   }<br>
><br>
> but this does not work for me, it works on function definitions but not with<br>
> function declaration.<br>
><br>
> Am I missing here any thing?<br>
<br>
</div></div>The attribute should inherit from InheritableAttr instead of just<br>
Attr. That should cause it to be inherited by later redeclarations.<br></blockquote><div>I think my question is not clear, in the example given above foo and foo2 both are different function and what I want is that foo is extern function for current module and for this declaration I want regmask attribute as a string.</div><div>Why should I need InheritableAttr when foo is not going to be redeclared in the current module? </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class=""><br>
> Note: I want to parse this string at MI level if possible or at IR level to<br>
> create a RegMask out of that.<br>
<br>
</span>How do you intend to report diagnostics to the user if the parsed<br>
string contains something unexpected?<br></blockquote><div>If I am not able to use clang's diagnostics then I believe I should take help of some thing like LLVM_ERROR.</div><div>-Vivek</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
~Aaron<br>
<br>
><br>
> Sincerely,<br>
> Vivek<br>
><br>
> _______________________________________________<br>
> cfe-dev mailing list<br>
> <a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
><br>
</blockquote></div><br></div></div>