<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hello Rui,<o:p></o:p></p>
<p class="MsoNormal">We meet an LLD PDB issue that if we link assembly code with C code and set >= -O1 level optimization in LTO, the executable’s PDB will contain wrong zero Lines for the assembly code in DEBUG_S_LINES subsection, and then our COFF source
 debuggers will fail to do the source-level debug on the executable.  This issue is same in both Linux and Windows, and I figure out a simple case in Linux to reproduce this issue as below. Please help to give us some advices on how to solve the zero Lines
 issue.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">$ cat main.c<o:p></o:p></p>
<p class="MsoNormal">void assembly_fun();<o:p></o:p></p>
<p class="MsoNormal">int main()<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">  int Index1;<o:p></o:p></p>
<p class="MsoNormal">  for (Index1 = 0; Index1 == 0; assembly_fun(), Index1++){<o:p></o:p></p>
<p class="MsoNormal">    assembly_fun();<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal">  assembly_fun();<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">$ cat assembly.nasm<o:p></o:p></p>
<p class="MsoNormal">    DEFAULT REL<o:p></o:p></p>
<p class="MsoNormal">    SECTION .text<o:p></o:p></p>
<p class="MsoNormal">global assembly_fun<o:p></o:p></p>
<p class="MsoNormal">assembly_fun:<o:p></o:p></p>
<p class="MsoNormal">  ret<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">$ cat makefile_clanglto_Oz<o:p></o:p></p>
<p class="MsoNormal">CC_FLAGS= -g  -m64 -mcmodel=small -target x86_64-unknown-windows -gcodeview -flto -Oz<o:p></o:p></p>
<p class="MsoNormal">CC = /home/jshi19/llvm/clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-18.04/bin/clang<o:p></o:p></p>
<p class="MsoNormal">DLINK_FLAGS = /Machine:X64 /DLL /ENTRY:main /DEBUG:GHASH /lldmap<o:p></o:p></p>
<p class="MsoNormal">DLINK = /home/jshi19/llvm/clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-18.04/bin/lld-link<o:p></o:p></p>
<p class="MsoNormal">SLINK = /home/jshi19/llvm/clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-18.04/bin/llvm-lib<o:p></o:p></p>
<p class="MsoNormal">build:<o:p></o:p></p>
<p class="MsoNormal">        "$(CC)" $(CC_FLAGS) -c -o main.obj  main.c<o:p></o:p></p>
<p class="MsoNormal">        "nasm" -f win64 -o assembly.obj assembly.nasm<o:p></o:p></p>
<p class="MsoNormal">        "$(SLINK)" /OUT:main.lib main.obj<o:p></o:p></p>
<p class="MsoNormal">        "$(SLINK)" /OUT:assembly.lib assembly.obj<o:p></o:p></p>
<p class="MsoNormal">        "$(DLINK)" /OUT:main.dll $(DLINK_FLAGS) main.lib assembly.lib<o:p></o:p></p>
<p class="MsoNormal">clean:<o:p></o:p></p>
<p class="MsoNormal">        rm -f *.obj *.lib *.pdb *.dll *.map<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">$ make -f makefile_clanglto_Oz<o:p></o:p></p>
<p class="MsoNormal">$ llvm-pdbutil dump -l main.pdb<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                           Lines<o:p></o:p></p>
<p class="MsoNormal">============================================================<o:p></o:p></p>
<p class="MsoNormal">Mod 0000 | `assembly.obj`:<o:p></o:p></p>
<p class="MsoNormal">Mod 0001 | `/home/jshi19/llvm/wrongcode/lld-link5/lto.tmp`:<o:p></o:p></p>
<p class="MsoNormal">/home/jshi19/llvm/wrongcode/lld-link5/main.c (MD5: 5F82BB79FE2DA0B0549B784CFDC37D05)<o:p></o:p></p>
<p class="MsoNormal">  0001:00000004-0000001E, line/addr entries = 5<o:p></o:p></p>
<p class="MsoNormal">     3 00000004 !    <b><span style="color:red">0</span></b> 00000008 !    5 0000000D !   
<b><span style="color:red">0 </span></b>00000012 !    9 00000017 !<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If we disable the optimization in the CC_FLAGS with -O0 as below, the PDB Lines will become correct non-zero numbers.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">CC_FLAGS= -g  -m64 -mcmodel=small -target x86_64-unknown-windows -gcodeview -flto
<span style="color:red">-O0<o:p></o:p></span></p>
<p class="MsoNormal">$ llvm-pdbutil dump -l main.pdb<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                           Lines<o:p></o:p></p>
<p class="MsoNormal">============================================================<o:p></o:p></p>
<p class="MsoNormal">Mod 0000 | `assembly.obj`:<o:p></o:p></p>
<p class="MsoNormal">Mod 0001 | `/home/jshi19/llvm/wrongcode/lld_PDB_issue/lto.tmp`:<o:p></o:p></p>
<p class="MsoNormal">/home/jshi19/llvm/wrongcode/lld_PDB_issue/main.c (MD5: 5F82BB79FE2DA0B0549B784CFDC37D05)<o:p></o:p></p>
<p class="MsoNormal">  0001:00000010-00000050, line/addr entries = 6<o:p></o:p></p>
<p class="MsoNormal">     3 00000010 !    5 0000001C !    6 0000002B !    5 00000030 !    8 00000042 !    9 00000047 !<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks<o:p></o:p></p>
<p class="MsoNormal">Steven Shi<o:p></o:p></p>
<p class="MsoNormal"><b><span style="font-size:12.0pt;font-family:"Arial",sans-serif"><o:p> </o:p></span></b></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>