[LLVMdev] [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-dev/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-dev
mailing list