<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><br><div><div>On Oct 11, 2013, at 12:07 PM, Eric Christopher <<a href="mailto:echristo@gmail.com">echristo@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><blockquote type="cite"><br>Since we don't have ODR, we may have macros defined differently for a struct<br>in a .h file,<br>thus having two versions of the struct from two different CU. It seems that<br>we can't assume<br>structs with the same name and defined in the same file/line/column are the<br>same.<br><br></blockquote><br>Ah right sorry, I remember this. Also, macros are evil, just ask the<br>modules guys :)<br><br><blockquote type="cite">Hashing the types can happen either at the front end or at IR level. That is<br>our first design choice :)<br><br></blockquote><br>Sorta :)<br><br><blockquote type="cite">I think we should try not to hash the types for non-LTO builds at the front<br>end or at IR level, since it does not give us<br>any benefit given that we are hashing them at the back end.<br><br>One advantage of hashing it at IR level is that we can just hash the MDNodes<br>that affect the<br>type MDNode, at front end, the AST contains more information and should be<br>harder to hash.<br></blockquote><br>It depends upon the goals. If the goal is to make debug information<br>post-link smaller then just using the type hashing machinery for<br>structs will be sufficient. However, if it's to save space during an<br>LTO link then we'll want to do it in the front end.<br><br>Doug: Have a link for how you do the C type merging for modules?<br></blockquote></div><div><br></div>Modules foists the C++ one definition rule on C/Objective-C so that it can avoid performing type merging, so we can’t look there.<div><br></div><div>C doesn’t have a one definition rule per se. The cross-translation-unit compatibility rules are in 6.2.7 of the C standard, which boils down to structural equality:</div><div><br></div><div><div class="page" title="Page 52">
                        <div class="layoutArea">
                                <div class="column">
                                        <ol style="list-style-type: none">
                                                <li><p><span style="font-size: 12.000000pt; font-family: 'Times'">Moreover, two structure,
union, or enumerated types declared in separate translation units are compatible if their
tags and members satisfy the following requirements: If one is declared with a tag, the
other shall be declared with the same tag. If both are complete types, then the following
additional requirements apply: there shall be a one-to-one correspondence between their
members such that each pair of corresponding members are declared with compatible
types, and such that if one member of a corresponding pair is declared with a name, the
other member is declared with the same name. For two structures, corresponding
members shall be declared in the same order. For two structures or unions, corresponding
bit-fields shall have the same widths. For two enumerations, corresponding members
shall have the same values. </span></p>
                                                </li>
                                        </ol>
                                </div>
                        </div>
                </div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>- Doug</div></div></body></html>