mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-20 16:17:38 +00:00
Implement support to debug inlined functions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86748 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "llvm/IntrinsicInst.h"
|
||||
#include "llvm/GlobalVariable.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
#include "llvm/Support/CFG.h"
|
||||
#include "llvm/Transforms/Utils/ValueMapper.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
@@ -346,6 +347,27 @@ ConstantFoldMappedInstruction(const Instruction *I) {
|
||||
Ops.size(), TD);
|
||||
}
|
||||
|
||||
static MDNode *UpdateInlinedAtInfo(MDNode *InsnMD, MDNode *TheCallMD,
|
||||
LLVMContext &Context) {
|
||||
DILocation ILoc(InsnMD);
|
||||
if (ILoc.isNull()) return InsnMD;
|
||||
|
||||
DILocation CallLoc(TheCallMD);
|
||||
if (CallLoc.isNull()) return InsnMD;
|
||||
|
||||
DILocation OrigLocation = ILoc.getOrigLocation();
|
||||
MDNode *NewLoc = TheCallMD;
|
||||
if (!OrigLocation.isNull())
|
||||
NewLoc = UpdateInlinedAtInfo(OrigLocation.getNode(), TheCallMD, Context);
|
||||
|
||||
SmallVector<Value *, 4> MDVs;
|
||||
MDVs.push_back(InsnMD->getElement(0)); // Line
|
||||
MDVs.push_back(InsnMD->getElement(1)); // Col
|
||||
MDVs.push_back(InsnMD->getElement(2)); // Scope
|
||||
MDVs.push_back(NewLoc);
|
||||
return MDNode::get(Context, MDVs.data(), MDVs.size());
|
||||
}
|
||||
|
||||
/// CloneAndPruneFunctionInto - This works exactly like CloneFunctionInto,
|
||||
/// except that it does some simple constant prop and DCE on the fly. The
|
||||
/// effect of this is to copy significantly less code in cases where (for
|
||||
@@ -358,7 +380,8 @@ void llvm::CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
SmallVectorImpl<ReturnInst*> &Returns,
|
||||
const char *NameSuffix,
|
||||
ClonedCodeInfo *CodeInfo,
|
||||
const TargetData *TD) {
|
||||
const TargetData *TD,
|
||||
Instruction *TheCall) {
|
||||
assert(NameSuffix && "NameSuffix cannot be null!");
|
||||
|
||||
#ifndef NDEBUG
|
||||
@@ -397,19 +420,49 @@ void llvm::CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
// references as we go. This uses ValueMap to do all the hard work.
|
||||
//
|
||||
BasicBlock::iterator I = NewBB->begin();
|
||||
|
||||
LLVMContext &Context = OldFunc->getContext();
|
||||
unsigned DbgKind = Context.getMetadata().getMDKind("dbg");
|
||||
MDNode *TheCallMD = NULL;
|
||||
SmallVector<Value *, 4> MDVs;
|
||||
if (TheCall && TheCall->hasMetadata())
|
||||
TheCallMD = Context.getMetadata().getMD(DbgKind, TheCall);
|
||||
|
||||
// Handle PHI nodes specially, as we have to remove references to dead
|
||||
// blocks.
|
||||
if (PHINode *PN = dyn_cast<PHINode>(I)) {
|
||||
// Skip over all PHI nodes, remembering them for later.
|
||||
BasicBlock::const_iterator OldI = BI->begin();
|
||||
for (; (PN = dyn_cast<PHINode>(I)); ++I, ++OldI)
|
||||
for (; (PN = dyn_cast<PHINode>(I)); ++I, ++OldI) {
|
||||
if (I->hasMetadata())
|
||||
if (TheCallMD) {
|
||||
if (MDNode *IMD = Context.getMetadata().getMD(DbgKind, I)) {
|
||||
MDNode *NewMD = UpdateInlinedAtInfo(IMD, TheCallMD, Context);
|
||||
Context.getMetadata().addMD(DbgKind, NewMD, I);
|
||||
}
|
||||
} else
|
||||
// The cloned instruction has dbg info but the call instruction
|
||||
// does not have dbg info. Remove dbg info from cloned instruction.
|
||||
Context.getMetadata().removeMD(DbgKind, I);
|
||||
PHIToResolve.push_back(cast<PHINode>(OldI));
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise, remap the rest of the instructions normally.
|
||||
for (; I != NewBB->end(); ++I)
|
||||
for (; I != NewBB->end(); ++I) {
|
||||
if (I->hasMetadata())
|
||||
if (TheCallMD) {
|
||||
if (MDNode *IMD = Context.getMetadata().getMD(DbgKind, I)) {
|
||||
MDNode *NewMD = UpdateInlinedAtInfo(IMD, TheCallMD, Context);
|
||||
Context.getMetadata().addMD(DbgKind, NewMD, I);
|
||||
}
|
||||
} else
|
||||
// The cloned instruction has dbg info but the call instruction
|
||||
// does not have dbg info. Remove dbg info from cloned instruction.
|
||||
Context.getMetadata().removeMD(DbgKind, I);
|
||||
|
||||
RemapInstruction(I, ValueMap);
|
||||
}
|
||||
}
|
||||
|
||||
// Defer PHI resolution until rest of function is resolved, PHI resolution
|
||||
|
||||
Reference in New Issue
Block a user