llvm.org GIT mirror llvm / f667db3
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 Tom Stellard 7 years ago
2 changed file(s) with 104 addition(s) and 3 deletion(s). Raw diff Collapse all Expand all
16231623 }
16241624
16251625 void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1626 // SmallVector &Vars = ScopeVariables.lookup(LS);
1627 ScopeVariables[LS].push_back(Var);
1628 // Vars.push_back(Var);
1626 SmallVectorImpl &Vars = ScopeVariables[LS];
1627 DIVariable DV = Var->getVariable();
1628 if (DV.getTag() == dwarf::DW_TAG_arg_variable) {
1629 DISubprogram Ctxt(DV.getContext());
1630 DIArray Variables = Ctxt.getVariables();
1631 // If the variable is a parameter (arg_variable) and this is an optimized
1632 // build (the subprogram has a 'variables' list) make sure we keep the
1633 // parameters in order. Otherwise we would produce an incorrect function
1634 // type with parameters out of order if function parameters were used out of
1635 // order or unused (see the call to addScopeVariable in endFunction where
1636 // the remaining unused variables (including parameters) are added).
1637 if (unsigned NumVariables = Variables.getNumElements()) {
1638 // Keep the parameters at the start of the variables list. Search through
1639 // current variable list (Vars) and the full function variable list in
1640 // lock-step looking for this parameter in the full list to find the
1641 // insertion point.
1642 SmallVectorImpl::iterator I = Vars.begin();
1643 unsigned j = 0;
1644 while (I != Vars.end() && j != NumVariables &&
1645 Variables.getElement(j) != DV &&
1646 (*I)->getVariable().getTag() == dwarf::DW_TAG_arg_variable) {
1647 if (Variables.getElement(j) == (*I)->getVariable())
1648 ++I;
1649 ++j;
1650 }
1651 Vars.insert(I, Var);
1652 return;
1653 }
1654 }
1655
1656 Vars.push_back(Var);
16291657 }
16301658
16311659 // Gather and emit post-function debug information.
0 ; RUN: llc -filetype=obj < %s > %t
1 ; RUN: llvm-dwarfdump %t | FileCheck %s
2
3 ; IR generated from clang -O -g with the following source
4 ;
5 ; void f1(int x, int y);
6 ; void f3(int line);
7 ; void f2() {
8 ; f1(1, 2);
9 ; }
10 ; void f1(int x, int y) {
11 ; f3(y);
12 ; }
13
14 ; CHECK: DW_AT_name{{.*}}"f1"
15 ; CHECK: DW_TAG_formal_parameter
16 ; CHECK-NEXT: DW_AT_name{{.*}}"x"
17 ; CHECK: DW_TAG_formal_parameter
18 ; CHECK-NEXT: DW_AT_name{{.*}}"y"
19
20 ; Function Attrs: uwtable
21 define void @_Z2f2v() #0 {
22 tail call void @llvm.dbg.value(metadata !15, i64 0, metadata !16), !dbg !18
23 tail call void @llvm.dbg.value(metadata !19, i64 0, metadata !20), !dbg !18
24 tail call void @_Z2f3i(i32 2), !dbg !21
25 ret void, !dbg !22
26 }
27
28 ; Function Attrs: uwtable
29 define void @_Z2f1ii(i32 %x, i32 %y) #0 {
30 tail call void @llvm.dbg.value(metadata !{i32 %x}, i64 0, metadata !13), !dbg !23
31 tail call void @llvm.dbg.value(metadata !{i32 %y}, i64 0, metadata !14), !dbg !23
32 tail call void @_Z2f3i(i32 %y), !dbg !24
33 ret void, !dbg !25
34 }
35
36 declare void @_Z2f3i(i32) #1
37
38 ; Function Attrs: nounwind readnone
39 declare void @llvm.dbg.value(metadata, i64, metadata) #2
40
41 attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
42 attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
43 attributes #2 = { nounwind readnone }
44
45 !llvm.dbg.cu = !{!0}
46
47 !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/scratch/exp.cpp] [DW_LANG_C_plus_plus]
48 !1 = metadata !{metadata !"exp.cpp", metadata !"/usr/local/google/home/blaikie/dev/scratch"}
49 !2 = metadata !{i32 0}
50 !3 = metadata !{metadata !4, metadata !8}
51 !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f2", metadata !"f2", metadata !"_Z2f2v", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @_Z2f2v, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f2]
52 !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/blaikie/dev/scratch/exp.cpp]
53 !6 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
54 !7 = metadata !{null}
55 !8 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f1", metadata !"f1", metadata !"_Z2f1ii", i32 6, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (i32, i32)* @_Z2f1ii, null, null, metadata !12, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [f1]
56 !9 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !10, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
57 !10 = metadata !{null, metadata !11, metadata !11}
58 !11 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
59 !12 = metadata !{metadata !13, metadata !14}
60 !13 = metadata !{i32 786689, metadata !8, metadata !"x", metadata !5, i32 16777222, metadata !11, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [x] [line 6]
61 !14 = metadata !{i32 786689, metadata !8, metadata !"y", metadata !5, i32 33554438, metadata !11, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [y] [line 6]
62 !15 = metadata !{i32 undef}
63 !16 = metadata !{i32 786689, metadata !8, metadata !"x", metadata !5, i32 16777222, metadata !11, i32 0, metadata !17} ; [ DW_TAG_arg_variable ] [x] [line 6]
64 !17 = metadata !{i32 4, i32 0, metadata !4, null}
65 !18 = metadata !{i32 6, i32 0, metadata !8, metadata !17}
66 !19 = metadata !{i32 2}
67 !20 = metadata !{i32 786689, metadata !8, metadata !"y", metadata !5, i32 33554438, metadata !11, i32 0, metadata !17} ; [ DW_TAG_arg_variable ] [y] [line 6]
68 !21 = metadata !{i32 7, i32 0, metadata !8, metadata !17}
69 !22 = metadata !{i32 5, i32 0, metadata !4, null}
70 !23 = metadata !{i32 6, i32 0, metadata !8, null}
71 !24 = metadata !{i32 7, i32 0, metadata !8, null}
72 !25 = metadata !{i32 8, i32 0, metadata !8, null} ; [ DW_TAG_imported_declaration ]