<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div class="">Hi folks, it’s my first post in llvm-dev mailing list, and definitely not the last :-)</div>
<div class=""><br class="">
</div>
<div class="">Recently, I found an elf file built with or without debug info has different machine code generated. Sadly, it cannot be reproduced in a piece of code. Here is my investigation.</div>
<div class=""><br class="">
</div>
<div class="">> clang -S -emit-llvm <a href="http://foo.cc" class="">foo.cc</a> -O3 -ggdb3 -o dbg.ll</div>
<div class="">> clang -S -emit-llvm <a href="http://foo.cc" class="">foo.cc</a> -O3 -o rel.ll</div>
<div class=""><br class="">
</div>
<div class="">Where <a href="http://foo.cc" class="">foo.cc</a> is a cc file in my company of 10k+ LOC and depends on tons of 3rd libraries.</div>
<div class=""><br class="">
</div>
<div class="">The difference between dbg.ll and rel.ll are the llvm debug intrinsics. Emmmm, looks fine.</div>
<div class=""><br class="">
</div>
<div class="">> llc dbg.ll -o dbg.s</div>
<div class="">> llc rel.ll -o rel.s</div>
<div class=""><br class="">
</div>
<div class="">And the asm instructions are the same. Emmm, fine again.</div>
<div class=""><br class="">
</div>
<div class="">> llvm-mc -filetype=obj dbg.s -o dbg.o</div>
<div class="">> llvm-mc -filetype=obj rel.s -o rel.o</div>
<div class=""><br class="">
</div>
<div class="">The 2 obj files generated by LLVM assembler has DIFFERENT machine codes.</div>
<div class=""><br class="">
</div>
<div class="">> 74 19                      je f20</div>
<div class=""><br class="">
</div>
<div class="">The obj compiled with debug info use 0x74 to represent a JE instruction, while</div>
<div class=""><br class="">
</div>
<div class="">> 0f 84 15 00 00 00   je f20</div>
<div class=""><br class="">
</div>
<div class="">The obj compiled without debug info use 0x0f 0x84 instead.</div>
<div class=""><br class="">
</div>
<div class="">What? Why the debug info affects the generation of machine code? As a LLVM beginner, I’m willing to dive deeper to find the root cause. </div>
<div class=""><br class="">
</div>
<div class="">Thanks in advance.</div>
<div class=""><br class="">
</div>
<div class="">
<div dir="auto" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div dir="auto" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div>--</div>
<div>Zhiwei Chen<br class="">
<br class="">
</div>
</div>
</div>
</div>
<br class="">
</body>
</html>