Arvind Sudarsanam
2010-Jul-15 20:19 UTC
[LLVMdev] Trying to access the user defined variable name
Hi Devang,
Thanks for your reply. You mentioned
" First parameter is the compiler generated temp. and 3rd parameter
provides info about the variable, including its name 'u'."
I did manage to get this far. But, I am finding it difficult to access
this info using LLVM APIs. The third parameter is of type "metadata".
So I was able to access it by casting it to MDNode. After that, I am
assuming that it gives me a handle to the metadata represented as
"!10"
!10 = metadata !{i32 524544, metadata !9, metadata !"u", metadata !2,
i32 3, metadata !6} ; [DW_TAG_auto_variable ]
>From here, I am trying invain to access the variable name.
Is there something wrong in my approach? I feel that I have not
understood the method to access metadata in llvm.
Thanks
Regards
Arvind
On Thu, Jul 15, 2010 at 2:07 PM, Devang Patel <devang.patel at gmail.com>
wrote:> On Wed, Jul 14, 2010 at 3:03 PM, Arvind Sudarsanam
> <arvind.sudarsanam at aggiemail.usu.edu> wrote:
>> Dear all,
>>
>> I have the following source code:
>>
>> long f(long x, long y)
>> {
>> long u;
>>
>> u = x+y;
>> return u;
>> };
>>
>> After clang (with debug option set) and llvm opt using mem2reg, I get
>> the following .ll file
>>
***************************************************************************
>> ; ModuleID = '<stdin>'
>> target datalayout >>
"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
>> target triple = "i686-pc-linux-gnu"
>>
>> define i32 @f(i32 %x, i32 %y) nounwind {
>> entry:
>> call void @llvm.dbg.value(metadata !{i32 %x}, i64 0, metadata !0)
>> call void @llvm.dbg.value(metadata !{i32 %y}, i64 0, metadata !7)
>> %add = add nsw i32 %x, %y, !dbg !8 ; <i32>
[#uses=1]
>> call void @llvm.dbg.value(metadata !{i32 %add}, i64 0, metadata !10),
!dbg !8
>> ret i32 %add, !dbg !11
>> }
>>
>> declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
>>
>> declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone
>>
>> !0 = metadata !{i32 524545, metadata !1, metadata !"x",
metadata !2,
>> i32 1, metadata !6} ; [ DW_TAG_arg_variable ]
>> !1 = metadata !{i32 524334, i32 0, metadata !2, metadata
!"f",
>> metadata !"f", metadata !"f", metadata !2, i32 2,
metadata !4, i1
>> false, i1 true, i32 0, i32 0, null, i1 false, i1 false} ; [
>> DW_TAG_subprogram ]
>> !2 = metadata !{i32 524329, metadata !"testadd.c", metadata
>> !"/home/asudarsanam/perforce/llvmtop/setup", metadata !3} ; [
>> DW_TAG_file_type ]
>> !3 = metadata !{i32 524305, i32 0, i32 12, metadata
!"testadd.c",
>> metadata !".", metadata !"clang 2.0", i1 true, i1
false, metadata !"",
>> i32 0} ; [ DW_TAG_compile_unit ]
>> !4 = metadata !{i32 524309, metadata !2, metadata !"",
metadata !2,
>> i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [
>> DW_TAG_subroutine_type ]
>> !5 = metadata !{metadata !6}
>> !6 = metadata !{i32 524324, metadata !2, metadata !"long",
metadata
>> !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
>> !7 = metadata !{i32 524545, metadata !1, metadata !"y",
metadata !2,
>> i32 1, metadata !6} ; [ DW_TAG_arg_variable ]
>> !8 = metadata !{i32 5, i32 4, metadata !9, null}
>> !9 = metadata !{i32 524299, metadata !1, i32 2, i32 1} ; [
>> DW_TAG_lexical_block ] !10 = metadata !{i32 524544, metadata !9,
>> metadata !"u", metadata !2, i32 3, metadata !6} ; [
>> DW_TAG_auto_variable ]
>> !11 = metadata !{i32 7, i32 1, metadata !9, null}
>> ******************************************************************
>>
>> Llvm has replaced the name of the local variable (u) by a temporary
>> name (%add). However, the debug information contains the information
>> about the original variable name. **** !10 = metadata !{i32 524544,
>> metadata !9, metadata !"u", metadata !2, i32 3, metadata !6}
; [
>> DW_TAG_auto_variable ] ******
>
> Variable name 'u' is intentionally preserved in
DW_TAG_auto_variable
> because user debugging this code does not know anything about temp.
> names used by compiler.
>
>> I have been trying for a while and have been unsuccessful in accessing
>> this information (mapping between the temporary name (%add) and the
>> actual name (u)).
>
> That's what llvm.dbg.value is doing.
>
> call void @llvm.dbg.value(metadata !{i32 %add}, i64 0, metadata !10), !dbg
!8
>
> First parameter is the compiler generated temp. and 3rd parameter
> provides info about the variable, including its name 'u'.
>
> -
> Devang
>
--
Arvind Sudarsanam
Utah State University
Phone: (435) 512-7769
E-mail: theonemorpheus at gmail.com
Web-site: http://cc.usu.edu/~asudarsanam
Devang Patel
2010-Jul-15 21:39 UTC
[LLVMdev] Trying to access the user defined variable name
On Thu, Jul 15, 2010 at 1:19 PM, Arvind Sudarsanam <arvind.sudarsanam at aggiemail.usu.edu> wrote:> Hi Devang, > > Thanks for your reply. You mentioned > " First parameter is the compiler generated temp. and 3rd parameter > provides info about the variable, including its name 'u'." > > I did manage to get this far. But, I am finding it difficult to access > this info using LLVM APIs. The third parameter is of type "metadata". > So I was able to access it by casting it to MDNode. After that, I am > assuming that it gives me a handle to the metadata represented as > "!10" > > !10 = metadata !{i32 524544, metadata !9, metadata !"u", metadata !2, > i32 3, metadata !6} ; [DW_TAG_auto_variable ] > > From here, I am trying invain to access the variable name. > Is there something wrong in my approach? I feel that I have not > understood the method to access metadata in llvm. >Use DIVariable from DebugInfo.h to access fields of MDNode that is holding variable's info. - Devang
Arvind Sudarsanam
2010-Jul-15 22:16 UTC
[LLVMdev] Trying to access the user defined variable name
Hi Devang, I did try using DIVariable for accessing the MDNode, to no effect. One point to note is, I try to access the debug information after running the optimization pass "mem2reg". It seems "mem2reg" removes all debug information. When I run -print-dbginfo pass before running the mem2reg pass, I get a lot of info. But when I run the -print-dbginfo pass after the mem2reg pass, I get nothing. I look at the .ll file after mem2reg pass, it still has all the debug information. Somehow, it is not being identified by the llvm APIs. I am planning to write a program to parse the .ll file and access this info myself. I was hoping that this program is already available. Please let me know if I am missing anything or am incorrect about something. Thanks a lot for your replies Regards Arvind On Thu, Jul 15, 2010 at 3:39 PM, Devang Patel <devang.patel at gmail.com> wrote:> On Thu, Jul 15, 2010 at 1:19 PM, Arvind Sudarsanam > <arvind.sudarsanam at aggiemail.usu.edu> wrote: >> Hi Devang, >> >> Thanks for your reply. You mentioned >> " First parameter is the compiler generated temp. and 3rd parameter >> provides info about the variable, including its name 'u'."ization pass >> >> I did manage to get this far. But, I am finding it difficult to access >> this info using LLVM APIs. The third parameter is of type "metadata". >> So I was able to access it by casting it to MDNode. After that, I am >> assuming that it gives me a handle to the metadata represented as >> "!10" >> >> !10 = metadata !{i32 524544, metadata !9, metadata !"u", metadata !2, >> i32 3, metadata !6} ; [DW_TAG_auto_variable ] >> >> From here, I am trying invain to access the variable name. >> Is there something wrong in my approach? I feel that I have not >> understood the method to access metadata in llvm. >> > > Use DIVariable from DebugInfo.h to access fields of MDNode that is > holding variable's info. > > - > Devang >-- Arvind Sudarsanam Utah State University Phone: (435) 512-7769 E-mail: theonemorpheus at gmail.com Web-site: http://cc.usu.edu/~asudarsanam