Skip to content

Commit bd7ba70

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:8cdecd4d3aedea7bc5f27d1f69da216100cb2815 into amd-gfx:3efff4af20d0
Local branch amd-gfx 3efff4a Merged main:0183b58e292d9d7004fabc92bd0da10eba5666db into amd-gfx:378c20547273 Remote branch main 8cdecd4 [IR] Add getelementptr nusw and nuw flags (llvm#90824)
2 parents 3efff4a + 8cdecd4 commit bd7ba70

File tree

118 files changed

+1293
-462
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+1293
-462
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,8 @@ Bug Fixes in This Version
632632
Bug Fixes to Compiler Builtins
633633
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
634634

635+
- Fix crash when atomic builtins are called with pointer to zero-size struct (#GH90330)
636+
635637
Bug Fixes to Attribute Support
636638
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
637639

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ def note_strncat_wrong_size : Note<
855855
"the terminating null byte">;
856856

857857
def warn_assume_side_effects : Warning<
858-
"the argument to %0 has side effects that will be discarded">,
858+
"assumption is ignored because it contains (potential) side-effects">,
859859
InGroup<DiagGroup<"assume">>;
860860
def warn_omp_assume_attribute_string_unknown : Warning<
861861
"unknown assumption string '%0'; attribute is potentially ignored">,
@@ -8860,8 +8860,10 @@ def err_builtin_fn_use : Error<"builtin functions must be directly called">;
88608860

88618861
def warn_call_wrong_number_of_arguments : Warning<
88628862
"too %select{few|many}0 arguments in call to %1">;
8863+
88638864
def err_atomic_builtin_must_be_pointer : Error<
8864-
"address argument to atomic builtin must be a pointer (%0 invalid)">;
8865+
"address argument to atomic builtin must be a pointer %select{|to a non-zero-sized object }1(%0 invalid)">;
8866+
88658867
def err_atomic_builtin_must_be_pointer_intptr : Error<
88668868
"address argument to atomic builtin must be a pointer to integer or pointer"
88678869
" (%0 invalid)">;

clang/lib/AST/Interp/ByteCodeExprGen.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3341,7 +3341,8 @@ bool ByteCodeExprGen<Emitter>::VisitCallExpr(const CallExpr *E) {
33413341
// write the result into.
33423342
if (IsVirtual && !HasQualifier) {
33433343
uint32_t VarArgSize = 0;
3344-
unsigned NumParams = Func->getNumWrittenParams();
3344+
unsigned NumParams =
3345+
Func->getNumWrittenParams() + isa<CXXOperatorCallExpr>(E);
33453346
for (unsigned I = NumParams, N = E->getNumArgs(); I != N; ++I)
33463347
VarArgSize += align(primSize(classify(E->getArg(I)).value_or(PT_Ptr)));
33473348

@@ -3775,13 +3776,13 @@ bool ByteCodeExprGen<Emitter>::VisitDeclRefExpr(const DeclRefExpr *E) {
37753776
return this->emitGetPtrLocal(Offset, E);
37763777
} else if (auto GlobalIndex = P.getGlobal(D)) {
37773778
if (IsReference)
3778-
return this->emitGetGlobalPtr(*GlobalIndex, E);
3779+
return this->emitGetGlobal(classifyPrim(E), *GlobalIndex, E);
37793780

37803781
return this->emitGetPtrGlobal(*GlobalIndex, E);
37813782
} else if (const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
37823783
if (auto It = this->Params.find(PVD); It != this->Params.end()) {
37833784
if (IsReference || !It->second.IsPtr)
3784-
return this->emitGetParamPtr(It->second.Offset, E);
3785+
return this->emitGetParam(classifyPrim(E), It->second.Offset, E);
37853786

37863787
return this->emitGetPtrParam(It->second.Offset, E);
37873788
}

clang/lib/AST/Interp/PrimType.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ template <unsigned Bits, bool Signed> class Integral;
3030

3131
/// Enumeration of the primitive types of the VM.
3232
enum PrimType : unsigned {
33-
PT_Sint8,
34-
PT_Uint8,
35-
PT_Sint16,
36-
PT_Uint16,
37-
PT_Sint32,
38-
PT_Uint32,
39-
PT_Sint64,
40-
PT_Uint64,
41-
PT_IntAP,
42-
PT_IntAPS,
43-
PT_Bool,
44-
PT_Float,
45-
PT_Ptr,
46-
PT_FnPtr,
33+
PT_Sint8 = 0,
34+
PT_Uint8 = 1,
35+
PT_Sint16 = 2,
36+
PT_Uint16 = 3,
37+
PT_Sint32 = 4,
38+
PT_Uint32 = 5,
39+
PT_Sint64 = 6,
40+
PT_Uint64 = 7,
41+
PT_IntAP = 8,
42+
PT_IntAPS = 9,
43+
PT_Bool = 10,
44+
PT_Float = 11,
45+
PT_Ptr = 12,
46+
PT_FnPtr = 13,
4747
};
4848

4949
inline constexpr bool isPtrType(PrimType T) {

clang/lib/Sema/SemaChecking.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3824,7 +3824,7 @@ bool Sema::CheckARMBuiltinExclusiveCall(unsigned BuiltinID, CallExpr *TheCall,
38243824
const PointerType *pointerType = PointerArg->getType()->getAs<PointerType>();
38253825
if (!pointerType) {
38263826
Diag(DRE->getBeginLoc(), diag::err_atomic_builtin_must_be_pointer)
3827-
<< PointerArg->getType() << PointerArg->getSourceRange();
3827+
<< PointerArg->getType() << 0 << PointerArg->getSourceRange();
38283828
return true;
38293829
}
38303830

@@ -3858,7 +3858,7 @@ bool Sema::CheckARMBuiltinExclusiveCall(unsigned BuiltinID, CallExpr *TheCall,
38583858
if (!ValType->isIntegerType() && !ValType->isAnyPointerType() &&
38593859
!ValType->isBlockPointerType() && !ValType->isFloatingType()) {
38603860
Diag(DRE->getBeginLoc(), diag::err_atomic_builtin_must_be_pointer_intfltptr)
3861-
<< PointerArg->getType() << PointerArg->getSourceRange();
3861+
<< PointerArg->getType() << 0 << PointerArg->getSourceRange();
38623862
return true;
38633863
}
38643864

@@ -6803,7 +6803,7 @@ ExprResult Sema::BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
68036803
const PointerType *pointerType = Ptr->getType()->getAs<PointerType>();
68046804
if (!pointerType) {
68056805
Diag(ExprRange.getBegin(), diag::err_atomic_builtin_must_be_pointer)
6806-
<< Ptr->getType() << Ptr->getSourceRange();
6806+
<< Ptr->getType() << 0 << Ptr->getSourceRange();
68076807
return ExprError();
68086808
}
68096809

@@ -6832,6 +6832,13 @@ ExprResult Sema::BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
68326832
}
68336833
}
68346834

6835+
// Pointer to object of size zero is not allowed.
6836+
if (Context.getTypeInfoInChars(AtomTy).Width.isZero()) {
6837+
Diag(ExprRange.getBegin(), diag::err_atomic_builtin_must_be_pointer)
6838+
<< Ptr->getType() << 1 << Ptr->getSourceRange();
6839+
return ExprError();
6840+
}
6841+
68356842
// For an arithmetic operation, the implied arithmetic must be well-formed.
68366843
if (Form == Arithmetic) {
68376844
// GCC does not enforce these rules for GNU atomics, but we do to help catch
@@ -7223,15 +7230,15 @@ ExprResult Sema::BuiltinAtomicOverloaded(ExprResult TheCallResult) {
72237230
const PointerType *pointerType = FirstArg->getType()->getAs<PointerType>();
72247231
if (!pointerType) {
72257232
Diag(DRE->getBeginLoc(), diag::err_atomic_builtin_must_be_pointer)
7226-
<< FirstArg->getType() << FirstArg->getSourceRange();
7233+
<< FirstArg->getType() << 0 << FirstArg->getSourceRange();
72277234
return ExprError();
72287235
}
72297236

72307237
QualType ValType = pointerType->getPointeeType();
72317238
if (!ValType->isIntegerType() && !ValType->isAnyPointerType() &&
72327239
!ValType->isBlockPointerType()) {
72337240
Diag(DRE->getBeginLoc(), diag::err_atomic_builtin_must_be_pointer_intptr)
7234-
<< FirstArg->getType() << FirstArg->getSourceRange();
7241+
<< FirstArg->getType() << 0 << FirstArg->getSourceRange();
72357242
return ExprError();
72367243
}
72377244

clang/test/AST/Interp/functions.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,3 +623,9 @@ namespace FuncPtrParam {
623623
*a; // both-warning {{expression result unused}}
624624
}
625625
}
626+
627+
namespace {
628+
void f() noexcept;
629+
void (&r)() = f;
630+
void (&cond3)() = r;
631+
}

clang/test/AST/Interp/records.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,3 +1467,16 @@ namespace IgnoredCtorWithZeroInit {
14671467
return (S(), true);
14681468
}
14691469
}
1470+
1471+
#if __cplusplus >= 202002L
1472+
namespace VirtOperator {
1473+
/// This used to crash because it's a virtual CXXOperatorCallExpr.
1474+
struct B {
1475+
virtual constexpr bool operator==(const B&) const { return true; }
1476+
};
1477+
struct D : B {
1478+
constexpr bool operator==(const B&) const override{ return false; } // both-note {{operator}}
1479+
};
1480+
constexpr bool cmp_base_derived = D() == D(); // both-warning {{ambiguous}}
1481+
}
1482+
#endif

clang/test/Parser/MicrosoftExtensions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ bool f(int);
426426
template <typename T>
427427
struct A {
428428
constexpr A(T t) {
429-
__assume(f(t)); // expected-warning{{the argument to '__assume' has side effects that will be discarded}}
429+
__assume(f(t)); // expected-warning{{assumption is ignored because it contains (potential) side-effects}}
430430
}
431431
constexpr bool g() { return false; }
432432
};

clang/test/Sema/atomic-ops.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,38 @@ void memory_checks(_Atomic(int) *Ap, int *p, int val) {
639639
(void)__atomic_compare_exchange_n(p, p, val, 0, memory_order_seq_cst, -1); // expected-warning {{memory order argument to atomic operation is invalid}}
640640
}
641641

642+
struct Z {
643+
char z[];
644+
};
645+
646+
void zeroSizeArgError(struct Z *a, struct Z *b, struct Z *c) {
647+
__atomic_exchange(b, b, c, memory_order_relaxed); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
648+
__atomic_exchange(b, b, c, memory_order_acq_rel); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
649+
__atomic_exchange(b, b, c, memory_order_acquire); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
650+
__atomic_exchange(b, b, c, memory_order_consume); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
651+
__atomic_exchange(b, b, c, memory_order_release); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
652+
__atomic_exchange(b, b, c, memory_order_seq_cst); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
653+
__atomic_load(a, b, memory_order_relaxed); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
654+
__atomic_load(a, b, memory_order_acq_rel); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
655+
__atomic_load(a, b, memory_order_acquire); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
656+
__atomic_load(a, b, memory_order_consume); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
657+
__atomic_load(a, b, memory_order_release); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
658+
__atomic_load(a, b, memory_order_seq_cst); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
659+
__atomic_store(a, b, memory_order_relaxed); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
660+
__atomic_store(a, b, memory_order_acq_rel); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
661+
__atomic_store(a, b, memory_order_acquire); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
662+
__atomic_store(a, b, memory_order_consume); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
663+
__atomic_store(a, b, memory_order_release); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
664+
__atomic_store(a, b, memory_order_seq_cst); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
665+
__atomic_compare_exchange(a, b, c, 0, memory_order_relaxed, memory_order_relaxed); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
666+
__atomic_compare_exchange(a, b, c, 0, memory_order_acq_rel, memory_order_acq_rel); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
667+
__atomic_compare_exchange(a, b, c, 0, memory_order_acquire, memory_order_acquire); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
668+
__atomic_compare_exchange(a, b, c, 0, memory_order_consume, memory_order_consume); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
669+
__atomic_compare_exchange(a, b, c, 0, memory_order_release, memory_order_release); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
670+
__atomic_compare_exchange(a, b, c, 0, memory_order_seq_cst, memory_order_seq_cst); // expected-error {{address argument to atomic builtin must be a pointer to a non-zero-sized object}}
671+
672+
}
673+
642674
void nullPointerWarning(void) {
643675
volatile _Atomic(int) vai;
644676
_Atomic(int) ai;

clang/test/Sema/builtin-assume.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@ int ispure(int) __attribute__((pure));
88
int foo(int *a, int i) {
99
#ifdef _MSC_VER
1010
__assume(i != 4);
11-
__assume(++i > 2); //expected-warning {{the argument to '__assume' has side effects that will be discarded}}
12-
__assume(nonconst() > 2); //expected-warning {{the argument to '__assume' has side effects that will be discarded}}
11+
__assume(++i > 2); //expected-warning {{assumption is ignored because it contains (potential) side-effects}}
12+
__assume(nonconst() > 2); //expected-warning {{assumption is ignored because it contains (potential) side-effects}}
1313
__assume(isconst() > 2);
1414
__assume(ispure(i) > 2);
15-
__assume(ispure(++i) > 2); //expected-warning {{the argument to '__assume' has side effects that will be discarded}}
15+
__assume(ispure(++i) > 2); //expected-warning {{assumption is ignored because it contains (potential) side-effects}}
1616

1717
int test = sizeof(struct{char qq[(__assume(i != 5), 7)];});
1818
#else
1919
__builtin_assume(i != 4);
20-
__builtin_assume(++i > 2); //expected-warning {{the argument to '__builtin_assume' has side effects that will be discarded}}
21-
__builtin_assume(nonconst() > 2); //expected-warning {{the argument to '__builtin_assume' has side effects that will be discarded}}
20+
__builtin_assume(++i > 2); //expected-warning {{assumption is ignored because it contains (potential) side-effects}}
21+
__builtin_assume(nonconst() > 2); //expected-warning {{assumption is ignored because it contains (potential) side-effects}}
2222
__builtin_assume(isconst() > 2);
2323
__builtin_assume(ispure(i) > 2);
24-
__builtin_assume(ispure(++i) > 2); //expected-warning {{the argument to '__builtin_assume' has side effects that will be discarded}}
24+
__builtin_assume(ispure(++i) > 2); //expected-warning {{assumption is ignored because it contains (potential) side-effects}}
2525

2626
int test = sizeof(struct{char qq[(__builtin_assume(i != 5), 7)];}); // expected-warning {{variable length array}}
2727
#endif

0 commit comments

Comments
 (0)