[compiler-rt] r225215 - tests: correct builtins test if built under -mthumb on ARM
Saleem Abdulrasool
compnerd at compnerd.org
Mon Jan 5 18:52:43 PST 2015
On Mon, Jan 5, 2015 at 2:33 PM, Alexey Samsonov <vonosmas at gmail.com> wrote:
> Hi Saleem.
>
> 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? :)
>
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.
> On Mon, Jan 5, 2015 at 1:54 PM, Saleem Abdulrasool <compnerd at compnerd.org>
> wrote:
>
>> Author: compnerd
>> Date: Mon Jan 5 15:54:50 2015
>> New Revision: 225215
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=225215&view=rev
>> Log:
>> tests: correct builtins test if built under -mthumb on ARM
>>
>> The clear_cache and enable_execute_stack tests attempt to memcpy the
>> definition
>> of a function into a buffer before executing the function. The problem
>> with
>> this approach is that on some targets (ARM with thumb mode compilation,
>> MIPS
>> with MIPS16 codegen or uMIPS), you would use a pointer which is incorrect
>> (it
>> would be off-by-one) due to the ISA selection being encoded into the
>> address.
>> This ensures that the function address is retrieved correctly in all
>> cases.
>>
>> Modified:
>> compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c
>> compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c
>>
>> Modified: compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c?rev=225215&r1=225214&r2=225215&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c (original)
>> +++ compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c Mon Jan 5
>> 15:54:50 2015
>> @@ -38,7 +38,18 @@ int func2()
>> return 2;
>> }
>>
>> -
>> +void *__attribute__((noinline))
>> +memcpy_f(void *dst, const void *src, size_t n) {
>> +// ARM and MIPS nartually align functions, but use the LSB for ISA
>> selection
>> +// (THUMB, MIPS16/uMIPS respectively). Ensure that the ISA bit is
>> ignored in
>> +// the memcpy
>> +#if defined(__arm__) || defined(__mips__)
>> + return (void *)((uintptr_t)memcpy(dst, (void *)((uintptr_t)src & ~1),
>> n) |
>> + ((uintptr_t)src & 1));
>> +#else
>> + return memcpy(dst, (void *)((uintptr_t)src), n);
>> +#endif
>> +}
>>
>> unsigned char execution_buffer[128];
>>
>> @@ -59,16 +70,14 @@ int main()
>> return 1;
>>
>> // verify you can copy and execute a function
>> - memcpy(execution_buffer, (void *)(uintptr_t)&func1, 128);
>> + pfunc f1 = (pfunc)memcpy_f(execution_buffer, func1, 128);
>> __clear_cache(execution_buffer, &execution_buffer[128]);
>> - pfunc f1 = (pfunc)(uintptr_t)execution_buffer;
>> if ((*f1)() != 1)
>> return 1;
>>
>> // verify you can overwrite a function with another
>> - memcpy(execution_buffer, (void *)(uintptr_t)&func2, 128);
>> + pfunc f2 = (pfunc)memcpy_f(execution_buffer, func2, 128);
>> __clear_cache(execution_buffer, &execution_buffer[128]);
>> - pfunc f2 = (pfunc)(uintptr_t)execution_buffer;
>> if ((*f2)() != 2)
>> return 1;
>>
>>
>> Modified: compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c
>> URL:
>> 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
>>
>> ==============================================================================
>> --- compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c
>> (original)
>> +++ compiler-rt/trunk/test/builtins/Unit/enable_execute_stack_test.c Mon
>> Jan 5 15:54:50 2015
>> @@ -45,8 +45,18 @@ int func2()
>> return 2;
>> }
>>
>> -
>> -
>> +void *__attribute__((noinline))
>> +memcpy_f(void *dst, const void *src, size_t n) {
>> +// ARM and MIPS nartually align functions, but use the LSB for ISA
>> selection
>> +// (THUMB, MIPS16/uMIPS respectively). Ensure that the ISA bit is
>> ignored in
>> +// the memcpy
>> +#if defined(__arm__) || defined(__mips__)
>> + return (void *)((uintptr_t)memcpy(dst, (void *)((uintptr_t)src & ~1),
>> n) |
>> + ((uintptr_t)src & 1));
>> +#else
>> + return memcpy(dst, (void *)((uintptr_t)src), n);
>> +#endif
>> +}
>>
>> int main()
>> {
>> @@ -55,16 +65,14 @@ int main()
>> __enable_execute_stack(execution_buffer);
>>
>> // verify you can copy and execute a function
>> - memcpy(execution_buffer, (void *)(uintptr_t)&func1, 128);
>> + pfunc f1 = (pfunc)memcpy_f(execution_buffer, func1, 128);
>> __clear_cache(execution_buffer, &execution_buffer[128]);
>> - pfunc f1 = (pfunc)(uintptr_t)execution_buffer;
>> if ((*f1)() != 1)
>> return 1;
>>
>> // verify you can overwrite a function with another
>> - memcpy(execution_buffer, (void *)(uintptr_t)&func2, 128);
>> + pfunc f2 = (pfunc)memcpy_f(execution_buffer, func2, 128);
>> __clear_cache(execution_buffer, &execution_buffer[128]);
>> - pfunc f2 = (pfunc)(uintptr_t)execution_buffer;
>> if ((*f2)() != 2)
>> return 1;
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
>
> --
> Alexey Samsonov
> vonosmas at gmail.com
>
--
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150105/6af3d602/attachment.html>
More information about the llvm-commits
mailing list