<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<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>Hi,</FONT></DIV>
<DIV><FONT face=Verdana color=#0000ff size=2></FONT> </DIV>
<DIV><FONT face=Verdana color=#0000ff size=2>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.</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 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 15:38:36</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: [LLVMdev] How 
to get the variable mapping between the source andllvm 
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 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></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></DIV>
<DIV>-Eli</DIV>
<DIV></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>