[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