Skip to content

Commit 8993144

Browse files
author
MUSTAPHA BARKI
authored
Merge branch 'main' into Uncontrolled-data-used-in-path-expression
2 parents 93bbb50 + 119cdf7 commit 8993144

File tree

394 files changed

+25705
-19017
lines changed

Some content is hidden

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

394 files changed

+25705
-19017
lines changed

.clang-format

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
BasedOnStyle: LLVM
2+
LineEnding: LF

.github/workflows/libcxx-build-and-test.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ jobs:
215215
- uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
216216
with:
217217
# https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md
218-
xcode-version: '16.3'
218+
xcode-version: '26.0'
219219
- uses: seanmiddleditch/gha-setup-ninja@3b1f8f94a2f8254bd26914c4ab9474d4f0015f67 # v6
220220
- name: Build and test
221221
run: |

bolt/include/bolt/Rewrite/RewriteInstance.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,12 +249,11 @@ class RewriteInstance {
249249
/// Analyze relocation \p Rel.
250250
/// Return true if the relocation was successfully processed, false otherwise.
251251
/// The \p SymbolName, \p SymbolAddress, \p Addend and \p ExtractedValue
252-
/// parameters will be set on success. The \p Skip argument indicates
253-
/// that the relocation was analyzed, but it must not be processed.
252+
/// parameters will be set on success.
254253
bool analyzeRelocation(const object::RelocationRef &Rel, uint32_t &RType,
255254
std::string &SymbolName, bool &IsSectionRelocation,
256255
uint64_t &SymbolAddress, int64_t &Addend,
257-
uint64_t &ExtractedValue, bool &Skip) const;
256+
uint64_t &ExtractedValue) const;
258257

259258
/// Rewrite non-allocatable sections with modifications.
260259
void rewriteNoteSections();

bolt/lib/Core/Relocation.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ static bool isSupportedAArch64(uint32_t Type) {
8181
case ELF::R_AARCH64_LD64_GOT_LO12_NC:
8282
case ELF::R_AARCH64_TLSDESC_LD64_LO12:
8383
case ELF::R_AARCH64_TLSDESC_ADD_LO12:
84-
case ELF::R_AARCH64_TLSDESC_CALL:
8584
case ELF::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
8685
case ELF::R_AARCH64_PREL16:
8786
case ELF::R_AARCH64_PREL32:
@@ -193,7 +192,6 @@ static size_t getSizeForTypeAArch64(uint32_t Type) {
193192
case ELF::R_AARCH64_LD64_GOT_LO12_NC:
194193
case ELF::R_AARCH64_TLSDESC_LD64_LO12:
195194
case ELF::R_AARCH64_TLSDESC_ADD_LO12:
196-
case ELF::R_AARCH64_TLSDESC_CALL:
197195
case ELF::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
198196
case ELF::R_AARCH64_PREL32:
199197
case ELF::R_AARCH64_MOVW_UABS_G0:
@@ -248,7 +246,14 @@ static bool skipRelocationTypeX86(uint32_t Type) {
248246
}
249247

250248
static bool skipRelocationTypeAArch64(uint32_t Type) {
251-
return Type == ELF::R_AARCH64_NONE || Type == ELF::R_AARCH64_LD_PREL_LO19;
249+
switch (Type) {
250+
default:
251+
return false;
252+
case ELF::R_AARCH64_NONE:
253+
case ELF::R_AARCH64_LD_PREL_LO19:
254+
case ELF::R_AARCH64_TLSDESC_CALL:
255+
return true;
256+
}
252257
}
253258

254259
static bool skipRelocationTypeRISCV(uint32_t Type) {
@@ -362,7 +367,6 @@ static uint64_t extractValueAArch64(uint32_t Type, uint64_t Contents,
362367
return static_cast<int64_t>(PC) + SignExtend64<32>(Contents & 0xffffffff);
363368
case ELF::R_AARCH64_PREL64:
364369
return static_cast<int64_t>(PC) + Contents;
365-
case ELF::R_AARCH64_TLSDESC_CALL:
366370
case ELF::R_AARCH64_JUMP26:
367371
case ELF::R_AARCH64_CALL26:
368372
// Immediate goes in bits 25:0 of B and BL.
@@ -552,7 +556,6 @@ static bool isGOTAArch64(uint32_t Type) {
552556
case ELF::R_AARCH64_TLSDESC_ADR_PAGE21:
553557
case ELF::R_AARCH64_TLSDESC_LD64_LO12:
554558
case ELF::R_AARCH64_TLSDESC_ADD_LO12:
555-
case ELF::R_AARCH64_TLSDESC_CALL:
556559
return true;
557560
}
558561
}
@@ -591,7 +594,6 @@ static bool isTLSAArch64(uint32_t Type) {
591594
case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
592595
case ELF::R_AARCH64_TLSDESC_LD64_LO12:
593596
case ELF::R_AARCH64_TLSDESC_ADD_LO12:
594-
case ELF::R_AARCH64_TLSDESC_CALL:
595597
case ELF::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
596598
return true;
597599
}
@@ -667,7 +669,6 @@ static bool isPCRelativeAArch64(uint32_t Type) {
667669
case ELF::R_AARCH64_MOVW_UABS_G2_NC:
668670
case ELF::R_AARCH64_MOVW_UABS_G3:
669671
return false;
670-
case ELF::R_AARCH64_TLSDESC_CALL:
671672
case ELF::R_AARCH64_CALL26:
672673
case ELF::R_AARCH64_JUMP26:
673674
case ELF::R_AARCH64_TSTBR14:

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2274,8 +2274,7 @@ uint32_t getRelocationSymbol(const ELFObjectFileBase *Obj,
22742274
bool RewriteInstance::analyzeRelocation(
22752275
const RelocationRef &Rel, uint32_t &RType, std::string &SymbolName,
22762276
bool &IsSectionRelocation, uint64_t &SymbolAddress, int64_t &Addend,
2277-
uint64_t &ExtractedValue, bool &Skip) const {
2278-
Skip = false;
2277+
uint64_t &ExtractedValue) const {
22792278
if (!Relocation::isSupported(RType))
22802279
return false;
22812280

@@ -2707,9 +2706,8 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
27072706
int64_t Addend;
27082707
uint64_t ExtractedValue;
27092708
bool IsSectionRelocation;
2710-
bool Skip;
27112709
if (!analyzeRelocation(Rel, RType, SymbolName, IsSectionRelocation,
2712-
SymbolAddress, Addend, ExtractedValue, Skip)) {
2710+
SymbolAddress, Addend, ExtractedValue)) {
27132711
LLVM_DEBUG({
27142712
dbgs() << "BOLT-WARNING: failed to analyze relocation @ offset = "
27152713
<< formatv("{0:x}; type name = {1}\n", Rel.getOffset(), TypeName);
@@ -2718,14 +2716,6 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
27182716
return;
27192717
}
27202718

2721-
if (Skip) {
2722-
LLVM_DEBUG({
2723-
dbgs() << "BOLT-DEBUG: skipping relocation @ offset = "
2724-
<< formatv("{0:x}; type name = {1}\n", Rel.getOffset(), TypeName);
2725-
});
2726-
return;
2727-
}
2728-
27292719
if (!IsFromCode && !IsWritable && (IsX86 || IsAArch64) &&
27302720
Relocation::isPCRelative(RType)) {
27312721
BinaryData *BD = BC->getBinaryDataContainingAddress(Rel.getOffset());

bolt/test/AArch64/tls-desc-call.s

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# RUN: %clang %cflags %s -o %t.so -fPIC -shared -Wl,-q
2+
# RUN: llvm-bolt %t.so -o %t.bolt --debug-only=bolt 2>&1 | FileCheck %s
3+
4+
# REQUIRES: asserts
5+
6+
## Verify that R_AARCH64_TLSDESC_CALL relocations are ignored
7+
8+
# CHECK-NOT: Relocation {{.*}} R_AARCH64_TLSDESC_CALL
9+
10+
.text
11+
.globl get_tls_var
12+
.p2align 2
13+
.type get_tls_var,@function
14+
get_tls_var:
15+
.cfi_startproc
16+
str x30, [sp, #-16]!
17+
adrp x0, :tlsdesc:tls_var
18+
ldr x1, [x0, :tlsdesc_lo12:tls_var]
19+
add x0, x0, :tlsdesc_lo12:tls_var
20+
.tlsdesccall tls_var
21+
blr x1
22+
mrs x8, TPIDR_EL0
23+
ldr w0, [x8, x0]
24+
ldr x30, [sp], #16
25+
ret
26+
.size get_tls_var, .-get_tls_var
27+
.cfi_endproc
28+
29+
.type tls_var,@object
30+
.section .tdata,"awT",@progbits
31+
.globl tls_var
32+
.p2align 2, 0x0
33+
tls_var:
34+
.word 42
35+
.size tls_var, 4

clang/.clang-format

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
BasedOnStyle: LLVM
2+
LineEnding: LF

clang/docs/InternalsManual.rst

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2859,6 +2859,67 @@ This library is called by the :ref:`Parser library <Parser>` during parsing to
28592859
do semantic analysis of the input. For valid programs, Sema builds an AST for
28602860
parsed constructs.
28612861

2862+
2863+
Concept Satisfaction Checking and Subsumption
2864+
---------------------------------------------
2865+
2866+
As per the C++ standard, constraints are `normalized <https://eel.is/c++draft/temp.constr.normal>`_
2867+
and the normal form is used both for subsumption, and constraint checking.
2868+
Both depend on a parameter mapping that substitutes lazily. In particular,
2869+
we should not substitute in unused arguments.
2870+
2871+
Clang follows the order of operations prescribed by the standard.
2872+
2873+
Normalization happens prior to satisfaction and subsumption
2874+
and is handled by ``NormalizedConstraint``.
2875+
2876+
Clang preserves in the normalized form intermediate concept-ids
2877+
(``ConceptIdConstraint``) This is used for diagnostics only and no substitution
2878+
happens in a ConceptIdConstraint if its expression is satisfied.
2879+
2880+
The normal form of the associated constraints of a declaration is cached in
2881+
Sema::NormalizationCache such that it is only computed once.
2882+
2883+
A ``NormalizedConstraint`` is a recursive data structure, where each node
2884+
contains a parameter mapping, represented by the indexes of all parameter
2885+
being used.
2886+
2887+
Checking satisfaction is done by ``ConstraintSatisfactionChecker``, recursively
2888+
walking ``NormalizedConstraint``. At each level, we substitute the outermost
2889+
level of the template arguments referenced in the parameter mapping of a
2890+
normalized expression (``MultiLevelTemplateArgumentList``).
2891+
2892+
For the following example,
2893+
2894+
.. code-block:: c++
2895+
2896+
template <typename T>
2897+
concept A = __is_same(T, int);
2898+
2899+
template <typename U>
2900+
concept B = A<U> && __is_same(U, int);
2901+
2902+
The normal form of B is
2903+
2904+
.. code-block:: c++
2905+
2906+
__is_same(T, int) /*T->U, innermost level*/
2907+
&& __is_same(U, int) {U->U} /*T->U, outermost level*/
2908+
2909+
After substitution in the mapping, we substitute in the constraint expression
2910+
using that copy of the ``MultiLevelTemplateArgumentList``, and then evaluate it.
2911+
2912+
Because this is expensive, it is cached in
2913+
``UnsubstitutedConstraintSatisfactionCache``.
2914+
2915+
Any error during satisfaction is recorded in ``ConstraintSatisfaction``.
2916+
for nested requirements, ``ConstraintSatisfaction`` is stored (including
2917+
diagnostics) in the AST, which is something we might want to improve.
2918+
2919+
When an atomic constraint is not satified, we try to substitute into any
2920+
enclosing concept-id using the same mechanism described above, for
2921+
diagnostics purpose, and inject that in the ``ConstraintSatisfaction``.
2922+
28622923
.. _CodeGen:
28632924

28642925
The CodeGen Library

clang/docs/ReleaseNotes.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,10 @@ C++23 Feature Support
160160
C++20 Feature Support
161161
^^^^^^^^^^^^^^^^^^^^^
162162

163+
- Clang now normalizes constraints before checking whether they are satisfied, as mandated by the standard.
164+
As a result, Clang no longer incorrectly diagnoses substitution failures in template arguments only
165+
used in concept-ids, and produces better diagnostics for satisfaction failure. (#GH61811) (#GH135190)
166+
163167
C++17 Feature Support
164168
^^^^^^^^^^^^^^^^^^^^^
165169

@@ -437,6 +441,7 @@ Bug Fixes to C++ Support
437441
- Fix the result of `__builtin_is_implicit_lifetime` for types with a user-provided constructor. (#GH160610)
438442
- Correctly deduce return types in ``decltype`` expressions. (#GH160497) (#GH56652) (#GH116319) (#GH161196)
439443
- Fixed a crash in the pre-C++23 warning for attributes before a lambda declarator (#GH161070).
444+
- Fix a crash when attempting to deduce a deduction guide from a non deducible template template parameter. (#130604)
440445

441446
Bug Fixes to AST Handling
442447
^^^^^^^^^^^^^^^^^^^^^^^^^

clang/include/clang/AST/ASTConcept.h

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,20 @@ namespace clang {
2828

2929
class ConceptDecl;
3030
class TemplateDecl;
31+
class ConceptReference;
3132
class Expr;
3233
class NamedDecl;
3334
struct PrintingPolicy;
3435

36+
/// Unsatisfied constraint expressions if the template arguments could be
37+
/// substituted into them, or a diagnostic if substitution resulted in
38+
/// an invalid expression.
39+
///
40+
using ConstraintSubstitutionDiagnostic = std::pair<SourceLocation, StringRef>;
41+
using UnsatisfiedConstraintRecord =
42+
llvm::PointerUnion<const Expr *, const ConceptReference *,
43+
const ConstraintSubstitutionDiagnostic *>;
44+
3545
/// The result of a constraint satisfaction check, containing the necessary
3646
/// information to diagnose an unsatisfied constraint.
3747
class ConstraintSatisfaction : public llvm::FoldingSetNode {
@@ -48,16 +58,13 @@ class ConstraintSatisfaction : public llvm::FoldingSetNode {
4858
ArrayRef<TemplateArgument> TemplateArgs)
4959
: ConstraintOwner(ConstraintOwner), TemplateArgs(TemplateArgs) {}
5060

51-
using SubstitutionDiagnostic = std::pair<SourceLocation, StringRef>;
52-
using Detail = llvm::PointerUnion<Expr *, SubstitutionDiagnostic *>;
53-
5461
bool IsSatisfied = false;
5562
bool ContainsErrors = false;
5663

5764
/// \brief The substituted constraint expr, if the template arguments could be
5865
/// substituted into them, or a diagnostic if substitution resulted in an
5966
/// invalid expression.
60-
llvm::SmallVector<Detail, 4> Details;
67+
llvm::SmallVector<UnsatisfiedConstraintRecord, 4> Details;
6168

6269
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C) {
6370
Profile(ID, C, ConstraintOwner, TemplateArgs);
@@ -69,19 +76,12 @@ class ConstraintSatisfaction : public llvm::FoldingSetNode {
6976

7077
bool HasSubstitutionFailure() {
7178
for (const auto &Detail : Details)
72-
if (Detail.dyn_cast<SubstitutionDiagnostic *>())
79+
if (Detail.dyn_cast<const ConstraintSubstitutionDiagnostic *>())
7380
return true;
7481
return false;
7582
}
7683
};
7784

78-
/// Pairs of unsatisfied atomic constraint expressions along with the
79-
/// substituted constraint expr, if the template arguments could be
80-
/// substituted into them, or a diagnostic if substitution resulted in
81-
/// an invalid expression.
82-
using UnsatisfiedConstraintRecord =
83-
llvm::PointerUnion<Expr *, std::pair<SourceLocation, StringRef> *>;
84-
8585
/// \brief The result of a constraint satisfaction check, containing the
8686
/// necessary information to diagnose an unsatisfied constraint.
8787
///
@@ -101,6 +101,10 @@ struct ASTConstraintSatisfaction final :
101101
return getTrailingObjects() + NumRecords;
102102
}
103103

104+
ArrayRef<UnsatisfiedConstraintRecord> records() const {
105+
return {begin(), end()};
106+
}
107+
104108
ASTConstraintSatisfaction(const ASTContext &C,
105109
const ConstraintSatisfaction &Satisfaction);
106110
ASTConstraintSatisfaction(const ASTContext &C,
@@ -282,6 +286,11 @@ class TypeConstraint {
282286
}
283287
};
284288

289+
/// Insertion operator for diagnostics. This allows sending ConceptReferences's
290+
/// into a diagnostic with <<.
291+
const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB,
292+
const ConceptReference *C);
293+
285294
} // clang
286295

287296
#endif // LLVM_CLANG_AST_ASTCONCEPT_H

0 commit comments

Comments
 (0)