<div dir="ltr">On Mon, Jan 5, 2015 at 2:33 PM, Alexey Samsonov <span dir="ltr"><<a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi Saleem.</div><div><br></div>How do you run the builtins test suite? Do you, by any chance have local changes that would allow to run them in CMake build, and can be upstreamed with reasonable effort? :)</div></blockquote><div><br></div><div>I have something cobbled together that relies on ssh.  Introducing something into the existing CMake system probably would limit it to being run locally only.  I think if that is okay, it might be possible to add support for that.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div><div class="h5"><div class="gmail_quote">On Mon, Jan 5, 2015 at 1:54 PM, Saleem Abdulrasool <span dir="ltr"><<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: compnerd<br>
Date: Mon Jan  5 15:54:50 2015<br>
New Revision: 225215<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=225215&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=225215&view=rev</a><br>
Log:<br>
tests: correct builtins test if built under -mthumb on ARM<br>
<br>
The clear_cache and enable_execute_stack tests attempt to memcpy the definition<br>
of a function into a buffer before executing the function.  The problem with<br>
this approach is that on some targets (ARM with thumb mode compilation, MIPS<br>
with MIPS16 codegen or uMIPS), you would use a pointer which is incorrect (it<br>
would be off-by-one) due to the ISA selection being encoded into the address.<br>
This ensures that the function address is retrieved correctly in all cases.<br>
<br>
Modified:<br>
    compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c<br>
    compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c<br>
<br>
Modified: compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c?rev=225215&r1=225214&r2=225215&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c?rev=225215&r1=225214&r2=225215&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c (original)<br>
+++ compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c Mon Jan  5 15:54:50 2015<br>
@@ -38,7 +38,18 @@ int func2()<br>
     return 2;<br>
 }<br>
<br>
-<br>
+void *__attribute__((noinline))<br>
+memcpy_f(void *dst, const void *src, size_t n) {<br>
+// ARM and MIPS nartually align functions, but use the LSB for ISA selection<br>
+// (THUMB, MIPS16/uMIPS respectively).  Ensure that the ISA bit is ignored in<br>
+// the memcpy<br>
+#if defined(__arm__) || defined(__mips__)<br>
+  return (void *)((uintptr_t)memcpy(dst, (void *)((uintptr_t)src & ~1), n) |<br>
+                  ((uintptr_t)src & 1));<br>
+#else<br>
+  return memcpy(dst, (void *)((uintptr_t)src), n);<br>
+#endif<br>
+}<br>
<br>
 unsigned char execution_buffer[128];<br>
<br>
@@ -59,16 +70,14 @@ int main()<br>
         return 1;<br>
<br>
     // verify you can copy and execute a function<br>
-    memcpy(execution_buffer, (void *)(uintptr_t)&func1, 128);<br>
+    pfunc f1 = (pfunc)memcpy_f(execution_buffer, func1, 128);<br>
     __clear_cache(execution_buffer, &execution_buffer[128]);<br>
-    pfunc f1 = (pfunc)(uintptr_t)execution_buffer;<br>
     if ((*f1)() != 1)<br>
         return 1;<br>
<br>
     // verify you can overwrite a function with another<br>
-    memcpy(execution_buffer, (void *)(uintptr_t)&func2, 128);<br>
+    pfunc f2 = (pfunc)memcpy_f(execution_buffer, func2, 128);<br>
     __clear_cache(execution_buffer, &execution_buffer[128]);<br>
-    pfunc f2 = (pfunc)(uintptr_t)execution_buffer;<br>
     if ((*f2)() != 2)<br>
         return 1;<br>
<br>
<br>
Modified: compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c?rev=225215&r1=225214&r2=225215&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c?rev=225215&r1=225214&r2=225215&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c (original)<br>
+++ compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c Mon Jan  5 15:54:50 2015<br>
@@ -45,8 +45,18 @@ int func2()<br>
     return 2;<br>
 }<br>
<br>
-<br>
-<br>
+void *__attribute__((noinline))<br>
+memcpy_f(void *dst, const void *src, size_t n) {<br>
+// ARM and MIPS nartually align functions, but use the LSB for ISA selection<br>
+// (THUMB, MIPS16/uMIPS respectively).  Ensure that the ISA bit is ignored in<br>
+// the memcpy<br>
+#if defined(__arm__) || defined(__mips__)<br>
+  return (void *)((uintptr_t)memcpy(dst, (void *)((uintptr_t)src & ~1), n) |<br>
+                  ((uintptr_t)src & 1));<br>
+#else<br>
+  return memcpy(dst, (void *)((uintptr_t)src), n);<br>
+#endif<br>
+}<br>
<br>
 int main()<br>
 {<br>
@@ -55,16 +65,14 @@ int main()<br>
     __enable_execute_stack(execution_buffer);<br>
<br>
     // verify you can copy and execute a function<br>
-    memcpy(execution_buffer, (void *)(uintptr_t)&func1, 128);<br>
+    pfunc f1 = (pfunc)memcpy_f(execution_buffer, func1, 128);<br>
     __clear_cache(execution_buffer, &execution_buffer[128]);<br>
-    pfunc f1 = (pfunc)(uintptr_t)execution_buffer;<br>
     if ((*f1)() != 1)<br>
         return 1;<br>
<br>
     // verify you can overwrite a function with another<br>
-    memcpy(execution_buffer, (void *)(uintptr_t)&func2, 128);<br>
+    pfunc f2 = (pfunc)memcpy_f(execution_buffer, func2, 128);<br>
     __clear_cache(execution_buffer, &execution_buffer[128]);<br>
-    pfunc f2 = (pfunc)(uintptr_t)execution_buffer;<br>
     if ((*f2)() != 2)<br>
         return 1;<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div></div></div><span class="HOEnZb"><font color="#888888">-- <br><div><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div></div>
</font></span></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org</div>
</div></div>