<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="MSHTML 6.00.6000.16890" name=GENERATOR>
<STYLE>@font-face {
        font-family: 宋体;
}
@font-face {
        font-family: Verdana;
}
@font-face {
        font-family: @宋体;
}
@page Section1 {size: 595.3pt 841.9pt; margin: 72.0pt 90.0pt 72.0pt 90.0pt; layout-grid: 15.6pt; }
P.MsoNormal {
        TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10.5pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "Times New Roman"; TEXT-ALIGN: justify
}
LI.MsoNormal {
        TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10.5pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "Times New Roman"; TEXT-ALIGN: justify
}
DIV.MsoNormal {
        TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10.5pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "Times New Roman"; TEXT-ALIGN: justify
}
A:link {
        COLOR: blue; TEXT-DECORATION: underline
}
SPAN.MsoHyperlink {
        COLOR: blue; TEXT-DECORATION: underline
}
A:visited {
        COLOR: purple; TEXT-DECORATION: underline
}
SPAN.MsoHyperlinkFollowed {
        COLOR: purple; TEXT-DECORATION: underline
}
SPAN.EmailStyle17 {
        FONT-WEIGHT: normal; COLOR: windowtext; FONT-STYLE: normal; FONT-FAMILY: Verdana; TEXT-DECORATION: none; mso-style-type: personal-compose
}
DIV.Section1 {
        page: Section1
}
BLOCKQUOTE {
        MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; MARGIN-LEFT: 2em
}
OL {
        MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
}
UL {
        MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
}
</STYLE>
</HEAD>
<BODY style="MARGIN-TOP: 10px; MARGIN-LEFT: 10px; MARGIN-RIGHT: 10px">
<DIV><FONT face=Verdana color=#0000ff size=2>Eli,</FONT></DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana color=#0000ff size=2>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". 
</FONT></DIV>
<DIV><FONT face=Verdana color=#0000ff size=2>See the example: </FONT></DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana color=#0000ff size=2>
<DIV>**************</DIV>
<DIV>C source</DIV>
<DIV>**************</DIV>
<DIV>int h (int j, int i) {</DIV>
<DIV>    int tmp;</DIV>
<DIV>    tmp = j+i+2;</DIV>
<DIV>    return tmp;</DIV>
<DIV>}</DIV></FONT></DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana color=#0000ff 
size=2>+++++++++++++++++++++++++++++++++++++</FONT></DIV>
<DIV><FONT face=Verdana color=#0000ff size=2>.ll file:</FONT></DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana color=#0000ff 
size=2>; ModuleID = 'simplecase.c'</DIV>
<DIV>
<DIV>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"</DIV>
<DIV>target triple = "x86_64-unknown-linux-gnu"</DIV>
<DIV></DIV>
<DIV>define i32 @h(i32 %j, i32 %i) nounwind readnone {</DIV>
<DIV>entry:</DIV>
<DIV>  %0 = add nsw i32 %j, 2, !dbg !0                 ; <i32> [#uses=1]</DIV>
<DIV>  %1 = add nsw i32 %0, %i, !dbg !0                ; <i32> [#uses=1]</DIV>
<DIV>  ret i32 %1, !dbg !7</DIV>
<DIV>}</DIV>
<DIV></DIV>
<DIV>!0 = metadata !{i32 3, i32 0, metadata !1, null}</DIV>
<DIV>!1 = metadata !{i32 458763, metadata !2, i32 1, i32 0} ; [ DW_TAG_lexical_block ]</DIV>
<DIV>!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 ]</DIV>
<DIV>!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 ]</DIV>
<DIV>!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 ]</DIV>
<DIV>!5 = metadata !{metadata !6, metadata !6, metadata !6}</DIV>
<DIV>!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 ]</DIV>
<DIV>!7 = metadata !{i32 4, i32 0, metadata !1, null}</DIV>
<DIV>
<DIV><FONT face=Verdana color=#0000ff 
size=2>+++++++++++++++++++++++++++++++++++++</FONT></DIV></DIV>
<DIV> </DIV>
<DIV>Now the mapping will be tmp <---->%1. We can't derive the mapping 
based on "alloca/store" instruction. </DIV>
<DIV> </DIV>
<DIV> </DIV></FONT></DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana color=#0000ff size=2>Best,</FONT></DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana size=2></FONT> </DIV>
<DIV align=left>
<DIV align=left><FONT face=Verdana size=2>
<HR style="WIDTH: 122px; HEIGHT: 2px" SIZE=2>
</FONT></DIV>
<DIV><FONT color=#c0c0c0><FONT face=Verdana 
size=2><SPAN>Kecheng</SPAN></FONT></DIV>
<DIV><FONT face=Verdana size=2>2010-05-13</FONT></FONT></DIV></DIV>
<DIV><FONT face=Verdana size=2>
<HR>
</FONT></DIV>
<DIV><FONT face=Verdana><FONT size=2><STRONG>From:</STRONG> Eli 
Friedman</FONT></FONT></DIV>
<DIV><FONT face=Verdana><FONT size=2><STRONG>Date:</STRONG> 
2010-05-13 16:58:05</FONT></FONT></DIV>
<DIV><FONT face=Verdana><FONT size=2><STRONG>To:</STRONG> 
Kecheng</FONT></FONT></DIV>
<DIV><FONT face=Verdana><FONT size=2><STRONG>Cc:</STRONG> 
llvmdev</FONT></FONT></DIV>
<DIV><FONT face=Verdana><FONT size=2><STRONG>Subject:</STRONG> Re: Re: [LLVMdev] 
How to get the variable mapping between the sourceandllvm 
bytecode</FONT></FONT></DIV>
<DIV><FONT face=Verdana size=2></FONT> </DIV>
<DIV><FONT face=Verdana size=2>
<DIV>On Thu, May 13, 2010 at 4:00 PM, Kecheng <kecheng@cecs.pdx.edu> wrote:</DIV>
<DIV>> Hi,</DIV>
<DIV>></DIV>
<DIV>> I want to get the mapping between C source's variables and bytecode</DIV>
<DIV>> variables.  It seems that llvm doesn't provide this mapping, so I think a</DIV>
<DIV>> walk-around method is to get the instruction's mapping. I have to use</DIV>
<DIV>> llvm-gcc, not clang. Any advice? Thanks.</DIV>
<DIV></DIV>
<DIV>"int tmp;" corresponds to "%tmp = alloca i32" in the IR.  You can pull</DIV>
<DIV>that mapping out of the appropriate llvm.dbg.declare call.  To find</DIV>
<DIV>assignments to the variable, look for store instructions which store</DIV>
<DIV>into "%tmp".  I fail to see what the addition has to do with anything</DIV>
<DIV>in this context.</DIV>
<DIV></DIV>
<DIV>-Eli</DIV>
<DIV></DIV>
<DIV>> Best,</DIV>
<DIV>></DIV>
<DIV>> ________________________________</DIV>
<DIV>> Kecheng</DIV>
<DIV>> 2010-05-13</DIV>
<DIV>> ________________________________</DIV>
<DIV>> From: Eli Friedman</DIV>
<DIV>> Date: 2010-05-13 15:38:36</DIV>
<DIV>> To: Kecheng</DIV>
<DIV>> Cc: llvmdev</DIV>
<DIV>> Subject: Re: [LLVMdev] How to get the variable mapping between the source</DIV>
<DIV>> andllvm bytecode</DIV>
<DIV>></DIV>
<DIV>> On Thu, May 13, 2010 at 1:47 PM, Kecheng <kecheng@cecs.pdx.edu> wrote:</DIV>
<DIV>>> Hi,</DIV>
<DIV>>></DIV>
<DIV>>> I want to know the variable mapping between the source and llvm bytecode. It</DIV>
<DIV>>> seems that current llvm debugging information cannot provide this mapping</DIV>
<DIV>>> directly.</DIV>
<DIV>>></DIV>
<DIV>>> Here is my examples (llvm 2.7). In this exmaple, I want to know the mapping:</DIV>
<DIV>>> tmp<--->%4. But current llvm's debugging information can only provide that</DIV>
<DIV>>> the instruction "%4 = add nsw i32 %3, 2" is at line 3 in the C source. But</DIV>
<DIV>>> since there're two "+" at line 3, I don't have a direct way to know which</DIV>
<DIV>>> "+" is mapped to this "add". Is there any way I can derive the mapping based</DIV>
<DIV>>> on current ddg infor? Thanks.</DIV>
<DIV>> You want to map the "+" in the source to a specific "add" instruction?</DIV>
<DIV>>  clang does provide column number info, though, which might help a</DIV>
<DIV>> bit.  In general, though, debug info isn't rich enough to provide that</DIV>
<DIV>> sort of mapping.  What are you trying to do?</DIV>
<DIV>> -Eli</DIV>
<DIV>>> **************</DIV>
<DIV>>> C source</DIV>
<DIV>>> **************</DIV>
<DIV>>> int h (int j, int i) {</DIV>
<DIV>>>     int tmp;</DIV>
<DIV>>>     tmp = j+i+2;</DIV>
<DIV>>>     return tmp;</DIV>
<DIV>>> }</DIV>
<DIV>>></DIV>
<DIV>>> **************</DIV>
<DIV>>> .ll file</DIV>
<DIV>>> **************</DIV>
<DIV>>> ; ModuleID = 'simplecase.c'</DIV>
<DIV>>> 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"</DIV>
<DIV>>> target triple = "x86_64-unknown-linux-gnu"</DIV>
<DIV>>> define i32 @h(i32 %j, i32 %i) nounwind {</DIV>
<DIV>>> entry:</DIV>
<DIV>>>   %j_addr = alloca i32                            ; <i32*> [#uses=2]</DIV>
<DIV>>>   %i_addr = alloca i32                            ; <i32*> [#uses=2]</DIV>
<DIV>>>   %retval = alloca i32                            ; <i32*> [#uses=2]</DIV>
<DIV>>>   %0 = alloca i32                                 ; <i32*> [#uses=2]</DIV>
<DIV>>>   %tmp = alloca i32                               ; <i32*> [#uses=2]</DIV>
<DIV>>>   %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]</DIV>
<DIV>>>   call void @llvm.dbg.declare(metadata !{i32* %j_addr}, metadata !0), !dbg !6</DIV>
<DIV>>>   store i32 %j, i32* %j_addr</DIV>
<DIV>>>   call void @llvm.dbg.declare(metadata !{i32* %i_addr}, metadata !7), !dbg !6</DIV>
<DIV>>>   store i32 %i, i32* %i_addr</DIV>
<DIV>>>   call void @llvm.dbg.declare(metadata !{i32* %tmp}, metadata !8), !dbg !10</DIV>
<DIV>>>   %1 = load i32* %j_addr, align 4, !dbg !11       ; <i32> [#uses=1]</DIV>
<DIV>>>   %2 = load i32* %i_addr, align 4, !dbg !11       ; <i32> [#uses=1]</DIV>
<DIV>>>   %3 = add nsw i32 %1, %2, !dbg !11               ; <i32> [#uses=1]</DIV>
<DIV>>>   %4 = add nsw i32 %3, 2, !dbg !11                ; <i32> [#uses=1]</DIV>
<DIV>>>   store i32 %4, i32* %tmp, align 4, !dbg !11</DIV>
<DIV>>>   %5 = load i32* %tmp, align 4, !dbg !12          ; <i32> [#uses=1]</DIV>
<DIV>>>   store i32 %5, i32* %0, align 4, !dbg !12</DIV>
<DIV>>>   %6 = load i32* %0, align 4, !dbg !12            ; <i32> [#uses=1]</DIV>
<DIV>>>   store i32 %6, i32* %retval, align 4, !dbg !12</DIV>
<DIV>>>   br label %return, !dbg !12</DIV>
<DIV>>> return:                                           ; preds = %entry</DIV>
<DIV>>>   %retval1 = load i32* %retval, !dbg !12          ; <i32> [#uses=1]</DIV>
<DIV>>>   ret i32 %retval1, !dbg !12</DIV>
<DIV>>> }</DIV>
<DIV>>> declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone</DIV>
<DIV>>> !0 = metadata !{i32 459009, metadata !1, metadata !"j", metadata !2, i32 1, metadata !5} ; [ DW_TAG_arg_variable ]</DIV>
<DIV>>> !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 ]</DIV>
<DIV>>> !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 ]</DIV>
<DIV>>> !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 ]</DIV>
<DIV>>> !4 = metadata !{metadata !5, metadata !5, metadata !5}</DIV>
<DIV>>> !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 ]</DIV>
<DIV>>> !6 = metadata !{i32 1, i32 0, metadata !1, null}</DIV>
<DIV>>> !7 = metadata !{i32 459009, metadata !1, metadata !"i", metadata !2, i32 1, metadata !5} ; [ DW_TAG_arg_variable ]</DIV>
<DIV>>> !8 = metadata !{i32 459008, metadata !9, metadata !"tmp", metadata !2, i32 2, metadata !5} ; [ DW_TAG_auto_variable ]</DIV>
<DIV>>> !9 = metadata !{i32 458763, metadata !1, i32 1, i32 0} ; [ DW_TAG_lexical_block ]</DIV>
<DIV>>> !10 = metadata !{i32 1, i32 0, metadata !9, null}</DIV>
<DIV>>> !11 = metadata !{i32 3, i32 0, metadata !9, null}</DIV>
<DIV>>> !12 = metadata !{i32 4, i32 0, metadata !9, null}</DIV>
<DIV>>></DIV>
<DIV>>> Best,</DIV>
<DIV>>></DIV>
<DIV>>> Kecheng</DIV>
<DIV>>> 2010-05-13</DIV>
<DIV>>> _______________________________________________</DIV>
<DIV>>> LLVM Developers mailing list</DIV>
<DIV>>> LLVMdev@cs.uiuc.edu         http://llvm.cs.uiuc.edu</DIV>
<DIV>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</DIV>
<DIV>>></DIV>
<DIV>>></DIV></FONT></DIV></BODY></HTML>