git: d409305fa383 - main - Merge llvm-project 12.0.0 release
Dimitry Andric
dim at FreeBSD.org
Sun Jun 13 20:02:55 UTC 2021
The branch main has been updated by dim:
URL: https://cgit.FreeBSD.org/src/commit/?id=d409305fa3838fb39b38c26fc085fb729b8766d5
commit d409305fa3838fb39b38c26fc085fb729b8766d5
Merge: e8d8bef961a5 b4125f7d51da
Author: Dimitry Andric <dim at FreeBSD.org>
AuthorDate: 2021-04-26 11:23:24 +0000
Commit: Dimitry Andric <dim at FreeBSD.org>
CommitDate: 2021-06-13 20:01:15 +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
.../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 --cc contrib/llvm-project/clang/include/clang/AST/Decl.h
index 47c282f0a63d,47c282f0a63d..1c5827b9c3a4
--- a/contrib/llvm-project/clang/include/clang/AST/Decl.h
+++ b/contrib/llvm-project/clang/include/clang/AST/Decl.h
@@@ -1276,15 -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 --cc contrib/llvm-project/clang/include/clang/AST/Expr.h
index a44d06967431,a44d06967431..52f8f18af205
--- a/contrib/llvm-project/clang/include/clang/AST/Expr.h
+++ b/contrib/llvm-project/clang/include/clang/AST/Expr.h
@@@ -699,8 -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 --cc contrib/llvm-project/clang/lib/AST/Decl.cpp
index feb9b0645ebc,feb9b0645ebc..10cfe145b3f0
--- a/contrib/llvm-project/clang/lib/AST/Decl.cpp
+++ b/contrib/llvm-project/clang/lib/AST/Decl.cpp
@@@ -2384,11 -2384,11 +2384,11 @@@ EvaluatedStmt *VarDecl::getEvaluatedStm
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,16 +2407,8 @@@
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 -2424,7 +2416,7 @@@
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 -2478,14 +2470,7 @@@ bool VarDecl::checkForConstantInitializ
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 --cc contrib/llvm-project/clang/lib/AST/ExprConstant.cpp
index 56181bbe1166,1bdad771a923..b24025664684
--- a/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp
+++ b/contrib/llvm-project/clang/lib/AST/ExprConstant.cpp
@@@ -3302,9 -3302,9 +3302,12 @@@ static bool evaluateVarDeclInit(EvalInf
// 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;
}
@@@ -14856,8 -14866,8 +14869,7 @@@ bool Expr::EvaluateAsConstantExpr(EvalR
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 -14880,12 +14882,11 @@@
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();
diff --cc contrib/llvm-project/clang/lib/CodeGen/CGExprConstant.cpp
index 497f9c04c9f8,497f9c04c9f8..decb8129e644
--- a/contrib/llvm-project/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/contrib/llvm-project/clang/lib/CodeGen/CGExprConstant.cpp
@@@ -1622,8 -1622,8 +1622,8 @@@ llvm::Constant *ConstantEmitter::tryEmi
if (CD->isTrivial() && CD->isDefaultConstructor())
return CGM.EmitNullConstant(D.getType());
}
++ InConstantContext = true;
}
-- InConstantContext = D.hasConstantInitialization();
QualType destType = D.getType();
diff --cc contrib/llvm-project/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 57cc2d60e2af,83dfa0780547..caa5291ff6fa
--- a/contrib/llvm-project/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/contrib/llvm-project/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@@ -409,6 -409,6 +409,7 @@@ class InlinedOpenMPRegionRAII
llvm::DenseMap<const VarDecl *, FieldDecl *> LambdaCaptureFields;
FieldDecl *LambdaThisCaptureField = nullptr;
const CodeGen::CGBlockInfo *BlockInfo = nullptr;
++ bool NoInheritance = false;
public:
/// Constructs region for combined constructs.
@@@ -416,16 -416,16 +417,19 @@@
/// a list of functions used for code generation of implicitly inlined
/// regions.
InlinedOpenMPRegionRAII(CodeGenFunction &CGF, const RegionCodeGenTy &CodeGen,
-- OpenMPDirectiveKind Kind, bool HasCancel)
-- : CGF(CGF) {
++ OpenMPDirectiveKind Kind, bool HasCancel,
++ bool NoInheritance = true)
++ : CGF(CGF), NoInheritance(NoInheritance) {
// Start emission for the construct.
CGF.CapturedStmtInfo = new CGOpenMPInlinedRegionInfo(
CGF.CapturedStmtInfo, CodeGen, Kind, HasCancel);
-- std::swap(CGF.LambdaCaptureFields, LambdaCaptureFields);
-- LambdaThisCaptureField = CGF.LambdaThisCaptureField;
-- CGF.LambdaThisCaptureField = nullptr;
-- BlockInfo = CGF.BlockInfo;
-- CGF.BlockInfo = nullptr;
++ if (NoInheritance) {
++ std::swap(CGF.LambdaCaptureFields, LambdaCaptureFields);
++ LambdaThisCaptureField = CGF.LambdaThisCaptureField;
++ CGF.LambdaThisCaptureField = nullptr;
++ BlockInfo = CGF.BlockInfo;
++ CGF.BlockInfo = nullptr;
++ }
}
~InlinedOpenMPRegionRAII() {
@@@ -434,9 -434,9 +438,11 @@@
cast<CGOpenMPInlinedRegionInfo>(CGF.CapturedStmtInfo)->getOldCSI();
delete CGF.CapturedStmtInfo;
CGF.CapturedStmtInfo = OldCSI;
-- std::swap(CGF.LambdaCaptureFields, LambdaCaptureFields);
-- CGF.LambdaThisCaptureField = LambdaThisCaptureField;
-- CGF.BlockInfo = BlockInfo;
++ if (NoInheritance) {
++ std::swap(CGF.LambdaCaptureFields, LambdaCaptureFields);
++ CGF.LambdaThisCaptureField = LambdaThisCaptureField;
++ CGF.BlockInfo = BlockInfo;
++ }
}
};
@@@ -3853,7 -3853,7 +3859,7 @@@ static void emitPrivatesInit(CodeGenFun
// Processing for implicitly captured variables.
InlinedOpenMPRegionRAII Region(
CGF, [](CodeGenFunction &, PrePostActionTy &) {}, OMPD_unknown,
-- /*HasCancel=*/false);
++ /*HasCancel=*/false, /*NoInheritance=*/true);
SharedRefLValue = CGF.EmitLValue(Pair.second.OriginalRef);
}
if (Type->isArrayType()) {
@@@ -6214,7 -6214,7 +6220,9 @@@ void CGOpenMPRuntime::emitInlinedDirect
bool HasCancel) {
if (!CGF.HaveInsertPoint())
return;
-- InlinedOpenMPRegionRAII Region(CGF, CodeGen, InnerKind, HasCancel);
++ InlinedOpenMPRegionRAII Region(CGF, CodeGen, InnerKind, HasCancel,
++ InnerKind != OMPD_critical &&
++ InnerKind != OMPD_master);
CGF.CapturedStmtInfo->EmitBody(CGF, /*S=*/nullptr);
}
diff --cc contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp
index 493e14cb904b,493e14cb904b..070fda664678
--- a/contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp
+++ b/contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp
@@@ -522,7 -522,7 +522,8 @@@ NativeProcessProtocol::GetSoftwareBreak
static const uint8_t g_mips64_opcode[] = {0x00, 0x00, 0x00, 0x0d};
static const uint8_t g_mips64el_opcode[] = {0x0d, 0x00, 0x00, 0x00};
static const uint8_t g_s390x_opcode[] = {0x00, 0x01};
-- static const uint8_t g_ppc64le_opcode[] = {0x08, 0x00, 0xe0, 0x7f}; // trap
++ static const uint8_t g_ppc_opcode[] = {0x7f, 0xe0, 0x00, 0x08}; // trap
++ static const uint8_t g_ppcle_opcode[] = {0x08, 0x00, 0xe0, 0x7f}; // trap
switch (GetArchitecture().GetMachine()) {
case llvm::Triple::aarch64:
@@@ -544,8 -544,8 +545,12 @@@
case llvm::Triple::systemz:
return llvm::makeArrayRef(g_s390x_opcode);
++ case llvm::Triple::ppc:
++ case llvm::Triple::ppc64:
++ return llvm::makeArrayRef(g_ppc_opcode);
++
case llvm::Triple::ppc64le:
-- return llvm::makeArrayRef(g_ppc64le_opcode);
++ return llvm::makeArrayRef(g_ppcle_opcode);
default:
return llvm::createStringError(llvm::inconvertibleErrorCode(),
@@@ -568,6 -568,6 +573,8 @@@ size_t NativeProcessProtocol::GetSoftwa
case llvm::Triple::mips64el:
case llvm::Triple::mips:
case llvm::Triple::mipsel:
++ case llvm::Triple::ppc:
++ case llvm::Triple::ppc64:
case llvm::Triple::ppc64le:
// On these architectures the PC doesn't get updated for breakpoint hits.
return 0;
diff --cc contrib/llvm-project/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
index f4d44eb7e745,f4d44eb7e745..6b39a83fd668
--- a/contrib/llvm-project/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
+++ b/contrib/llvm-project/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
@@@ -214,55 -214,55 +214,9 @@@ void PlatformFreeBSD::GetStatus(Stream
#endif
}
--size_t
--PlatformFreeBSD::GetSoftwareBreakpointTrapOpcode(Target &target,
-- BreakpointSite *bp_site) {
-- switch (target.GetArchitecture().GetMachine()) {
-- case llvm::Triple::arm: {
-- lldb::BreakpointLocationSP bp_loc_sp(bp_site->GetOwnerAtIndex(0));
-- AddressClass addr_class = AddressClass::eUnknown;
--
-- if (bp_loc_sp) {
-- addr_class = bp_loc_sp->GetAddress().GetAddressClass();
-- if (addr_class == AddressClass::eUnknown &&
-- (bp_loc_sp->GetAddress().GetFileAddress() & 1))
-- addr_class = AddressClass::eCodeAlternateISA;
-- }
--
-- if (addr_class == AddressClass::eCodeAlternateISA) {
-- // TODO: Enable when FreeBSD supports thumb breakpoints.
-- // FreeBSD kernel as of 10.x, does not support thumb breakpoints
-- return 0;
-- }
--
-- static const uint8_t g_arm_breakpoint_opcode[] = {0xFE, 0xDE, 0xFF, 0xE7};
-- size_t trap_opcode_size = sizeof(g_arm_breakpoint_opcode);
-- assert(bp_site);
-- if (bp_site->SetTrapOpcode(g_arm_breakpoint_opcode, trap_opcode_size))
-- return trap_opcode_size;
-- }
-- LLVM_FALLTHROUGH;
-- default:
-- return Platform::GetSoftwareBreakpointTrapOpcode(target, bp_site);
-- }
--}
--
bool PlatformFreeBSD::CanDebugProcess() {
if (IsHost()) {
-- llvm::Triple host_triple{llvm::sys::getProcessTriple()};
-- bool use_legacy_plugin;
--
-- switch (host_triple.getArch()) {
-- case llvm::Triple::x86:
-- case llvm::Triple::x86_64:
-- // FreeBSDRemote plugin supports x86 only at the moment
-- use_legacy_plugin = !!getenv("FREEBSD_LEGACY_PLUGIN");
-- break;
-- default:
-- use_legacy_plugin = true;
-- }
--
-- return !use_legacy_plugin;
++ return true;
} else {
// If we're connected, we can debug.
return IsConnected();
diff --cc contrib/llvm-project/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h
index c198ea18638d,c198ea18638d..4fd10fb1be73
--- a/contrib/llvm-project/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h
+++ b/contrib/llvm-project/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h
@@@ -44,9 -44,9 +44,6 @@@ public
bool CanDebugProcess() override;
-- size_t GetSoftwareBreakpointTrapOpcode(Target &target,
-- BreakpointSite *bp_site) override;
--
void CalculateTrapHandlerSymbolNames() override;
MmapArgList GetMmapArgumentList(const ArchSpec &arch, lldb::addr_t addr,
diff --cc contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
index 163093c2ab1f,163093c2ab1f..5961ff4439db
--- a/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
+++ b/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
@@@ -213,8 -213,8 +213,9 @@@ void NativeProcessFreeBSD::MonitorSIGTR
llvm::Error error = t.CopyWatchpointsFrom(
static_cast<NativeThreadFreeBSD &>(*GetCurrentThread()));
if (error) {
-- LLDB_LOG(log, "failed to copy watchpoints to new thread {0}: {1}",
-- info.pl_lwpid, llvm::toString(std::move(error)));
++ LLDB_LOG_ERROR(log, std::move(error),
++ "failed to copy watchpoints to new thread {1}: {0}",
++ info.pl_lwpid);
SetState(StateType::eStateInvalid);
return;
}
@@@ -264,19 -264,19 +265,35 @@@
switch (info.pl_siginfo.si_code) {
case TRAP_BRKPT:
++ LLDB_LOG(log, "SIGTRAP/TRAP_BRKPT: si_addr: {0}",
++ info.pl_siginfo.si_addr);
++
if (thread) {
-- thread->SetStoppedByBreakpoint();
++ auto thread_info =
++ m_threads_stepping_with_breakpoint.find(thread->GetID());
++ if (thread_info != m_threads_stepping_with_breakpoint.end()) {
++ thread->SetStoppedByTrace();
++ Status brkpt_error = RemoveBreakpoint(thread_info->second);
++ if (brkpt_error.Fail())
++ LLDB_LOG(log, "pid = {0} remove stepping breakpoint: {1}",
++ thread_info->first, brkpt_error);
++ m_threads_stepping_with_breakpoint.erase(thread_info);
++ } else
++ thread->SetStoppedByBreakpoint();
FixupBreakpointPCAsNeeded(*thread);
}
SetState(StateType::eStateStopped, true);
return;
case TRAP_TRACE:
++ LLDB_LOG(log, "SIGTRAP/TRAP_TRACE: si_addr: {0}",
++ info.pl_siginfo.si_addr);
++
if (thread) {
auto ®ctx = static_cast<NativeRegisterContextFreeBSD &>(
thread->GetRegisterContext());
uint32_t wp_index = LLDB_INVALID_INDEX32;
-- Status error =
-- regctx.GetWatchpointHitIndex(wp_index, LLDB_INVALID_ADDRESS);
++ Status error = regctx.GetWatchpointHitIndex(
++ wp_index, reinterpret_cast<uintptr_t>(info.pl_siginfo.si_addr));
if (error.Fail())
LLDB_LOG(log,
"received error while checking for watchpoint hits, pid = "
@@@ -354,6 -354,6 +371,27 @@@ Status NativeProcessFreeBSD::PtraceWrap
return error;
}
++llvm::Expected<llvm::ArrayRef<uint8_t>>
++NativeProcessFreeBSD::GetSoftwareBreakpointTrapOpcode(size_t size_hint) {
++ static const uint8_t g_arm_opcode[] = {0xfe, 0xde, 0xff, 0xe7};
++ static const uint8_t g_thumb_opcode[] = {0x01, 0xde};
++
++ switch (GetArchitecture().GetMachine()) {
++ case llvm::Triple::arm:
++ switch (size_hint) {
++ case 2:
++ return llvm::makeArrayRef(g_thumb_opcode);
++ case 4:
++ return llvm::makeArrayRef(g_arm_opcode);
++ default:
++ return llvm::createStringError(llvm::inconvertibleErrorCode(),
++ "Unrecognised trap opcode size hint!");
++ }
++ default:
++ return NativeProcessProtocol::GetSoftwareBreakpointTrapOpcode(size_hint);
++ }
++}
++
Status NativeProcessFreeBSD::Resume(const ResumeActionList &resume_actions) {
Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS));
LLDB_LOG(log, "pid {0}", GetID());
@@@ -623,9 -623,9 +661,8 @@@ size_t NativeProcessFreeBSD::UpdateThre
Status NativeProcessFreeBSD::SetBreakpoint(lldb::addr_t addr, uint32_t size,
bool hardware) {
if (hardware)
-- return Status("NativeProcessFreeBSD does not support hardware breakpoints");
-- else
-- return SetSoftwareBreakpoint(addr, size);
++ return SetHardwareBreakpoint(addr, size);
++ return SetSoftwareBreakpoint(addr, size);
}
Status NativeProcessFreeBSD::GetLoadedModuleFileSpec(const char *module_path,
@@@ -878,3 -878,3 +915,7 @@@ Status NativeProcessFreeBSD::Reinitiali
return error;
}
++
++bool NativeProcessFreeBSD::SupportHardwareSingleStepping() const {
++ return !m_arch.IsMIPS();
++}
diff --cc contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h
index 3c7a9400f9c4,3c7a9400f9c4..ceffc370ca33
--- a/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h
+++ b/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h
@@@ -10,6 -10,6 +10,8 @@@
#define liblldb_NativeProcessFreeBSD_H_
#include "Plugins/Process/POSIX/NativeProcessELF.h"
++#include "Plugins/Process/Utility/NativeProcessSoftwareSingleStep.h"
++
#include "lldb/Target/MemoryRegionInfo.h"
#include "lldb/Utility/ArchSpec.h"
#include "lldb/Utility/FileSpec.h"
@@@ -25,7 -25,7 +27,8 @@@ namespace process_freebsd
/// for debugging.
///
/// Changes in the inferior process state are broadcasted.
--class NativeProcessFreeBSD : public NativeProcessELF {
++class NativeProcessFreeBSD : public NativeProcessELF,
++ private NativeProcessSoftwareSingleStep {
public:
class Factory : public NativeProcessProtocol::Factory {
public:
@@@ -84,6 -84,6 +87,12 @@@
static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr,
int data = 0, int *result = nullptr);
++ bool SupportHardwareSingleStepping() const;
++
++protected:
++ llvm::Expected<llvm::ArrayRef<uint8_t>>
++ GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;
++
private:
MainLoop::SignalHandleUP m_sigchld_handle;
ArchSpec m_arch;
diff --cc contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD.cpp
index ac3cc4fe788a,ac3cc4fe788a..3d744f773a26
--- a/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD.cpp
+++ b/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD.cpp
@@@ -8,7 -8,7 +8,7 @@@
#include "NativeRegisterContextFreeBSD.h"
--#include "Plugins/Process/FreeBSDRemote/NativeProcessFreeBSD.h"
++#include "Plugins/Process/FreeBSD/NativeProcessFreeBSD.h"
#include "lldb/Host/common/NativeProcessProtocol.h"
diff --cc contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD_arm.cpp
index 000000000000,000000000000..c4ee3773eaeb
new file mode 100644
--- /dev/null
+++ b/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD_arm.cpp
@@@ -1,0 -1,0 +1,202 @@@
++//===-- NativeRegisterContextFreeBSD_arm.cpp ------------------------------===//
++//
++// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
++// See https://llvm.org/LICENSE.txt for license information.
++// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
++//
++//===----------------------------------------------------------------------===//
++
++#if defined(__arm__)
++
++#include "NativeRegisterContextFreeBSD_arm.h"
++
++#include "lldb/Utility/DataBufferHeap.h"
++#include "lldb/Utility/RegisterValue.h"
++#include "lldb/Utility/Status.h"
++
++#include "Plugins/Process/FreeBSD/NativeProcessFreeBSD.h"
++#include "Plugins/Process/Utility/RegisterInfoPOSIX_arm.h"
++
++// clang-format off
++#include <sys/param.h>
++#include <sys/ptrace.h>
++#include <sys/types.h>
++// clang-format on
++
++using namespace lldb;
++using namespace lldb_private;
++using namespace lldb_private::process_freebsd;
++
++NativeRegisterContextFreeBSD *
++NativeRegisterContextFreeBSD::CreateHostNativeRegisterContextFreeBSD(
++ const ArchSpec &target_arch, NativeThreadProtocol &native_thread) {
++ return new NativeRegisterContextFreeBSD_arm(target_arch, native_thread);
++}
++
++NativeRegisterContextFreeBSD_arm::NativeRegisterContextFreeBSD_arm(
++ const ArchSpec &target_arch, NativeThreadProtocol &native_thread)
++ : NativeRegisterContextRegisterInfo(
++ native_thread, new RegisterInfoPOSIX_arm(target_arch)) {}
++
++RegisterInfoPOSIX_arm &
++NativeRegisterContextFreeBSD_arm::GetRegisterInfo() const {
++ return static_cast<RegisterInfoPOSIX_arm &>(*m_register_info_interface_up);
++}
++
++uint32_t NativeRegisterContextFreeBSD_arm::GetRegisterSetCount() const {
++ return GetRegisterInfo().GetRegisterSetCount();
++}
++
++const RegisterSet *
++NativeRegisterContextFreeBSD_arm::GetRegisterSet(uint32_t set_index) const {
++ return GetRegisterInfo().GetRegisterSet(set_index);
++}
++
++uint32_t NativeRegisterContextFreeBSD_arm::GetUserRegisterCount() const {
++ uint32_t count = 0;
++ for (uint32_t set_index = 0; set_index < GetRegisterSetCount(); ++set_index)
++ count += GetRegisterSet(set_index)->num_registers;
++ return count;
++}
++
++Status NativeRegisterContextFreeBSD_arm::ReadRegisterSet(uint32_t set) {
++ switch (set) {
++ case RegisterInfoPOSIX_arm::GPRegSet:
++ return NativeProcessFreeBSD::PtraceWrapper(PT_GETREGS, m_thread.GetID(),
++ m_reg_data.data());
++ case RegisterInfoPOSIX_arm::FPRegSet:
++ return NativeProcessFreeBSD::PtraceWrapper(
++ PT_GETVFPREGS, m_thread.GetID(),
++ m_reg_data.data() + sizeof(RegisterInfoPOSIX_arm::GPR));
++ }
++ llvm_unreachable("NativeRegisterContextFreeBSD_arm::ReadRegisterSet");
++}
++
++Status NativeRegisterContextFreeBSD_arm::WriteRegisterSet(uint32_t set) {
++ switch (set) {
++ case RegisterInfoPOSIX_arm::GPRegSet:
++ return NativeProcessFreeBSD::PtraceWrapper(PT_SETREGS, m_thread.GetID(),
++ m_reg_data.data());
++ case RegisterInfoPOSIX_arm::FPRegSet:
++ return NativeProcessFreeBSD::PtraceWrapper(
++ PT_SETVFPREGS, m_thread.GetID(),
++ m_reg_data.data() + sizeof(RegisterInfoPOSIX_arm::GPR));
++ }
++ llvm_unreachable("NativeRegisterContextFreeBSD_arm::WriteRegisterSet");
++}
++
++Status
++NativeRegisterContextFreeBSD_arm::ReadRegister(const RegisterInfo *reg_info,
++ RegisterValue ®_value) {
++ Status error;
++
++ if (!reg_info) {
++ error.SetErrorString("reg_info NULL");
++ return error;
++ }
++
++ const uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
++
++ if (reg == LLDB_INVALID_REGNUM)
++ return Status("no lldb regnum for %s", reg_info && reg_info->name
++ ? reg_info->name
++ : "<unknown register>");
++
++ uint32_t set = GetRegisterInfo().GetRegisterSetFromRegisterIndex(reg);
++ error = ReadRegisterSet(set);
++ if (error.Fail())
++ return error;
++
++ assert(reg_info->byte_offset + reg_info->byte_size <= m_reg_data.size());
++ reg_value.SetBytes(m_reg_data.data() + reg_info->byte_offset,
++ reg_info->byte_size, endian::InlHostByteOrder());
++ return error;
++}
++
++Status NativeRegisterContextFreeBSD_arm::WriteRegister(
++ const RegisterInfo *reg_info, const RegisterValue ®_value) {
++ Status error;
++
++ if (!reg_info)
++ return Status("reg_info NULL");
++
++ const uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
++
++ if (reg == LLDB_INVALID_REGNUM)
++ return Status("no lldb regnum for %s", reg_info && reg_info->name
++ ? reg_info->name
++ : "<unknown register>");
++
++ uint32_t set = GetRegisterInfo().GetRegisterSetFromRegisterIndex(reg);
++ error = ReadRegisterSet(set);
++ if (error.Fail())
++ return error;
++
++ assert(reg_info->byte_offset + reg_info->byte_size <= m_reg_data.size());
++ ::memcpy(m_reg_data.data() + reg_info->byte_offset, reg_value.GetBytes(),
++ reg_info->byte_size);
++
++ return WriteRegisterSet(set);
++}
++
++Status NativeRegisterContextFreeBSD_arm::ReadAllRegisterValues(
++ lldb::DataBufferSP &data_sp) {
++ Status error;
++
++ error = ReadRegisterSet(RegisterInfoPOSIX_arm::GPRegSet);
++ if (error.Fail())
++ return error;
++
++ error = ReadRegisterSet(RegisterInfoPOSIX_arm::FPRegSet);
++ if (error.Fail())
++ return error;
++
++ data_sp.reset(new DataBufferHeap(m_reg_data.size(), 0));
++ uint8_t *dst = data_sp->GetBytes();
++ ::memcpy(dst, m_reg_data.data(), m_reg_data.size());
++
++ return error;
++}
++
++Status NativeRegisterContextFreeBSD_arm::WriteAllRegisterValues(
++ const lldb::DataBufferSP &data_sp) {
++ Status error;
++
++ if (!data_sp) {
++ error.SetErrorStringWithFormat(
++ "NativeRegisterContextFreeBSD_arm::%s invalid data_sp provided",
++ __FUNCTION__);
++ return error;
++ }
++
++ if (data_sp->GetByteSize() != m_reg_data.size()) {
++ error.SetErrorStringWithFormat(
++ "NativeRegisterContextFreeBSD_arm::%s data_sp contained mismatched "
++ "data size, expected %" PRIu64 ", actual %" PRIu64,
++ __FUNCTION__, m_reg_data.size(), data_sp->GetByteSize());
++ return error;
++ }
++
++ uint8_t *src = data_sp->GetBytes();
++ if (src == nullptr) {
++ error.SetErrorStringWithFormat("NativeRegisterContextFreeBSD_arm::%s "
++ "DataBuffer::GetBytes() returned a null "
++ "pointer",
++ __FUNCTION__);
++ return error;
++ }
++ ::memcpy(m_reg_data.data(), src, m_reg_data.size());
++
++ error = WriteRegisterSet(RegisterInfoPOSIX_arm::GPRegSet);
++ if (error.Fail())
++ return error;
*** 31327 LINES SKIPPED ***
More information about the dev-commits-src-main
mailing list