<div class="gmail_quote">On Wed, May 30, 2012 at 8:30 AM, Chris Lattner <span dir="ltr"><<a href="mailto:clattner@apple.com" target="_blank">clattner@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><br><div><div class="im"><div>On May 29, 2012, at 9:51 AM, Dmitry Vyukov wrote:</div><br><blockquote type="cite"><div class="gmail_quote">Hi,<div><br></div><div>I have the following program:</div>
<div><br></div><div><font face="courier new, monospace">// test.c</font></div><div><div><font face="courier new, monospace">#include <stdlib.h></font></div>
<div>
<font face="courier new, monospace">struct foo_t {</font></div><div><font face="courier new, monospace">  int x[1024];</font></div><div><font face="courier new, monospace">};</font></div><div><font face="courier new, monospace">__thread struct foo_t g_foo;</font></div>


<div><font face="courier new, monospace">void bar(struct foo_t* foo) {</font></div><div><font face="courier new, monospace">  g_foo = *foo;</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace">int main() {</font></div>


<div><font face="courier new, monospace">  struct foo_t* f = (struct foo_t*)malloc(sizeof(struct foo_t));</font></div><div><font face="courier new, monospace">  bar(f);</font></div><div><font face="courier new, monospace">  return 0;</font></div>


<div><font face="courier new, monospace">}</font></div></div><div><br></div><div>When I compile it with clang I see that it inserts memcpy() in function bar():</div></div></blockquote><div><br></div></div><div>Hi Dmitry,</div>
<div><br></div><div>Short answer: you can't.  Freestanding implementations are required to provide memcpy.</div><div><br></div></div></div></blockquote><div><br></div><div>Hi Chris,</div><div class="gmail_quote"><br></div>
I understand that a freestanding impl must provide memcpy(). But I think it's somewhat orthogonal to actual insertion of the function calls. For example, it's legal to compile with -O0 and with -O3, but I think a conforming compiler that always compiles with -O3 w/o any means to override that would not be that useful. So I thought maybe there is some flag that control insertion of memcpy's, perhaps a hacky flag that turns off the particular pass.</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">Meanwhile I will try Chandler's solution.</div><div class="gmail_quote"><br></div>