From 3b5c84008deb344a5e3c4957b753e532baf90a8f Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Thu, 23 Oct 2014 22:04:30 +0000 Subject: DebugInfo: Sink DwarfDebug::addNonArgumentScopeVariable into DwarfFile. llvm-svn: 220520 --- llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp') diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp index 7ad28225e96..6b3d148ee06 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp @@ -176,4 +176,36 @@ bool DwarfFile::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) { CurrentFnArguments[ArgNo - 1] = Var; return true; } + +void DwarfFile::addNonArgumentScopeVariable(LexicalScope *LS, + DbgVariable *Var) { + SmallVectorImpl &Vars = DD.getScopeVariables()[LS]; + DIVariable DV = Var->getVariable(); + // Variables with positive arg numbers are parameters. + if (unsigned ArgNum = DV.getArgNumber()) { + // 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().getArgNumber(); + // 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; + ++I; + } + Vars.insert(I, Var); + return; + } + + Vars.push_back(Var); +} } -- cgit v1.2.3