// // Function: printSourceInfo() // // Description: // Print source file and line number information about the instruction to // standard output. // static void printSourceInfo (std::string errorType, Instruction * I) { // // Print out where the fault will be inserted in the source code. // If we can't find the source line information, use a dummy line number and // the function name by default. // std::string fname = I->getParent()->getParent()->getNameStr(); std::string funcname = fname; uint64_t lineno = 0; unsigned dbgKind = I->getContext().getMDKindID("dbg"); if (MDNode *Dbg = I->getMetadata(dbgKind)) { DILocation Loc (Dbg); fname = Loc.getDirectory().str() + Loc.getFilename().str(); lineno = Loc.getLineNumber(); } std::cout << "Inject: " << errorType << ": " << funcname << ": " << fname << ": " << lineno << "\n"; return; }
/// ExtractDebugLocation - Extract debug location information /// from DILocation. DebugLoc ExtractDebugLocation(DILocation &Loc, DebugLocTracker &DebugLocInfo) { DebugLoc DL; MDNode *Context = Loc.getScope().getNode(); MDNode *InlinedLoc = NULL; if (!Loc.getOrigLocation().isNull()) InlinedLoc = Loc.getOrigLocation().getNode(); // If this location is already tracked then use it. DebugLocTuple Tuple(Context, InlinedLoc, Loc.getLineNumber(), Loc.getColumnNumber()); DenseMap<DebugLocTuple, unsigned>::iterator II = DebugLocInfo.DebugIdMap.find(Tuple); if (II != DebugLocInfo.DebugIdMap.end()) return DebugLoc::get(II->second); // Add a new location entry. unsigned Id = DebugLocInfo.DebugLocations.size(); DebugLocInfo.DebugLocations.push_back(Tuple); DebugLocInfo.DebugIdMap[Tuple] = Id; return DebugLoc::get(Id); }