[PATCH] Fix atomic libcall.

Logan Chien tzuhsiang.chien at gmail.com
Wed Mar 12 09:08:12 PDT 2014


Ping.

This patch tries to fix the SEGV when atomic operations is going to be
lowered to libcall (e.g. the implementation for armv5e.)  The root cause is
due to the incorrect bitcast from int to pointers.  This patch should fix
the problem.  Please have a look.  Thanks.

Sincerely,
Logan


On Tue, Mar 11, 2014 at 10:28 PM, Logan Chien <tzuhsiang.chien at gmail.com>wrote:

> Ping
>
>
> On Mon, Mar 10, 2014 at 11:55 PM, Logan Chien <tzuhsiang.chien at gmail.com>wrote:
>
>>   Revise the test case for no assertion build.
>>
>> http://llvm-reviews.chandlerc.com/D3006
>>
>> CHANGE SINCE LAST DIFF
>>   http://llvm-reviews.chandlerc.com/D3006?vs=7642&id=7700#toc
>>
>> Files:
>>   lib/CodeGen/CGAtomic.cpp
>>   test/CodeGen/atomic-ops-libcall.c
>>
>> Index: lib/CodeGen/CGAtomic.cpp
>> ===================================================================
>> --- lib/CodeGen/CGAtomic.cpp
>> +++ lib/CodeGen/CGAtomic.cpp
>> @@ -476,6 +476,8 @@
>>      Args.add(RValue::get(EmitCastToVoidPtr(Ptr)),
>> getContext().VoidPtrTy);
>>
>>      std::string LibCallName;
>> +    QualType LoweredMemTy =
>> +      MemTy->isPointerType() ? getContext().getIntPtrType() : MemTy;
>>      QualType RetTy;
>>      bool HaveRetTy = false;
>>      switch (E->getOp()) {
>> @@ -531,7 +533,7 @@
>>      case AtomicExpr::AO__c11_atomic_fetch_add:
>>      case AtomicExpr::AO__atomic_fetch_add:
>>        LibCallName = "__atomic_fetch_add";
>> -      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
>> +      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1,
>> LoweredMemTy,
>>                          E->getExprLoc());
>>        break;
>>      // T __atomic_fetch_and_N(T *mem, T val, int order)
>> @@ -552,7 +554,7 @@
>>      case AtomicExpr::AO__c11_atomic_fetch_sub:
>>      case AtomicExpr::AO__atomic_fetch_sub:
>>        LibCallName = "__atomic_fetch_sub";
>> -      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
>> +      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1,
>> LoweredMemTy,
>>                          E->getExprLoc());
>>        break;
>>      // T __atomic_fetch_xor_N(T *mem, T val, int order)
>> Index: test/CodeGen/atomic-ops-libcall.c
>> ===================================================================
>> --- /dev/null
>> +++ test/CodeGen/atomic-ops-libcall.c
>> @@ -0,0 +1,37 @@
>> +// RUN: %clang_cc1 < %s -triple armv5e-none-linux-gnueabi -emit-llvm -O1
>> | FileCheck %s
>> +
>> +enum memory_order {
>> +  memory_order_relaxed, memory_order_consume, memory_order_acquire,
>> +  memory_order_release, memory_order_acq_rel, memory_order_seq_cst
>> +};
>> +
>> +int *test_c11_atomic_fetch_add_int_ptr(_Atomic(int *) *p) {
>> +  // CHECK: test_c11_atomic_fetch_add_int_ptr
>> +  // CHECK: {{%[^ ]*}} = tail call i32* @__atomic_fetch_add_4(i8*
>> {{%[0-9]+}}, i32 12, i32 5)
>> +  return __c11_atomic_fetch_add(p, 3, memory_order_seq_cst);
>> +}
>> +
>> +int *test_c11_atomic_fetch_sub_int_ptr(_Atomic(int *) *p) {
>> +  // CHECK: test_c11_atomic_fetch_sub_int_ptr
>> +  // CHECK: {{%[^ ]*}} = tail call i32* @__atomic_fetch_sub_4(i8*
>> {{%[0-9]+}}, i32 20, i32 5)
>> +  return __c11_atomic_fetch_sub(p, 5, memory_order_seq_cst);
>> +}
>> +
>> +int test_c11_atomic_fetch_add_int(_Atomic(int) *p) {
>> +  // CHECK: test_c11_atomic_fetch_add_int
>> +  // CHECK: {{%[^ ]*}} = tail call i32 bitcast (i32* (i8*, i32, i32)*
>> @__atomic_fetch_add_4 to i32 (i8*, i32, i32)*)(i8* {{%[0-9]+}}, i32 3, i32
>> 5)
>> +  return __c11_atomic_fetch_add(p, 3, memory_order_seq_cst);
>> +}
>> +
>> +int test_c11_atomic_fetch_sub_int(_Atomic(int) *p) {
>> +  // CHECK: test_c11_atomic_fetch_sub_int
>> +  // CHECK: {{%[^ ]*}} = tail call i32 bitcast (i32* (i8*, i32, i32)*
>> @__atomic_fetch_sub_4 to i32 (i8*, i32, i32)*)(i8* {{%[0-9]+}}, i32 5, i32
>> 5)
>> +  return __c11_atomic_fetch_sub(p, 5, memory_order_seq_cst);
>> +}
>> +
>> +int *fp2a(int **p) {
>> +  // CHECK: @fp2a
>> +  // CHECK: {{%[^ ]*}} = tail call i32* @__atomic_fetch_sub_4(i8*
>> {{%[0-9]+}}, i32 4, i32 0)
>> +  // Note, the GNU builtins do not multiply by sizeof(T)!
>> +  return __atomic_fetch_sub(p, 4, memory_order_relaxed);
>> +}
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140313/080c410a/attachment.html>


More information about the cfe-commits mailing list