<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 14 (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:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 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:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.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=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Adrian and David,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>‘creduce’ is a very powerful tool! It successfully simplify the preprocessed file.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>The attached case can reproduce the failure. Just run:<o:p></o:p></span></p><p class=MsoNormal style='text-indent:9.0pt'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>clang++ -S –g –O3 –std=c++11 -target aarch64 dbg-info.cpp<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>-Hao<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> David Blaikie [mailto:dblaikie@gmail.com] <br><b>Sent:</b> 2015</span><span lang=ZH-CN style='font-size:10.0pt;font-family:SimSun'>年</span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>1</span><span lang=ZH-CN style='font-size:10.0pt;font-family:SimSun'>月</span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>28</span><span lang=ZH-CN style='font-size:10.0pt;font-family:SimSun'>日</span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> 7:59<br><b>To:</b> Hao Liu<br><b>Cc:</b> Adrian Prantl; llvm-commits<br><b>Subject:</b> Re: [llvm] r226598 - Reapply: Teach SROA how to update debug info for fragmented variables.<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>On Mon, Jan 26, 2015 at 7:40 PM, Hao Liu <<a href="mailto:Hao.Liu@arm.com" target="_blank">Hao.Liu@arm.com</a>> wrote:<o:p></o:p></p><p class=MsoNormal>Hi Adrian and David,<br><br>Our internal tests failed again on another assertion, which is also related<br>to this commit.<br><br>David did a commit r226842 in<br><a href="http://llvm.org/viewvc/llvm-project?view=revision&revision=226842" target="_blank">http://llvm.org/viewvc/llvm-project?view=revision&revision=226842</a>, which<br>reverted a work around. Then our internal tests have an assertion failure.<br>But the failure is not caused by 226842 according to David's explanation.<br>After some investigation, I found it is caused by this commit. I did two<br>experiments.<br>Experiment 1. Update llvm to r226598 and apply the patch in r226842. Our<br>test case will have an assertion failure.<br>Experiment 2. Update llvm to r226597 and also apply the patch in r226842. It<br>doesn't have such failure.<br><br>Sorry that I don't familiar with debug info. I don't know how to simplify a<br>test case. <o:p></o:p></p><div><p class=MsoNormal><br>When clang crashes it should tell you the paths of the crash files (a preprocessed source file and a script with the full command line that can be used to reproduce the failure) - do you have those?<br><br>If you want to reduce it further, you can try removing arguments from the command line (checking that it still crashes) until you have the minimal arguments, and also try reducing the preprocesesd source (removing functions, namespaces, arguments, etc) while checking it still reproduces the crash.<br><br>With that, it'll be easier to investigate.<br><br>But my guess is that it shouldn't be too hard to reproduce - any argument that gets SROA'd into two or more arguments might trigger this assertion by trying to add two argument variables, maybe? Not sure.<br> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm'><p class=MsoNormal>I use "LS-dump()" but see nothing. And "LS-getParent()" is not<br>null, so it seems the work around works. I think this issue is similar to<br>the issue in the work around r226842. Hopefully you know what is "duplicate<br>argument" and you can fix it.<br><br>The failure information is like:<br>llc: ./llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp:171: void llvm::DwarfFile::<br>addScopeVariable(llvm::LexicalScope*, llvm::DbgVariable*): Assertion `CurNum<br>!= ArgNum && "Duplicate argument"' failed.<br>#0 0x1583698 llvm::sys::PrintStackTrace(_IO_FILE*)<br>./llvm/lib/Support/Unix/Signals.inc:423:0<br>#1 0x1583933 PrintStackTraceSignalHandler(void*)<br>./llvm/lib/Support/Unix/Signals.inc:481:0<br>#2 0x1582555 SignalHandler(int) ./llvm/lib/Support/Unix/Signals.inc:198:0<br>#3 0x7f3ec3c06340 __restore_rt<br>(/lib/x86_64-linux-gnu/libpthread.so.0+0x10340)<br>#4 0x7f3ec2e2dcc9 gsignal<br>/build/buildd/eglibc-2.19/signal/../nptl/sysdeps/unix/sysv/linux/raise.c:56:<br>0<br>#5 0x7f3ec2e310d8 abort /build/buildd/eglibc-2.19/stdlib/abort.c:91:0<br>#6 0x7f3ec2e26b86 __assert_fail_base<br>/build/buildd/eglibc-2.19/assert/assert.c:92:0<br>#7 0x7f3ec2e26c32 (/lib/x86_64-linux-gnu/libc.so.6+0x2fc32)<br>#8 0xe042de llvm::DwarfFile::addScopeVariable(llvm::LexicalScope*,<br>llvm::DbgVariable*) ./llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp:172:0<br>#9 0xdd8aa7<br>llvm::DwarfDebug::collectVariableInfoFromMMITable(llvm::SmallPtrSetImpl<llvm<br>::MDNode const*>&) ./llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp:773:0<br>#10 0xdd9643 llvm::DwarfDebug::collectVariableInfo(llvm::DwarfCompileUnit&,<br>llvm::DISubprogram, llvm::SmallPtrSetImpl<llvm::MDNode const*>&)<br>./llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp:942:0<br>#11 0xddb091 llvm::DwarfDebug::endFunction(llvm::MachineFunction const*)<br>./llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp:1266:0<br>#12 0xdbf424 llvm::AsmPrinter::EmitFunctionBody()<br>./llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp:887:0<br>#13 0xbb5a6f llvm::AsmPrinter::runOnMachineFunction(llvm::MachineFunction&)<br>./llvm/include/llvm/CodeGen/AsmPrinter.h:189:0<br>#14 0xbb5c96 (anonymous<br>namespace)::AArch64AsmPrinter::runOnMachineFunction(llvm::MachineFunction&)<br>./llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp:89:0<br><br>Thanks,<br>-Hao<br><br>>>-----Original Message-----<br>>>From: Adrian Prantl [mailto:<a href="mailto:aprantl@apple.com">aprantl@apple.com</a>]<br>>>Sent: 2015<span lang=ZH-CN style='font-family:SimSun'>年</span>1<span lang=ZH-CN style='font-family:SimSun'>月</span>23<span lang=ZH-CN style='font-family:SimSun'>日</span> 23:59<br>>>To: Hao Liu<br>>>Cc: llvm-commits; David Blaikie<br>>>Subject: Re: [llvm] r226598 - Reapply: Teach SROA how to update debug info<br>>>for fragmented variables.<br>>><br>>><o:p></o:p></p><div><div><p class=MsoNormal>>>> On Jan 23, 2015, at 2:15 AM, Hao Liu <<a href="mailto:Hao.Liu@arm.com">Hao.Liu@arm.com</a>> wrote:<br>>>><br>>>> Hi Adrian,<br>>>><br>>>> I observe a crash caused by this commit on our internal tests. Without<br>"-g"<br>>>> the test can be built successfully. This original case is a little<br>>>> difficult to be simplified. I will work on reproducer.<br>>><br>>>That would be great!<br>>><br>>>> Just let you know so that maybe you can find the root cause and fix it.<br>>><br>>>In order to diagnose the problem, it might be sufficient information if<br>you<br>>>could just to just invoke ->dump() on the type that is passed into<br>>>isUnsignedDIType(). We may simply need to add another TAG to this list.<br>>><br>>>thanks,<br>>>-- adrian<br>>>><br>>>> clang-3.7: ./llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp:592: bool<br>>>> isUnsignedDIType(llvm::DwarfDebug*, llvm::DIType): Assertion `T ==<br>>>> dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type || T ==<br>>>> dwarf::DW_TAG_volatile_type || T == dwarf::DW_TAG_restrict_type || T<br>>>> == dwarf::DW_TAG_enumeration_type' failed.<br>>>> #0 0x1d27f90 llvm::sys::PrintStackTrace(_IO_FILE*)<br>>>> ./llvm/lib/Support/Unix/Signals.inc:423:0<br>>>> #1 0x1d2822b PrintStackTraceSignalHandler(void*)<br>>>> ./llvm/lib/Support/Unix/Signals.inc:481:0<br>>>> #2 0x1d26e4d SignalHandler(int)<br>>>> ./llvm/lib/Support/Unix/Signals.inc:198:0<br>>>> #3 0x7ffaa3f5f340 __restore_rt<br>>>> (/lib/x86_64-linux-gnu/libpthread.so.0+0x10340)<br>>>> #4 0x7ffaa3186cc9 gsignal<br>>>><br>/build/buildd/eglibc-2.19/signal/../nptl/sysdeps/unix/sysv/linux/raise.c:56:<br>>>> 0<br>>>> #5 0x7ffaa318a0d8 abort /build/buildd/eglibc-2.19/stdlib/abort.c:91:0<br>>>> #6 0x7ffaa317fb86 __assert_fail_base<br>>>> /build/buildd/eglibc-2.19/assert/assert.c:92:0<br>>>> #7 0x7ffaa317fc32 (/lib/x86_64-linux-gnu/libc.so.6+0x2fc32)<br>>>> #8 0x207f2b5 isUnsignedDIType(llvm::DwarfDebug*, llvm::DIType)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp:593:0<br>>>> #9 0x207f300 isUnsignedDIType(llvm::DwarfDebug*, llvm::DIType)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp:594:0<br>>>> #10 0x207f8a4 llvm::DwarfUnit::addConstantValue(llvm::DIE&,<br>>>> llvm::MachineOperand const&, llvm::DIType)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp:686:0<br>>>> #11 0x20ad32e<br>>>> llvm::DwarfCompileUnit::constructVariableDIEImpl(llvm::DbgVariable<br>>>> const&,<br>>>> bool) ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:508:0<br>>>> #12 0x20ad081<br>>>> llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:472:0<br>>>> #13 0x20ad50f<br>>>> llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&,<br>>>> llvm::LexicalScope const&, llvm::DIE*&)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:535:0<br>>>> #14 0x20ad623<br>>>> llvm::DwarfCompileUnit::createScopeChildrenDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&, unsigned int*)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:546:0<br>>>> #15 0x20ac41c<br>>>> llvm::DwarfCompileUnit::constructScopeDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:346:0<br>>>> #16 0x20ad6f0<br>>>> llvm::DwarfCompileUnit::createScopeChildrenDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&, unsigned int*)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:550:0<br>>>> #17 0x20ac41c<br>>>> llvm::DwarfCompileUnit::constructScopeDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:346:0<br>>>> #18 0x20ad6f0<br>>>> llvm::DwarfCompileUnit::createScopeChildrenDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&, unsigned int*)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:550:0<br>>>> #19 0x20ac3cd<br>>>> llvm::DwarfCompileUnit::constructScopeDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:333:0<br>>>> #20 0x20ad6f0<br>>>> llvm::DwarfCompileUnit::createScopeChildrenDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&, unsigned int*)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:550:0<br>>>> #21 0x20ac41c<br>>>> llvm::DwarfCompileUnit::constructScopeDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:346:0<br>>>> #22 0x20ad6f0<br>>>> llvm::DwarfCompileUnit::createScopeChildrenDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&, unsigned int*)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:550:0<br>>>> #23 0x20ac41c<br>>>> llvm::DwarfCompileUnit::constructScopeDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:346:0<br>>>> #24 0x20ad6f0<br>>>> llvm::DwarfCompileUnit::createScopeChildrenDIE(llvm::LexicalScope*,<br>>>> llvm::SmallVectorImpl<std::unique_ptr<llvm::DIE,<br>>>> std::default_delete<llvm::DIE> > >&, unsigned int*)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:550:0<br>>>> #25 0x20ada2d<br>>>> llvm::DwarfCompileUnit::createAndAddScopeChildren(llvm::LexicalScope*,<br>>>> llvm::DIE&) ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:593:0<br>>>> #26 0x20ad8f1<br>>>> llvm::DwarfCompileUnit::constructSubprogramScopeDIE(llvm::LexicalScope<br>>>> *)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:577:0<br>>>> #27 0x20562e7 llvm::DwarfDebug::endFunction(llvm::MachineFunction<br>>>> const*)<br>>>> ./llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp:1306:0<br>>>> #28 0x203ec5a llvm::AsmPrinter::EmitFunctionBody()<br>>>> ./llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp:887:0<br>>>> #29 0x12c03dd<br>>>> llvm::AsmPrinter::runOnMachineFunction(llvm::MachineFunction&)<br>>>> ./llvm/include/llvm/CodeGen/AsmPrinter.h:189:0<br>>>> #30 0x12c0604 (anonymous<br>>>><br>>>namespace)::AArch64AsmPrinter::runOnMachineFunction(llvm::MachineFunct<br>>>> ion&)<br>>>> ./llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp:89:0<br>>>> #31 0x1661c9d<br>>>> llvm::MachineFunctionPass::runOnFunction(llvm::Function&)<br>>>> ./llvm/lib/CodeGen/MachineFunctionPass.cpp:34:0<br>>>> #32 0x198a476 llvm::FPPassManager::runOnFunction(llvm::Function&)<br>>>> ./llvm/lib/IR/LegacyPassManager.cpp:1530:0<br>>>> #33 0x198a5e6 llvm::FPPassManager::runOnModule(llvm::Module&)<br>>>> ./llvm/lib/IR/LegacyPassManager.cpp:1550:0<br>>>> #34 0x198a904 (anonymous<br>>>> namespace)::MPPassManager::runOnModule(llvm::Module&)<br>>>> ./llvm/lib/IR/LegacyPassManager.cpp:1608:0<br>>>> #35 0x198afa8 llvm::legacy::PassManagerImpl::run(llvm::Module&)<br>>>> ./llvm/lib/IR/LegacyPassManager.cpp:1715:0<br>>>> #36 0x198b1c7 llvm::legacy::PassManager::run(llvm::Module&)<br>>>> ./llvm/lib/IR/LegacyPassManager.cpp:1749:0<br>>>> #37 0x2292b3b (anonymous<br>>>> namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction,<br>>>> llvm::raw_ostream*)<br>>>> ./llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:634:0<br>>>> #38 0x2292c0a clang::EmitBackendOutput(clang::DiagnosticsEngine&,<br>>>> clang::CodeGenOptions const&, clang::TargetOptions const&,<br>>>> clang::LangOptions const&, llvm::StringRef, llvm::Module*,<br>>>> clang::BackendAction, llvm::raw_ostream*)<br>>>> ./llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:650:0<br>>>> #39 0x22785ec<br>>>> clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)<br>>>> ./llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:178:0<br>>>> #40 0x2caa57a clang::ParseAST(clang::Sema&, bool, bool)<br>>>> ./llvm/tools/clang/lib/Parse/ParseAST.cpp:153:0<br>>>> #41 0x1f24938 clang::ASTFrontendAction::ExecuteAction()<br>>>> ./llvm/tools/clang/lib/Frontend/FrontendAction.cpp:528:0<br>>>> #42 0x227aab7 clang::CodeGenAction::ExecuteAction()<br>>>> ./llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:728:0<br>>>> #43 0x1f24413 clang::FrontendAction::Execute()<br>>>> ./llvm/tools/clang/lib/Frontend/FrontendAction.cpp:432:0<br>>>> #44 0x1eeda94<br>>>> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)<br>>>> ./llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:812:0<br>>>> #45 0x20356b5<br>>>> clang::ExecuteCompilerInvocation(clang::CompilerInstance*)<br>>>> ./llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:222:<br>>>> 0<br>>>> #46 0x10d8d66 cc1_main(llvm::ArrayRef<char const*>, char const*,<br>>>> void*)<br>>>> ./llvm/tools/clang/tools/driver/cc1_main.cpp:110:0<br>>>> #47 0x10d1522 ExecuteCC1Tool(llvm::ArrayRef<char const*>,<br>>>llvm::StringRef) .<br>>>> /llvm/tools/clang/tools/driver/driver.cpp:369:0<br>>>> #48 0x10d1b04 main ./llvm/tools/clang/tools/driver/driver.cpp:415:0<br>>>> #49 0x7ffaa3171ec5 __libc_start_main<br>>>> /build/buildd/eglibc-2.19/csu/libc-start.c:321:0<br>>>> #50 0x10ce559 _start (./llvm/2build/bin/clang-3.7+0x10ce559)<br>>>><br>>>>>> -----Original Message-----<br>>>>>> From: <a href="mailto:llvm-commits-bounces@cs.uiuc.edu">llvm-commits-bounces@cs.uiuc.edu</a> [mailto:<a href="mailto:llvm-commits-">llvm-commits-</a><br>>>>>> <a href="mailto:bounces@cs.uiuc.edu">bounces@cs.uiuc.edu</a>] On Behalf Of Adrian Prantl<br>>>>>> Sent: 2015<span lang=ZH-CN style='font-family:SimSun'>年</span>1<span lang=ZH-CN style='font-family:SimSun'>月</span>21<span lang=ZH-CN style='font-family:SimSun'>日</span> 3:42<br>>>>>> To: <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>>>>>> Subject: [llvm] r226598 - Reapply: Teach SROA how to update debug<br>>>>>> info for fragmented variables.<br>>>>>><br>>>>>> Author: adrian<br>>>>>> Date: Tue Jan 20 13:42:22 2015<br>>>>>> New Revision: 226598<br>>>>>><br>>>>>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=226598&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=226598&view=rev</a><br>>>>>> Log:<br>>>>>> Reapply: Teach SROA how to update debug info for fragmented variables.<br>>>>>> This reapplies r225379.<br>>>>>><br>>>>>> ChangeLog:<br>>>>>> - The assertion that this commit previously ran into about the<br>>>>>> inability to handle indirect variables has since been removed and<br>>>>>> the backend can handle this now.<br>>>>>> - Testcases were upgrade to the new MDLocation format.<br>>>>>> - Instead of keeping a DebugDeclares map, we now use<br>>>>>> llvm::FindAllocaDbgDeclare().<br>>>>>><br>>>>>> Original commit message follows.<br>>>>>><br>>>>>> Debug info: Teach SROA how to update debug info for fragmented<br>>>variables.<br>>>>>> This allows us to generate debug info for extremely advanced code<br>>>>>> such as<br>>>>>><br>>>>>> typedef struct { long int a; int b;} S;<br>>>>>><br>>>>>> int foo(S s) {<br>>>>>>  return s.b;<br>>>>>> }<br>>>>>><br>>>>>> which at -O1 on x86_64 is codegen'd into<br>>>>>><br>>>>>> define i32 @foo(i64 %s.coerce0, i32 %s.coerce1) #0 {  ret i32<br>>>>>> %s.coerce1, !dbg !24 }<br>>>>>><br>>>>>> with this patch we emit the following debug info for this<br>>>>>><br>>>>>> TAG_formal_parameter [3]<br>>>>>>  AT_location( 0x00000000<br>>>>>>               0x0000000000000000 - 0x0000000000000006: rdi, piece<br>>>>>> 0x00000008, rsi, piece 0x00000004<br>>>>>>               0x0000000000000006 - 0x0000000000000008: rdi, piece<br>>>>>> 0x00000008, rax, piece 0x00000004 )<br>>>>>>               AT_name( "s" )<br>>>>>>               AT_decl_file(<br>>>> "/Volumes/Data/llvm/_build.ninja.release/test.c" )<br>>>>>><br>>>>>> Thanks to chandlerc, dblaikie, and echristo for their feedback on<br>>>>>> all<br>>>> previous<br>>>>>> iterations of this patch!<br>>>>>><br>>>>>> Added:<br>>>>>>   llvm/trunk/test/DebugInfo/X86/sroasplit-1.ll<br>>>>>>   llvm/trunk/test/DebugInfo/X86/sroasplit-2.ll<br>>>>>>   llvm/trunk/test/DebugInfo/X86/sroasplit-3.ll<br>>>>>> Modified:<br>>>>>>   llvm/trunk/lib/Transforms/Scalar/SROA.cpp<br>>>>>>   llvm/trunk/test/DebugInfo/X86/array2.ll<br>>>>>><br>>>>>> Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp<br>>>>>> URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><br>>>>>><br>>>project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=226598&r1=2265<br>>>>>> 97<br>>>>>> &r2=226598&view=diff<br>>>>>><br>>>===============================================================<br>>>>>> ===============<br>>>>>> --- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)<br>>>>>> +++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Tue Jan 20 13:42:22<o:p></o:p></p></div></div><p class=MsoNormal>>>>>> +++ 2015<o:p></o:p></p><div><div><p class=MsoNormal>>>>>> @@ -1257,8 +1257,8 @@ private:<br>>>>>>  friend class AllocaSliceRewriter;<br>>>>>><br>>>>>>  bool presplitLoadsAndStores(AllocaInst &AI, AllocaSlices &AS);<br>>>>>> -  bool rewritePartition(AllocaInst &AI, AllocaSlices &AS,<br>>>>>> -                        AllocaSlices::Partition &P);<br>>>>>> +  AllocaInst *rewritePartition(AllocaInst &AI, AllocaSlices &AS,<br>>>>>> +                               AllocaSlices::Partition &P);<br>>>>>>  bool splitAlloca(AllocaInst &AI, AllocaSlices &AS);  bool<br>>>>>> runOnAlloca(AllocaInst &AI);  void clobberUse(Use &U); @@ -3964,8<br>>>>>> +3964,8 @@ bool SROA::presplitLoadsAndStores(Alloca<br>>>>>> /// appropriate new offsets. It also evaluates how successful the<br>>>>>> rewrite<br>>>> was<br>>>>>> /// at enabling promotion and if it was successful queues the alloca<br>>>>>> to be<br>>>> ///<br>>>>>> promoted.<br>>>>>> -bool SROA::rewritePartition(AllocaInst &AI, AllocaSlices &AS,<br>>>>>> -                            AllocaSlices::Partition &P) {<br>>>>>> +AllocaInst *SROA::rewritePartition(AllocaInst &AI, AllocaSlices &AS,<br>>>>>> +                                   AllocaSlices::Partition &P) {<br>>>>>>  // Try to compute a friendly type for this partition of the alloca.<br>>>> This<br>>>>>>  // won't always succeed, in which case we fall back to a legal<br>>>>>> integer<br>>>> type<br>>>>>>  // or an i8 array of an appropriate size.<br>>>>>> @@ -4003,6 +4003,7 @@ bool SROA::rewritePartition(AllocaInst &<br>>>>>>    NewAI = &AI;<br>>>>>>    // FIXME: We should be able to bail at this point with "nothing<br>>>> changed".<br>>>>>>    // FIXME: We might want to defer PHI speculation until after here.<br>>>>>> +    // FIXME: return nullptr;<br>>>>>>  } else {<br>>>>>>    unsigned Alignment = AI.getAlignment();<br>>>>>>    if (!Alignment) {<br>>>>>> @@ -4098,7 +4099,7 @@ bool SROA::rewritePartition(AllocaInst &<br>>>>>>      PostPromotionWorklist.pop_back();  }<br>>>>>><br>>>>>> -  return true;<br>>>>>> +  return NewAI;<br>>>>>> }<br>>>>>><br>>>>>> /// \brief Walks the slices of an alloca and form partitions based<br>>>>>> on<br>>>> them,<br>>>>>> @@ -4137,9 +4138,24 @@ bool SROA::splitAlloca(AllocaInst &AI, A  if<br>>>>>> (!IsSorted)<br>>>>>>    std::sort(AS.begin(), AS.end());<br>>>>>><br>>>>>> +  /// \brief Describes the allocas introduced by rewritePartition<o:p></o:p></p></div></div><p class=MsoNormal>>>>>> + /// in order to migrate the debug info.<br>>>>>> +  struct Piece {<br>>>>>> +    AllocaInst *Alloca;<br>>>>>> +    uint64_t Offset;<br>>>>>> +    uint64_t Size;<br>>>>>> +    Piece(AllocaInst *AI, uint64_t O, uint64_t S)<br>>>>>> +      : Alloca(AI), Offset(O), Size(S) {}  };  SmallVector<Piece,<br>>>>>> + 4> Pieces;<br>>>>>> +<br>>>>>>  // Rewrite each partition.<br>>>>>>  for (auto &P : AS.partitions()) {<br>>>>>> -    Changed |= rewritePartition(AI, AS, P);<br>>>>>> +    if (AllocaInst *NewAI = rewritePartition(AI, AS, P)) {<br>>>>>> +      Changed = true;<br>>>>>> +      if (NewAI != &AI)<br>>>>>> +        Pieces.push_back(Piece(NewAI, P.beginOffset(), P.size()));<br>>>>>> +    }<br>>>>>>    ++NumPartitions;<br>>>>>>  }<br>>>>>><br>>>>>> @@ -4147,6 +4163,28 @@ bool SROA::splitAlloca(AllocaInst &AI, A<br>>>>>> MaxPartitionsPerAlloca =<br>>>>>>      std::max<unsigned>(NumPartitions, MaxPartitionsPerAlloca);<br>>>>>><br>>>>>> +  // Migrate debug information from the old alloca to the new<br>>>>>> + alloca(s) // and the individial partitions.<o:p></o:p></p><div><div><p class=MsoNormal>>>>>> +  if (DbgDeclareInst *DbgDecl = FindAllocaDbgDeclare(&AI)) {<br>>>>>> +    DIVariable Var(DbgDecl->getVariable());<br>>>>>> +    DIExpression Expr(DbgDecl->getExpression());<br>>>>>> +    DIBuilder DIB(*AI.getParent()->getParent()->getParent(),<br>>>>>> +                  /*AllowUnresolved*/ false);<br>>>>>> +    bool IsSplit = Pieces.size() > 1;<br>>>>>> +    for (auto Piece : Pieces) {<br>>>>>> +      // Create a piece expression describing the new partition or<br>>>>>> + reuse<br>>>> AI's<br>>>>>> +      // expression if there is only one partition.<br>>>>>> +      if (IsSplit)<br>>>>>> +        Expr = DIB.createPieceExpression(Piece.Offset, Piece.Size);<br>>>>>> +<br>>>>>> +      // Remove any existing dbg.declare intrinsic describing the<br>>>>>> + same<br>>>> alloca.<br>>>>>> +      if (DbgDeclareInst *OldDDI =<br>FindAllocaDbgDeclare(Piece.Alloca))<br>>>>>> +        OldDDI->eraseFromParent();<br>>>>>> +<br>>>>>> +      Instruction *NewDDI = DIB.insertDeclare(Piece.Alloca, Var,<br>>>>>> + Expr,<br>>>> &AI);<br>>>>>> +      NewDDI->setDebugLoc(DbgDecl->getDebugLoc());<br>>>>>> +    }<br>>>>>> +  }<br>>>>>>  return Changed;<br>>>>>> }<br>>>>>><br>>>>>> @@ -4258,8 +4296,11 @@ void SROA::deleteDeadInstructions(<br>>>>>>          DeadInsts.insert(U);<br>>>>>>      }<br>>>>>><br>>>>>> -    if (AllocaInst *AI = dyn_cast<AllocaInst>(I))<br>>>>>> +    if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) {<br>>>>>>      DeletedAllocas.insert(AI);<br>>>>>> +      if (DbgDeclareInst *DbgDecl = FindAllocaDbgDeclare(AI))<br>>>>>> +        DbgDecl->eraseFromParent();<br>>>>>> +    }<br>>>>>><br>>>>>>    ++NumDeleted;<br>>>>>>    I->eraseFromParent();<br>>>>>> @@ -4376,9 +4417,10 @@ bool SROA::runOnFunction(Function &F) {<br>>>>>><br>>>>>>  BasicBlock &EntryBB = F.getEntryBlock();  for (BasicBlock::iterator<br>>>>>> I = EntryBB.begin(), E =<br>>>> std::prev(EntryBB.end());<br>>>>>> -       I != E; ++I)<br>>>>>> +       I != E; ++I) {<br>>>>>>    if (AllocaInst *AI = dyn_cast<AllocaInst>(I))<br>>>>>>      Worklist.insert(AI);<br>>>>>> +  }<br>>>>>><br>>>>>>  bool Changed = false;<br>>>>>>  // A set of deleted alloca instruction pointers which should be<br>>>>>> removed<br>>>> from<br>>>>>><br>>>>>> Modified: llvm/trunk/test/DebugInfo/X86/array2.ll<br>>>>>> URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><br>>>>>> project/llvm/trunk/test/DebugInfo/X86/array2.ll?rev=226598&r1=226597<br>>>>>> &r2<br>>>>>> =226598&view=diff<br>>>>>><br>>>===============================================================<br>>>>>> ===============<br>>>>>> --- llvm/trunk/test/DebugInfo/X86/array2.ll (original)<br>>>>>> +++ llvm/trunk/test/DebugInfo/X86/array2.ll Tue Jan 20 13:42:22 2015<br>>>>>> @@ -13,12 +13,12 @@<br>>>>>> ; }<br>>>>>> ;<br>>>>>> ; RUN: opt %s -O2 -S -o - | FileCheck %s -; Test that we do not<br>>>>>> lower dbg.declares for arrays.<br>>>>>> +; Test that we correctly lower dbg.declares for arrays.<br>>>>>> ;<br>>>>>> ; CHECK: define i32 @main<br>>>>>> -; CHECK: call void @llvm.dbg.value<br>>>>>> -; CHECK: call void @llvm.dbg.value<br>>>>>> -; CHECK: call void @llvm.dbg.declare<br>>>>>> +; CHECK: call void @llvm.dbg.value(metadata i32 42, i64 0, metadata<br>>>>>> +![[ARRAY:[0-9]+]], metadata ![[EXPR:[0-9]+]]) ; CHECK: ![[ARRAY]] =<br>>>>>> +{{.*}}; [ DW_TAG_auto_variable ] [array] [line 6] ; CHECK:<o:p></o:p></p></div></div><p class=MsoNormal>>>>>> +![[EXPR]] = {{.*}}; [ DW_TAG_expression ] [DW_OP_piece offset=0,<br>>>>>> +size=4]<br>>>>>> target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"<br>>>>>> target triple = "x86_64-apple-macosx10.9.0"<br>>>>>><br>>>>>><br>>>>>> Added: llvm/trunk/test/DebugInfo/X86/sroasplit-1.ll<br>>>>>> URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><br>>>>>> project/llvm/trunk/test/DebugInfo/X86/sroasplit-1.ll?rev=226598&view<br>>>>>> =auto<br>>>>>><br>>>===============================================================<br>>>>>> ===============<br>>>>>> --- llvm/trunk/test/DebugInfo/X86/sroasplit-1.ll (added)<br>>>>>> +++ llvm/trunk/test/DebugInfo/X86/sroasplit-1.ll Tue Jan 20 13:42:22<br>>>>>> +++ 2015<br>>>>>> @@ -0,0 +1,97 @@<br>>>>>> +; RUN: opt %s -sroa -verify -S -o - | FileCheck %s ; ; Test that we<br>>>>>> +can partial emit debug info for aggregates repeatedly ; split up by<o:p></o:p></p><div><div><p class=MsoNormal>SROA.<br>>>>>> +;<br>>>>>> +;    // Compile with -O1<br>>>>>> +;    typedef struct {<br>>>>>> +;      int a;<br>>>>>> +;      long int b;<br>>>>>> +;    } Inner;<br>>>>>> +;<br>>>>>> +;    typedef struct {<br>>>>>> +;      Inner inner[2];<br>>>>>> +;    } Outer;<br>>>>>> +;<br>>>>>> +;    int foo(Outer outer) {<br>>>>>> +;      Inner i1 = outer.inner[1];<br>>>>>> +;      return i1.a;<br>>>>>> +;    }<br>>>>>> +;<br>>>>>> +<br>>>>>> +; Verify that SROA creates a variable piece when splitting i1.<br>>>>>> +; CHECK: %[[I1:.*]] = alloca [12 x i8], align 4 ; CHECK: call void<br>>>>>> <a href="mailto:+@llvm.dbg.declare(metadata">+@llvm.dbg.declare(metadata</a> [12 x i8]* %[[I1]], metadata<br>>>>>> +![[VAR:[0-9]+]], metadata ![[PIECE1:[0-9]+]]) ; CHECK: call void<br>>>>>> <a href="mailto:+@llvm.dbg.value(metadata">+@llvm.dbg.value(metadata</a> i32 %[[A:.*]], i64 0, metadata ![[VAR]],<br>>>>>> +metadata ![[PIECE2:[0-9]+]]) ; CHECK: ret i32 %[[A]] ; Read Var and<br>>>> Piece:<br>>>>>> +; CHECK: ![[VAR]] = {{.*}} ; [ DW_TAG_auto_variable ] [i1] [line<o:p></o:p></p></div></div><p class=MsoNormal>>>>>> +11] ;<br>>>>>> +CHECK: ![[PIECE1]] = {{.*}} ; [ DW_TAG_expression ] [DW_OP_piece<br>>>>>> +offset=4, size=12] ; CHECK: ![[PIECE2]] = {{.*}} ; [<br>>>>>> +DW_TAG_expression ] [DW_OP_piece offset=0, size=4]<br>>>>>> +<br>>>>>> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"<br>>>>>> +target triple = "x86_64-apple-macosx10.9.0"<br>>>>>> +<br>>>>>> +%struct.Outer = type { [2 x %struct.Inner] } %struct.Inner = type {<br>>>>>> +i32, i64 }<br>>>>>> +<br>>>>>> +; Function Attrs: nounwind ssp uwtable define i32<br>>>>>> <a href="mailto:+@foo(%25struct.Outer*">+@foo(%struct.Outer*</a> byval align 8 %outer) #0 {<br>>>>>> +entry:<br>>>>>> +  %i1 = alloca %struct.Inner, align 8<br>>>>>> +  call void @llvm.dbg.declare(metadata %struct.Outer* %outer,<br>>>>>> +metadata !25, metadata !2), !dbg !26<br>>>>>> +  call void @llvm.dbg.declare(metadata %struct.Inner* %i1, metadata<br>>>>>> +!27, metadata !2), !dbg !28<br>>>>>> +  %inner = getelementptr inbounds %struct.Outer* %outer, i32 0, i32<br>>>>>> +0, !dbg !28<br>>>>>> +  %arrayidx = getelementptr inbounds [2 x %struct.Inner]* %inner,<br>>>>>> +i32 0, i64 1, !dbg !28<br>>>>>> +  %0 = bitcast %struct.Inner* %i1 to i8*, !dbg !28<br>>>>>> +  %1 = bitcast %struct.Inner* %arrayidx to i8*, !dbg !28<br>>>>>> +  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 16, i32<br>>>>>> +8,<br>>>>>> +i1 false), !dbg !28<br>>>>>> +  %a = getelementptr inbounds %struct.Inner* %i1, i32 0, i32 0,<br>>>>>> +!dbg<br>>>>>> +!29<br>>>>>> +  %2 = load i32* %a, align 4, !dbg !29<br>>>>>> +  ret i32 %2, !dbg !29<br>>>>>> +}<br>>>>>> +<br>>>>>> +; Function Attrs: nounwind readnone declare void<br>>>>>> <a href="mailto:+@llvm.dbg.declare(metadata">+@llvm.dbg.declare(metadata</a>, metadata, metadata) #1<br>>>>>> +<br>>>>>> +; Function Attrs: nounwind<br>>>>>> +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8*<br>>>>>> +nocapture readonly, i64, i32, i1) #2<br>>>>>> +<br>>>>>> +attributes #0 = { nounwind ssp uwtable } attributes #1 = { nounwind<br>>>>>> +readnone } attributes #2 = { nounwind }<br>>>>>> +<br>>>>>> +!<a href="http://llvm.dbg.cu" target="_blank">llvm.dbg.cu</a> = !{!0}<br>>>>>> +!llvm.module.flags = !{!22, !23}<br>>>>>> +!llvm.ident = !{!24}<br>>>>>> +<br>>>>>> +!0 = !{!"0x11\0012\00clang version 3.5.0 \000\00\000\00\001", !1,<br>>>>>> +!2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ] [ DW_TAG_compile_unit<br>>>>>> +] [sroasplit-1.c] [DW_LANG_C99]<br>>>>>> +!1 = !{!"sroasplit-1.c", !""}<br>>>>>> +!2 = !{}<br>>>>>> +!3 = !{!4}<br>>>>>> +!4 = !{!"0x2e\00foo\00foo\00\0010\000\001\000\006\00256\000\0010",<br>>>>>> +!1, !5, !6, null, i32 (%struct.Outer*)* @foo, null, null, !2} ; [<br>>>>>> +DW_TAG_subprogram ] [ DW_TAG_subprogram ] [line 10] [def] [foo]<br>>>>>> +!5 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [ DW_TAG_file_type ]<br>>>>>> +[sroasplit-1.c]<br>>>>>> +!6 = !{!"0x15\00\000\000\000\000\000\000", i32 0, null, null, !7,<br>>>>>> +null, null, null} ; [ DW_TAG_subroutine_type ] [<br>>>>>> +DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from<br>>>>>> +]<br>>>>>> +!7 = !{!8, !9}<br>>>>>> +!8 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [<br>>>>>> +DW_TAG_base_type ] [ DW_TAG_base_type ] [int] [line 0, size 32,<br>>>>>> +align 32, offset 0, enc DW_ATE_signed]<br>>>>>> +!9 = !{!"0x16\00Outer\008\000\000\000\000", !1, null, !10} ; [<br>>>>>> +DW_TAG_typedef ] [ DW_TAG_typedef ] [Outer] [line 8, size 0, align<br>>>>>> +0, offset 0] [from ]<br>>>>>> +!10 = !{!"0x13\00\006\00256\0064\000\000\000", !1, null, null, !11,<br>>>>>> +null, null, null} ; [ DW_TAG_structure_type ] [line 6, size 256,<br>>>>>> +align 64, offset 0] [def] [from ]<br>>>>>> +!11 = !{!12}<br>>>>>> +!12 = !{!"0xd\00inner\007\00256\0064\000\000", !1, !10, !13} ; [<br>>>>>> +DW_TAG_member ] [inner] [line 7, size 256, align 64, offset 0]<br>>>>>> +[from ]<br>>>>>> +!13 = !{!"0x1\00\000\00256\0064\000\000", null, null, !14, !20, i32<br>>>>>> +0, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 256,<br>>>>>> +align 64, offset 0] [from Inner]<br>>>>>> +!14 = !{!"0x16\00Inner\004\000\000\000\000", !1, null, !15} ; [<br>>>>>> +DW_TAG_typedef ] [ DW_TAG_typedef ] [Inner] [line 4, size 0, align<br>>>>>> +0, offset 0] [from ]<br>>>>>> +!15 = !{!"0x13\00\001\00128\0064\000\000\000", !1, null, null, !16,<br>>>>>> +null, null, null} ; [ DW_TAG_structure_type ] [line 1, size 128,<br>>>>>> +align 64, offset 0] [def] [from ]<br>>>>>> +!16 = !{!17, !18}<br>>>>>> +!17 = !{!"0xd\00a\002\0032\0032\000\000", !1, !15, !8} ; [<br>>>>>> +DW_TAG_member ] [a] [line 2, size 32, align 32, offset 0] [from<br>>>>>> +int]<br>>>>>> +!18 = !{!"0xd\00b\003\0064\0064\0064\000", !1, !15, !19} ; [<br>>>>>> +DW_TAG_member ] [b] [line 3, size 64, align 64, offset 64] [from<br>>>>>> +long int]<br>>>>>> +!19 = !{!"0x24\00long int\000\0064\0064\000\000\005", null, null} ;<br>>>>>> +[ DW_TAG_base_type ] [ DW_TAG_base_type ] [long int] [line 0, size<br>>>>>> +64, align 64, offset 0, enc DW_ATE_signed]<br>>>>>> +!20 = !{!21}<br>>>>>> +!21 = !{!"0x21\000\002"}        ; [ DW_TAG_subrange_type ] [0, 1]<br>>>>>> +!22 = !{i32 2, !"Dwarf Version", i32 2}<br>>>>>> +!23 = !{i32 1, !"Debug Info Version", i32 2}<br>>>>>> +!24 = !{!"clang version 3.5.0 "}<br>>>>>> +!25 = !{!"0x101\00outer\0016777226\000", !4, !5, !9} ; [<br>>>>>> +DW_TAG_arg_variable ] [ DW_TAG_arg_variable ] [outer] [line 10]<br>>>>>> +!26 = !MDLocation(line: 10, scope: !4)<br>>>>>> +!27 = !{!"0x100\00i1\0011\000", !4, !5, !14} ; [<br>>>>>> +DW_TAG_auto_variable ] [ DW_TAG_auto_variable ] [i1] [line 11]<br>>>>>> +!28 = !MDLocation(line: 11, scope: !4)<br>>>>>> +!29 = !MDLocation(line: 12, scope: !4)<br>>>>>><br>>>>>> Added: llvm/trunk/test/DebugInfo/X86/sroasplit-2.ll<br>>>>>> URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><br>>>>>> project/llvm/trunk/test/DebugInfo/X86/sroasplit-2.ll?rev=226598&view<br>>>>>> =auto<br>>>>>><br>>>===============================================================<br>>>>>> ===============<br>>>>>> --- llvm/trunk/test/DebugInfo/X86/sroasplit-2.ll (added)<br>>>>>> +++ llvm/trunk/test/DebugInfo/X86/sroasplit-2.ll Tue Jan 20 13:42:22<br>>>>>> +++ 2015<br>>>>>> @@ -0,0 +1,102 @@<br>>>>>> +; RUN: opt %s -sroa -verify -S -o - | FileCheck %s ; ; Test that we<br>>>>>> +can partial emit debug info for aggregates repeatedly ; split up by<br>SROA.<br>>>>>> +;<br>>>>>> +;    // Compile with -O1<br>>>>>> +;    typedef struct {<br>>>>>> +;      int a;<br>>>>>> +;      int b;<br>>>>>> +;    } Inner;<br>>>>>> +;<br>>>>>> +;    typedef struct {<br>>>>>> +;      Inner inner[2];<br>>>>>> +;    } Outer;<br>>>>>> +;<br>>>>>> +;    int foo(Outer outer) {<br>>>>>> +;      Inner i1 = outer.inner[1];<br>>>>>> +;      return i1.a;<br>>>>>> +;    }<br>>>>>> +;<br>>>>>> +<br>>>>>> +; Verify that SROA creates a variable piece when splitting i1.<br>>>>>> +; CHECK:  call void @llvm.dbg.value(metadata i64 %outer.coerce0,<br>>>>>> +i64 0, metadata ![[O:[0-9]+]], metadata ![[PIECE1:[0-9]+]]), ;<br>>>>>> +CHECK:  call void @llvm.dbg.value(metadata i64 %outer.coerce1, i64<br>>>>>> +0, metadata ![[O]], metadata ![[PIECE2:[0-9]+]]), ; CHECK:  call<br>>>>>> +void @llvm.dbg.value({{.*}}, i64 0, metadata ![[I1:[0-9]+]],<br>>>>>> +metadata ![[PIECE3:[0-9]+]]), ; CHECK-DAG: ![[O]] = {{.*}} [<br>>>>>> +DW_TAG_arg_variable ] [outer] [line 10] ; CHECK-DAG: ![[PIECE1]] =<br>>>>>> +{{.*}} [ DW_TAG_expression ] [DW_OP_piece offset=0, size=8] ; CHECK-<br>>>DAG:<br>>>>>> +![[PIECE2]] = {{.*}} [ DW_TAG_expression ] [DW_OP_piece offset=8,<br>>>>>> +size=8] ; CHECK-DAG: ![[I1]] = {{.*}} [ DW_TAG_auto_variable ] [i1]<br>>>>>> +[line 11] ; CHECK-DAG: ![[PIECE3]] = {{.*}} [ DW_TAG_expression ]<br>>>>>> +[DW_OP_piece offset=0, size=4]<br>>>>>> +<br>>>>>> +; ModuleID = 'sroasplit-2.c'<br>>>>>> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"<br>>>>>> +target triple = "x86_64-apple-macosx10.9.0"<br>>>>>> +<br>>>>>> +%struct.Outer = type { [2 x %struct.Inner] } %struct.Inner = type {<br>>>>>> +i32, i32 }<br>>>>>> +<br>>>>>> +; Function Attrs: nounwind ssp uwtable define i32 @foo(i64<br>>>>>> +%outer.coerce0, i64 %outer.coerce1) #0 {<br>>>>>> +  %outer = alloca %struct.Outer, align 8<br>>>>>> +  %i1 = alloca %struct.Inner, align 4<br>>>>>> +  %1 = bitcast %struct.Outer* %outer to { i64, i64 }*<br>>>>>> +  %2 = getelementptr { i64, i64 }* %1, i32 0, i32 0<br>>>>>> +  store i64 %outer.coerce0, i64* %2<br>>>>>> +  %3 = getelementptr { i64, i64 }* %1, i32 0, i32 1<br>>>>>> +  store i64 %outer.coerce1, i64* %3<br>>>>>> +  call void @llvm.dbg.declare(metadata %struct.Outer* %outer,<br>>>>>> +metadata !24, metadata !2), !dbg !25<br>>>>>> +  call void @llvm.dbg.declare(metadata %struct.Inner* %i1, metadata<br>>>>>> +!26, metadata !2), !dbg !27<br>>>>>> +  %4 = getelementptr inbounds %struct.Outer* %outer, i32 0, i32 0,<br>>>>>> +!dbg<br>>>>>> +!27<br>>>>>> +  %5 = getelementptr inbounds [2 x %struct.Inner]* %4, i32 0, i64<br>>>>>> +1, !dbg !27<br>>>>>> +  %6 = bitcast %struct.Inner* %i1 to i8*, !dbg !27<br>>>>>> +  %7 = bitcast %struct.Inner* %5 to i8*, !dbg !27<br>>>>>> +  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %6, i8* %7, i64 8, i32<br>>>>>> +4, i1 false), !dbg !27<br>>>>>> +  %8 = getelementptr inbounds %struct.Inner* %i1, i32 0, i32 0,<br>>>>>> +!dbg<br>>>>>> +!28<br>>>>>> +  %9 = load i32* %8, align 4, !dbg !28<br>>>>>> +  ret i32 %9, !dbg !28<br>>>>>> +}<br>>>>>> +<br>>>>>> +; Function Attrs: nounwind readnone declare void<br>>>>>> <a href="mailto:+@llvm.dbg.declare(metadata">+@llvm.dbg.declare(metadata</a>, metadata, metadata) #1<br>>>>>> +<br>>>>>> +; Function Attrs: nounwind<br>>>>>> +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8*<br>>>>>> +nocapture readonly, i64, i32, i1) #2<br>>>>>> +<br>>>>>> +attributes #0 = { nounwind ssp uwtable<br>>>>>> +"no-frame-pointer-elim"="true" } attributes #1 = { nounwind<br>>>>>> +readnone } attributes #2 = { nounwind }<br>>>>>> +<br>>>>>> +!<a href="http://llvm.dbg.cu" target="_blank">llvm.dbg.cu</a> = !{!0}<br>>>>>> +!llvm.module.flags = !{!21, !22}<br>>>>>> +!llvm.ident = !{!23}<br>>>>>> +<br>>>>>> +!0 = !{!"0x11\0012\00clang version 3.5.0 \000\00\000\00\001", !1,<br>>>>>> +!2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ] [ DW_TAG_compile_unit<br>>>>>> +] [sroasplit-2.c] [DW_LANG_C99]<br>>>>>> +!1 = !{!"sroasplit-2.c", !""}<br>>>>>> +!2 = !{}<br>>>>>> +!3 = !{!4}<br>>>>>> +!4 = !{!"0x2e\00foo\00foo\00\0010\000\001\000\006\00256\000\0010",<br>>>>>> +!1, !5, !6, null, i32 (i64, i64)* @foo, null, null, !2} ; [<br>>>>>> +DW_TAG_subprogram ] [ DW_TAG_subprogram ] [line 10] [def] [foo]<br>>>>>> +!5 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [ DW_TAG_file_type ]<br>>>>>> +[sroasplit-2.c]<br>>>>>> +!6 = !{!"0x15\00\000\000\000\000\000\000", i32 0, null, null, !7,<br>>>>>> +null, null, null} ; [ DW_TAG_subroutine_type ] [<br>>>>>> +DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from<br>>>>>> +]<br>>>>>> +!7 = !{!8, !9}<br>>>>>> +!8 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [<br>>>>>> +DW_TAG_base_type ] [ DW_TAG_base_type ] [int] [line 0, size 32,<br>>>>>> +align 32, offset 0, enc DW_ATE_signed]<br>>>>>> +!9 = !{!"0x16\00Outer\008\000\000\000\000", !1, null, !10} ; [<br>>>>>> +DW_TAG_typedef ] [ DW_TAG_typedef ] [Outer] [line 8, size 0, align<br>>>>>> +0, offset 0] [from ]<br>>>>>> +!10 = !{!"0x13\00\006\00128\0032\000\000\000", !1, null, null, !11,<br>>>>>> +null, null, null} ; [ DW_TAG_structure_type ] [line 6, size 128,<br>>>>>> +align 32, offset 0] [def] [from ]<br>>>>>> +!11 = !{!12}<br>>>>>> +!12 = !{!"0xd\00inner\007\00128\0032\000\000", !1, !10, !13} ; [<br>>>>>> +DW_TAG_member ] [inner] [line 7, size 128, align 32, offset 0]<br>>>>>> +[from ]<br>>>>>> +!13 = !{!"0x1\00\000\00128\0032\000\000", null, null, !14, !19, i32<br>>>>>> +0, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 128,<br>>>>>> +align 32, offset 0] [from Inner]<br>>>>>> +!14 = !{!"0x16\00Inner\004\000\000\000\000", !1, null, !15} ; [<br>>>>>> +DW_TAG_typedef ] [ DW_TAG_typedef ] [Inner] [line 4, size 0, align<br>>>>>> +0, offset 0] [from ]<br>>>>>> +!15 = !{!"0x13\00\001\0064\0032\000\000\000", !1, null, null, !16,<br>>>>>> +null, null, null} ; [ DW_TAG_structure_type ] [line 1, size 64,<br>>>>>> +align 32, offset 0] [def] [from ]<br>>>>>> +!16 = !{!17, !18}<br>>>>>> +!17 = !{!"0xd\00a\002\0032\0032\000\000", !1, !15, !8} ; [<br>>>>>> +DW_TAG_member ] [a] [line 2, size 32, align 32, offset 0] [from<br>>>>>> +int]<br>>>>>> +!18 = !{!"0xd\00b\003\0032\0032\0032\000", !1, !15, !8} ; [<br>>>>>> +DW_TAG_member ] [b] [line 3, size 32, align 32, offset 32] [from<br>>>>>> +int]<br>>>>>> +!19 = !{!20}<br>>>>>> +!20 = !{!"0x21\000\002"}        ; [ DW_TAG_subrange_type ] [0, 1]<br>>>>>> +!21 = !{i32 2, !"Dwarf Version", i32 2}<br>>>>>> +!22 = !{i32 1, !"Debug Info Version", i32 2}<br>>>>>> +!23 = !{!"clang version 3.5.0 "}<br>>>>>> +!24 = !{!"0x101\00outer\0016777226\000", !4, !5, !9} ; [<br>>>>>> +DW_TAG_arg_variable ] [ DW_TAG_arg_variable ] [outer] [line 10]<br>>>>>> +!25 = !MDLocation(line: 10, scope: !4)<br>>>>>> +!26 = !{!"0x100\00i1\0011\000", !4, !5, !14} ; [<br>>>>>> +DW_TAG_auto_variable ] [ DW_TAG_auto_variable ] [i1] [line 11]<br>>>>>> +!27 = !MDLocation(line: 11, scope: !4)<br>>>>>> +!28 = !MDLocation(line: 12, scope: !4)<br>>>>>><br>>>>>> Added: llvm/trunk/test/DebugInfo/X86/sroasplit-3.ll<br>>>>>> URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><br>>>>>> project/llvm/trunk/test/DebugInfo/X86/sroasplit-3.ll?rev=226598&view<br>>>>>> =auto<br>>>>>><br>>>===============================================================<br>>>>>> ===============<br>>>>>> --- llvm/trunk/test/DebugInfo/X86/sroasplit-3.ll (added)<br>>>>>> +++ llvm/trunk/test/DebugInfo/X86/sroasplit-3.ll Tue Jan 20 13:42:22<br>>>>>> +++ 2015<br>>>>>> @@ -0,0 +1,63 @@<br>>>>>> +; RUN: opt %s -sroa -verify -S -o - | FileCheck %s ; ModuleID =<br>>>>>> +'test.c'<br>>>>>> +; Test that SROA updates the debug info correctly if an alloca was<br>>>>>> +rewritten but ; not partitioned into multiple allocas.<br>>>>>> +;<br>>>>>> +; CHECK: call void @llvm.dbg.value(metadata float %s.coerce, i64 0,<br>>>>>> +metadata ![[VAR:[0-9]+]], metadata ![[EXPR:[0-9]+]]) ; CHECK:<br>>>>>> +![[VAR]] = {{.*}} [ DW_TAG_arg_variable ] [s] [line 3] ; CHECK:<br>>>>>> +![[EXPR]] = {{.*}} [ DW_TAG_expression ] ; CHECK-NOT: DW_OP_piece<br>>>>>> +<br>>>>>> +;<br>>>>>> +; struct S { float f; };<br>>>>>> +;<br>>>>>> +; float foo(struct S s) {<br>>>>>> +;   return s.f;<br>>>>>> +; }<br>>>>>> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"<br>>>>>> +target triple = "x86_64-apple-macosx10.10.0"<br>>>>>> +<br>>>>>> +%struct.S = type { float }<br>>>>>> +<br>>>>>> +; Function Attrs: nounwind ssp uwtable define float @foo(float<br>>>>>> +%s.coerce) #0 {<br>>>>>> +entry:<br>>>>>> +  %s = alloca %struct.S, align 4<br>>>>>> +  %coerce.dive = getelementptr %struct.S* %s, i32 0, i32 0<br>>>>>> +  store float %s.coerce, float* %coerce.dive, align 1<br>>>>>> +  call void @llvm.dbg.declare(metadata %struct.S* %s, metadata !16,<br>>>>>> +metadata !17), !dbg !18<br>>>>>> +  %f = getelementptr inbounds %struct.S* %s, i32 0, i32 0, !dbg !19<br>>>>>> +  %0 = load float* %f, align 4, !dbg !19<br>>>>>> +  ret float %0, !dbg !19<br>>>>>> +}<br>>>>>> +<br>>>>>> +; Function Attrs: nounwind readnone declare void<br>>>>>> <a href="mailto:+@llvm.dbg.declare(metadata">+@llvm.dbg.declare(metadata</a>, metadata, metadata) #1<br>>>>>> +<br>>>>>> +attributes #0 = { nounwind ssp uwtable } attributes #1 = { nounwind<br>>>>>> +readnone }<br>>>>>> +<br>>>>>> +!<a href="http://llvm.dbg.cu" target="_blank">llvm.dbg.cu</a> = !{!0}<br>>>>>> +!llvm.module.flags = !{!12, !13, !14} !llvm.ident = !{!15}<br>>>>>> +<br>>>>>> +!0 = !{!"0x11\0012\00clang version 3.6.0 \000\00\000\00\001", !1,<br>>>>>> +!2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ]<br>>>>>> +[/Volumes/Data/llvm/_build.ninja.debug/test.c] [DW_LANG_C99]<br>>>>>> +!1 = !{!"test.c", !"/Volumes/Data/llvm/_build.ninja.debug"}<br>>>>>> +!2 = !{}<br>>>>>> +!3 = !{!4}<br>>>>>> +!4<br>>>>>> = !{!"0x2e\00foo\00foo\00\003\000\001\000\000\00256\000\003", !1,<br>>>>>> !5, !6, null, float (float)* @foo, null, null, !2} ; [<br>>>>>> DW_TAG_subprogram ] [line<br>>>> 3] [def]<br>>>>>> [foo]<br>>>>>> +!5 = !{!"0x29", !1}                               ; [<br>DW_TAG_file_type ]<br>>>>>> [/Volumes/Data/llvm/_build.ninja.debug/test.c]<br>>>>>> +!6 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !7,<br>>>>>> +null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0,<br>>>>>> +align 0, offset 0] [from ]<br>>>>>> +!7 = !{!8, !9}<br>>>>>> +!8 = !{!"0x24\00float\000\0032\0032\000\000\004", null, null} ; [<br>>>>>> +DW_TAG_base_type ] [float] [line 0, size 32, align 32, offset 0,<br>>>>>> +enc DW_ATE_float]<br>>>>>> +!9 = !{!"0x13\00S\001\0032\0032\000\000\000", !1, null, null, !10,<br>>>>>> +null, null, null} ; [ DW_TAG_structure_type ] [S] [line 1, size 32,<br>>>>>> +align 32, offset 0] [def] [from ]<br>>>>>> +!10 = !{!11}<br>>>>>> +!11 = !{!"0xd\00f\001\0032\0032\000\000", !1, !9, !8} ; [<br>>>>>> +DW_TAG_member ] [f] [line 1, size 32, align 32, offset 0] [from<br>>>>>> +float]<br>>>>>> +!12 = !{i32 2, !"Dwarf Version", i32 2}<br>>>>>> +!13 = !{i32 2, !"Debug Info Version", i32 2}<br>>>>>> +!14 = !{i32 1, !"PIC Level", i32 2}<br>>>>>> +!15 = !{!"clang version 3.6.0 "}<br>>>>>> +!16 = !{!"0x101\00s\0016777219\000", !4, !5, !9}  ; [<br>>>>>> +DW_TAG_arg_variable<o:p></o:p></p><div><div><p class=MsoNormal style='margin-bottom:12.0pt'>>>> ]<br>>>>>> [s] [line 3]<br>>>>>> +!17 = !{!"0x102"}                                 ; [<br>DW_TAG_expression ]<br>>>>>> +!18 = !MDLocation(line: 3, column: 20, scope: !4)<br>>>>>> +!19 = !MDLocation(line: 4, column: 2, scope: !4)<br>>>>>><br>>>>>><br>>>>>> _______________________________________________<br>>>>>> llvm-commits mailing list<br>>>>>> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>>>>>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>>>><br>>>><br>>>><br>>>><br>>><br><br><br><br><o:p></o:p></p></div></div></blockquote></div><p class=MsoNormal><o:p> </o:p></p></div></div></div></div></body></html>