diff options
author | Tim Northover <tnorthover@apple.com> | 2018-04-23 08:16:24 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2018-04-23 08:16:24 +0000 |
commit | 9dc1d0c74eb1f566ef20e307b0cdda1f79d4cbee (patch) | |
tree | 5a8cedadab811c489ac6d8cff61641098286319a /clang/lib/CodeGen/CGAtomic.cpp | |
parent | 1b6d3744229f6953bad081c5b80fce91e4913731 (diff) | |
download | bcm5719-llvm-9dc1d0c74eb1f566ef20e307b0cdda1f79d4cbee.tar.gz bcm5719-llvm-9dc1d0c74eb1f566ef20e307b0cdda1f79d4cbee.zip |
[Atomics] warn about atomic accesses using libcalls
If an atomic variable is misaligned (and that suspicion is why Clang emits
libcalls at all) the runtime support library will have to use a lock to safely
access it, with potentially very bad performance consequences. There's a very
good chance this is unintentional so it makes sense to issue a warning.
Also give it a named group so people can promote it to an error, or disable it
if they really don't care.
llvm-svn: 330566
Diffstat (limited to 'clang/lib/CodeGen/CGAtomic.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGAtomic.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGAtomic.cpp b/clang/lib/CodeGen/CGAtomic.cpp index efc708988ab..47a82b602a0 100644 --- a/clang/lib/CodeGen/CGAtomic.cpp +++ b/clang/lib/CodeGen/CGAtomic.cpp @@ -18,6 +18,7 @@ #include "TargetInfo.h" #include "clang/AST/ASTContext.h" #include "clang/CodeGen/CGFunctionInfo.h" +#include "clang/Sema/SemaDiagnostic.h" #include "llvm/ADT/DenseMap.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Intrinsics.h" @@ -751,6 +752,13 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) { Address Dest = Address::invalid(); Address Ptr = EmitPointerWithAlignment(E->getPtr()); + if (E->getOp() == AtomicExpr::AO__c11_atomic_init || + E->getOp() == AtomicExpr::AO__opencl_atomic_init) { + LValue lvalue = MakeAddrLValue(Ptr, AtomicTy); + EmitAtomicInit(E->getVal1(), lvalue); + return RValue::get(nullptr); + } + CharUnits sizeChars, alignChars; std::tie(sizeChars, alignChars) = getContext().getTypeInfoInChars(AtomicTy); uint64_t Size = sizeChars.getQuantity(); @@ -758,12 +766,8 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) { bool UseLibcall = ((Ptr.getAlignment() % sizeChars) != 0 || getContext().toBits(sizeChars) > MaxInlineWidthInBits); - if (E->getOp() == AtomicExpr::AO__c11_atomic_init || - E->getOp() == AtomicExpr::AO__opencl_atomic_init) { - LValue lvalue = MakeAddrLValue(Ptr, AtomicTy); - EmitAtomicInit(E->getVal1(), lvalue); - return RValue::get(nullptr); - } + if (UseLibcall) + CGM.getDiags().Report(E->getLocStart(), diag::warn_atomic_op_misaligned); llvm::Value *Order = EmitScalarExpr(E->getOrder()); llvm::Value *Scope = |