mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
In -fast mode do what FastISel does.
This code could use some refactoring help! llvm-svn: 69254
This commit is contained in:
parent
d9a9d5bdbb
commit
87488c2a88
@ -3961,8 +3961,14 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||||||
Subprogram.getLinkageName(SPName);
|
Subprogram.getLinkageName(SPName);
|
||||||
if (!SPName.empty()
|
if (!SPName.empty()
|
||||||
&& strcmp(SPName.c_str(), MF.getFunction()->getNameStart())) {
|
&& strcmp(SPName.c_str(), MF.getFunction()->getNameStart())) {
|
||||||
// This is end of inlined function. Debugging information for
|
// This is end of inlined function. Debugging information for
|
||||||
// inlined function is not handled yet (only supported by FastISel).
|
// inlined function is not handled yet (only supported by FastISel).
|
||||||
|
if (Fast) {
|
||||||
|
unsigned ID = DW->RecordInlinedFnEnd(Subprogram);
|
||||||
|
if (ID != 0)
|
||||||
|
DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),
|
||||||
|
getRoot(), ID));
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3980,38 +3986,67 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||||||
DbgFuncStartInst &FSI = cast<DbgFuncStartInst>(I);
|
DbgFuncStartInst &FSI = cast<DbgFuncStartInst>(I);
|
||||||
Value *SP = FSI.getSubprogram();
|
Value *SP = FSI.getSubprogram();
|
||||||
if (SP && DW->ValidDebugInfo(SP, Fast)) {
|
if (SP && DW->ValidDebugInfo(SP, Fast)) {
|
||||||
// llvm.dbg.func.start implicitly defines a dbg_stoppoint which is
|
MachineFunction &MF = DAG.getMachineFunction();
|
||||||
// what (most?) gdb expects.
|
|
||||||
MachineFunction &MF = DAG.getMachineFunction();
|
|
||||||
DISubprogram Subprogram(cast<GlobalVariable>(SP));
|
|
||||||
|
|
||||||
std::string SPName;
|
|
||||||
Subprogram.getLinkageName(SPName);
|
|
||||||
if (!SPName.empty()
|
|
||||||
&& strcmp(SPName.c_str(), MF.getFunction()->getNameStart())) {
|
|
||||||
// This is beginning of inlined function. Debugging information for
|
|
||||||
// inlined function is not handled yet (only supported by FastISel).
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
DICompileUnit CompileUnit = Subprogram.getCompileUnit();
|
|
||||||
std::string Dir, FN;
|
|
||||||
unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir),
|
|
||||||
CompileUnit.getFilename(FN));
|
|
||||||
|
|
||||||
// Record the source line but does not create a label for the normal
|
|
||||||
// function start. It will be emitted at asm emission time. However,
|
|
||||||
// create a label if this is a beginning of inlined function.
|
|
||||||
unsigned Line = Subprogram.getLineNumber();
|
|
||||||
|
|
||||||
if (Fast) {
|
if (Fast) {
|
||||||
unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile);
|
// llvm.dbg.func.start implicitly defines a dbg_stoppoint which is what
|
||||||
if (DW->getRecordSourceLineCount() != 1)
|
// (most?) gdb expects.
|
||||||
|
DebugLoc PrevLoc = CurDebugLoc;
|
||||||
|
DISubprogram Subprogram(cast<GlobalVariable>(SP));
|
||||||
|
DICompileUnit CompileUnit = Subprogram.getCompileUnit();
|
||||||
|
std::string Dir, FN;
|
||||||
|
unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir),
|
||||||
|
CompileUnit.getFilename(FN));
|
||||||
|
|
||||||
|
if (!Subprogram.describes(MF.getFunction())) {
|
||||||
|
// This is a beginning of an inlined function.
|
||||||
|
|
||||||
|
// Record the source line.
|
||||||
|
unsigned Line = Subprogram.getLineNumber();
|
||||||
|
unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile);
|
||||||
|
setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0)));
|
||||||
|
|
||||||
DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),
|
DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),
|
||||||
getRoot(), LabelID));
|
getRoot(), LabelID));
|
||||||
}
|
DebugLocTuple PrevLocTpl = MF.getDebugLocTuple(PrevLoc);
|
||||||
|
DW->RecordInlinedFnStart(&FSI, Subprogram, LabelID,
|
||||||
|
PrevLocTpl.Src,
|
||||||
|
PrevLocTpl.Line,
|
||||||
|
PrevLocTpl.Col);
|
||||||
|
} else {
|
||||||
|
// Record the source line.
|
||||||
|
unsigned Line = Subprogram.getLineNumber();
|
||||||
|
setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0)));
|
||||||
|
|
||||||
setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0)));
|
// llvm.dbg.func_start also defines beginning of function scope.
|
||||||
|
DW->RecordRegionStart(cast<GlobalVariable>(FSI.getSubprogram()));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DISubprogram Subprogram(cast<GlobalVariable>(SP));
|
||||||
|
|
||||||
|
std::string SPName;
|
||||||
|
Subprogram.getLinkageName(SPName);
|
||||||
|
if (!SPName.empty()
|
||||||
|
&& strcmp(SPName.c_str(), MF.getFunction()->getNameStart())) {
|
||||||
|
// This is beginning of inlined function. Debugging information for
|
||||||
|
// inlined function is not handled yet (only supported by FastISel).
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// llvm.dbg.func.start implicitly defines a dbg_stoppoint which is
|
||||||
|
// what (most?) gdb expects.
|
||||||
|
DICompileUnit CompileUnit = Subprogram.getCompileUnit();
|
||||||
|
std::string Dir, FN;
|
||||||
|
unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir),
|
||||||
|
CompileUnit.getFilename(FN));
|
||||||
|
|
||||||
|
// Record the source line but does not create a label for the normal
|
||||||
|
// function start. It will be emitted at asm emission time. However,
|
||||||
|
// create a label if this is a beginning of inlined function.
|
||||||
|
unsigned Line = Subprogram.getLineNumber();
|
||||||
|
setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0)));
|
||||||
|
// FIXME - Start new region because llvm.dbg.func_start also defines
|
||||||
|
// beginning of function scope.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -296,6 +296,12 @@ bool SelectionDAGISel::runOnFunction(Function &Fn) {
|
|||||||
assert((!EnableFastISelAbort || EnableFastISel) &&
|
assert((!EnableFastISelAbort || EnableFastISel) &&
|
||||||
"-fast-isel-abort requires -fast-isel");
|
"-fast-isel-abort requires -fast-isel");
|
||||||
|
|
||||||
|
// Do not codegen any 'available_externally' functions at all, they have
|
||||||
|
// definitions outside the translation unit.
|
||||||
|
if (Fn.hasAvailableExternallyLinkage())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
|
||||||
// Get alias analysis for load/store combining.
|
// Get alias analysis for load/store combining.
|
||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user