aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/Local.cpp
diff options
context:
space:
mode:
authorAmy Huang <akhuang@google.com>2021-04-12 20:02:41 -0700
committerAmy Huang <akhuang@google.com>2021-04-12 20:10:17 -0700
commitdad5caa59e6b2bde8d6cf5b64a972c393c526c82 (patch)
tree1c11725f96e0fec03c1646caeabcc09c888ba593 /llvm/lib/Transforms/Utils/Local.cpp
parentc362179b0a125c164cd7f256977d95fc15ba5edf (diff)
downloadllvm-dad5caa59e6b2bde8d6cf5b64a972c393c526c82.zip
llvm-dad5caa59e6b2bde8d6cf5b64a972c393c526c82.tar.gz
llvm-dad5caa59e6b2bde8d6cf5b64a972c393c526c82.tar.bz2
Revert "Reapply "[DebugInfo] Use variadic debug values to salvage BinOps and GEP instrs with non-const operands""
This change causes an assert / segmentation fault in LTO builds. This reverts commit f2e4f3eff3c9135d92840016f8ed4540cdd1313b.
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/Local.cpp98
1 files changed, 30 insertions, 68 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index 4730e8f..e285f8a 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -1816,26 +1816,17 @@ void llvm::salvageDebugInfoForDbgValues(
is_contained(DIILocation, &I) &&
"DbgVariableIntrinsic must use salvaged instruction as its location");
unsigned LocNo = std::distance(DIILocation.begin(), find(DIILocation, &I));
- SmallVector<Value *, 4> AdditionalValues;
- DIExpression *SalvagedExpr = salvageDebugInfoImpl(
- I, DII->getExpression(), StackValue, LocNo, AdditionalValues);
+
+ DIExpression *DIExpr =
+ salvageDebugInfoImpl(I, DII->getExpression(), StackValue, LocNo);
// salvageDebugInfoImpl should fail on examining the first element of
// DbgUsers, or none of them.
- if (!SalvagedExpr)
+ if (!DIExpr)
break;
DII->replaceVariableLocationOp(&I, I.getOperand(0));
- if (AdditionalValues.empty()) {
- DII->setExpression(SalvagedExpr);
- } else if (isa<DbgValueInst>(DII)) {
- DII->addVariableLocationOps(AdditionalValues, SalvagedExpr);
- } else {
- // Do not salvage using DIArgList for dbg.addr/dbg.declare, as it is
- // currently only valid for stack value expressions.
- Value *Undef = UndefValue::get(I.getOperand(0)->getType());
- DII->replaceVariableLocationOp(I.getOperand(0), Undef);
- }
+ DII->setExpression(DIExpr);
LLVM_DEBUG(dbgs() << "SALVAGE: " << *DII << '\n');
Salvaged = true;
}
@@ -1850,27 +1841,12 @@ void llvm::salvageDebugInfoForDbgValues(
}
bool getSalvageOpsForGEP(GetElementPtrInst *GEP, const DataLayout &DL,
- uint64_t CurrentLocOps,
- SmallVectorImpl<uint64_t> &Opcodes,
- SmallVectorImpl<Value *> &AdditionalValues) {
+ SmallVectorImpl<uint64_t> &Opcodes) {
unsigned BitWidth = DL.getIndexSizeInBits(GEP->getPointerAddressSpace());
- // Rewrite a GEP into a DIExpression.
- SmallDenseMap<Value *, APInt, 8> VariableOffsets;
+ // Rewrite a constant GEP into a DIExpression.
APInt ConstantOffset(BitWidth, 0);
- if (!GEP->collectOffset(DL, BitWidth, VariableOffsets, ConstantOffset))
+ if (!GEP->accumulateConstantOffset(DL, ConstantOffset))
return false;
- if (!VariableOffsets.empty() && !CurrentLocOps) {
- Opcodes.insert(Opcodes.begin(), {dwarf::DW_OP_LLVM_arg, 0});
- CurrentLocOps = 1;
- }
- for (auto Offset : VariableOffsets) {
- AdditionalValues.push_back(Offset.first);
- assert(Offset.second.isStrictlyPositive() &&
- "Expected strictly positive multiplier for offset.");
- Opcodes.append({dwarf::DW_OP_LLVM_arg, CurrentLocOps++, dwarf::DW_OP_constu,
- Offset.second.getZExtValue(), dwarf::DW_OP_mul,
- dwarf::DW_OP_plus});
- }
DIExpression::appendOffset(Opcodes, ConstantOffset.getSExtValue());
return true;
}
@@ -1905,35 +1881,23 @@ uint64_t getDwarfOpForBinOp(Instruction::BinaryOps Opcode) {
}
}
-bool getSalvageOpsForBinOp(BinaryOperator *BI, uint64_t CurrentLocOps,
- SmallVectorImpl<uint64_t> &Opcodes,
- SmallVectorImpl<Value *> &AdditionalValues) {
- // Handle binary operations with constant integer operands as a special case.
+bool getSalvageOpsForBinOp(BinaryOperator *BI,
+ SmallVectorImpl<uint64_t> &Opcodes) {
+ // Rewrite binary operations with constant integer operands.
auto *ConstInt = dyn_cast<ConstantInt>(BI->getOperand(1));
- // Values wider than 64 bits cannot be represented within a DIExpression.
- if (ConstInt && ConstInt->getBitWidth() > 64)
+ if (!ConstInt || ConstInt->getBitWidth() > 64)
return false;
-
+ uint64_t Val = ConstInt->getSExtValue();
Instruction::BinaryOps BinOpcode = BI->getOpcode();
- // Push any Constant Int operand onto the expression stack.
- if (ConstInt) {
- uint64_t Val = ConstInt->getSExtValue();
- // Add or Sub Instructions with a constant operand can potentially be
- // simplified.
- if (BinOpcode == Instruction::Add || BinOpcode == Instruction::Sub) {
- uint64_t Offset = BinOpcode == Instruction::Add ? Val : -int64_t(Val);
- DIExpression::appendOffset(Opcodes, Offset);
- return true;
- }
- Opcodes.append({dwarf::DW_OP_constu, Val});
- } else {
- if (!CurrentLocOps) {
- Opcodes.append({dwarf::DW_OP_LLVM_arg, 0});
- CurrentLocOps = 1;
- }
- Opcodes.append({dwarf::DW_OP_LLVM_arg, CurrentLocOps});
- AdditionalValues.push_back(BI->getOperand(1));
+ // Add or Sub Instructions with a constant operand can potentially be
+ // simplified.
+ if (BinOpcode == Instruction::Add || BinOpcode == Instruction::Sub) {
+ uint64_t Offset = BinOpcode == Instruction::Add ? Val : -int64_t(Val);
+ DIExpression::appendOffset(Opcodes, Offset);
+ return true;
}
+ // Add constant int operand to expression stack.
+ Opcodes.append({dwarf::DW_OP_constu, Val});
// Add salvaged binary operator to expression stack, if it has a valid
// representation in a DIExpression.
@@ -1945,11 +1909,9 @@ bool getSalvageOpsForBinOp(BinaryOperator *BI, uint64_t CurrentLocOps,
return true;
}
-DIExpression *
-llvm::salvageDebugInfoImpl(Instruction &I, DIExpression *SrcDIExpr,
- bool WithStackValue, unsigned LocNo,
- SmallVectorImpl<Value *> &AdditionalValues) {
- uint64_t CurrentLocOps = SrcDIExpr->getNumLocationOperands();
+DIExpression *llvm::salvageDebugInfoImpl(Instruction &I,
+ DIExpression *SrcDIExpr,
+ bool WithStackValue, unsigned LocNo) {
auto &M = *I.getModule();
auto &DL = M.getDataLayout();
@@ -1963,7 +1925,7 @@ llvm::salvageDebugInfoImpl(Instruction &I, DIExpression *SrcDIExpr,
};
// initializer-list helper for applying operators to the source DIExpression.
- auto applyOps = [&](ArrayRef<uint64_t> Opcodes) {
+ auto applyOps = [&](ArrayRef<uint64_t> Opcodes) -> DIExpression * {
SmallVector<uint64_t, 8> Ops(Opcodes.begin(), Opcodes.end());
return doSalvage(Ops);
};
@@ -1989,15 +1951,15 @@ llvm::salvageDebugInfoImpl(Instruction &I, DIExpression *SrcDIExpr,
SmallVector<uint64_t, 8> Ops;
if (auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {
- if (getSalvageOpsForGEP(GEP, DL, CurrentLocOps, Ops, AdditionalValues))
+ if (getSalvageOpsForGEP(GEP, DL, Ops))
return doSalvage(Ops);
} else if (auto *BI = dyn_cast<BinaryOperator>(&I)) {
- if (getSalvageOpsForBinOp(BI, CurrentLocOps, Ops, AdditionalValues))
+ if (getSalvageOpsForBinOp(BI, Ops))
return doSalvage(Ops);
}
- // *Not* to do: we should not attempt to salvage load instructions,
- // because the validity and lifetime of a dbg.value containing
- // DW_OP_deref becomes difficult to analyze. See PR40628 for examples.
+ // *Not* to do: we should not attempt to salvage load instructions,
+ // because the validity and lifetime of a dbg.value containing
+ // DW_OP_deref becomes difficult to analyze. See PR40628 for examples.
return nullptr;
}