From 820b147493d6d534f9482f1e7d4ff5af99d095b4 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Sun, 19 May 2013 15:28:16 +0000 Subject: [PATCH] Invalidate instruction cache when setting memory to be executable. lli's remote MCJIT code calls setExecutable just prior to running code. In line with Darwin behaviour this seems to be the place to invalidate any caches needed so that relocations can take effect properly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182213 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Unix/Memory.inc | 3 +++ test/ExecutionEngine/MCJIT/remote/lit.local.cfg | 11 ----------- .../MCJIT/remote/test-common-symbols-remote.ll | 2 +- .../MCJIT/remote/test-data-align-remote.ll | 2 +- .../MCJIT/remote/test-global-init-nonzero-remote.ll | 2 +- .../MCJIT/remote/test-ptr-reloc-remote.ll | 2 +- 6 files changed, 7 insertions(+), 15 deletions(-) delete mode 100644 test/ExecutionEngine/MCJIT/remote/lit.local.cfg diff --git a/lib/Support/Unix/Memory.inc b/lib/Support/Unix/Memory.inc index cdd475c17f7..1c6af7fa0f2 100644 --- a/lib/Support/Unix/Memory.inc +++ b/lib/Support/Unix/Memory.inc @@ -268,6 +268,9 @@ bool Memory::setExecutable (MemoryBlock &M, std::string *ErrMsg) { kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)M.Address, (vm_size_t)M.Size, 0, VM_PROT_READ | VM_PROT_EXECUTE | VM_PROT_COPY); return KERN_SUCCESS == kr; +#elif defined(__arm__) || defined(__aarch64__) + Memory::InvalidateInstructionCache(M.Address, M.Size); + return true; #else return true; #endif diff --git a/test/ExecutionEngine/MCJIT/remote/lit.local.cfg b/test/ExecutionEngine/MCJIT/remote/lit.local.cfg deleted file mode 100644 index 12fcda02732..00000000000 --- a/test/ExecutionEngine/MCJIT/remote/lit.local.cfg +++ /dev/null @@ -1,11 +0,0 @@ -config.suffixes = ['.ll', '.c', '.cpp'] - -def getRoot(config): - if not config.parent: - return config - return getRoot(config.parent) - -root = getRoot(config) - -if 'arm' in root.target_triple: - config.unsupported = True diff --git a/test/ExecutionEngine/MCJIT/remote/test-common-symbols-remote.ll b/test/ExecutionEngine/MCJIT/remote/test-common-symbols-remote.ll index a336c017c08..eb2e68606da 100644 --- a/test/ExecutionEngine/MCJIT/remote/test-common-symbols-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/test-common-symbols-remote.ll @@ -1,5 +1,5 @@ ; RUN: %lli_mcjit -remote-mcjit -O0 -disable-lazy-compilation=false %s -; XFAIL: arm, mips +; XFAIL: mips ; The intention of this test is to verify that symbols mapped to COMMON in ELF ; work as expected. diff --git a/test/ExecutionEngine/MCJIT/remote/test-data-align-remote.ll b/test/ExecutionEngine/MCJIT/remote/test-data-align-remote.ll index 9daf1684de8..874eeae2069 100644 --- a/test/ExecutionEngine/MCJIT/remote/test-data-align-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/test-data-align-remote.ll @@ -1,5 +1,5 @@ ; RUN: %lli_mcjit -remote-mcjit -O0 %s -; XFAIL: armv7, mips +; XFAIL: mips ; Check that a variable is always aligned as specified. diff --git a/test/ExecutionEngine/MCJIT/remote/test-global-init-nonzero-remote.ll b/test/ExecutionEngine/MCJIT/remote/test-global-init-nonzero-remote.ll index b8d94b50cfe..5337c5d2582 100644 --- a/test/ExecutionEngine/MCJIT/remote/test-global-init-nonzero-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/test-global-init-nonzero-remote.ll @@ -1,5 +1,5 @@ ; RUN: %lli_mcjit -remote-mcjit %s > /dev/null -; XFAIL: arm, mips +; XFAIL: mips @count = global i32 1, align 4 diff --git a/test/ExecutionEngine/MCJIT/remote/test-ptr-reloc-remote.ll b/test/ExecutionEngine/MCJIT/remote/test-ptr-reloc-remote.ll index 833a56a4a95..1a55879f8f6 100644 --- a/test/ExecutionEngine/MCJIT/remote/test-ptr-reloc-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/test-ptr-reloc-remote.ll @@ -1,5 +1,5 @@ ; RUN: %lli_mcjit -remote-mcjit -O0 %s -; XFAIL: arm, mips +; XFAIL: mips @.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1 @ptr = global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), align 4 -- 2.34.1