mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-05 02:16:46 +00:00
Inliner: Use replaceDbgDeclareForAlloca() instead of splicing the
instruction and generalize it to optionally dereference the variable. Follow-up to r227544. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227604 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7a3c3f3a96
commit
88deac4007
@ -274,10 +274,11 @@ bool LowerDbgDeclare(Function &F);
|
||||
/// an alloca, if any.
|
||||
DbgDeclareInst *FindAllocaDbgDeclare(Value *V);
|
||||
|
||||
/// replaceDbgDeclareForAlloca - Replaces llvm.dbg.declare instruction when
|
||||
/// alloca is replaced with a new value.
|
||||
/// \brief Replaces llvm.dbg.declare instruction when an alloca is replaced with
|
||||
/// a new value. If Deref is true, tan additional DW_OP_deref is prepended to
|
||||
/// the expression.
|
||||
bool replaceDbgDeclareForAlloca(AllocaInst *AI, Value *NewAllocaAddress,
|
||||
DIBuilder &Builder);
|
||||
DIBuilder &Builder, bool Deref);
|
||||
|
||||
/// \brief Remove all blocks that can not be reached from the function's entry.
|
||||
///
|
||||
|
@ -1739,7 +1739,7 @@ void FunctionStackPoisoner::poisonStack() {
|
||||
Value *NewAllocaPtr = IRB.CreateIntToPtr(
|
||||
IRB.CreateAdd(LocalStackBase, ConstantInt::get(IntptrTy, Desc.Offset)),
|
||||
AI->getType());
|
||||
replaceDbgDeclareForAlloca(AI, NewAllocaPtr, DIB);
|
||||
replaceDbgDeclareForAlloca(AI, NewAllocaPtr, DIB, /*Deref=*/true);
|
||||
AI->replaceAllUsesWith(NewAllocaPtr);
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DebugInfo.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/DIBuilder.h"
|
||||
#include "llvm/IR/Dominators.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
@ -1112,13 +1113,10 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI,
|
||||
AI, I);
|
||||
}
|
||||
// Move any dbg.declares describing the allocas into the entry basic block.
|
||||
DIBuilder DIB(*Caller->getParent());
|
||||
for (auto &I : IFI.StaticAllocas)
|
||||
if (auto AI = dyn_cast<AllocaInst>(I))
|
||||
if (auto *DDI = FindAllocaDbgDeclare(AI))
|
||||
if (DDI->getParent() != Caller->begin())
|
||||
Caller->getEntryBlock().getInstList()
|
||||
.splice(AI->getNextNode(), FirstNewBlock->getInstList(),
|
||||
DDI, DDI->getNextNode());
|
||||
replaceDbgDeclareForAlloca(AI, AI, DIB, /*Deref=*/false);
|
||||
}
|
||||
|
||||
bool InlinedMustTailCalls = false;
|
||||
|
@ -1106,10 +1106,11 @@ DbgDeclareInst *llvm::FindAllocaDbgDeclare(Value *V) {
|
||||
}
|
||||
|
||||
bool llvm::replaceDbgDeclareForAlloca(AllocaInst *AI, Value *NewAllocaAddress,
|
||||
DIBuilder &Builder) {
|
||||
DIBuilder &Builder, bool Deref) {
|
||||
DbgDeclareInst *DDI = FindAllocaDbgDeclare(AI);
|
||||
if (!DDI)
|
||||
return false;
|
||||
DebugLoc Loc = DDI->getDebugLoc();
|
||||
DIVariable DIVar(DDI->getVariable());
|
||||
DIExpression DIExpr(DDI->getExpression());
|
||||
assert((!DIVar || DIVar.isVariable()) &&
|
||||
@ -1117,21 +1118,24 @@ bool llvm::replaceDbgDeclareForAlloca(AllocaInst *AI, Value *NewAllocaAddress,
|
||||
if (!DIVar)
|
||||
return false;
|
||||
|
||||
// Create a copy of the original DIDescriptor for user variable, prepending
|
||||
// "deref" operation to a list of address elements, as new llvm.dbg.declare
|
||||
// will take a value storing address of the memory for variable, not
|
||||
// alloca itself.
|
||||
SmallVector<int64_t, 4> NewDIExpr;
|
||||
NewDIExpr.push_back(dwarf::DW_OP_deref);
|
||||
if (DIExpr)
|
||||
for (unsigned i = 0, n = DIExpr.getNumElements(); i < n; ++i)
|
||||
NewDIExpr.push_back(DIExpr.getElement(i));
|
||||
if (Deref) {
|
||||
// Create a copy of the original DIDescriptor for user variable, prepending
|
||||
// "deref" operation to a list of address elements, as new llvm.dbg.declare
|
||||
// will take a value storing address of the memory for variable, not
|
||||
// alloca itself.
|
||||
SmallVector<int64_t, 4> NewDIExpr;
|
||||
NewDIExpr.push_back(dwarf::DW_OP_deref);
|
||||
if (DIExpr)
|
||||
for (unsigned i = 0, n = DIExpr.getNumElements(); i < n; ++i)
|
||||
NewDIExpr.push_back(DIExpr.getElement(i));
|
||||
DIExpr = Builder.createExpression(NewDIExpr);
|
||||
}
|
||||
|
||||
// Insert llvm.dbg.declare in the same basic block as the original alloca,
|
||||
// and remove old llvm.dbg.declare.
|
||||
BasicBlock *BB = AI->getParent();
|
||||
Builder.insertDeclare(NewAllocaAddress, DIVar,
|
||||
Builder.createExpression(NewDIExpr), BB);
|
||||
Builder.insertDeclare(NewAllocaAddress, DIVar, DIExpr, BB)
|
||||
->setDebugLoc(Loc);
|
||||
DDI->eraseFromParent();
|
||||
return true;
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ entry:
|
||||
; CHECK: define void @_Z3fn5v()
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: %agg.tmp.sroa.3.i = alloca [20 x i8], align 4
|
||||
; CHECK-NEXT: tail call void @llvm.dbg.declare(metadata [20 x i8]* %agg.tmp.sroa.3.i,
|
||||
; CHECK-NEXT: call void @llvm.dbg.declare(metadata [20 x i8]* %agg.tmp.sroa.3.i,
|
||||
%agg.tmp.sroa.3 = alloca [20 x i8], align 4
|
||||
tail call void @llvm.dbg.declare(metadata [20 x i8]* %agg.tmp.sroa.3, metadata !46, metadata !48), !dbg !49
|
||||
%agg.tmp.sroa.0.0.copyload = load i32* getelementptr inbounds (%struct.A* @b, i64 0, i32 0), align 8, !dbg !50
|
||||
|
@ -92,6 +92,6 @@ attributes #1 = { nounwind readnone }
|
||||
!22 = !MDLocation(line: 8, column: 14, scope: !9)
|
||||
!23 = !MDLocation(line: 9, column: 1, scope: !9)
|
||||
|
||||
; CHECK: [[m23]] = !{!"0x101\00x\0016777217\000", !4, !5, !8, [[CALL_SITE:![0-9]*]]} ; [ DW_TAG_arg_variable ] [x] [line 1]
|
||||
; CHECK: [[CALL_SITE]] = distinct !MDLocation(line: 8, column: 14, scope: !9)
|
||||
; CHECK: [[CALL_SITE:![0-9]+]] = distinct !MDLocation(line: 8, column: 14, scope: !9)
|
||||
; CHECK: [[m23]] = !{!"0x101\00x\0016777217\000", !4, !5, !8, [[CALL_SITE]]} ; [ DW_TAG_arg_variable ] [x] [line 1]
|
||||
; CHECK: [[m24]] = !MDLocation(line: 1, column: 17, scope: !4, inlinedAt: [[CALL_SITE]])
|
||||
|
Loading…
Reference in New Issue
Block a user