<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=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:宋体;
        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:"\@宋体";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        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;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 129.75pt 1.0in 129.7pt;}
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="MsoPlainText">Hi Umesh,<o:p></o:p></p>
<p class="MsoPlainText">Thank you for the suggestion. I can use the "Brute force method " to narrow down the LTO wrong instructions here and there, but I still don't know why these wrong instructions are generated, and how to let Clang LTO don't generate those
 wrong instructions.<o:p></o:p></p>
<p class="MsoPlainText">I suspect the wrong code is caused by some LTO wrong optimization pass, so I hope to disable all optimizations in the LTO firstly, then enable them one by one later to narrow down my issue root cause. But when I try to disable the optimization
 by enforcing –O0 in the LTO build, I find the ld fails to recognize some clang  bitcode library, and fail to link.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">e.g. use the Clang_LTO_Fails_On_LD example in below bug attachment<o:p></o:p></p>
<p class="MsoPlainText"><a href="https://sourceware.org/bugzilla/show_bug.cgi?id=20070">https://sourceware.org/bugzilla/show_bug.cgi?id=20070</a>
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">If I enforce the -O0 to disable the optimization in LTO, the ld fail to link:<o:p></o:p></p>
<p class="MsoPlainText">~/clang38/bin/clang -o Hello.dll -flto <b><span style="color:red">-O0</span></b><span style="color:red">
</span>-nostdlib -Wl,-n -Wl,-q -Wl,--gc-sections -Wl,-z,common-page-size=0x40 -Wl,--entry,_ModuleEntryPoint -Wl,-u,_ModuleEntryPoint -Wl,-Map,Hello.map -Wl,-melf_x86_64 -Wl,--oformat=elf64-x86-64 -Wl,--start-group,,@static_library_files.lst -Wl,--end-group<o:p></o:p></p>
<p class="MsoPlainText">BaseLib.lib: error adding symbols: File format not recognized<o:p></o:p></p>
<p class="MsoPlainText">clang-3.8: error: linker command failed with exit code 1 (use -v to see invocation)<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">But if I enable the -O1, -O2, or higher -On, the ld  link pass:<o:p></o:p></p>
<p class="MsoPlainText">~/clang38/bin/clang -o Hello.dll -flto <b><span style="color:red">-O1</span></b><span style="color:red">
</span>-nostdlib -Wl,-n -Wl,-q -Wl,--gc-sections -Wl,-z,common-page-size=0x40 -Wl,--entry,_ModuleEntryPoint -Wl,-u,_ModuleEntryPoint -Wl,-Map,Hello.map -Wl,-melf_x86_64 -Wl,--oformat=elf64-x86-64 -Wl,--start-group,,@static_library_files.lst -Wl,--end-group<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">How can I correctly disable all the optimization in clang LTO? How can I know, enable and disable the specific optimizations in clang LTO? Any suggestion is welcomed!<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Steven Shi<o:p></o:p></p>
<p class="MsoPlainText">Intel\SSG\STO\UEFI Firmware<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Tel: +86 021-61166522<o:p></o:p></p>
<p class="MsoPlainText">iNet: 821-6522<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><a name="_____replyseparator"></a>> -----Original Message-----</p>
<p class="MsoPlainText">> From: Umesh Kalappa [mailto:umesh.kalappa0@gmail.com]</p>
<p class="MsoPlainText">> Sent: Saturday, May 14, 2016 2:14 AM</p>
<p class="MsoPlainText">> To: Shi, Steven <steven.shi@intel.com></p>
<p class="MsoPlainText">> Cc: llvm-dev <llvm-dev@lists.llvm.org>; cfe-dev@lists.llvm.org</p>
<p class="MsoPlainText">> Subject: Re: [llvm-dev] How to debug if LTO generate wrong code?</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> Steven,</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> Brute force method  is ,get the disassemble of the hanged function and</p>
<p class="MsoPlainText">> try to check the difference with and without LTO in the generated</p>
<p class="MsoPlainText">> code.</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> or try to attach gdb and check  for the instruction ,that cause the exception .</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> Thank you</p>
<p class="MsoPlainText">> ~Umesh</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> On Fri, May 13, 2016 at 7:48 PM, Shi, Steven via llvm-dev</p>
<p class="MsoPlainText">> <<a href="mailto:llvm-dev@lists.llvm.org"><span style="color:windowtext;text-decoration:none">llvm-dev@lists.llvm.org</span></a>> wrote:</p>
<p class="MsoPlainText">> > Hello,</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > I'm enabling clang LTO to improve code size of Uefi standard</p>
<p class="MsoPlainText">> > (<a href="http://www.uefi.org/"><span style="color:windowtext;text-decoration:none">http://www.uefi.org/</span></a>) firmware (<a href="https://github.com/tianocore/edk2"><span style="color:windowtext;text-decoration:none">https://github.com/tianocore/edk2</span></a>),</p>
<p class="MsoPlainText">> which</p>
<p class="MsoPlainText">> > is mostly C code. My project is in <a href="https://github.com/shijunjing/edk2">
<span style="color:windowtext;text-decoration:none">https://github.com/shijunjing/edk2</span></a></p>
<p class="MsoPlainText">> branch</p>
<p class="MsoPlainText">> > llvm : <a href="https://github.com/shijunjing/edk2/tree/llvm">
<span style="color:windowtext;text-decoration:none">https://github.com/shijunjing/edk2/tree/llvm</span></a>. I find my most</p>
<p class="MsoPlainText">> firmware</p>
<p class="MsoPlainText">> > modules work well after enable LTO, but some X64 modules will not run</p>
<p class="MsoPlainText">> (e.g.</p>
<p class="MsoPlainText">> > hang with CPU exception) , and these X64 modules work well if build with</p>
<p class="MsoPlainText">> the</p>
<p class="MsoPlainText">> > LTO disabled (-fno-lto).</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > I don’t know how to efficiently debug these LTO wrong code and</p>
<p class="MsoPlainText">> investigate</p>
<p class="MsoPlainText">> > if there is compiler’s bug. I appreciate if anyone can  give me some</p>
<p class="MsoPlainText">> > suggestions about the clang LTO issue debug method, commands, or BKMs.</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > Below are  my clang LTO build tools and options, I use clang 3.8 release</p>
<p class="MsoPlainText">> > with binutils 2.26 ld (I’ve pushed ld support LLVM gold plugin</p>
<p class="MsoPlainText">> > <a href="https://sourceware.org/bugzilla/show_bug.cgi?id=20070">
<span style="color:windowtext;text-decoration:none">https://sourceware.org/bugzilla/show_bug.cgi?id=20070</span></a>). Any suggestion</p>
<p class="MsoPlainText">> is</p>
<p class="MsoPlainText">> > welcome!</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > ##################</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > # CLANGLTO38 X64 definitions</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > ##################</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_OBJCOPY_PATH         =</p>
<p class="MsoPlainText">> DEF(GCC53_X64_PREFIX)objcopy</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_CC_PATH              = DEF(CLANG38_X64_PREFIX)clang</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_SLINK_PATH           = DEF(CLANG38_X64_PREFIX)llvm-</p>
<p class="MsoPlainText">> ar</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_DLINK_PATH           =</p>
<p class="MsoPlainText">> DEF(CLANG38_X64_PREFIX)clang</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_ASM_PATH             = DEF(CLANG38_X64_PREFIX)clang</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_PP_PATH              = DEF(CLANG38_X64_PREFIX)clang</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_RC_PATH              = DEF(GCC53_X64_PREFIX)objcopy</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_CC_FLAGS = -c -fshort-wchar -fno-strict-aliasing -</p>
<p class="MsoPlainText">> Wall</p>
<p class="MsoPlainText">> > -Werror -Wno-array-bounds -Wno-empty-body -ffunction-sections</p>
<p class="MsoPlainText">> > -fdata-sections -include AutoGen.h -</p>
<p class="MsoPlainText">> DSTRING_ARRAY_NAME=$(BASE_NAME)Strings</p>
<p class="MsoPlainText">> > -fno-stack-protector -fno-builtin -mms-bitfields -Wno-address</p>
<p class="MsoPlainText">> > -Wno-shift-negative-value -Wno-parentheses-equality -Wno-unknown-</p>
<p class="MsoPlainText">> pragmas</p>
<p class="MsoPlainText">> > -Wno-tautological-constant-out-of-range-compare</p>
<p class="MsoPlainText">> > -Wno-incompatible-library-redeclaration -target x86_64-pc-linux-gnu</p>
<p class="MsoPlainText">> > -fno-asynchronous-unwind-tables -m64 -Wno-enum-conversion</p>
<p class="MsoPlainText">> > "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=large -g -Os</p>
<p class="MsoPlainText">> -flto</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_DLINK_FLAGS  = -flto -nostdlib -Wl,-n -Wl,-q</p>
<p class="MsoPlainText">> > -Wl,--gc-sections -Wl,-z,common-page-size=0x40</p>
<p class="MsoPlainText">> > -Wl,--entry,$(IMAGE_ENTRY_POINT) -Wl,-u,$(IMAGE_ENTRY_POINT)</p>
<p class="MsoPlainText">> > -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map -Wl,-melf_x86_64</p>
<p class="MsoPlainText">> > -Wl,--oformat=elf64-x86-64</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_ASM_FLAGS            = -c -x assembler -imacros</p>
<p class="MsoPlainText">> > $(DEST_DIR_DEBUG)/AutoGen.h -m64 -target x86_64-pc-linux-gnu</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_RC_FLAGS             = -I binary -O elf64-x86-64        -B</p>
<p class="MsoPlainText">> > i386    --rename-section .data=.hii</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > *_CLANGLTO38_X64_NASM_FLAGS           = -f elf64</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > Steven Shi</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > Intel\SSG\STO\UEFI Firmware</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > Tel: +86 021-61166522</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > iNet: 821-6522</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > _______________________________________________</p>
<p class="MsoPlainText">> > LLVM Developers mailing list</p>
<p class="MsoPlainText">> > <a href="mailto:llvm-dev@lists.llvm.org"><span style="color:windowtext;text-decoration:none">llvm-dev@lists.llvm.org</span></a></p>
<p class="MsoPlainText">> > <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">
<span style="color:windowtext;text-decoration:none">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</span></a></p>
<p class="MsoPlainText">> ></p>
</div>
</body>
</html>