git: e405b2dc913c - stable/12 - Merge llvm-project 12.0.0 release
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 25 Dec 2021 11:55:27 UTC
The branch stable/12 has been updated by dim:
URL: https://cgit.FreeBSD.org/src/commit/?id=e405b2dc913c99189aa9b923ed686a790253cc7e
commit e405b2dc913c99189aa9b923ed686a790253cc7e
Author: Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2021-04-26 11:23:24 +0000
Commit: Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2021-12-25 11:51:06 +0000
Merge llvm-project 12.0.0 release
This updates llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and
openmp to llvmorg-12.0.0-0-gd28af7c654d8, a.k.a. 12.0.0 release.
PR: 255570
MFC after: 6 weeks
(cherry picked from commit d409305fa3838fb39b38c26fc085fb729b8766d5)
---
.../clang/include/clang/AST/ASTContext.h | 3 +
.../llvm-project/clang/include/clang/AST/Decl.h | 11 +-
.../llvm-project/clang/include/clang/AST/DeclCXX.h | 6 +
.../llvm-project/clang/include/clang/AST/Expr.h | 3 +-
.../llvm-project/clang/include/clang/AST/Mangle.h | 3 +
.../include/clang/AST/MangleNumberingContext.h | 5 +
.../clang/include/clang/AST/RecursiveASTVisitor.h | 12 +
.../clang/include/clang/ASTMatchers/ASTMatchers.h | 2 +-
.../clang/include/clang/Basic/CodeGenOptions.def | 3 +
.../clang/include/clang/Basic/CodeGenOptions.h | 6 +
.../clang/include/clang/Driver/Options.td | 7 +-
.../clang/include/clang/Lex/VariadicMacroSupport.h | 10 +-
.../llvm-project/clang/include/clang/Sema/Sema.h | 18 +-
contrib/llvm-project/clang/lib/AST/ASTImporter.cpp | 2 +
contrib/llvm-project/clang/lib/AST/CXXABI.h | 5 +-
contrib/llvm-project/clang/lib/AST/Decl.cpp | 29 +-
contrib/llvm-project/clang/lib/AST/DeclCXX.cpp | 14 +
.../llvm-project/clang/lib/AST/ExprConstant.cpp | 50 +-
.../llvm-project/clang/lib/AST/ItaniumCXXABI.cpp | 6 +
.../llvm-project/clang/lib/AST/ItaniumMangle.cpp | 346 +++--
.../llvm-project/clang/lib/AST/MicrosoftCXXABI.cpp | 33 +-
.../clang/lib/ASTMatchers/ASTMatchFinder.cpp | 48 +-
.../clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 2 +-
.../llvm-project/clang/lib/Basic/ProfileList.cpp | 1 +
.../llvm-project/clang/lib/Basic/Targets/PPC.cpp | 3 -
.../llvm-project/clang/lib/Basic/Targets/RISCV.cpp | 6 +-
.../llvm-project/clang/lib/CodeGen/CGBuiltin.cpp | 2 +
.../llvm-project/clang/lib/CodeGen/CGCUDANV.cpp | 8 +
contrib/llvm-project/clang/lib/CodeGen/CGCall.cpp | 5 +
.../clang/lib/CodeGen/CGExprConstant.cpp | 2 +-
.../clang/lib/CodeGen/CGOpenMPRuntime.cpp | 34 +-
.../clang/lib/CodeGen/CodeGenFunction.h | 11 +
.../clang/lib/Driver/ToolChains/Arch/RISCV.cpp | 2 +-
.../clang/lib/Driver/ToolChains/Clang.cpp | 15 +-
.../clang/lib/Driver/ToolChains/CommonArgs.cpp | 5 +
.../clang/lib/Driver/ToolChains/Linux.cpp | 9 -
.../clang/lib/Driver/ToolChains/MSVC.cpp | 6 +-
.../clang/lib/Driver/ToolChains/OpenBSD.cpp | 1 +
.../clang/lib/Format/UnwrappedLineFormatter.cpp | 2 +-
.../clang/lib/Frontend/CompilerInvocation.cpp | 7 +-
.../clang/lib/Frontend/InitPreprocessor.cpp | 2 +-
.../llvm-project/clang/lib/Headers/avx512fintrin.h | 16 +-
.../llvm-project/clang/lib/Lex/Preprocessor.cpp | 8 +-
contrib/llvm-project/clang/lib/Lex/TokenLexer.cpp | 10 +-
contrib/llvm-project/clang/lib/Parse/ParseDecl.cpp | 3 +-
contrib/llvm-project/clang/lib/Sema/Sema.cpp | 43 +-
.../clang/lib/Sema/SemaCodeComplete.cpp | 21 +-
contrib/llvm-project/clang/lib/Sema/SemaDecl.cpp | 88 +-
contrib/llvm-project/clang/lib/Sema/SemaExpr.cpp | 2 +-
contrib/llvm-project/clang/lib/Sema/SemaLambda.cpp | 10 +-
contrib/llvm-project/clang/lib/Sema/SemaOpenMP.cpp | 23 +-
.../llvm-project/clang/lib/Sema/TreeTransform.h | 7 +-
.../clang/lib/Serialization/ASTReaderDecl.cpp | 1 +
.../clang/lib/Serialization/ASTWriter.cpp | 1 +
.../sanitizer_platform_interceptors.h | 2 +-
contrib/llvm-project/libcxx/include/__locale | 20 +-
.../libcxx/include/__threading_support | 2 +-
contrib/llvm-project/libcxx/include/bit | 2 +-
contrib/llvm-project/libcxx/include/limits | 4 +-
contrib/llvm-project/libcxx/include/memory | 2 +-
contrib/llvm-project/libcxx/src/atomic.cpp | 6 +
contrib/llvm-project/libcxx/src/locale.cpp | 2 +-
contrib/llvm-project/lld/ELF/InputSection.cpp | 5 +-
contrib/llvm-project/lld/docs/ReleaseNotes.rst | 108 +-
.../source/Host/common/NativeProcessProtocol.cpp | 11 +-
.../Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp | 48 +-
.../Plugins/Platform/FreeBSD/PlatformFreeBSD.h | 3 -
.../Plugins/Process/FreeBSD/FreeBSDThread.cpp | 615 ---------
.../source/Plugins/Process/FreeBSD/FreeBSDThread.h | 111 --
.../NativeProcessFreeBSD.cpp | 57 +-
.../NativeProcessFreeBSD.h | 11 +-
.../NativeRegisterContextFreeBSD.cpp | 2 +-
.../NativeRegisterContextFreeBSD.h | 0
.../FreeBSD/NativeRegisterContextFreeBSD_arm.cpp | 202 +++
.../FreeBSD/NativeRegisterContextFreeBSD_arm.h | 68 +
.../FreeBSD/NativeRegisterContextFreeBSD_arm64.cpp | 288 ++++
.../FreeBSD/NativeRegisterContextFreeBSD_arm64.h | 86 ++
.../NativeRegisterContextFreeBSD_mips64.cpp | 186 +++
.../FreeBSD/NativeRegisterContextFreeBSD_mips64.h | 71 +
.../NativeRegisterContextFreeBSD_powerpc.cpp | 289 ++++
.../FreeBSD/NativeRegisterContextFreeBSD_powerpc.h | 74 +
.../NativeRegisterContextFreeBSD_x86_64.cpp | 0
.../NativeRegisterContextFreeBSD_x86_64.h | 6 +-
.../NativeThreadFreeBSD.cpp | 5 +
.../NativeThreadFreeBSD.h | 2 +-
.../Plugins/Process/FreeBSD/POSIXStopInfo.cpp | 44 -
.../source/Plugins/Process/FreeBSD/POSIXStopInfo.h | 66 -
.../Plugins/Process/FreeBSD/ProcessFreeBSD.cpp | 1080 ---------------
.../Plugins/Process/FreeBSD/ProcessFreeBSD.h | 221 ---
.../Plugins/Process/FreeBSD/ProcessMonitor.cpp | 1424 --------------------
.../Plugins/Process/FreeBSD/ProcessMonitor.h | 279 ----
.../Plugins/Process/FreeBSD/RegisterContextPOSIX.h | 63 -
.../RegisterContextPOSIXProcessMonitor_arm.cpp | 260 ----
.../RegisterContextPOSIXProcessMonitor_arm.h | 80 --
.../RegisterContextPOSIXProcessMonitor_arm64.cpp | 267 ----
.../RegisterContextPOSIXProcessMonitor_arm64.h | 82 --
.../RegisterContextPOSIXProcessMonitor_mips64.cpp | 262 ----
.../RegisterContextPOSIXProcessMonitor_mips64.h | 82 --
.../RegisterContextPOSIXProcessMonitor_powerpc.cpp | 274 ----
.../RegisterContextPOSIXProcessMonitor_powerpc.h | 84 --
.../RegisterContextPOSIXProcessMonitor_x86.cpp | 613 ---------
.../RegisterContextPOSIXProcessMonitor_x86.h | 81 --
.../NetBSD/NativeRegisterContextNetBSD_x86_64.h | 4 +-
.../Utility/NativeProcessSoftwareSingleStep.cpp | 182 +++
.../Utility/NativeProcessSoftwareSingleStep.h | 31 +
.../Utility/NativeRegisterContextDBReg_arm64.cpp | 466 +++++++
.../Utility/NativeRegisterContextDBReg_arm64.h | 79 ++
..._x86.cpp => NativeRegisterContextDBReg_x86.cpp} | 38 +-
...oint_x86.h => NativeRegisterContextDBReg_x86.h} | 10 +-
.../Process/Utility/RegisterInfos_powerpc.h | 4 +-
.../lldb/tools/lldb-server/lldb-gdbserver.cpp | 2 +-
contrib/llvm-project/llvm/include/llvm-c/Core.h | 6 +-
contrib/llvm-project/llvm/include/llvm-c/Orc.h | 7 +-
.../llvm/include/llvm/Analysis/AssumptionCache.h | 2 +-
.../llvm/include/llvm/CodeGen/FastISel.h | 5 +-
.../llvm/include/llvm/CodeGen/MachineInstr.h | 7 +
.../llvm/include/llvm/CodeGen/TargetLowering.h | 4 +
.../llvm/include/llvm/Demangle/ItaniumDemangle.h | 68 +-
.../llvm/include/llvm/Frontend/OpenMP/OMPKinds.def | 4 +-
.../llvm-project/llvm/include/llvm/IR/InstrTypes.h | 3 -
.../llvm/include/llvm/IR/Instruction.h | 7 +
.../llvm/include/llvm/IR/IntrinsicInst.h | 8 +-
.../llvm/include/llvm/IR/Intrinsics.td | 2 +-
.../llvm/include/llvm/IR/IntrinsicsRISCV.td | 7 +-
.../llvm-project/llvm/include/llvm/IR/Metadata.h | 18 +
.../llvm-project/llvm/include/llvm/IR/Operator.h | 5 +
.../llvm/include/llvm/IR/PseudoProbe.h | 27 +-
.../include/llvm/Passes/StandardInstrumentations.h | 2 +
.../llvm/include/llvm/ProfileData/ProfileCommon.h | 3 +
.../llvm/include/llvm/ProfileData/SampleProf.h | 29 +-
.../include/llvm/ProfileData/SampleProfReader.h | 4 +
.../llvm/include/llvm/Support/CommandLine.h | 13 +
.../llvm/Transforms/IPO/SampleContextTracker.h | 19 +-
.../llvm/Transforms/IPO/SampleProfileProbe.h | 41 +
.../llvm/include/llvm/Transforms/Utils/Cloning.h | 7 +
.../llvm/lib/Analysis/DemandedBits.cpp | 2 +-
.../llvm/lib/Analysis/IVDescriptors.cpp | 5 +-
.../llvm-project/llvm/lib/Analysis/MemorySSA.cpp | 26 -
.../llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp | 81 ++
.../llvm/lib/Analysis/ValueTracking.cpp | 28 +-
.../llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp | 9 +-
.../lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 5 +
.../llvm/lib/CodeGen/LiveRangeShrink.cpp | 3 +-
.../llvm-project/llvm/lib/CodeGen/MachineInstr.cpp | 3 +-
.../llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 17 +-
.../llvm/lib/CodeGen/SelectionDAG/FastISel.cpp | 10 +-
.../CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 5 +-
.../lib/CodeGen/SelectionDAG/TargetLowering.cpp | 31 +-
.../llvm/lib/CodeGen/StackProtector.cpp | 2 +-
.../llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | 8 +-
.../lib/ExecutionEngine/Orc/OrcV2CBindings.cpp | 2 +-
contrib/llvm-project/llvm/lib/IR/AutoUpgrade.cpp | 42 +
contrib/llvm-project/llvm/lib/IR/ConstantFold.cpp | 59 +-
contrib/llvm-project/llvm/lib/IR/Instruction.cpp | 14 +
contrib/llvm-project/llvm/lib/IR/Operator.cpp | 20 +-
contrib/llvm-project/llvm/lib/IR/PseudoProbe.cpp | 41 +
contrib/llvm-project/llvm/lib/IR/Verifier.cpp | 6 -
.../llvm-project/llvm/lib/MC/ELFObjectWriter.cpp | 11 +
.../llvm-project/llvm/lib/Passes/PassBuilder.cpp | 6 +
.../llvm-project/llvm/lib/Passes/PassRegistry.def | 1 +
.../llvm/lib/Passes/StandardInstrumentations.cpp | 1 +
.../lib/ProfileData/Coverage/CoverageMapping.cpp | 1 -
.../llvm/lib/ProfileData/ProfileSummaryBuilder.cpp | 34 +
.../llvm/lib/ProfileData/SampleProfReader.cpp | 99 +-
.../llvm/lib/ProfileData/SampleProfWriter.cpp | 15 +-
.../llvm-project/llvm/lib/Support/CommandLine.cpp | 25 +-
.../llvm-project/llvm/lib/Support/Windows/Path.inc | 24 +-
.../lib/Target/AArch64/AArch64ISelLowering.cpp | 7 +-
.../AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp | 2 +-
.../lib/Target/AMDGPU/SIShrinkInstructions.cpp | 24 +-
.../llvm/lib/Target/ARM/ARMISelLowering.cpp | 6 +-
.../llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 6 +
.../llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 12 +-
.../llvm/lib/Target/PowerPC/PPCISelLowering.h | 3 +
.../lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp | 6 +-
.../RISCV/MCTargetDesc/RISCVTargetStreamer.cpp | 6 +-
.../llvm/lib/Target/RISCV/RISCVCleanupVSETVLI.cpp | 37 +-
.../lib/Target/RISCV/RISCVExpandPseudoInsts.cpp | 11 +-
.../llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp | 118 +-
.../llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h | 5 +-
.../llvm/lib/Target/RISCV/RISCVInstrFormatsV.td | 23 +-
.../llvm/lib/Target/RISCV/RISCVInstrInfoB.td | 67 -
.../llvm/lib/Target/RISCV/RISCVInstrInfoV.td | 116 +-
.../lib/Target/RISCV/RISCVInstrInfoVPseudos.td | 239 ++--
.../lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td | 6 +-
contrib/llvm-project/llvm/lib/Target/VE/VE.h | 10 +-
.../Target/X86/Disassembler/X86Disassembler.cpp | 1 +
.../llvm/lib/Target/X86/X86FastISel.cpp | 8 +
.../llvm/lib/Target/X86/X86ISelLowering.cpp | 9 +-
.../llvm/lib/Target/X86/X86InstrAVX512.td | 4 +-
.../llvm/lib/Target/X86/X86InstrSSE.td | 16 +-
.../llvm/lib/Transforms/IPO/FunctionAttrs.cpp | 10 +-
.../lib/Transforms/IPO/SampleContextTracker.cpp | 118 +-
.../llvm/lib/Transforms/IPO/SampleProfile.cpp | 713 ++++++++--
.../llvm/lib/Transforms/IPO/SampleProfileProbe.cpp | 162 ++-
.../Transforms/InstCombine/InstCombineCasts.cpp | 1 +
.../lib/Transforms/InstCombine/InstCombinePHI.cpp | 8 +-
.../InstCombine/InstCombineSimplifyDemanded.cpp | 8 +-
.../InstCombine/InstructionCombining.cpp | 7 +-
.../llvm/lib/Transforms/Scalar/ADCE.cpp | 2 +-
.../llvm/lib/Transforms/Scalar/JumpThreading.cpp | 10 +
.../llvm/lib/Transforms/Scalar/LoopUnswitch.cpp | 10 +-
.../llvm/lib/Transforms/Scalar/SROA.cpp | 38 +-
.../llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 67 -
.../llvm/lib/Transforms/Utils/CloneFunction.cpp | 8 +
.../llvm/lib/Transforms/Utils/InlineFunction.cpp | 12 +-
.../llvm/lib/Transforms/Utils/Local.cpp | 33 +-
.../llvm/lib/Transforms/Utils/LoopPeel.cpp | 19 +-
.../llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 19 +-
.../Vectorize/LoopVectorizationPlanner.h | 4 +
.../lib/Transforms/Vectorize/LoopVectorize.cpp | 40 +-
.../llvm-project/llvm/tools/llvm-dwp/llvm-dwp.cpp | 4 +-
.../llvm/tools/llvm-objdump/llvm-objdump.cpp | 30 +-
.../llvm/tools/llvm-profdata/llvm-profdata.cpp | 2 +-
.../llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | 7 +-
.../llvm/utils/TableGen/IntrinsicEmitter.cpp | 4 +-
.../openmp/runtime/src/kmp_config.h.cmake | 4 +-
.../openmp/runtime/src/kmp_runtime.cpp | 21 +-
.../openmp/runtime/src/kmp_settings.cpp | 10 +-
.../openmp/runtime/src/kmp_tasking.cpp | 3 +-
etc/mtree/BSD.include.dist | 2 +
lib/clang/include/Plugins/Plugins.def | 1 -
lib/clang/include/VCSVersion.inc | 8 +-
lib/clang/include/clang/Config/config.h | 2 +-
lib/clang/include/llvm/Config/config.h | 4 +-
lib/clang/include/llvm/Config/llvm-config.h | 2 +-
lib/clang/include/llvm/Support/VCSRevision.h | 2 +-
lib/clang/liblldb/Makefile | 36 +-
lib/clang/libllvm/Makefile | 1 +
lib/libc++/Makefile | 26 +-
lib/libc++/__config_site | 40 +
lib/libomp/kmp_config.h | 18 +
lib/libomp/kmp_i18n_default.inc | 10 +-
lib/libomp/kmp_i18n_id.inc | 4 +-
lib/libomp/omp-tools.h | 141 +-
lib/libomp/omp.h | 144 +-
sys/sys/param.h | 2 +-
tools/build/mk/OptionalObsoleteFiles.inc | 11 +
usr.bin/clang/Makefile | 1 +
usr.bin/clang/bugpoint/bugpoint.1 | 8 +-
usr.bin/clang/clang/clang.1 | 42 +-
usr.bin/clang/llc/llc.1 | 22 +-
usr.bin/clang/lldb-server/Makefile | 53 +
usr.bin/clang/lldb-server/lldb-server.1 | 262 ++++
usr.bin/clang/lldb/lldb.1 | 39 +-
usr.bin/clang/lli/lli.1 | 10 +-
usr.bin/clang/llvm-ar/llvm-ar.1 | 10 +-
usr.bin/clang/llvm-ar/llvm-ranlib.1 | 8 +-
usr.bin/clang/llvm-as/llvm-as.1 | 8 +-
usr.bin/clang/llvm-bcanalyzer/llvm-bcanalyzer.1 | 8 +-
usr.bin/clang/llvm-cov/llvm-cov.1 | 25 +-
usr.bin/clang/llvm-cxxfilt/llvm-cxxfilt.1 | 18 +-
usr.bin/clang/llvm-diff/llvm-diff.1 | 8 +-
usr.bin/clang/llvm-dis/llvm-dis.1 | 8 +-
usr.bin/clang/llvm-dwarfdump/llvm-dwarfdump.1 | 54 +-
usr.bin/clang/llvm-extract/llvm-extract.1 | 56 +-
usr.bin/clang/llvm-link/llvm-link.1 | 8 +-
usr.bin/clang/llvm-mca/llvm-mca.1 | 25 +-
usr.bin/clang/llvm-nm/llvm-nm.1 | 15 +-
usr.bin/clang/llvm-objcopy/llvm-objcopy.1 | 116 +-
usr.bin/clang/llvm-objdump/llvm-objdump.1 | 683 +++++++---
usr.bin/clang/llvm-pdbutil/llvm-pdbutil.1 | 8 +-
usr.bin/clang/llvm-profdata/llvm-profdata.1 | 85 +-
usr.bin/clang/llvm-size/llvm-size.1 | 10 +-
usr.bin/clang/llvm-strings/llvm-strings.1 | 10 +-
usr.bin/clang/llvm-symbolizer/llvm-addr2line.1 | 29 +-
usr.bin/clang/llvm-symbolizer/llvm-symbolizer.1 | 98 +-
usr.bin/clang/llvm-tblgen/llvm-tblgen.1 | 806 ++++++++++-
usr.bin/clang/opt/opt.1 | 8 +-
269 files changed, 7470 insertions(+), 7919 deletions(-)
diff --git a/contrib/llvm-project/clang/include/clang/AST/ASTContext.h b/contrib/llvm-project/clang/include/clang/AST/ASTContext.h
index ce47d54e44b0..ae69a68608b7 100644
--- a/contrib/llvm-project/clang/include/clang/AST/ASTContext.h
+++ b/contrib/llvm-project/clang/include/clang/AST/ASTContext.h
@@ -538,6 +538,9 @@ private:
/// need them (like static local vars).
llvm::MapVector<const NamedDecl *, unsigned> MangleNumbers;
llvm::MapVector<const VarDecl *, unsigned> StaticLocalNumbers;
+ /// Mapping the associated device lambda mangling number if present.
+ mutable llvm::DenseMap<const CXXRecordDecl *, unsigned>
+ DeviceLambdaManglingNumbers;
/// Mapping that stores parameterIndex values for ParmVarDecls when
/// that value exceeds the bitfield size of ParmVarDeclBits.ParameterIndex.
diff --git a/contrib/llvm-project/clang/include/clang/AST/Decl.h b/contrib/llvm-project/clang/include/clang/AST/Decl.h
index 47c282f0a63d..1c5827b9c3a4 100644
--- a/contrib/llvm-project/clang/include/clang/AST/Decl.h
+++ b/contrib/llvm-project/clang/include/clang/AST/Decl.h
@@ -1276,15 +1276,12 @@ public:
EvaluatedStmt *getEvaluatedStmt() const;
/// Attempt to evaluate the value of the initializer attached to this
- /// declaration, and produce notes explaining why it cannot be evaluated.
- /// Returns a pointer to the value if evaluation succeeded, 0 otherwise.
+ /// declaration, and produce notes explaining why it cannot be evaluated or is
+ /// not a constant expression. Returns a pointer to the value if evaluation
+ /// succeeded, 0 otherwise.
APValue *evaluateValue() const;
+ APValue *evaluateValue(SmallVectorImpl<PartialDiagnosticAt> &Notes) const;
-private:
- APValue *evaluateValueImpl(SmallVectorImpl<PartialDiagnosticAt> &Notes,
- bool IsConstantInitialization) const;
-
-public:
/// Return the already-evaluated value of this variable's
/// initializer, or NULL if the value is not yet known. Returns pointer
/// to untyped APValue if the value could not be evaluated.
diff --git a/contrib/llvm-project/clang/include/clang/AST/DeclCXX.h b/contrib/llvm-project/clang/include/clang/AST/DeclCXX.h
index e32101bb2276..89006b1cfa7f 100644
--- a/contrib/llvm-project/clang/include/clang/AST/DeclCXX.h
+++ b/contrib/llvm-project/clang/include/clang/AST/DeclCXX.h
@@ -1735,6 +1735,12 @@ public:
getLambdaData().HasKnownInternalLinkage = HasKnownInternalLinkage;
}
+ /// Set the device side mangling number.
+ void setDeviceLambdaManglingNumber(unsigned Num) const;
+
+ /// Retrieve the device side mangling number.
+ unsigned getDeviceLambdaManglingNumber() const;
+
/// Returns the inheritance model used for this record.
MSInheritanceModel getMSInheritanceModel() const;
diff --git a/contrib/llvm-project/clang/include/clang/AST/Expr.h b/contrib/llvm-project/clang/include/clang/AST/Expr.h
index a44d06967431..52f8f18af205 100644
--- a/contrib/llvm-project/clang/include/clang/AST/Expr.h
+++ b/contrib/llvm-project/clang/include/clang/AST/Expr.h
@@ -699,8 +699,7 @@ public:
/// notes will be produced if the expression is not a constant expression.
bool EvaluateAsInitializer(APValue &Result, const ASTContext &Ctx,
const VarDecl *VD,
- SmallVectorImpl<PartialDiagnosticAt> &Notes,
- bool IsConstantInitializer) const;
+ SmallVectorImpl<PartialDiagnosticAt> &Notes) const;
/// EvaluateWithSubstitution - Evaluate an expression as if from the context
/// of a call to the given function with the given arguments, inside an
diff --git a/contrib/llvm-project/clang/include/clang/AST/Mangle.h b/contrib/llvm-project/clang/include/clang/AST/Mangle.h
index 0e8d6dd53d8a..7b6495d85eb6 100644
--- a/contrib/llvm-project/clang/include/clang/AST/Mangle.h
+++ b/contrib/llvm-project/clang/include/clang/AST/Mangle.h
@@ -96,6 +96,9 @@ public:
virtual bool shouldMangleCXXName(const NamedDecl *D) = 0;
virtual bool shouldMangleStringLiteral(const StringLiteral *SL) = 0;
+ virtual bool isDeviceMangleContext() const { return false; }
+ virtual void setDeviceMangleContext(bool) {}
+
// FIXME: consider replacing raw_ostream & with something like SmallString &.
void mangleName(GlobalDecl GD, raw_ostream &);
virtual void mangleCXXName(GlobalDecl GD, raw_ostream &) = 0;
diff --git a/contrib/llvm-project/clang/include/clang/AST/MangleNumberingContext.h b/contrib/llvm-project/clang/include/clang/AST/MangleNumberingContext.h
index f1ca6a05dbaf..eb33759682d6 100644
--- a/contrib/llvm-project/clang/include/clang/AST/MangleNumberingContext.h
+++ b/contrib/llvm-project/clang/include/clang/AST/MangleNumberingContext.h
@@ -52,6 +52,11 @@ public:
/// this context.
virtual unsigned getManglingNumber(const TagDecl *TD,
unsigned MSLocalManglingNumber) = 0;
+
+ /// Retrieve the mangling number of a new lambda expression with the
+ /// given call operator within the device context. No device number is
+ /// assigned if there's no device numbering context is associated.
+ virtual unsigned getDeviceManglingNumber(const CXXMethodDecl *) { return 0; }
};
} // end namespace clang
diff --git a/contrib/llvm-project/clang/include/clang/AST/RecursiveASTVisitor.h b/contrib/llvm-project/clang/include/clang/AST/RecursiveASTVisitor.h
index 505ea700fd0e..7870cea198a7 100644
--- a/contrib/llvm-project/clang/include/clang/AST/RecursiveASTVisitor.h
+++ b/contrib/llvm-project/clang/include/clang/AST/RecursiveASTVisitor.h
@@ -186,6 +186,9 @@ public:
/// code, e.g., implicit constructors and destructors.
bool shouldVisitImplicitCode() const { return false; }
+ /// Return whether this visitor should recurse into lambda body
+ bool shouldVisitLambdaBody() const { return true; }
+
/// Return whether this visitor should traverse post-order.
bool shouldTraversePostOrder() const { return false; }
@@ -2057,6 +2060,15 @@ bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
// by clang.
(!D->isDefaulted() || getDerived().shouldVisitImplicitCode());
+ if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
+ if (const CXXRecordDecl *RD = MD->getParent()) {
+ if (RD->isLambda() &&
+ declaresSameEntity(RD->getLambdaCallOperator(), MD)) {
+ VisitBody = VisitBody && getDerived().shouldVisitLambdaBody();
+ }
+ }
+ }
+
if (VisitBody) {
TRY_TO(TraverseStmt(D->getBody())); // Function body.
}
diff --git a/contrib/llvm-project/clang/include/clang/ASTMatchers/ASTMatchers.h b/contrib/llvm-project/clang/include/clang/ASTMatchers/ASTMatchers.h
index 6f6dfab59a39..031fa4682c3a 100644
--- a/contrib/llvm-project/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/contrib/llvm-project/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -344,7 +344,7 @@ extern const internal::VariadicAllOfMatcher<Decl> decl;
/// int number = 42;
/// auto [foo, bar] = std::make_pair{42, 42};
/// \endcode
-extern const internal::VariadicAllOfMatcher<DecompositionDecl>
+extern const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl>
decompositionDecl;
/// Matches a declaration of a linkage specification.
diff --git a/contrib/llvm-project/clang/include/clang/Basic/CodeGenOptions.def b/contrib/llvm-project/clang/include/clang/Basic/CodeGenOptions.def
index 5c8af65326ed..9d53b5b923bb 100644
--- a/contrib/llvm-project/clang/include/clang/Basic/CodeGenOptions.def
+++ b/contrib/llvm-project/clang/include/clang/Basic/CodeGenOptions.def
@@ -266,6 +266,9 @@ CODEGENOPT(VectorizeLoop , 1, 0) ///< Run loop vectorizer.
CODEGENOPT(VectorizeSLP , 1, 0) ///< Run SLP vectorizer.
CODEGENOPT(ProfileSampleAccurate, 1, 0) ///< Sample profile is accurate.
+/// Treat loops as finite: language, always, never.
+ENUM_CODEGENOPT(FiniteLoops, FiniteLoopsKind, 2, FiniteLoopsKind::Language)
+
/// Attempt to use register sized accesses to bit-fields in structures, when
/// possible.
CODEGENOPT(UseRegisterSizedBitfieldAccess , 1, 0)
diff --git a/contrib/llvm-project/clang/include/clang/Basic/CodeGenOptions.h b/contrib/llvm-project/clang/include/clang/Basic/CodeGenOptions.h
index 73d41e3293c6..c550817f0f69 100644
--- a/contrib/llvm-project/clang/include/clang/Basic/CodeGenOptions.h
+++ b/contrib/llvm-project/clang/include/clang/Basic/CodeGenOptions.h
@@ -140,6 +140,12 @@ public:
All, // Keep all frame pointers.
};
+ enum FiniteLoopsKind {
+ Language, // Not specified, use language standard.
+ Always, // All loops are assumed to be finite.
+ Never, // No loop is assumed to be finite.
+ };
+
/// The code model to use (-mcmodel).
std::string CodeModel;
diff --git a/contrib/llvm-project/clang/include/clang/Driver/Options.td b/contrib/llvm-project/clang/include/clang/Driver/Options.td
index 42c5319041d0..817798926650 100644
--- a/contrib/llvm-project/clang/include/clang/Driver/Options.td
+++ b/contrib/llvm-project/clang/include/clang/Driver/Options.td
@@ -1147,7 +1147,7 @@ def fprofile_update_EQ : Joined<["-"], "fprofile-update=">,
defm pseudo_probe_for_profiling : BoolFOption<"pseudo-probe-for-profiling",
CodeGenOpts<"PseudoProbeForProfiling">, DefaultFalse,
PosFlag<SetTrue, [], "Emit">, NegFlag<SetFalse, [], "Do not emit">,
- BothFlags<[NoXarchOption, CC1Option], " pseudo probes for sample profiler">>;
+ BothFlags<[NoXarchOption, CC1Option], " pseudo probes for sample profiling">>;
def forder_file_instrumentation : Flag<["-"], "forder-file-instrumentation">,
Group<f_Group>, Flags<[CC1Option, CoreOption]>,
HelpText<"Generate instrumented code to collect order file into default.profraw file (overridden by '=' form of option or LLVM_PROFILE_FILE env var)">;
@@ -2410,6 +2410,11 @@ def fno_unroll_loops : Flag<["-"], "fno-unroll-loops">, Group<f_Group>,
defm reroll_loops : BoolFOption<"reroll-loops",
CodeGenOpts<"RerollLoops">, DefaultFalse,
PosFlag<SetTrue, [CC1Option], "Turn on loop reroller">, NegFlag<SetFalse>>;
+def ffinite_loops: Flag<["-"], "ffinite-loops">, Group<f_Group>,
+ HelpText<"Assume all loops are finite.">, Flags<[CC1Option]>;
+def fno_finite_loops: Flag<["-"], "fno-finite-loops">, Group<f_Group>,
+ HelpText<"Do not assume that any loop is finite.">, Flags<[CC1Option]>;
+
def ftrigraphs : Flag<["-"], "ftrigraphs">, Group<f_Group>,
HelpText<"Process trigraph sequences">, Flags<[CC1Option]>;
def fno_trigraphs : Flag<["-"], "fno-trigraphs">, Group<f_Group>,
diff --git a/contrib/llvm-project/clang/include/clang/Lex/VariadicMacroSupport.h b/contrib/llvm-project/clang/include/clang/Lex/VariadicMacroSupport.h
index 989e0ac703c9..119f02201fc6 100644
--- a/contrib/llvm-project/clang/include/clang/Lex/VariadicMacroSupport.h
+++ b/contrib/llvm-project/clang/include/clang/Lex/VariadicMacroSupport.h
@@ -39,17 +39,14 @@ namespace clang {
assert(Ident__VA_ARGS__->isPoisoned() && "__VA_ARGS__ should be poisoned "
"outside an ISO C/C++ variadic "
"macro definition!");
- assert(
- !Ident__VA_OPT__ ||
- (Ident__VA_OPT__->isPoisoned() && "__VA_OPT__ should be poisoned!"));
+ assert(Ident__VA_OPT__->isPoisoned() && "__VA_OPT__ should be poisoned!");
}
/// Client code should call this function just before the Preprocessor is
/// about to Lex tokens from the definition of a variadic (ISO C/C++) macro.
void enterScope() {
Ident__VA_ARGS__->setIsPoisoned(false);
- if (Ident__VA_OPT__)
- Ident__VA_OPT__->setIsPoisoned(false);
+ Ident__VA_OPT__->setIsPoisoned(false);
}
/// Client code should call this function as soon as the Preprocessor has
@@ -58,8 +55,7 @@ namespace clang {
/// (might be explicitly called, and then reinvoked via the destructor).
void exitScope() {
Ident__VA_ARGS__->setIsPoisoned(true);
- if (Ident__VA_OPT__)
- Ident__VA_OPT__->setIsPoisoned(true);
+ Ident__VA_OPT__->setIsPoisoned(true);
}
~VariadicMacroScopeGuard() { exitScope(); }
diff --git a/contrib/llvm-project/clang/include/clang/Sema/Sema.h b/contrib/llvm-project/clang/include/clang/Sema/Sema.h
index 7f7c84eb1b1d..2530a2776373 100644
--- a/contrib/llvm-project/clang/include/clang/Sema/Sema.h
+++ b/contrib/llvm-project/clang/include/clang/Sema/Sema.h
@@ -6558,7 +6558,7 @@ public:
/// Number lambda for linkage purposes if necessary.
void handleLambdaNumbering(
CXXRecordDecl *Class, CXXMethodDecl *Method,
- Optional<std::tuple<unsigned, bool, Decl *>> Mangling = None);
+ Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling = None);
/// Endow the lambda scope info with the relevant properties.
void buildLambdaScope(sema::LambdaScopeInfo *LSI,
@@ -11948,8 +11948,8 @@ public:
/// if (diagIfOpenMPDeviceCode(Loc, diag::err_vla_unsupported))
/// return ExprError();
/// // Otherwise, continue parsing as normal.
- SemaDiagnosticBuilder diagIfOpenMPDeviceCode(SourceLocation Loc,
- unsigned DiagID);
+ SemaDiagnosticBuilder
+ diagIfOpenMPDeviceCode(SourceLocation Loc, unsigned DiagID, FunctionDecl *FD);
/// Creates a SemaDiagnosticBuilder that emits the diagnostic if the current
/// context is "used as host code".
@@ -11965,17 +11965,19 @@ public:
/// return ExprError();
/// // Otherwise, continue parsing as normal.
SemaDiagnosticBuilder diagIfOpenMPHostCode(SourceLocation Loc,
- unsigned DiagID);
+ unsigned DiagID, FunctionDecl *FD);
- SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID);
+ SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID,
+ FunctionDecl *FD = nullptr);
SemaDiagnosticBuilder targetDiag(SourceLocation Loc,
- const PartialDiagnostic &PD) {
- return targetDiag(Loc, PD.getDiagID()) << PD;
+ const PartialDiagnostic &PD,
+ FunctionDecl *FD = nullptr) {
+ return targetDiag(Loc, PD.getDiagID(), FD) << PD;
}
/// Check if the expression is allowed to be used in expressions for the
/// offloading devices.
- void checkDeviceDecl(const ValueDecl *D, SourceLocation Loc);
+ void checkDeviceDecl(ValueDecl *D, SourceLocation Loc);
enum CUDAFunctionTarget {
CFT_Device,
diff --git a/contrib/llvm-project/clang/lib/AST/ASTImporter.cpp b/contrib/llvm-project/clang/lib/AST/ASTImporter.cpp
index 085c50c0667b..0d723fbbcd8c 100644
--- a/contrib/llvm-project/clang/lib/AST/ASTImporter.cpp
+++ b/contrib/llvm-project/clang/lib/AST/ASTImporter.cpp
@@ -2848,6 +2848,8 @@ ExpectedDecl ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
return CDeclOrErr.takeError();
D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), *CDeclOrErr,
DCXX->hasKnownLambdaInternalLinkage());
+ D2CXX->setDeviceLambdaManglingNumber(
+ DCXX->getDeviceLambdaManglingNumber());
} else if (DCXX->isInjectedClassName()) {
// We have to be careful to do a similar dance to the one in
// Sema::ActOnStartCXXMemberDeclarations
diff --git a/contrib/llvm-project/clang/lib/AST/CXXABI.h b/contrib/llvm-project/clang/lib/AST/CXXABI.h
index 31cb36918726..ca9424bcb7a4 100644
--- a/contrib/llvm-project/clang/lib/AST/CXXABI.h
+++ b/contrib/llvm-project/clang/lib/AST/CXXABI.h
@@ -22,8 +22,9 @@ class ASTContext;
class CXXConstructorDecl;
class DeclaratorDecl;
class Expr;
-class MemberPointerType;
+class MangleContext;
class MangleNumberingContext;
+class MemberPointerType;
/// Implements C++ ABI-specific semantic analysis functions.
class CXXABI {
@@ -75,6 +76,8 @@ public:
/// Creates an instance of a C++ ABI class.
CXXABI *CreateItaniumCXXABI(ASTContext &Ctx);
CXXABI *CreateMicrosoftCXXABI(ASTContext &Ctx);
+std::unique_ptr<MangleNumberingContext>
+createItaniumNumberingContext(MangleContext *);
}
#endif
diff --git a/contrib/llvm-project/clang/lib/AST/Decl.cpp b/contrib/llvm-project/clang/lib/AST/Decl.cpp
index feb9b0645ebc..10cfe145b3f0 100644
--- a/contrib/llvm-project/clang/lib/AST/Decl.cpp
+++ b/contrib/llvm-project/clang/lib/AST/Decl.cpp
@@ -2384,11 +2384,11 @@ EvaluatedStmt *VarDecl::getEvaluatedStmt() const {
APValue *VarDecl::evaluateValue() const {
SmallVector<PartialDiagnosticAt, 8> Notes;
- return evaluateValueImpl(Notes, hasConstantInitialization());
+ return evaluateValue(Notes);
}
-APValue *VarDecl::evaluateValueImpl(SmallVectorImpl<PartialDiagnosticAt> &Notes,
- bool IsConstantInitialization) const {
+APValue *VarDecl::evaluateValue(
+ SmallVectorImpl<PartialDiagnosticAt> &Notes) const {
EvaluatedStmt *Eval = ensureEvaluatedStmt();
const auto *Init = cast<Expr>(Eval->Value);
@@ -2407,16 +2407,8 @@ APValue *VarDecl::evaluateValueImpl(SmallVectorImpl<PartialDiagnosticAt> &Notes,
Eval->IsEvaluating = true;
- ASTContext &Ctx = getASTContext();
- bool Result = Init->EvaluateAsInitializer(Eval->Evaluated, Ctx, this, Notes,
- IsConstantInitialization);
-
- // In C++11, this isn't a constant initializer if we produced notes. In that
- // case, we can't keep the result, because it may only be correct under the
- // assumption that the initializer is a constant context.
- if (IsConstantInitialization && Ctx.getLangOpts().CPlusPlus11 &&
- !Notes.empty())
- Result = false;
+ bool Result = Init->EvaluateAsInitializer(Eval->Evaluated, getASTContext(),
+ this, Notes);
// Ensure the computed APValue is cleaned up later if evaluation succeeded,
// or that it's empty (so that there's nothing to clean up) if evaluation
@@ -2424,7 +2416,7 @@ APValue *VarDecl::evaluateValueImpl(SmallVectorImpl<PartialDiagnosticAt> &Notes,
if (!Result)
Eval->Evaluated = APValue();
else if (Eval->Evaluated.needsCleanup())
- Ctx.addDestruction(&Eval->Evaluated);
+ getASTContext().addDestruction(&Eval->Evaluated);
Eval->IsEvaluating = false;
Eval->WasEvaluated = true;
@@ -2478,14 +2470,7 @@ bool VarDecl::checkForConstantInitialization(
assert(!cast<Expr>(Eval->Value)->isValueDependent());
// Evaluate the initializer to check whether it's a constant expression.
- Eval->HasConstantInitialization =
- evaluateValueImpl(Notes, true) && Notes.empty();
-
- // If evaluation as a constant initializer failed, allow re-evaluation as a
- // non-constant initializer if we later find we want the value.
- if (!Eval->HasConstantInitialization)
- Eval->WasEvaluated = false;
-
+ Eval->HasConstantInitialization = evaluateValue(Notes) && Notes.empty();
return Eval->HasConstantInitialization;
}
diff --git a/contrib/llvm-project/clang/lib/AST/DeclCXX.cpp b/contrib/llvm-project/clang/lib/AST/DeclCXX.cpp
index 0368ada0b81c..0375f9b4432e 100644
--- a/contrib/llvm-project/clang/lib/AST/DeclCXX.cpp
+++ b/contrib/llvm-project/clang/lib/AST/DeclCXX.cpp
@@ -1593,6 +1593,20 @@ Decl *CXXRecordDecl::getLambdaContextDecl() const {
return getLambdaData().ContextDecl.get(Source);
}
+void CXXRecordDecl::setDeviceLambdaManglingNumber(unsigned Num) const {
+ assert(isLambda() && "Not a lambda closure type!");
+ if (Num)
+ getASTContext().DeviceLambdaManglingNumbers[this] = Num;
+}
+
+unsigned CXXRecordDecl::getDeviceLambdaManglingNumber() const {
+ assert(isLambda() && "Not a lambda closure type!");
+ auto I = getASTContext().DeviceLambdaManglingNumbers.find(this);
+ if (I != getASTContext().DeviceLambdaManglingNumbers.end())
+ return I->second;
+ return 0;
+}
+
static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
QualType T =
cast<CXXConversionDecl>(Conv->getUnderlyingDecl()->getAsFunction())
diff --git a/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp b/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp
index 56181bbe1166..b24025664684 100644
--- a/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp
+++ b/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp
@@ -3302,9 +3302,12 @@ static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E,
// Check that we can fold the initializer. In C++, we will have already done
// this in the cases where it matters for conformance.
- if (!VD->evaluateValue()) {
- Info.FFDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD;
+ SmallVector<PartialDiagnosticAt, 8> Notes;
+ if (!VD->evaluateValue(Notes)) {
+ Info.FFDiag(E, diag::note_constexpr_var_init_non_constant,
+ Notes.size() + 1) << VD;
NoteLValueLocation(Info, Base);
+ Info.addNotes(Notes);
return false;
}
@@ -3497,8 +3500,8 @@ static bool diagnoseMutableFields(EvalInfo &Info, const Expr *E, AccessKinds AK,
static bool lifetimeStartedInEvaluation(EvalInfo &Info,
APValue::LValueBase Base,
bool MutableSubobject = false) {
- // A temporary we created.
- if (Base.getCallIndex())
+ // A temporary or transient heap allocation we created.
+ if (Base.getCallIndex() || Base.is<DynamicAllocLValue>())
return true;
switch (Info.IsEvaluatingDecl) {
@@ -10009,6 +10012,7 @@ bool RecordExprEvaluator::VisitLambdaExpr(const LambdaExpr *E) {
auto *CaptureInitIt = E->capture_init_begin();
const LambdaCapture *CaptureIt = ClosureClass->captures_begin();
bool Success = true;
+ const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(ClosureClass);
for (const auto *Field : ClosureClass->fields()) {
assert(CaptureInitIt != E->capture_init_end());
// Get the initializer for this field
@@ -10019,8 +10023,13 @@ bool RecordExprEvaluator::VisitLambdaExpr(const LambdaExpr *E) {
if (!CurFieldInit)
return Error(E);
+ LValue Subobject = This;
+
+ if (!HandleLValueMember(Info, E, Subobject, Field, &Layout))
+ return false;
+
APValue &FieldVal = Result.getStructField(Field->getFieldIndex());
- if (!EvaluateInPlace(FieldVal, Info, This, CurFieldInit)) {
+ if (!EvaluateInPlace(FieldVal, Info, Subobject, CurFieldInit)) {
if (!Info.keepEvaluatingAfterFailure())
return false;
Success = false;
@@ -14786,11 +14795,14 @@ bool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx,
static bool EvaluateDestruction(const ASTContext &Ctx, APValue::LValueBase Base,
APValue DestroyedValue, QualType Type,
- SourceLocation Loc, Expr::EvalStatus &EStatus) {
- EvalInfo Info(Ctx, EStatus, EvalInfo::EM_ConstantExpression);
+ SourceLocation Loc, Expr::EvalStatus &EStatus,
+ bool IsConstantDestruction) {
+ EvalInfo Info(Ctx, EStatus,
+ IsConstantDestruction ? EvalInfo::EM_ConstantExpression
+ : EvalInfo::EM_ConstantFold);
Info.setEvaluatingDecl(Base, DestroyedValue,
EvalInfo::EvaluatingDeclKind::Dtor);
- Info.InConstantContext = true;
+ Info.InConstantContext = IsConstantDestruction;
LValue LVal;
LVal.set(Base);
@@ -14844,7 +14856,8 @@ bool Expr::EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx,
// If this is a class template argument, it's required to have constant
// destruction too.
if (Kind == ConstantExprKind::ClassTemplateArgument &&
- (!EvaluateDestruction(Ctx, Base, Result.Val, T, getBeginLoc(), Result) ||
+ (!EvaluateDestruction(Ctx, Base, Result.Val, T, getBeginLoc(), Result,
+ true) ||
Result.HasSideEffects)) {
// FIXME: Prefix a note to indicate that the problem is lack of constant
// destruction.
@@ -14856,8 +14869,7 @@ bool Expr::EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx,
bool Expr::EvaluateAsInitializer(APValue &Value, const ASTContext &Ctx,
const VarDecl *VD,
- SmallVectorImpl<PartialDiagnosticAt> &Notes,
- bool IsConstantInitialization) const {
+ SmallVectorImpl<PartialDiagnosticAt> &Notes) const {
assert(!isValueDependent() &&
"Expression evaluator can't be called on a dependent expression.");
@@ -14870,12 +14882,11 @@ bool Expr::EvaluateAsInitializer(APValue &Value, const ASTContext &Ctx,
Expr::EvalStatus EStatus;
EStatus.Diag = &Notes;
- EvalInfo Info(Ctx, EStatus,
- (IsConstantInitialization && Ctx.getLangOpts().CPlusPlus11)
- ? EvalInfo::EM_ConstantExpression
- : EvalInfo::EM_ConstantFold);
+ EvalInfo Info(Ctx, EStatus, VD->isConstexpr()
+ ? EvalInfo::EM_ConstantExpression
+ : EvalInfo::EM_ConstantFold);
Info.setEvaluatingDecl(VD, Value);
- Info.InConstantContext = IsConstantInitialization;
+ Info.InConstantContext = true;
SourceLocation DeclLoc = VD->getLocation();
QualType DeclTy = VD->getType();
@@ -14910,6 +14921,10 @@ bool VarDecl::evaluateDestruction(
Expr::EvalStatus EStatus;
EStatus.Diag = &Notes;
+ // Only treat the destruction as constant destruction if we formally have
+ // constant initialization (or are usable in a constant expression).
+ bool IsConstantDestruction = hasConstantInitialization();
+
// Make a copy of the value for the destructor to mutate, if we know it.
// Otherwise, treat the value as default-initialized; if the destructor works
// anyway, then the destruction is constant (and must be essentially empty).
@@ -14920,7 +14935,8 @@ bool VarDecl::evaluateDestruction(
return false;
if (!EvaluateDestruction(getASTContext(), this, std::move(DestroyedValue),
- getType(), getLocation(), EStatus) ||
+ getType(), getLocation(), EStatus,
+ IsConstantDestruction) ||
EStatus.HasSideEffects)
return false;
diff --git a/contrib/llvm-project/clang/lib/AST/ItaniumCXXABI.cpp b/contrib/llvm-project/clang/lib/AST/ItaniumCXXABI.cpp
index 069add8464ae..be10258a2d77 100644
--- a/contrib/llvm-project/clang/lib/AST/ItaniumCXXABI.cpp
+++ b/contrib/llvm-project/clang/lib/AST/ItaniumCXXABI.cpp
@@ -258,3 +258,9 @@ public:
CXXABI *clang::CreateItaniumCXXABI(ASTContext &Ctx) {
return new ItaniumCXXABI(Ctx);
}
+
+std::unique_ptr<MangleNumberingContext>
+clang::createItaniumNumberingContext(MangleContext *Mangler) {
+ return std::make_unique<ItaniumNumberingContext>(
+ cast<ItaniumMangleContext>(Mangler));
+}
diff --git a/contrib/llvm-project/clang/lib/AST/ItaniumMangle.cpp b/contrib/llvm-project/clang/lib/AST/ItaniumMangle.cpp
index 6c8d5687c64a..5cad84a96845 100644
--- a/contrib/llvm-project/clang/lib/AST/ItaniumMangle.cpp
+++ b/contrib/llvm-project/clang/lib/AST/ItaniumMangle.cpp
@@ -125,6 +125,8 @@ class ItaniumMangleContextImpl : public ItaniumMangleContext {
llvm::DenseMap<DiscriminatorKeyTy, unsigned> Discriminator;
llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier;
+ bool IsDevCtx = false;
+
public:
explicit ItaniumMangleContextImpl(ASTContext &Context,
DiagnosticsEngine &Diags)
@@ -137,6 +139,10 @@ public:
bool shouldMangleStringLiteral(const StringLiteral *) override {
return false;
}
+
+ bool isDeviceMangleContext() const override { return IsDevCtx; }
+ void setDeviceMangleContext(bool IsDev) override { IsDevCtx = IsDev; }
+
void mangleCXXName(GlobalDecl GD, raw_ostream &) override;
void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk,
raw_ostream &) override;
@@ -546,8 +552,8 @@ private:
unsigned knownArity);
void mangleCastExpression(const Expr *E, StringRef CastEncoding);
void mangleInitListElements(const InitListExpr *InitList);
- void mangleDeclRefExpr(const NamedDecl *D);
- void mangleExpression(const Expr *E, unsigned Arity = UnknownArity);
+ void mangleExpression(const Expr *E, unsigned Arity = UnknownArity,
+ bool AsTemplateArg = false);
void mangleCXXCtorType(CXXCtorType T, const CXXRecordDecl *InheritedFrom);
void mangleCXXDtorType(CXXDtorType T);
@@ -558,6 +564,7 @@ private:
unsigned NumTemplateArgs);
void mangleTemplateArgs(TemplateName TN, const TemplateArgumentList &AL);
void mangleTemplateArg(TemplateArgument A, bool NeedExactType);
+ void mangleTemplateArgExpr(const Expr *E);
void mangleValueInTemplateArg(QualType T, const APValue &V, bool TopLevel,
bool NeedExactType = false);
@@ -726,9 +733,17 @@ void CXXNameMangler::mangleFunctionEncodingBareType(const FunctionDecl *FD) {
EnableIfAttr *EIA = dyn_cast<EnableIfAttr>(*I);
if (!EIA)
continue;
- Out << 'X';
- mangleExpression(EIA->getCond());
- Out << 'E';
+ if (Context.getASTContext().getLangOpts().getClangABICompat() >
+ LangOptions::ClangABI::Ver11) {
+ mangleTemplateArgExpr(EIA->getCond());
+ } else {
+ // Prior to Clang 12, we hardcoded the X/E around enable-if's argument,
+ // even though <template-arg> should not include an X/E around
+ // <expr-primary>.
+ Out << 'X';
+ mangleExpression(EIA->getCond());
+ Out << 'E';
+ }
}
Out << 'E';
FunctionTypeDepth.pop(Saved);
@@ -1837,7 +1852,15 @@ void CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) {
// (in lexical order) with that same <lambda-sig> and context.
//
// The AST keeps track of the number for us.
- unsigned Number = Lambda->getLambdaManglingNumber();
+ //
+ // In CUDA/HIP, to ensure the consistent lamba numbering between the device-
+ // and host-side compilations, an extra device mangle context may be created
+ // if the host-side CXX ABI has different numbering for lambda. In such case,
+ // if the mangle context is that device-side one, use the device-side lambda
+ // mangling number for this lambda.
+ unsigned Number = Context.isDeviceMangleContext()
+ ? Lambda->getDeviceLambdaManglingNumber()
+ : Lambda->getLambdaManglingNumber();
assert(Number > 0 && "Lambda should be mangled as an unnamed class");
if (Number > 1)
mangleNumber(Number - 2);
@@ -3528,8 +3551,8 @@ void CXXNameMangler::mangleType(const DependentSizedMatrixType *T) {
Out << "u" << VendorQualifier.size() << VendorQualifier;
Out << "I";
- mangleTemplateArg(T->getRowExpr(), false);
- mangleTemplateArg(T->getColumnExpr(), false);
+ mangleTemplateArgExpr(T->getRowExpr());
+ mangleTemplateArgExpr(T->getColumnExpr());
mangleType(T->getElementType());
Out << "E";
}
@@ -3871,33 +3894,8 @@ void CXXNameMangler::mangleInitListElements(const InitListExpr *InitList) {
mangleExpression(InitList->getInit(i));
}
-void CXXNameMangler::mangleDeclRefExpr(const NamedDecl *D) {
- switch (D->getKind()) {
- default:
- // <expr-primary> ::= L <mangled-name> E # external name
- Out << 'L';
- mangle(D);
- Out << 'E';
- break;
-
- case Decl::ParmVar:
- mangleFunctionParam(cast<ParmVarDecl>(D));
- break;
-
- case Decl::EnumConstant: {
- const EnumConstantDecl *ED = cast<EnumConstantDecl>(D);
- mangleIntegerLiteral(ED->getType(), ED->getInitVal());
- break;
- }
-
- case Decl::NonTypeTemplateParm:
- const NonTypeTemplateParmDecl *PD = cast<NonTypeTemplateParmDecl>(D);
- mangleTemplateParameter(PD->getDepth(), PD->getIndex());
- break;
- }
-}
-
-void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
+void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
+ bool AsTemplateArg) {
// <expression> ::= <unary operator-name> <expression>
// ::= <binary operator-name> <expression> <expression>
// ::= <trinary operator-name> <expression> <expression> <expression>
@@ -3911,18 +3909,64 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
// ::= at <type> # alignof (a type)
// ::= <template-param>
// ::= <function-param>
+ // ::= fpT # 'this' expression (part of <function-param>)
// ::= sr <type> <unqualified-name> # dependent name
// ::= sr <type> <unqualified-name> <template-args> # dependent template-id
// ::= ds <expression> <expression> # expr.*expr
// ::= sZ <template-param> # size of a parameter pack
// ::= sZ <function-param> # size of a function parameter pack
+ // ::= u <source-name> <template-arg>* E # vendor extended expression
// ::= <expr-primary>
// <expr-primary> ::= L <type> <value number> E # integer literal
- // ::= L <type <value float> E # floating literal
+ // ::= L <type> <value float> E # floating literal
+ // ::= L <type> <string type> E # string literal
+ // ::= L <nullptr type> E # nullptr literal "LDnE"
+ // ::= L <pointer type> 0 E # null pointer template argument
+ // ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C99); not used by clang
*** 21874 LINES SKIPPED ***