mirror of https://github.com/microsoft/clang.git
Make -Watomic-alignment say whether the atomic operation was oversized
or misaligned. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@341710 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d61a5cefe6
commit
52bc9ec102
|
@ -7093,8 +7093,8 @@ def warn_atomic_op_has_invalid_memory_order : Warning<
|
|||
def err_atomic_op_has_invalid_synch_scope : Error<
|
||||
"synchronization scope argument to atomic operation is invalid">;
|
||||
def warn_atomic_op_misaligned : Warning<
|
||||
"misaligned or large atomic operation may incur significant performance penalty">,
|
||||
InGroup<DiagGroup<"atomic-alignment">>;
|
||||
"%select{large|misaligned}0 atomic operation may incur "
|
||||
"significant performance penalty">, InGroup<DiagGroup<"atomic-alignment">>;
|
||||
|
||||
def err_overflow_builtin_must_be_int : Error<
|
||||
"operand argument to overflow builtin must be an integer (%0 invalid)">;
|
||||
|
|
|
@ -765,11 +765,15 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
|
|||
std::tie(sizeChars, alignChars) = getContext().getTypeInfoInChars(AtomicTy);
|
||||
uint64_t Size = sizeChars.getQuantity();
|
||||
unsigned MaxInlineWidthInBits = getTarget().getMaxAtomicInlineWidth();
|
||||
bool UseLibcall = ((Ptr.getAlignment() % sizeChars) != 0 ||
|
||||
getContext().toBits(sizeChars) > MaxInlineWidthInBits);
|
||||
|
||||
if (UseLibcall)
|
||||
CGM.getDiags().Report(E->getBeginLoc(), diag::warn_atomic_op_misaligned);
|
||||
bool Oversized = getContext().toBits(sizeChars) > MaxInlineWidthInBits;
|
||||
bool Misaligned = (Ptr.getAlignment() % sizeChars) != 0;
|
||||
bool UseLibcall = Misaligned | Oversized;
|
||||
|
||||
if (UseLibcall) {
|
||||
CGM.getDiags().Report(E->getBeginLoc(), diag::warn_atomic_op_misaligned)
|
||||
<< !Oversized;
|
||||
}
|
||||
|
||||
llvm::Value *Order = EmitScalarExpr(E->getOrder());
|
||||
llvm::Value *Scope =
|
||||
|
|
|
@ -12,10 +12,10 @@ typedef int __attribute__((aligned(1))) unaligned_int;
|
|||
|
||||
void func(IntPair *p) {
|
||||
IntPair res;
|
||||
__atomic_load(p, &res, 0); // expected-warning {{misaligned or large atomic operation may incur significant performance penalty}}
|
||||
__atomic_store(p, &res, 0); // expected-warning {{misaligned or large atomic operation may incur significant performance penalty}}
|
||||
__atomic_fetch_add((unaligned_int *)p, 1, 2); // expected-warning {{misaligned or large atomic operation may incur significant performance penalty}}
|
||||
__atomic_fetch_sub((unaligned_int *)p, 1, 3); // expected-warning {{misaligned or large atomic operation may incur significant performance penalty}}
|
||||
__atomic_load(p, &res, 0); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
|
||||
__atomic_store(p, &res, 0); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
|
||||
__atomic_fetch_add((unaligned_int *)p, 1, 2); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
|
||||
__atomic_fetch_sub((unaligned_int *)p, 1, 3); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
|
||||
}
|
||||
|
||||
void func1(LongStruct *p) {
|
||||
|
|
Loading…
Reference in New Issue