[llvm-commits] [PATCH][Compiler-rt] Windows implementation of mmap functionality in clear_cache_test and enable_execute_stack_test

Ruben Van Boxem vanboxem.ruben at gmail.com
Sat Jan 7 11:42:01 PST 2012


Hi,

Attached is a patch for compiler-rt to allow it to compile with MinGW-w64
on Windows. Results aren't that bad.

x86 GCC and Clang do everything right, all tests pass.

x86_64 GCC fails a lot of tests. This is 99% sure a codegen issue.
38 - fixunssfti_test (Failed)
74 - fixunsdfti_test (Failed)

x86_64 Clang fails these tests:
2 - udivmodti4_test (SEGFAULT)
6 - fixdfti_test (Failed)
8 - negti2_test (SEGFAULT)
9 - cmpti2_test (SEGFAULT)
10 - mulvti3_test (SEGFAULT)
12 - fixunsxfti_test (Failed)
14 - negvti2_test (SEGFAULT)
16 - ucmpti2_test (SEGFAULT)
19 - popcountti2_test (SEGFAULT)
23 - shlti3_test (SEGFAULT)
29 - floatuntisf_test (SEGFAULT)
31 - powixf2_test (SEGFAULT)
34 - floattisf_test (SEGFAULT)
38 - fixunssfti_test (Failed)
39 - parityti2_test (SEGFAULT)
45 - multi3_test (SEGFAULT)
47 - clzti2_test (SEGFAULT)
53 - ffsti2_test (SEGFAULT)
55 - fixsfti_test (Failed)
56 - absvti2_test (SEGFAULT)
57 - ashrti3_test (SEGFAULT)
62 - addvti3_test (SEGFAULT)
64 - floatuntidf_test (SEGFAULT)
65 - umodti3_test (SEGFAULT)
66 - ctzti2_test (SEGFAULT)
67 - floatuntixf_test (SEGFAULT)
69 - floattidf_test (SEGFAULT)
70 - modti3_test (SEGFAULT)
73 - floattixf_test (SEGFAULT)
74 - fixunsdfti_test (Failed)
75 - subvti3_test (SEGFAULT)
80 - lshrti3_test (SEGFAULT)
83 - udivti3_test (SEGFAULT)
86 - fixxfti_test (Failed)
88 - divti3_test (SEGFAULT)

I'll be happy to provide any helpful info (as in, correctly generated
object files or something)

Everything passes on x86.

Please apply at your leisure! Thanks!

Ruben
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120107/85859e08/attachment.html>
-------------- next part --------------
Index: test/Unit/clear_cache_test.c
===================================================================
--- test/Unit/clear_cache_test.c	(revision 147731)
+++ test/Unit/clear_cache_test.c	(working copy)
@@ -11,12 +11,20 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>
+#if defined(_WIN32)
+#include <windows.h>
+void __clear_cache(void* start, void* end)
+{
+    if( !FlushInstructionCache(GetCurrentProcess(), start, end-start) )
+        exit(1);
+}
+#else
 #include <sys/mman.h>
+extern void __clear_cache(void* start, void* end);
+#endif
 
 
 
-extern void __clear_cache(void* start, void* end);
-
 typedef int (*pfunc)(void);
 
 int func1() 
@@ -31,14 +39,23 @@
 
 
 
-unsigned char execution_buffer[128];
 
+
 int main()
 {
+    unsigned char execution_buffer[128];
     // make executable the page containing execution_buffer 
     char* start = (char*)((uintptr_t)execution_buffer & (-4095));
     char* end = (char*)((uintptr_t)(&execution_buffer[128+4096]) & (-4095));
+#if defined(_WIN32)
+    DWORD dummy_oldProt;
+    MEMORY_BASIC_INFORMATION b;
+    if ( !VirtualQuery(start, &b, sizeof(b)) )
+        return 1;
+    if ( !VirtualProtect(b.BaseAddress, b.RegionSize, PAGE_EXECUTE_READWRITE, &b.Protect) )
+#else
     if ( mprotect(start, end-start, PROT_READ|PROT_WRITE|PROT_EXEC) != 0 )
+#endif
         return 1;
 
     // verify you can copy and execute a function
@@ -53,7 +70,8 @@
     __clear_cache(execution_buffer, &execution_buffer[128]);
     pfunc f2 = (pfunc)(uintptr_t)execution_buffer;
     if ( (*f2)() != 2 )
-        return 1;
+    {
+        return 1;}
 
     return 0;
 }
Index: test/Unit/enable_execute_stack_test.c
===================================================================
--- test/Unit/enable_execute_stack_test.c	(revision 147731)
+++ test/Unit/enable_execute_stack_test.c	(working copy)
@@ -11,12 +11,27 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>
+#if defined(_WIN32)
+#include <windows.h>
+void __clear_cache(void* start, void* end)
+{
+    if( !FlushInstructionCache(GetCurrentProcess(), start, end-start) )
+        abort();
+}
+void __enable_execute_stack(void *addr) 
+{ 
+    MEMORY_BASIC_INFORMATION b;
+
+    if ( !VirtualQuery(addr, &b, sizeof(b)) )
+        exit(1);
+    if( !VirtualProtect(b.BaseAddress, b.RegionSize, PAGE_EXECUTE_READWRITE, &b.Protect) )
+        exit(1);
+}
+#else
 #include <sys/mman.h>
-
-
-
 extern void __clear_cache(void* start, void* end);
 extern void __enable_execute_stack(void* addr);
+#endif
 
 typedef int (*pfunc)(void);
 
Index: lib/int_endianness.h
===================================================================
--- lib/int_endianness.h	(revision 147731)
+++ lib/int_endianness.h	(working copy)
@@ -80,6 +80,11 @@
 
 #endif /* GNU/Linux */
 
+#if defined(_WIN32)
+#define _YUGA_LITTLE_ENDIAN 1
+#define _YUGA_BIG_ENDIAN    0
+#endif /* Windows */
+
 /* . */
 
 #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)


More information about the llvm-commits mailing list