[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 02:49:06 PST 2016


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


More information about the llvm-dev mailing list