<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On 13 Jan 2010, at 20:34, Nick Lewycky wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div class="gmail_quote">On 13 January 2010 12:05, Mark Muir <span dir="ltr"><<a href="mailto:mark.i.r.muir@gmail.com">mark.i.r.muir@gmail.com</a>></span> wrote:<blockquote class="gmail_quote" style="border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0.8ex; padding-left: 1ex; position: static; z-index: auto; ">
<div class="im"><br></div>
But... now there's a small problem with library calls. Symbols such as 'memset', 'malloc', etc. are being removed by global dead code elimination. They are implemented in one of the bitcode modules that are linked together (implementations are based on newlib).</blockquote>

<div><br>And what problems does that cause? If malloc is linked in, we're free to inline it everywhere and delete the symbol. If you meant for it to be visible to the optimizers but you don't want it to be part of the code generated for your program (ie., you'll link it against newlib later), you should mark the functions with available_externally linkage.<br>

 </div></div></blockquote><div><br></div><div>Sorry, I should've been more clear - the calls to _malloc and _free weren't being inlined (see example below). I'm not sure why (happens with or without -simplify-libcalls). So, the resulting .bc file from 'opt' contains live references to symbols that were in its input .bc, but for some reason it stripped them.</div><div><br></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">#include <stdlib.h><br><br>int entries = 3;<br>int result;<br><br>int main()<br>{<br><span class="Apple-tab-span" style="white-space:pre">      </span>int i;<br><br><span class="Apple-tab-span" style="white-space:pre">  </span>// Allocate and populate the initial array.<br><span class="Apple-tab-span" style="white-space:pre">       </span>int* values = malloc(entries * sizeof(int));<br><span class="Apple-tab-span" style="white-space:pre">      </span>for (i = 0; i < entries; i ++)<br><span class="Apple-tab-span" style="white-space:pre">         </span>values[i] = i + 1;<br><span class="Apple-tab-span" style="white-space:pre">        </span><br><span class="Apple-tab-span" style="white-space:pre">  </span>// Calculate the sum, using a dynamically allocated accumulator.<br><span class="Apple-tab-span" style="white-space:pre">  </span>int* acc = malloc(sizeof(int));<br><span class="Apple-tab-span" style="white-space:pre">   </span>*acc = 0;<br><span class="Apple-tab-span" style="white-space:pre"> </span>for (i = 0; i < entries; i ++)<br><span class="Apple-tab-span" style="white-space:pre">         </span>*acc += values[i];<br><span class="Apple-tab-span" style="white-space:pre">        </span>result = *acc;<br><br><span class="Apple-tab-span" style="white-space:pre">  </span>// Deallocate the memory.<br><span class="Apple-tab-span" style="white-space:pre"> </span>free(values);<br><span class="Apple-tab-span" style="white-space:pre">     </span>free(acc);<br><span class="Apple-tab-span" style="white-space:pre">        </span><br><span class="Apple-tab-span" style="white-space:pre">  </span>return 0;<br>}</blockquote><div><div><div><br></div><div>Here's a fragment of the final machine assembly (with -O3):</div><div><br></div><div><div>_main:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ADDCOMP out=r1 in1=r1 in2=4 conf=`ADDCOMP_SUB</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>WMEM in=r2 in_addr=r1 conf=`WMEM_SI</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>CONST_16B out=r3 conf=12</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>JUMP nl_out=r2/*RA*/ addr_in=&_malloc conf=`JUMP_ALWAYS_ABS // Call</div><div><br></div></div><div><br></div><div>In case this is important, here is the relevant declarations from the 'stdlib.h' that is in use:</div><div><br></div></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">_PTR    _EXFUN(malloc,(size_t __size));<br>_VOID   _EXFUN(free,(_PTR));</blockquote><div><div><div><div><div><br></div><div>where:</div><div><br></div></div></div></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">#define _PTR            void *<br>#define _EXFUN(name, proto)             name proto</blockquote><div><div><div><div><div><div><div><br></div><div>and from 'newlib.c':</div><div><br></div></div></div></div></div></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">void *<br>malloc (size_t sz)<br>{<br><span class="Apple-tab-span" style="white-space:pre">     </span>...<br>}</blockquote><div><div><div><br></div><div>i.e. They look like any other function call, which is why I suspect it has something to do with special behaviour given to built-ins.</div></div><div><br></div><blockquote type="cite"><div class="gmail_quote"><div><font class="Apple-style-span" color="#000000"><br></font></div><div>Alternately, if you wanted malloc, memset and friends to be externally visible (compiled as part of your program and dlsym'able), you could create a public api file which contains a one per line list of the names of the functions that may not be marked internal linkage by internalize. Pass that in to opt with -internalize-public-api-file filename ...other flags...<br><br></div></div></blockquote><div><br></div><div>I saw that. I was thinking of only using that option as a last resort, due to maintainability.</div><div><br></div><blockquote type="cite"><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0.8ex; padding-left: 1ex; position: static; z-index: auto; "><font class="Apple-style-span" color="#000000"><br></font>
I guess I need help with the concept of built-ins, and what code is related to them in the Clang driver and back-end.<br>
<div><div></div></div></blockquote></div></blockquote></div><div><br></div><div>Thanks.</div><div><br></div><div>- Mark</div><div><br></div></body></html>