Author: Gui Andrade Date: 2020-08-14T07:46:43Z New Revision: 909a851dbffeb3637c19268e12e10fdf3dae2add
URL: https://github.com/llvm/llvm-project/commit/909a851dbffeb3637c19268e12e10fdf3dae2add DIFF: https://github.com/llvm/llvm-project/commit/909a851dbffeb3637c19268e12e10fdf3dae2add.diff LOG: [CGAtomic] Mark atomic libcall functions `nounwind` These functions won't ever unwind. This is useful for MemorySanitizer as it simplifies handling __atomic_load in particular. Differential Revision: https://reviews.llvm.org/D85573 Added: Modified: clang/lib/CodeGen/CGAtomic.cpp clang/test/CodeGen/atomic_ops.c Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGAtomic.cpp b/clang/lib/CodeGen/CGAtomic.cpp index b7ada4ac7e3b..d7720a23dd72 100644 --- a/clang/lib/CodeGen/CGAtomic.cpp +++ b/clang/lib/CodeGen/CGAtomic.cpp @@ -307,7 +307,14 @@ static RValue emitAtomicLibcall(CodeGenFunction &CGF, const CGFunctionInfo &fnInfo = CGF.CGM.getTypes().arrangeBuiltinFunctionCall(resultType, args); llvm::FunctionType *fnTy = CGF.CGM.getTypes().GetFunctionType(fnInfo); - llvm::FunctionCallee fn = CGF.CGM.CreateRuntimeFunction(fnTy, fnName); + llvm::AttrBuilder fnAttrB; + fnAttrB.addAttribute(llvm::Attribute::NoUnwind); + fnAttrB.addAttribute(llvm::Attribute::WillReturn); + llvm::AttributeList fnAttrs = llvm::AttributeList::get( + CGF.getLLVMContext(), llvm::AttributeList::FunctionIndex, fnAttrB); + + llvm::FunctionCallee fn = + CGF.CGM.CreateRuntimeFunction(fnTy, fnName, fnAttrs); auto callee = CGCallee::forDirect(fn); return CGF.EmitCall(fnInfo, callee, ReturnValueSlot(), args); } diff --git a/clang/test/CodeGen/atomic_ops.c b/clang/test/CodeGen/atomic_ops.c index c1eb1d005dba..79a1e5dba780 100644 --- a/clang/test/CodeGen/atomic_ops.c +++ b/clang/test/CodeGen/atomic_ops.c @@ -26,6 +26,9 @@ void foo(int x) } +// LIBCALL: declare void @__atomic_load(i32, i8*, i8*, i32) [[LC_ATTRS:#[0-9]+]] +// LIBCALL: declare i1 @__atomic_compare_exchange(i32, i8*, i8*, i8*, i32, i32) [[LC_ATTRS:#[0-9]+]] + extern _Atomic _Bool b; _Bool bar() { @@ -53,6 +56,8 @@ void baz(int y) { x += y; } +// LIBCALL: declare void @__atomic_store(i32, i8*, i8*, i32) [[LC_ATTRS:#[0-9]+]] + _Atomic(int) compound_add(_Atomic(int) in) { // CHECK-LABEL: @compound_add // CHECK: [[OLD:%.*]] = atomicrmw add i32* {{.*}}, i32 5 seq_cst @@ -107,3 +112,5 @@ _Atomic(int) compound_mul(_Atomic(int) in) { return (in *= 5); } + +// LIBCALL: [[LC_ATTRS]] = { nounwind willreturn } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits