1
0
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:
Devang Patel 2009-04-16 02:33:41 +00:00
parent d9a9d5bdbb
commit 87488c2a88
2 changed files with 71 additions and 30 deletions

View File

@ -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;

View File

@ -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>();