[LLVMdev] How to get the variable mapping between the sourceandllvm bytecode
Kecheng
kecheng at cecs.pdx.edu
Thu May 13 18:18:42 PDT 2010
Eli,
Thanks very much for your reply. That's what I want to know. It works for this example. But I usually have to deal with the optimized bytecode with "-O".
See the example:
**************
C source
**************
int h (int j, int i) {
int tmp;
tmp = j+i+2;
return tmp;
}
+++++++++++++++++++++++++++++++++++++
.ll file:
; ModuleID = 'simplecase.c'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
define i32 @h(i32 %j, i32 %i) nounwind readnone {
entry:
%0 = add nsw i32 %j, 2, !dbg !0 ; <i32> [#uses=1]
%1 = add nsw i32 %0, %i, !dbg !0 ; <i32> [#uses=1]
ret i32 %1, !dbg !7
}
!0 = metadata !{i32 3, i32 0, metadata !1, null}
!1 = metadata !{i32 458763, metadata !2, i32 1, i32 0} ; [ DW_TAG_lexical_block ]
!2 = metadata !{i32 458798, i32 0, metadata !3, metadata !"h", metadata !"h", metadata !"h", metadata !3, i32 1, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ]
!3 = metadata !{i32 458769, i32 0, i32 1, metadata !"simplecase.c", metadata !"/home/kecheng/cases/v2.7/simplecase/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
!4 = metadata !{i32 458773, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ]
!5 = metadata !{metadata !6, metadata !6, metadata !6}
!6 = metadata !{i32 458788, metadata !3, metadata !"int", metadata !3, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
!7 = metadata !{i32 4, i32 0, metadata !1, null}
+++++++++++++++++++++++++++++++++++++
Now the mapping will be tmp <---->%1. We can't derive the mapping based on "alloca/store" instruction.
Best,
Kecheng
2010-05-13
From: Eli Friedman
Date: 2010-05-13 16:58:05
To: Kecheng
Cc: llvmdev
Subject: Re: Re: [LLVMdev] How to get the variable mapping between the sourceandllvm bytecode
On Thu, May 13, 2010 at 4:00 PM, Kecheng <kecheng at cecs.pdx.edu> wrote:
> Hi,
>
> I want to get the mapping between C source's variables and bytecode
> variables. It seems that llvm doesn't provide this mapping, so I think a
> walk-around method is to get the instruction's mapping. I have to use
> llvm-gcc, not clang. Any advice? Thanks.
"int tmp;" corresponds to "%tmp = alloca i32" in the IR. You can pull
that mapping out of the appropriate llvm.dbg.declare call. To find
assignments to the variable, look for store instructions which store
into "%tmp". I fail to see what the addition has to do with anything
in this context.
-Eli
> Best,
>
> ________________________________
> Kecheng
> 2010-05-13
> ________________________________
> From: Eli Friedman
> Date: 2010-05-13 15:38:36
> To: Kecheng
> Cc: llvmdev
> Subject: Re: [LLVMdev] How to get the variable mapping between the source
> andllvm bytecode
>
> On Thu, May 13, 2010 at 1:47 PM, Kecheng <kecheng at cecs.pdx.edu> wrote:
>> Hi,
>>
>> I want to know the variable mapping between the source and llvm bytecode. It
>> seems that current llvm debugging information cannot provide this mapping
>> directly.
>>
>> Here is my examples (llvm 2.7). In this exmaple, I want to know the mapping:
>> tmp<--->%4. But current llvm's debugging information can only provide that
>> the instruction "%4 = add nsw i32 %3, 2" is at line 3 in the C source. But
>> since there're two "+" at line 3, I don't have a direct way to know which
>> "+" is mapped to this "add". Is there any way I can derive the mapping based
>> on current ddg infor? Thanks.
> You want to map the "+" in the source to a specific "add" instruction?
> clang does provide column number info, though, which might help a
> bit. In general, though, debug info isn't rich enough to provide that
> sort of mapping. What are you trying to do?
> -Eli
>> **************
>> C source
>> **************
>> int h (int j, int i) {
>> int tmp;
>> tmp = j+i+2;
>> return tmp;
>> }
>>
>> **************
>> .ll file
>> **************
>> ; ModuleID = 'simplecase.c'
>> target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
>> target triple = "x86_64-unknown-linux-gnu"
>> define i32 @h(i32 %j, i32 %i) nounwind {
>> entry:
>> %j_addr = alloca i32 ; <i32*> [#uses=2]
>> %i_addr = alloca i32 ; <i32*> [#uses=2]
>> %retval = alloca i32 ; <i32*> [#uses=2]
>> %0 = alloca i32 ; <i32*> [#uses=2]
>> %tmp = alloca i32 ; <i32*> [#uses=2]
>> %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
>> call void @llvm.dbg.declare(metadata !{i32* %j_addr}, metadata !0), !dbg !6
>> store i32 %j, i32* %j_addr
>> call void @llvm.dbg.declare(metadata !{i32* %i_addr}, metadata !7), !dbg !6
>> store i32 %i, i32* %i_addr
>> call void @llvm.dbg.declare(metadata !{i32* %tmp}, metadata !8), !dbg !10
>> %1 = load i32* %j_addr, align 4, !dbg !11 ; <i32> [#uses=1]
>> %2 = load i32* %i_addr, align 4, !dbg !11 ; <i32> [#uses=1]
>> %3 = add nsw i32 %1, %2, !dbg !11 ; <i32> [#uses=1]
>> %4 = add nsw i32 %3, 2, !dbg !11 ; <i32> [#uses=1]
>> store i32 %4, i32* %tmp, align 4, !dbg !11
>> %5 = load i32* %tmp, align 4, !dbg !12 ; <i32> [#uses=1]
>> store i32 %5, i32* %0, align 4, !dbg !12
>> %6 = load i32* %0, align 4, !dbg !12 ; <i32> [#uses=1]
>> store i32 %6, i32* %retval, align 4, !dbg !12
>> br label %return, !dbg !12
>> return: ; preds = %entry
>> %retval1 = load i32* %retval, !dbg !12 ; <i32> [#uses=1]
>> ret i32 %retval1, !dbg !12
>> }
>> declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
>> !0 = metadata !{i32 459009, metadata !1, metadata !"j", metadata !2, i32 1, metadata !5} ; [ DW_TAG_arg_variable ]
>> !1 = metadata !{i32 458798, i32 0, metadata !2, metadata !"h", metadata !"h", metadata !"h", metadata !2, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ]
>> !2 = metadata !{i32 458769, i32 0, i32 1, metadata !"simplecase.c", metadata !"/home/kecheng/cases/v2.7/simplecase/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
>> !3 = metadata !{i32 458773, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ]
>> !4 = metadata !{metadata !5, metadata !5, metadata !5}
>> !5 = metadata !{i32 458788, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
>> !6 = metadata !{i32 1, i32 0, metadata !1, null}
>> !7 = metadata !{i32 459009, metadata !1, metadata !"i", metadata !2, i32 1, metadata !5} ; [ DW_TAG_arg_variable ]
>> !8 = metadata !{i32 459008, metadata !9, metadata !"tmp", metadata !2, i32 2, metadata !5} ; [ DW_TAG_auto_variable ]
>> !9 = metadata !{i32 458763, metadata !1, i32 1, i32 0} ; [ DW_TAG_lexical_block ]
>> !10 = metadata !{i32 1, i32 0, metadata !9, null}
>> !11 = metadata !{i32 3, i32 0, metadata !9, null}
>> !12 = metadata !{i32 4, i32 0, metadata !9, null}
>>
>> Best,
>>
>> Kecheng
>> 2010-05-13
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100513/19ad8619/attachment.html>
More information about the llvm-dev
mailing list