diff options
| author | Reid Kleckner <rnk@google.com> | 2017-04-07 16:35:09 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2017-04-07 16:35:09 +0000 |
| commit | 8c78ca2e8f14ba15dbfcee13259806fff0649735 (patch) | |
| tree | d87d25aa957f4ade3edb875383977416508c9212 /compiler-rt/test/builtins/Unit | |
| parent | 478b81982f3457c47ab02e4fee3fbd880eb88d3a (diff) | |
| download | bcm5719-llvm-8c78ca2e8f14ba15dbfcee13259806fff0649735.tar.gz bcm5719-llvm-8c78ca2e8f14ba15dbfcee13259806fff0649735.zip | |
[builtins] Get the builtins tests passing on Windows
Many things were broken:
- We stopped building most builtins on Windows in r261432 for reasons
that are not at all clear to me. This essentially reverts that patch.
- Fix %librt to expand to clang_rt.builtins-$arch.lib on Windows instead
of libclang_rt.builtins-$arch.a.
- Fix memory protection tests (trampoline, enable executable, clear
cache) on Windows. One issue was that the MSVC incremental linker
generates ILT thunks for functions with external linkage, so memcpying
the functions into the executable stack buffer wasn't working. You
can't memcpy an RIP-relative jump without fixing up the offset.
- Disable tests that rely on C99 complex library functions when using
the MSVC CRT, which isn't compatible with clang's C99 _Complex.
In theory, these could all be separate patches, but it would not green
the tests, so let's try for it all at once. Hopefully this fixes the
clang-x64-ninja-win7 bot.
llvm-svn: 299780
Diffstat (limited to 'compiler-rt/test/builtins/Unit')
| -rw-r--r-- | compiler-rt/test/builtins/Unit/clear_cache_test.c | 21 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/divdc3_test.c | 2 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/divsc3_test.c | 2 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/divtc3_test.c | 2 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/divxc3_test.c | 2 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/enable_execute_stack_test.c | 32 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/lit.cfg | 14 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/lit.site.cfg.in | 2 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/muldc3_test.c | 2 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/mulsc3_test.c | 2 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/mulxc3_test.c | 2 | ||||
| -rw-r--r-- | compiler-rt/test/builtins/Unit/trampoline_setup_test.c | 1 |
12 files changed, 34 insertions, 50 deletions
diff --git a/compiler-rt/test/builtins/Unit/clear_cache_test.c b/compiler-rt/test/builtins/Unit/clear_cache_test.c index 590be7eb26f..58960ce3ca3 100644 --- a/compiler-rt/test/builtins/Unit/clear_cache_test.c +++ b/compiler-rt/test/builtins/Unit/clear_cache_test.c @@ -16,12 +16,6 @@ #include <stdint.h> #if defined(_WIN32) #include <windows.h> -void __clear_cache(void* start, void* end) -{ - if (!FlushInstructionCache(GetCurrentProcess(), start, end-start)) - exit(1); -} - static uintptr_t get_page_size() { SYSTEM_INFO si; GetSystemInfo(&si); @@ -30,27 +24,20 @@ static uintptr_t get_page_size() { #else #include <unistd.h> #include <sys/mman.h> -extern void __clear_cache(void* start, void* end); static uintptr_t get_page_size() { return sysconf(_SC_PAGE_SIZE); } #endif - +extern void __clear_cache(void* start, void* end); typedef int (*pfunc)(void); -int func1() -{ - return 1; -} - -int func2() -{ - return 2; -} +// Make these static to avoid ILT jumps for incremental linking on Windows. +static int func1() { return 1; } +static int func2() { return 2; } void *__attribute__((noinline)) memcpy_f(void *dst, const void *src, size_t n) { diff --git a/compiler-rt/test/builtins/Unit/divdc3_test.c b/compiler-rt/test/builtins/Unit/divdc3_test.c index 3c69cf3d0cc..042fd23f0f2 100644 --- a/compiler-rt/test/builtins/Unit/divdc3_test.c +++ b/compiler-rt/test/builtins/Unit/divdc3_test.c @@ -17,6 +17,8 @@ #include <complex.h> #include <stdio.h> +// REQUIRES: c99-complex + // Returns: the quotient of (a + ib) / (c + id) COMPILER_RT_ABI double _Complex diff --git a/compiler-rt/test/builtins/Unit/divsc3_test.c b/compiler-rt/test/builtins/Unit/divsc3_test.c index 42430151f0f..daa221825e7 100644 --- a/compiler-rt/test/builtins/Unit/divsc3_test.c +++ b/compiler-rt/test/builtins/Unit/divsc3_test.c @@ -17,6 +17,8 @@ #include <complex.h> #include <stdio.h> +// REQUIRES: c99-complex + // Returns: the quotient of (a + ib) / (c + id) COMPILER_RT_ABI float _Complex diff --git a/compiler-rt/test/builtins/Unit/divtc3_test.c b/compiler-rt/test/builtins/Unit/divtc3_test.c index f561a9644f9..7474330f6eb 100644 --- a/compiler-rt/test/builtins/Unit/divtc3_test.c +++ b/compiler-rt/test/builtins/Unit/divtc3_test.c @@ -18,6 +18,8 @@ #include <math.h> #include <complex.h> +// REQUIRES: c99-complex + // Returns: the quotient of (a + ib) / (c + id) COMPILER_RT_ABI long double _Complex diff --git a/compiler-rt/test/builtins/Unit/divxc3_test.c b/compiler-rt/test/builtins/Unit/divxc3_test.c index d71660bfe13..d0cdb0169eb 100644 --- a/compiler-rt/test/builtins/Unit/divxc3_test.c +++ b/compiler-rt/test/builtins/Unit/divxc3_test.c @@ -19,6 +19,8 @@ #include <complex.h> #include <stdio.h> +// REQUIRES: c99-complex + // Returns: the quotient of (a + ib) / (c + id) COMPILER_RT_ABI long double _Complex diff --git a/compiler-rt/test/builtins/Unit/enable_execute_stack_test.c b/compiler-rt/test/builtins/Unit/enable_execute_stack_test.c index 24165ed9fb7..72fc042e6dc 100644 --- a/compiler-rt/test/builtins/Unit/enable_execute_stack_test.c +++ b/compiler-rt/test/builtins/Unit/enable_execute_stack_test.c @@ -13,39 +13,14 @@ #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); -} -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); -int func1() -{ - return 1; -} - -int func2() -{ - return 2; -} +// Make these static to avoid ILT jumps for incremental linking on Windows. +static int func1() { return 1; } +static int func2() { return 2; } void *__attribute__((noinline)) memcpy_f(void *dst, const void *src, size_t n) { @@ -69,6 +44,7 @@ int main() // verify you can copy and execute a function pfunc f1 = (pfunc)memcpy_f(execution_buffer, func1, 128); __clear_cache(execution_buffer, &execution_buffer[128]); + printf("f1: %p\n", f1); if ((*f1)() != 1) return 1; diff --git a/compiler-rt/test/builtins/Unit/lit.cfg b/compiler-rt/test/builtins/Unit/lit.cfg index f29f7e00d04..9e3a0d6f7eb 100644 --- a/compiler-rt/test/builtins/Unit/lit.cfg +++ b/compiler-rt/test/builtins/Unit/lit.cfg @@ -24,15 +24,21 @@ default_builtins_opts = '' config.test_source_root = os.path.dirname(__file__) # Path to the static library -base_lib = os.path.join(config.compiler_rt_libdir, "libclang_rt.builtins-%s.a " - % config.target_arch) +is_msvc = get_required_attr(config, "builtins_is_msvc") +if is_msvc: + base_lib = os.path.join(config.compiler_rt_libdir, "clang_rt.builtins-%s.lib " + % config.target_arch) + config.substitutions.append( ("%librt ", base_lib) ) +else: + base_lib = os.path.join(config.compiler_rt_libdir, "libclang_rt.builtins-%s.a" + % config.target_arch) + config.substitutions.append( ("%librt ", base_lib + ' -lc -lm ') ) builtins_source_dir = os.path.join( get_required_attr(config, "compiler_rt_src_root"), "lib", "builtins") builtins_lit_source_dir = get_required_attr(config, "builtins_lit_source_dir") extra_link_flags = ["-nodefaultlibs"] -config.substitutions.append( ("%librt ", base_lib + ' -lc -lm ') ) target_cflags = [get_required_attr(config, "target_cflags")] target_cflags += ['-fno-builtin', '-I', builtins_source_dir] @@ -46,6 +52,8 @@ clang_builtins_static_cxxflags = config.cxx_mode_flags + \ clang_builtins_cflags = clang_builtins_static_cflags clang_builtins_cxxflags = clang_builtins_static_cxxflags +if not is_msvc: + config.available_features.add('c99-complex') config.available_features.add('not-android') clang_wrapper = "" diff --git a/compiler-rt/test/builtins/Unit/lit.site.cfg.in b/compiler-rt/test/builtins/Unit/lit.site.cfg.in index 4b4009d1e2c..16dc5ab68aa 100644 --- a/compiler-rt/test/builtins/Unit/lit.site.cfg.in +++ b/compiler-rt/test/builtins/Unit/lit.site.cfg.in @@ -4,7 +4,7 @@ config.name_suffix = "@BUILTINS_TEST_CONFIG_SUFFIX@" config.builtins_lit_source_dir = "@BUILTINS_LIT_SOURCE_DIR@/Unit" config.target_cflags = "@BUILTINS_TEST_TARGET_CFLAGS@" config.target_arch = "@BUILTINS_TEST_TARGET_ARCH@" - +config.builtins_is_msvc = "@MSVC_PYBOOL@" # Load common config for all compiler-rt lit tests. lit_config.load_config(config, "@COMPILER_RT_BINARY_DIR@/test/lit.common.configured") diff --git a/compiler-rt/test/builtins/Unit/muldc3_test.c b/compiler-rt/test/builtins/Unit/muldc3_test.c index add09f4e83e..5a856bc2c83 100644 --- a/compiler-rt/test/builtins/Unit/muldc3_test.c +++ b/compiler-rt/test/builtins/Unit/muldc3_test.c @@ -17,6 +17,8 @@ #include <complex.h> #include <stdio.h> +// REQUIRES: c99-complex + // Returns: the product of a + ib and c + id COMPILER_RT_ABI double _Complex diff --git a/compiler-rt/test/builtins/Unit/mulsc3_test.c b/compiler-rt/test/builtins/Unit/mulsc3_test.c index b14e237d359..46309c3e4c4 100644 --- a/compiler-rt/test/builtins/Unit/mulsc3_test.c +++ b/compiler-rt/test/builtins/Unit/mulsc3_test.c @@ -19,6 +19,8 @@ #include <complex.h> #include <stdio.h> +// REQUIRES: c99-complex + // Returns: the product of a + ib and c + id COMPILER_RT_ABI float _Complex diff --git a/compiler-rt/test/builtins/Unit/mulxc3_test.c b/compiler-rt/test/builtins/Unit/mulxc3_test.c index 384c6ee114e..3260b7521de 100644 --- a/compiler-rt/test/builtins/Unit/mulxc3_test.c +++ b/compiler-rt/test/builtins/Unit/mulxc3_test.c @@ -19,6 +19,8 @@ #include <complex.h> #include <stdio.h> +// REQUIRES: c99-complex + // Returns: the product of a + ib and c + id COMPILER_RT_ABI long double _Complex diff --git a/compiler-rt/test/builtins/Unit/trampoline_setup_test.c b/compiler-rt/test/builtins/Unit/trampoline_setup_test.c index 5a75724f440..b8c3eae2da1 100644 --- a/compiler-rt/test/builtins/Unit/trampoline_setup_test.c +++ b/compiler-rt/test/builtins/Unit/trampoline_setup_test.c @@ -13,7 +13,6 @@ #include <stdio.h> #include <string.h> #include <stdint.h> -#include <sys/mman.h> /* * Tests nested functions |

