Skip to content

Commit bb94c98

Browse files
authored
merge main into amd-staging (llvm#1706)
2 parents 3332d18 + 1faf93e commit bb94c98

File tree

104 files changed

+3020
-766
lines changed

Some content is hidden

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

104 files changed

+3020
-766
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,8 @@ Bug Fixes in This Version
441441
- Fixed a clang 20 regression where diagnostics attached to some calls to member functions
442442
using C++23 "deducing this" did not have a diagnostic location (#GH135522)
443443

444+
- Fixed a crash when a ``friend`` function is redefined as deleted. (#GH135506)
445+
444446
Bug Fixes to Compiler Builtins
445447
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
446448

clang/include/clang/Basic/arm_sme.td

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,33 @@ let SMETargetGuard = "sme-f16f16" in {
907907
}
908908

909909

910+
////////////////////////////////////////////////////////////////////////////////
911+
// SME2 - TMOP, SUTMOP, USTMOP
912+
913+
let SMETargetGuard = "sme2,sme-tmop" in {
914+
def SVTMOPA_ZA32 : Inst<"svtmopa_lane_za32[_{d}_{d}]", "vi2d[i", "hbf", MergeNone, "aarch64_sme_ftmopa_za32", [IsStreaming, IsInOutZA], [ImmCheck<0, ImmCheck0_3>, ImmCheck<4, ImmCheck0_3>]>;
915+
def SVSTMOPA_ZA32 : Inst<"svtmopa_lane_za32[_{d}_{d}]", "vi2d[i", "cs", MergeNone, "aarch64_sme_stmopa_za32", [IsStreaming, IsInOutZA], [ImmCheck<0, ImmCheck0_3>, ImmCheck<4, ImmCheck0_3>]>;
916+
def SVUTMOPA_ZA32 : Inst<"svtmopa_lane_za32[_{d}_{d}]", "vi2d[i", "UcUs", MergeNone, "aarch64_sme_utmopa_za32", [IsStreaming, IsInOutZA], [ImmCheck<0, ImmCheck0_3>, ImmCheck<4, ImmCheck0_3>]>;
917+
def SVSUTMOPA_ZA32 : Inst<"svtmopa_lane_za32[_{d}_{3}]", "vi2u[i", "c", MergeNone, "aarch64_sme_sutmopa_za32", [IsStreaming, IsInOutZA], [ImmCheck<0, ImmCheck0_3>, ImmCheck<4, ImmCheck0_3>]>;
918+
def SVUSTMOPA_ZA32 : Inst<"svtmopa_lane_za32[_{d}_{3}]", "vi2x[i", "Uc", MergeNone, "aarch64_sme_ustmopa_za32", [IsStreaming, IsInOutZA], [ImmCheck<0, ImmCheck0_3>, ImmCheck<4, ImmCheck0_3>]>;
919+
}
920+
921+
let SMETargetGuard = "sme2,sme-tmop,sme-f16f16" in {
922+
def SVTMOPA_F16 : Inst<"svtmopa_lane_za16[_{d}_{d}]", "vi2d[i", "h", MergeNone, "aarch64_sme_ftmopa_za16", [IsStreaming, IsInOutZA], [ImmCheck<0, ImmCheck0_1>, ImmCheck<4, ImmCheck0_3>]>;
923+
}
924+
925+
let SMETargetGuard = "sme2,sme-tmop,sme-b16b16" in {
926+
def SVTMOPA_BF16 : Inst<"svtmopa_lane_za16[_{d}_{d}]", "vi2d[i", "b", MergeNone, "aarch64_sme_ftmopa_za16", [IsStreaming, IsInOutZA], [ImmCheck<0, ImmCheck0_1>, ImmCheck<4, ImmCheck0_3>]>;
927+
}
928+
929+
let SMETargetGuard = "sme2,sme-tmop,sme-f8f16" in {
930+
def SVTMOPA_ZA16_FPM : Inst<"svtmopa_lane_za16[_{d}_{d}]", "vi2.dd[i>", "m", MergeNone, "aarch64_sme_ftmopa_za16", [IsStreaming, IsInOutZA], [ImmCheck<0, ImmCheck0_1>, ImmCheck<4, ImmCheck0_3>]>;
931+
}
932+
933+
let SMETargetGuard = "sme2,sme-tmop,sme-f8f32" in {
934+
def SVTMOPA_ZA32_FPM : Inst<"svtmopa_lane_za32[_{d}_{d}]", "vi2.dd[i>", "m", MergeNone, "aarch64_sme_ftmopa_za32", [IsStreaming, IsInOutZA], [ImmCheck<0, ImmCheck0_3>, ImmCheck<4, ImmCheck0_3>]>;
935+
}
936+
910937
multiclass ZAReadz<string n_suffix, string vg_num, string t, string i_prefix, list<ImmCheck> ch> {
911938
let SMETargetGuard = "sme2p1" in {
912939
def NAME # _H : SInst<"svreadz_hor_" # n_suffix # "_{d}_vg" # vg_num, vg_num # "im", t,

clang/include/clang/Basic/arm_sve.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -836,9 +836,11 @@ defm SVRINTP : SInstZPZ<"svrintp", "hfd", "aarch64_sve_frintp">;
836836
defm SVRINTX : SInstZPZ<"svrintx", "hfd", "aarch64_sve_frintx">;
837837
defm SVRINTZ : SInstZPZ<"svrintz", "hfd", "aarch64_sve_frintz">;
838838
defm SVSQRT : SInstZPZ<"svsqrt", "hfd", "aarch64_sve_fsqrt">;
839-
839+
def SVEXPA : SInst<"svexpa[_{d}]", "du", "hfd", MergeNone, "aarch64_sve_fexpa_x", [VerifyRuntimeMode]>{
840+
let SVETargetGuard = "sve";
841+
let SMETargetGuard = "sme2,ssve-fexpa";
842+
}
840843
let SVETargetGuard = "sve", SMETargetGuard = InvalidMode in {
841-
def SVEXPA : SInst<"svexpa[_{d}]", "du", "hfd", MergeNone, "aarch64_sve_fexpa_x">;
842844
def SVTMAD : SInst<"svtmad[_{d}]", "dddi", "hfd", MergeNone, "aarch64_sve_ftmad_x", [], [ImmCheck<2, ImmCheck0_7>]>;
843845
def SVTSMUL : SInst<"svtsmul[_{d}]", "ddu", "hfd", MergeNone, "aarch64_sve_ftsmul_x">;
844846
def SVTSSEL : SInst<"svtssel[_{d}]", "ddu", "hfd", MergeNone, "aarch64_sve_ftssel_x">;

clang/include/clang/Driver/SanitizerArgs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ class SanitizerArgs {
105105
bool requiresMinimalRuntime() const { return MinimalRuntime; }
106106
bool needsDfsanRt() const { return Sanitizers.has(SanitizerKind::DataFlow); }
107107
bool needsSafeStackRt() const { return SafeStackRuntime; }
108-
bool needsCfiRt() const;
109-
bool needsCfiDiagRt() const;
108+
bool needsCfiCrossDsoRt() const;
109+
bool needsCfiCrossDsoDiagRt() const;
110110
bool needsStatsRt() const { return Stats; }
111111
bool needsScudoRt() const { return Sanitizers.has(SanitizerKind::Scudo); }
112112
bool needsNsanRt() const {

clang/lib/AST/ByteCode/Compiler.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4057,7 +4057,7 @@ template <class Emitter> bool Compiler<Emitter>::visitBool(const Expr *E) {
40574057
return true;
40584058

40594059
// Convert pointers to bool.
4060-
if (T == PT_Ptr || T == PT_FnPtr) {
4060+
if (T == PT_Ptr) {
40614061
if (!this->emitNull(*T, 0, nullptr, E))
40624062
return false;
40634063
return this->emitNE(*T, E);
@@ -4103,8 +4103,6 @@ bool Compiler<Emitter>::visitZeroInitializer(PrimType T, QualType QT,
41034103
case PT_Ptr:
41044104
return this->emitNullPtr(Ctx.getASTContext().getTargetNullPointerValue(QT),
41054105
nullptr, E);
4106-
case PT_FnPtr:
4107-
return this->emitNullFnPtr(0, nullptr, E);
41084106
case PT_MemberPtr:
41094107
return this->emitNullMemberPtr(0, nullptr, E);
41104108
case PT_Float:
@@ -4255,7 +4253,6 @@ bool Compiler<Emitter>::emitConst(T Value, PrimType Ty, const Expr *E) {
42554253
case PT_Bool:
42564254
return this->emitConstBool(Value, E);
42574255
case PT_Ptr:
4258-
case PT_FnPtr:
42594256
case PT_MemberPtr:
42604257
case PT_Float:
42614258
case PT_IntAP:
@@ -4956,7 +4953,7 @@ bool Compiler<Emitter>::VisitCallExpr(const CallExpr *E) {
49564953
// If we know the callee already, check the known parametrs for nullability.
49574954
if (FuncDecl && NonNullArgs[ArgIndex]) {
49584955
PrimType ArgT = classify(Arg).value_or(PT_Ptr);
4959-
if (ArgT == PT_Ptr || ArgT == PT_FnPtr) {
4956+
if (ArgT == PT_Ptr) {
49604957
if (!this->emitCheckNonNullArg(ArgT, Arg))
49614958
return false;
49624959
}
@@ -5997,7 +5994,7 @@ bool Compiler<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
59975994
if (!this->visit(SubExpr))
59985995
return false;
59995996

6000-
if (T == PT_Ptr || T == PT_FnPtr) {
5997+
if (T == PT_Ptr) {
60015998
if (!this->emitIncPtr(E))
60025999
return false;
60036000

@@ -6021,7 +6018,7 @@ bool Compiler<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
60216018
if (!this->visit(SubExpr))
60226019
return false;
60236020

6024-
if (T == PT_Ptr || T == PT_FnPtr) {
6021+
if (T == PT_Ptr) {
60256022
if (!this->emitDecPtr(E))
60266023
return false;
60276024

@@ -6045,7 +6042,7 @@ bool Compiler<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
60456042
if (!this->visit(SubExpr))
60466043
return false;
60476044

6048-
if (T == PT_Ptr || T == PT_FnPtr) {
6045+
if (T == PT_Ptr) {
60496046
if (!this->emitLoadPtr(E))
60506047
return false;
60516048
if (!this->emitConstUint8(1, E))
@@ -6088,7 +6085,7 @@ bool Compiler<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
60886085
if (!this->visit(SubExpr))
60896086
return false;
60906087

6091-
if (T == PT_Ptr || T == PT_FnPtr) {
6088+
if (T == PT_Ptr) {
60926089
if (!this->emitLoadPtr(E))
60936090
return false;
60946091
if (!this->emitConstUint8(1, E))

clang/lib/AST/ByteCode/Disasm.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,6 @@ static const char *primTypeToString(PrimType T) {
256256
return "Float";
257257
case PT_Ptr:
258258
return "Ptr";
259-
case PT_FnPtr:
260-
return "FnPtr";
261259
case PT_MemberPtr:
262260
return "MemberPtr";
263261
case PT_FixedPoint:

clang/lib/AST/ByteCode/EvalEmitter.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,6 @@ bool EvalEmitter::speculate(const CallExpr *E, const LabelTy &EndLabel) {
142142
if (T == PT_Ptr) {
143143
const auto &Ptr = S.Stk.pop<Pointer>();
144144
return this->emitBool(CheckBCPResult(S, Ptr), E);
145-
} else if (T == PT_FnPtr) {
146-
S.Stk.discard<FunctionPointer>();
147-
// Never accepted
148-
return this->emitBool(false, E);
149145
}
150146

151147
// Otherwise, this is fine!
@@ -210,14 +206,6 @@ template <> bool EvalEmitter::emitRet<PT_Ptr>(const SourceInfo &Info) {
210206

211207
return true;
212208
}
213-
template <> bool EvalEmitter::emitRet<PT_FnPtr>(const SourceInfo &Info) {
214-
if (!isActive())
215-
return true;
216-
217-
// Function pointers cannot be converted to rvalues.
218-
EvalResult.setFunctionPointer(S.Stk.pop<FunctionPointer>());
219-
return true;
220-
}
221209

222210
bool EvalEmitter::emitRetVoid(const SourceInfo &Info) {
223211
EvalResult.setValid();

clang/lib/AST/ByteCode/FunctionPointer.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,22 @@ APValue FunctionPointer::toAPValue(const ASTContext &) const {
1616
return APValue(static_cast<Expr *>(nullptr), CharUnits::Zero(), {},
1717
/*OnePastTheEnd=*/false, /*IsNull=*/true);
1818

19-
if (!Valid)
20-
return APValue(static_cast<Expr *>(nullptr),
21-
CharUnits::fromQuantity(getIntegerRepresentation()), {},
22-
/*OnePastTheEnd=*/false, /*IsNull=*/false);
23-
2419
if (Func->getDecl())
25-
return APValue(Func->getDecl(), CharUnits::fromQuantity(Offset), {},
20+
return APValue(Func->getDecl(), CharUnits::fromQuantity(0), {},
2621
/*OnePastTheEnd=*/false, /*IsNull=*/false);
27-
return APValue(Func->getExpr(), CharUnits::fromQuantity(Offset), {},
22+
return APValue(Func->getExpr(), CharUnits::fromQuantity(0), {},
2823
/*OnePastTheEnd=*/false, /*IsNull=*/false);
2924
}
3025

3126
void FunctionPointer::print(llvm::raw_ostream &OS) const {
3227
OS << "FnPtr(";
33-
if (Func && Valid)
28+
if (Func)
3429
OS << Func->getName();
3530
else if (Func)
3631
OS << reinterpret_cast<uintptr_t>(Func);
3732
else
3833
OS << "nullptr";
39-
OS << ") + " << Offset;
34+
OS << ")";
4035
}
4136

4237
} // namespace interp

clang/lib/AST/ByteCode/FunctionPointer.h

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,15 @@ namespace interp {
2020
class FunctionPointer final {
2121
private:
2222
const Function *Func;
23-
uint64_t Offset;
24-
bool Valid;
2523

2624
public:
2725
FunctionPointer() = default;
28-
FunctionPointer(const Function *Func, uint64_t Offset = 0)
29-
: Func(Func), Offset(Offset), Valid(true) {}
30-
31-
FunctionPointer(uintptr_t IntVal, const Descriptor *Desc = nullptr)
32-
: Func(reinterpret_cast<const Function *>(IntVal)), Offset(0),
33-
Valid(false) {}
26+
FunctionPointer(const Function *Func) : Func(Func) {}
3427

3528
const Function *getFunction() const { return Func; }
36-
uint64_t getOffset() const { return Offset; }
3729
bool isZero() const { return !Func; }
38-
bool isValid() const { return Valid; }
3930
bool isWeak() const {
40-
if (!Func || !Valid || !Func->getDecl())
31+
if (!Func || !Func->getDecl())
4132
return false;
4233

4334
return Func->getDecl()->isWeak();
@@ -56,20 +47,8 @@ class FunctionPointer final {
5647
uint64_t getIntegerRepresentation() const {
5748
return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(Func));
5849
}
59-
60-
ComparisonCategoryResult compare(const FunctionPointer &RHS) const {
61-
if (Func == RHS.Func && Offset == RHS.Offset)
62-
return ComparisonCategoryResult::Equal;
63-
return ComparisonCategoryResult::Unordered;
64-
}
6550
};
6651

67-
inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
68-
FunctionPointer FP) {
69-
FP.print(OS);
70-
return OS;
71-
}
72-
7352
} // namespace interp
7453
} // namespace clang
7554

clang/lib/AST/ByteCode/Interp.h

Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include "FixedPoint.h"
2121
#include "Floating.h"
2222
#include "Function.h"
23-
#include "FunctionPointer.h"
2423
#include "InterpBuiltinBitCast.h"
2524
#include "InterpFrame.h"
2625
#include "InterpStack.h"
@@ -984,26 +983,6 @@ bool CmpHelperEQ(InterpState &S, CodePtr OpPC, CompareFn Fn) {
984983
return CmpHelper<T>(S, OpPC, Fn);
985984
}
986985

987-
template <>
988-
inline bool CmpHelperEQ<FunctionPointer>(InterpState &S, CodePtr OpPC,
989-
CompareFn Fn) {
990-
const auto &RHS = S.Stk.pop<FunctionPointer>();
991-
const auto &LHS = S.Stk.pop<FunctionPointer>();
992-
993-
// We cannot compare against weak declarations at compile time.
994-
for (const auto &FP : {LHS, RHS}) {
995-
if (FP.isWeak()) {
996-
const SourceInfo &Loc = S.Current->getSource(OpPC);
997-
S.FFDiag(Loc, diag::note_constexpr_pointer_weak_comparison)
998-
<< FP.toDiagnosticString(S.getASTContext());
999-
return false;
1000-
}
1001-
}
1002-
1003-
S.Stk.push<Boolean>(Boolean::from(Fn(LHS.compare(RHS))));
1004-
return true;
1005-
}
1006-
1007986
template <>
1008987
inline bool CmpHelper<Pointer>(InterpState &S, CodePtr OpPC, CompareFn Fn) {
1009988
using BoolT = PrimConv<PT_Bool>::T;
@@ -2141,12 +2120,25 @@ static inline bool DecPtr(InterpState &S, CodePtr OpPC) {
21412120

21422121
/// 1) Pops a Pointer from the stack.
21432122
/// 2) Pops another Pointer from the stack.
2144-
/// 3) Pushes the different of the indices of the two pointers on the stack.
2123+
/// 3) Pushes the difference of the indices of the two pointers on the stack.
21452124
template <PrimType Name, class T = typename PrimConv<Name>::T>
21462125
inline bool SubPtr(InterpState &S, CodePtr OpPC) {
21472126
const Pointer &LHS = S.Stk.pop<Pointer>();
21482127
const Pointer &RHS = S.Stk.pop<Pointer>();
21492128

2129+
if (!Pointer::hasSameBase(LHS, RHS) && S.getLangOpts().CPlusPlus) {
2130+
S.FFDiag(S.Current->getSource(OpPC),
2131+
diag::note_constexpr_pointer_arith_unspecified)
2132+
<< LHS.toDiagnosticString(S.getASTContext())
2133+
<< RHS.toDiagnosticString(S.getASTContext());
2134+
return false;
2135+
}
2136+
2137+
if (LHS == RHS) {
2138+
S.Stk.push<T>();
2139+
return true;
2140+
}
2141+
21502142
for (const Pointer &P : {LHS, RHS}) {
21512143
if (P.isZeroSizeArray()) {
21522144
QualType PtrT = P.getType();
@@ -2163,21 +2155,6 @@ inline bool SubPtr(InterpState &S, CodePtr OpPC) {
21632155
}
21642156
}
21652157

2166-
if (RHS.isZero()) {
2167-
S.Stk.push<T>(T::from(LHS.getIndex()));
2168-
return true;
2169-
}
2170-
2171-
if (!Pointer::hasSameBase(LHS, RHS) && S.getLangOpts().CPlusPlus) {
2172-
// TODO: Diagnose.
2173-
return false;
2174-
}
2175-
2176-
if (LHS.isZero() && RHS.isZero()) {
2177-
S.Stk.push<T>();
2178-
return true;
2179-
}
2180-
21812158
T A = LHS.isBlockPointer()
21822159
? (LHS.isElementPastEnd() ? T::from(LHS.getNumElems())
21832160
: T::from(LHS.getIndex()))

0 commit comments

Comments
 (0)