summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2013-07-19 14:51:27 +0000
committerTom Stellard <thomas.stellard@amd.com>2013-07-19 14:51:27 +0000
commitf667db3652e1fd198ce4e3aec4cebf080a124552 (patch)
tree306e586db6b718c0e4a664c73756440d06c660d0 /lib
parent08745de15d80abdb08b1bdd33516974d4205cb80 (diff)
downloadllvm-f667db3652e1fd198ce4e3aec4cebf080a124552.tar.gz
llvm-f667db3652e1fd198ce4e3aec4cebf080a124552.tar.bz2
llvm-f667db3652e1fd198ce4e3aec4cebf080a124552.tar.xz
PR15662: Optimized debug info produces out of order function parameters
When a function is inlined we lazily construct the variables representing the function's parameters. After that, we add any remaining unused parameters. If the function doesn't use all the parameters, or uses them out of order, then the DWARF would produce them in that order, producing a parameter order that doesn't match the source. This fix causes us to always keep the arg variables at the start of the variable list & in the original order from the source. Merged from r183297 Author: David Blaikie <dblaikie@gmail.com> Date: Wed Jun 5 05:39:59 2013 +0000 git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_33@186678 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.cpp34
1 files changed, 31 insertions, 3 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 73bba6989f..1e706ccf1e 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -1624,9 +1624,37 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
}
void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
-// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
- ScopeVariables[LS].push_back(Var);
-// Vars.push_back(Var);
+ SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
+ DIVariable DV = Var->getVariable();
+ if (DV.getTag() == dwarf::DW_TAG_arg_variable) {
+ DISubprogram Ctxt(DV.getContext());
+ DIArray Variables = Ctxt.getVariables();
+ // If the variable is a parameter (arg_variable) and this is an optimized
+ // build (the subprogram has a 'variables' list) make sure we keep the
+ // parameters in order. Otherwise we would produce an incorrect function
+ // type with parameters out of order if function parameters were used out of
+ // order or unused (see the call to addScopeVariable in endFunction where
+ // the remaining unused variables (including parameters) are added).
+ if (unsigned NumVariables = Variables.getNumElements()) {
+ // Keep the parameters at the start of the variables list. Search through
+ // current variable list (Vars) and the full function variable list in
+ // lock-step looking for this parameter in the full list to find the
+ // insertion point.
+ SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
+ unsigned j = 0;
+ while (I != Vars.end() && j != NumVariables &&
+ Variables.getElement(j) != DV &&
+ (*I)->getVariable().getTag() == dwarf::DW_TAG_arg_variable) {
+ if (Variables.getElement(j) == (*I)->getVariable())
+ ++I;
+ ++j;
+ }
+ Vars.insert(I, Var);
+ return;
+ }
+ }
+
+ Vars.push_back(Var);
}
// Gather and emit post-function debug information.