diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 20:45:01 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 20:45:01 +0000 |
commit | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (patch) | |
tree | 4adf86a776049cbf7f69a1929c4babcbbef925eb /llvm/lib/IR/DebugInfoMetadata.cpp | |
parent | 7cc9cf2bf09f069cb2dd947ead05d0b54301fb71 (diff) |
Notes
Diffstat (limited to 'llvm/lib/IR/DebugInfoMetadata.cpp')
-rw-r--r-- | llvm/lib/IR/DebugInfoMetadata.cpp | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/llvm/lib/IR/DebugInfoMetadata.cpp b/llvm/lib/IR/DebugInfoMetadata.cpp index 94ec3abfa7a2..d3ecd9b0e03d 100644 --- a/llvm/lib/IR/DebugInfoMetadata.cpp +++ b/llvm/lib/IR/DebugInfoMetadata.cpp @@ -23,6 +23,9 @@ using namespace llvm; +const DIExpression::FragmentInfo DebugVariable::DefaultFragment = { + std::numeric_limits<uint64_t>::max(), std::numeric_limits<uint64_t>::min()}; + DILocation::DILocation(LLVMContext &C, StorageType Storage, unsigned Line, unsigned Column, ArrayRef<Metadata *> MDs, bool ImplicitCode) @@ -712,12 +715,12 @@ DICommonBlock *DICommonBlock::getImpl(LLVMContext &Context, Metadata *Scope, DIModule *DIModule::getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name, MDString *ConfigurationMacros, - MDString *IncludePath, MDString *ISysRoot, + MDString *IncludePath, MDString *SysRoot, StorageType Storage, bool ShouldCreate) { assert(isCanonical(Name) && "Expected canonical MDString"); DEFINE_GETIMPL_LOOKUP( - DIModule, (Scope, Name, ConfigurationMacros, IncludePath, ISysRoot)); - Metadata *Ops[] = {Scope, Name, ConfigurationMacros, IncludePath, ISysRoot}; + DIModule, (Scope, Name, ConfigurationMacros, IncludePath, SysRoot)); + Metadata *Ops[] = {Scope, Name, ConfigurationMacros, IncludePath, SysRoot}; DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(DIModule, Ops); } @@ -929,17 +932,22 @@ bool DIExpression::isValid() const { } bool DIExpression::isImplicit() const { - unsigned N = getNumElements(); - if (isValid() && N > 0) { - switch (getElement(N-1)) { - case dwarf::DW_OP_stack_value: - case dwarf::DW_OP_LLVM_tag_offset: - return true; - case dwarf::DW_OP_LLVM_fragment: - return N > 1 && getElement(N-2) == dwarf::DW_OP_stack_value; - default: break; + if (!isValid()) + return false; + + if (getNumElements() == 0) + return false; + + for (const auto &It : expr_ops()) { + switch (It.getOp()) { + default: + break; + case dwarf::DW_OP_stack_value: + case dwarf::DW_OP_LLVM_tag_offset: + return true; } } + return false; } @@ -1013,6 +1021,8 @@ bool DIExpression::extractIfOffset(int64_t &Offset) const { const DIExpression *DIExpression::extractAddressClass(const DIExpression *Expr, unsigned &AddrClass) { + // FIXME: This seems fragile. Nothing that verifies that these elements + // actually map to ops and not operands. const unsigned PatternSize = 4; if (Expr->Elements.size() >= PatternSize && Expr->Elements[PatternSize - 4] == dwarf::DW_OP_constu && @@ -1141,10 +1151,14 @@ Optional<DIExpression *> DIExpression::createFragmentExpression( for (auto Op : Expr->expr_ops()) { switch (Op.getOp()) { default: break; + case dwarf::DW_OP_shr: + case dwarf::DW_OP_shra: + case dwarf::DW_OP_shl: case dwarf::DW_OP_plus: + case dwarf::DW_OP_plus_uconst: case dwarf::DW_OP_minus: - // We can't safely split arithmetic into multiple fragments because we - // can't express carry-over between fragments. + // We can't safely split arithmetic or shift operations into multiple + // fragments because we can't express carry-over between fragments. // // FIXME: We *could* preserve the lowest fragment of a constant offset // operation if the offset fits into SizeInBits. @@ -1182,6 +1196,20 @@ bool DIExpression::isConstant() const { return true; } +DIExpression::ExtOps DIExpression::getExtOps(unsigned FromSize, unsigned ToSize, + bool Signed) { + dwarf::TypeKind TK = Signed ? dwarf::DW_ATE_signed : dwarf::DW_ATE_unsigned; + DIExpression::ExtOps Ops{{dwarf::DW_OP_LLVM_convert, FromSize, TK, + dwarf::DW_OP_LLVM_convert, ToSize, TK}}; + return Ops; +} + +DIExpression *DIExpression::appendExt(const DIExpression *Expr, + unsigned FromSize, unsigned ToSize, + bool Signed) { + return appendToStack(Expr, getExtOps(FromSize, ToSize, Signed)); +} + DIGlobalVariableExpression * DIGlobalVariableExpression::getImpl(LLVMContext &Context, Metadata *Variable, Metadata *Expression, StorageType Storage, |