<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 20, 2016, at 12:53 PM, Joe Groff &lt;<a href="mailto:jgroff@apple.com" class="">jgroff@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><blockquote type="cite" style="font-family: Menlo-Regular; font-size: 11px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="Apple-interchange-newline">On Jan 19, 2016, at 8:31 AM, William Dillon &lt;<a href="mailto:william@housedillon.com" class="">william@housedillon.com</a>&gt; wrote:<br class=""><br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><br class="">Second, Orlando believes that it’s possible to use C++ to generate the object files rather that assembler. &nbsp;This would make these source files much more portable and easier to maintain. &nbsp;There is a catch, however. In the assembler version there is no runtime impact at all; the C++ version requires a subtraction at load time. &nbsp;The cost is pretty minimal, but it’s worth considering. Changing from one implementation to another is very simple.<br class=""></blockquote><br class="">How different is the .s file across platforms? I'd expect it to just contain data directives.<br class=""><br class=""></blockquote><br class="">There are very minor differences. &nbsp;Here are the current files:<br class=""><br class="">swift_begin.S:<br class=""><br class="">#if defined(__arm__)<br class="">.section .swift2_protocol_conformances, "aw",%progbits<br class="">#else<br class="">.section .swift2_protocol_conformances, "aw",@progbits<br class="">#endif<br class="">.global .swift2_protocol_conformances_start<br class="">.swift2_protocol_conformances_start:<br class=""><br class="">#if defined(__x86_64__)<br class="">.quad (.swift2_protocol_conformances_end - .swift2_protocol_conformances_start) - 8<br class="">#else<br class="">.long (.swift2_protocol_conformances_end - .swift2_protocol_conformances_start) - 8<br class="">.long 0<br class="">#endif<br class=""><br class=""><br class="">swift_end.S:<br class=""><br class="">#if defined(__arm__)<br class="">.section .swift2_protocol_conformances, "aw",%progbits<br class="">#else<br class="">.section .swift2_protocol_conformances, "aw",@progbits<br class="">#endif<br class="">.global .swift2_protocol_conformances_end<br class="">.swift2_protocol_conformances_end:<br class=""><br class="">Whereas the C++ version would be something like this (for begin):<br class=""><br class="">__attribute__((section(".swift2_protocol_conformances")))<br class="">extern char swift2_protocol_conformances_end[] __asm__(".swift2_protocol_conformances_end");<br class=""><br class="">__attribute__((section(".swift2_protocol_conformances")))<br class="">long long swift2_protocol_conformances_start __asm__(".swift2_protocol_conformances_start") =<br class="">(long long)((char *)&amp;swift2_protocol_conformances_end - (char *)&amp;swift2_protocol_conformances_start - sizeof(swift2_protocol_conformances_start));<br class=""><br class="">So, it’s not necessary to break-out the different sections, the generated initializer for swift2_protocol_conformances_start would have a subtraction.<br class=""></blockquote><br style="font-family: Menlo-Regular; font-size: 11px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Menlo-Regular; font-size: 11px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">A .ll file containing LLVM IR might be able to adequately abstract away the per-platform syntactical differences in .s files, while allowing enough control to avoid the extra relocation implied by the C++ code.</span><br style="font-family: Menlo-Regular; font-size: 11px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Menlo-Regular; font-size: 11px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote></div><br class=""></div><div class="">Thanks for the idea, Joe!<div class=""><br class=""></div><div class="">We’ll look into it. :)</div></div><div class=""><br class=""></div></body></html>