<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:x="urn:schemas-microsoft-com:office:excel" 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 12 (filtered medium)"><style><!--
/* Font Definitions */
@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:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* 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;}
@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-GB link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Samuel,<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 for the quick response.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I agree that the best way forward would be to reduce the number of sections/symbols produced<br>in Register.cpp.o. I’m afraid I don’t know enough about this part of clang to know how feasible<br>that is.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I’m afraid I don’t really have a good target for the maximum number of sections to be produced<br>in a single object file. I think the target should be to at least halve the number of sections of what<br>is currently produced, and hope that future changes will not be creeping up the number of<br>sections again.<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'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Kristof<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 lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Samuel Benzaquen [mailto:sbenza@google.com] <br><b>Sent:</b> 29 August 2013 23:09<br><b>To:</b> Kristof Beyls<br><b>Cc:</b> Clang Dev; Nicholas Braden; Manuel Klimek<br><b>Subject:</b> Re: 'too many sections' again when building ASTMatchers/Dynamic/Registry.cpp on Windows<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>On Thu, Aug 29, 2013 at 3:49 PM, Kristof Beyls <<a href="mailto:kristof.beyls@arm.com" target="_blank">kristof.beyls@arm.com</a>> wrote:<o:p></o:p></p><div><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>Hi Samuel,<br><br>We've observed that in the past few days, debug-builds with Visual Studio<br>have started failing again because too many sections are generated for<br>ASTMatchers/Dynamic/Registry.cpp.<br><br>This has been observed and discussed before in this email thread:<br><a href="http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-June/030102.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-June/030102.html</a>.<br><br>It seems that since then, bit by bit, the number of sections for<br>Registry.cpp<br>has been creeping up. I've done a quick experiment on linux to measure how<br>the size and the number of sections in Registry.cpp.o has been increasing<br>over<br>time. The table does show that your fix in r183768 did reduce the number of<br>sections a lot; but since then, the number of sections has been increasing<br>steadily and quite rapidly.<br><br>                Size of Register.cpp.o<br>svn id      bytes               sections<br>189448  27122264        28108<br>189353  27204656        28259<br>189031  26473624        27284<br>187500  26451288        26952<br>186000  21940824        23119<br>183769  19289872        20544<br>183768  33647984        35738<br><br>You did say on the previous email thread that you had a few more ideas on<br>how<br>to reduce the number of sections in Register.cpp.o. I'm wondering if you<br>would<br>be able to share the ideas you've got?<o:p></o:p></p></blockquote><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>The problem is that there are a lot of AST nodes, and each node is getting a whole bunch of classes instantiated, many of them with virtual methods.<o:p></o:p></p></div><div><p class=MsoNormal>For example, there are around 200 symbols related to clang::WhileStmt. It instantiates TrueMatcher<clang::WhileStmt>, DynCastMatcher<clang::Stmt, , lang::WhileStmt>, BindableMatcher<clang::WhileStmt>, MatcherInterface<clang::WhileStmt>, SingleNodeMatcherInterface<clang::WhileStmt>, VariadicOperatorMatcherInterface<clang::WhileStmt>, Matcher<clang::WhileStmt>::WrappedMatcher, Matcher<clang::WhileStmt>, IdMatcher<clang::WhileStmt>.<o:p></o:p></p></div><div><p class=MsoNormal>All of these have virtual methods, which means that there are 2 symbols per constructor, 3 for the destructor and 1 for the vtable. This is without counting the actual methods in the class.<o:p></o:p></p></div><div><p class=MsoNormal>We then do more method/class instantiations for the dynamic binding.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>The main fix I wanted to try is to reduce the number of classes that get instantiated. On the previous fix I removed vector<T> and list<T> for each AST node. I just replaced those uses with plain arrays.<o:p></o:p></p></div><div><p class=MsoNormal>I will do another round of fixes. Do you have a target size/sections ?<o:p></o:p></p></div><div><p class=MsoNormal><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>At the moment, it seems clang cannot be build with visual studio in debug<br>mode; and the large file size of Register.cpp.o and the large number of<br>sections seems to be slowing down the compile process on other platforms<br>too.<o:p></o:p></p></blockquote><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>In the worst case we could use plan A, which was splitting Register.cpp into many smaller files. We don't need to have all this code in the same compilation unit. I wanted to avoid doing this because it doesn't help to the total size of the objects and makes the code more complex.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>_Sam<o:p></o:p></p></div><div><p class=MsoNormal> <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 style='margin-bottom:12.0pt'><br>Thanks,<br><br>Kristof<br><br><o:p></o:p></p></blockquote></div><p class=MsoNormal><o:p> </o:p></p></div></div></div></div></body></html>