bool DwarfFile::addScopeVariable(LexicalScope *LS, DbgVariable *Var) { SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS]; DIVariable DV = Var->getVariable(); // Variables with positive arg numbers are parameters. if (unsigned ArgNum = DV->getArg()) { // Keep all parameters in order at the start of the variable list to ensure // function types are correct (no out-of-order parameters) // // This could be improved by only doing it for optimized builds (unoptimized // builds have the right order to begin with), searching from the back (this // would catch the unoptimized case quickly), or doing a binary search // rather than linear search. auto I = Vars.begin(); while (I != Vars.end()) { unsigned CurNum = (*I)->getVariable()->getArg(); // A local (non-parameter) variable has been found, insert immediately // before it. if (CurNum == 0) break; // A later indexed parameter has been found, insert immediately before it. if (CurNum > ArgNum) break; if (CurNum == ArgNum) { (*I)->addMMIEntry(*Var); return false; } ++I; } Vars.insert(I, Var); return true; } Vars.push_back(Var); return true; }
/// addSourceLine - Add location information to specified debug information /// entry. void CompileUnit::addSourceLine(DIE *Die, DIVariable V) { // Verify variable. if (!V.Verify()) return; unsigned Line = V.getLineNumber(); if (Line == 0) return; unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(), V.getContext().getDirectory()); assert(FileID && "Invalid file id"); addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); }
void DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) { MDNode *N = dyn_cast<MDNode>(DVI->getVariable()); if (!N) return; InitializeTypeMap(M); DIVariable DV = dyn_cast<MDLocalVariable>(N); if (!DV) return; if (!NodesSeen.insert(DV).second) return; processScope(DV.getContext()); processType(DV.getType().resolve(TypeIdentifierMap)); }