[llvm-dev] Translation of custom attribute (defined for variables) from clang to llvm

Naveed Ul Mustafa via llvm-dev llvm-dev at lists.llvm.org
Mon Nov 28 05:46:16 PST 2016


Can anyone please guide me on solving the problem. I am stuck for last 
two days.

Thansk in advance for any help.

---
Naveed Ul Mustafa

On 2016-11-28 10:49, Naveed Ul Mustafa via llvm-dev wrote:
> Hi John,
> 
> I have looked into the EmitAutoVarAlloca()  in CGDecl.cpp. However, I
> could not figure out how to employ my custom attribute for code
> generation. For example, my custom attribute is visible in CGDecl.cpp
> but how can I generate based on my custom attribute
> 
> if (D.hasAttr<myCustomAttri>())
> {
> //What to do here?
> }
> 
> What I wan in IR is something like below.
> 
> Without Custom Attribute: %1 = alloca i32, align 4
> With Custom Attribute: %1 = alloca i32, align 4, Affinity
> 
> Where affinity is an unsigned number, provided at time of variable
> declaration using custom attribute as shown below
> 
> unsigned int Affinity=1;
> __attribute__((myCustomAttr(Affinity))) volatile unsigned int a = 5;
> 
> Can you please guide me?
> 
> Thanks in advance
> 
> ---
> Naveed Ul Mustafa
> 
> On 2016-11-25 14:20, John Brawn wrote:
>> If you want the clang attribute to have an effect on the LLVM IR that
>> is generated then you need to modify the relevant parts of
>> clang/lib/CodeGen to do whatever it is you want to do. For local
>> variables it looks like EmitAutoVarAlloca in CGDecl.cpp is possibly
>> what you need to modify.
>> 
>> Probably the best thing to do is look around the CodeGen directory for
>> uses of hasAttr and try to find some other clang attribute which is
>> handled in a similar way to what you want to do, then do something
>> similar to that.
>> 
>> John
>> 
>>> -----Original Message-----
>>> From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf Of
>>> Naveed Ul Mustafa via llvm-dev
>>> Sent: 25 November 2016 14:04
>>> To: Asit Dhal
>>> Cc: Philip Reames via llvm-dev
>>> Subject: Re: [llvm-dev] Translation of custom attribute (defined for
>>> variables) from clang to llvm
>>> 
>>> Hi Asit,
>>> 
>>> thanks for the reply.
>>> 
>>> But I guess I was not clear in my question. Actually, i dont want to 
>>> use
>>> __ATTRIBUTE__((ANNOTATE("MOVIATTR"))), since in documentation it is
>>> stated that "This intrinsic allows annotation of local variables with
>>> arbitrary strings. This can be useful for special purpose 
>>> optimizations
>>> that want to look for these annotations. These have no other defined
>>> use; they are ignored by code generation and optimization."
>>> http://llvm.org/docs/LangRef.html#llvm-var-annotation-intrinsic
>>> 
>>> Thats why I want to use my custom defined attribute (i.e.
>>> moviAttr(unsigned int))) so that i can use it later for code 
>>> generation.
>>> 
>>> Syntax of adding my custom attribute in code snippet above is 
>>> correct,
>>> since clang doesnt generate any error.
>>> 
>>> do you think there is anyother reason for my custom attribute to not
>>> appear in IR?
>>> 
>>> 
>>> 
>>> ---
>>> Naveed Ul Mustafa
>>> 
>>> On 2016-11-25 13:44, Asit Dhal wrote:
>>> > Hi,
>>> >
>>> > I think, the syntax is wrong.
>>> > You can try this way..
>>> >
>>> > #DEFINE NEWATTR __ATTRIBUTE__((ANNOTATE("MOVIATTR")))
>>> >
>>> > int main()
>>> > {
>>> >         NEWATTR volatile unsigned int a = 5;
>>> >         VOLATILE UNSIGNED INT *P;
>>> >         p = &a;
>>> >         return (a+*p);
>>> > }
>>> >
>>> > And it generates
>>> >
>>> > ; ModuleID = 'test2.cpp'
>>> > target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
>>> > target triple = "x86_64-pc-linux-gnu"
>>> >
>>> > @.str = private unnamed_addr constant [9 x i8] c"moviAttr\00", section
>>> > "llvm.metadata"
>>> > @.str1 = private unnamed_addr constant [10 x i8] c"test2.cpp\00",
>>> > section "llvm.metadata"
>>> >
>>> > ; Function Attrs: nounwind uwtable
>>> > define i32 @main() #0 {
>>> >   %1 = alloca i32, align 4
>>> >   %a = alloca i32, align 4
>>> >   %p = alloca i32*, align 8
>>> >   store i32 0, i32* %1
>>> >   %2 = bitcast i32* %a to i8*
>>> >   CALL VOID @LLVM.VAR.ANNOTATION(I8* %2, I8* GETELEMENTPTR INBOUNDS
>>> > ([9 X I8]* @.STR, I32 0, I32 0), I8* GETELEMENTPTR INBOUNDS ([10 X
>>> > I8]* @.STR1, I32 0, I32 0), I32 5)
>>> >   store volatile i32 5, i32* %a, align 4
>>> >   store i32* %a, i32** %p, align 8
>>> >   %3 = load volatile i32* %a, align 4
>>> >   %4 = load i32** %p, align 8
>>> >   %5 = load volatile i32* %4, align 4
>>> >   %6 = add i32 %3, %5
>>> >   ret i32 %6
>>> > }
>>> >
>>> > ; Function Attrs: nounwind
>>> > DECLARE VOID @LLVM.VAR.ANNOTATION(I8*, I8*, I8*, I32) #1
>>> >
>>> > attributes #0 = { nounwind uwtable "less-precise-fpmad"="false"
>>> > "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
>>> > "no-infs-fp-math"="false" "no-nans-fp-math"="false"
>>> > "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
>>> > "use-soft-float"="false" }
>>> > attributes #1 = { nounwind }
>>> >
>>> > !llvm.ident = !{!0}
>>> >
>>> > !0 = !{!"Ubuntu clang version 3.6.0-2ubuntu1~trusty1
>>> > (tags/RELEASE_360/final) (based on LLVM 3.6.0)"}
>>> >
>>> > On Fri, Nov 25, 2016 at 12:52 PM, Naveed Ul Mustafa via llvm-dev
>>> > <llvm-dev at lists.llvm.org> wrote:
>>> >
>>> >> Hi All,
>>> >>
>>> >> I need your guidance about a custom attribute. I have defined one
>>> >> for variables. It is accepted in the source code (without any
>>> >> warnings from clang), for example in following snippet.
>>> >>
>>> >> #define NEWATTR __attribute__((moviAttr(1)))
>>> >>
>>> >> int main()
>>> >> {
>>> >> NEWATTR volatile unsigned int a = 5;
>>> >> volatile unsigned int *p;
>>> >> p = &a;
>>> >> return (a+*p);
>>> >> }
>>> >>
>>> >> and actually when I Dump the declaration, after adding the attribute
>>> >> in handleMoviAttr() function in SemaDeclAttr.cpp as shown in
>>> >> following snippet
>>> >>
>>> >> D->addAttr(::new (S.Context)moviAttrAttr(Attr.getRange(), S.Context,
>>> >> Val, Attr.getAttributeSpellingListIndex()));
>>> >> D->dump();
>>> >>
>>> >> It is dumped by clang with following output
>>> >>
>>> >> VarDecl 0x440c698 <file.c:6:17, line:10:32> col:32 a 'volatile
>>> >> unsigned int'
>>> >> `-moviAttrAttr 0x440c6d0 <line:6:32, col:42> 1
>>> >>
>>> >> HOWEVER, the attribute doesnt appear in IR of the program. IR is
>>> >> shown below.
>>> >>
>>> >> *** IR Dump Before Pre-ISel Intrinsic Lowering ***; ModuleID =
>>> >> 'file.bc'
>>> >> source_filename = "file.c"
>>> >> target datalayout =
>>> >>
>>> > "e-m:e-p:32:32-f64:64-i64:64-v128:64-v64:64-v32:32-v16:16-n8:16:32-
>>> S64"
>>> >> target triple = "shave"
>>> >>
>>> >> ; Function Attrs: nounwind
>>> >> define i32 @main() local_unnamed_addr #0 {
>>> >> %1 = alloca i32, align 4
>>> >> %2 = bitcast i32* %1 to i8*
>>> >> call void @llvm.lifetime.start(i64 4, i8* %2)
>>> >> store volatile i32 5, i32* %1, align 4
>>> >> %3 = load volatile i32, i32* %1, align 4
>>> >> %4 = load volatile i32, i32* %1, align 4
>>> >> %5 = add i32 %4, %3
>>> >> call void @llvm.lifetime.end(i64 4, i8* %2)
>>> >> ret i32 %5
>>> >> }
>>> >>
>>> >> ; Function Attrs: argmemonly nounwind
>>> >> declare void @llvm.lifetime.start(i64, i8* nocapture) #1
>>> >>
>>> >> ; Function Attrs: argmemonly nounwind
>>> >> declare void @llvm.lifetime.end(i64, i8* nocapture) #1
>>> >>
>>> >> attributes #0 = { nounwind "disable-tail-calls"="false"
>>> >> "less-precise-fpmad"="false" "no-frame-pointer-elim"="true"
>>> >> "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false"
>>> >> "no-jump-tables"="false" "no-nans-fp-math"="false"
>>> >> "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8"
>>> >> "target-cpu"="myriad2.2" "unsafe-fp-math"="false"
>>> >> "use-soft-float"="false" }
>>> >> attributes #1 = { argmemonly nounwind "target-cpu"="myriad2.2" }
>>> >>
>>> >> Can someone help me please to solve the problem so that custom
>>> >> attribute also appears in the IR.
>>> >>
>>> >> Thanks in advance
>>> >>
>>> >> --
>>> >> Naveed Ul Mustafa
>>> >> _______________________________________________
>>> >> LLVM Developers mailing list
>>> >> llvm-dev at lists.llvm.org
>>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev [1]
>>> >
>>> >
>>> >
>>> > Links:
>>> > ------
>>> > [1] http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


More information about the llvm-dev mailing list