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

John Brawn via llvm-dev llvm-dev at lists.llvm.org
Thu Dec 1 07:19:38 PST 2016


It's not possible to add an arbitrary operand to an alloca like that, but
you can add arbitrary metadata to an instruction. I'd have a look around
CodeGen for uses of setMetadata to see how it's done elsewhere. It looks
like you could do something like

 if (D.hasAttr<myCustomAttribute>())
 {
    Alloca->setMetadata("affinity", llvm::MDNode::get(getContext(), ValueAsMetadata::get(AffinityVal)));
 }

where Alloca is the alloca instruction you want to add the metadata to and
AffinityVal is the llvm::Value* for the affinity value.

John

> -----Original Message-----
> From: Naveed Ul Mustafa [mailto:naveed.mustafa at bilkent.edu.tr]
> Sent: 28 November 2016 13:46
> To: Naveed Ul Mustafa
> Cc: John Brawn; llvm-dev at lists.llvm.org; nd
> Subject: Re: [llvm-dev] Translation of custom attribute (defined for
> variables) from clang to llvm
> 
> 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