[PATCH] Fix atomic libcall.

Logan Chien tzuhsiang.chien at gmail.com
Thu Mar 13 17:20:15 PDT 2014


Ping?

Logan Chien <tzuhsiang.chien at gmail.com> 於 2014年3月13日星期四寫道:

> 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<javascript:_e(%7B%7D,'cvml','tzuhsiang.chien at gmail.com');>
> > wrote:
>
>> Ping
>>
>>
>> On Mon, Mar 10, 2014 at 11:55 PM, Logan Chien <tzuhsiang.chien at gmail.com<javascript:_e(%7B%7D,'cvml','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/20140314/4fe605ec/attachment.html>


More information about the cfe-commits mailing list