10 void printrules(Dwarf
*d
, ulong pc
);
16 fprint(2, "usage: dwarfdump file\n");
21 main(int argc
, char **argv
)
27 char *cdir
, *dir
, *file
;
28 ulong line
, mtime
, length
;
34 fmtinstall('R', exprfmt
);
35 fmtinstall('H', encodefmt
);
38 if((pe
= peopen(argv
[1])) == nil
)
39 sysfatal("elfopen %s: %r", argv
[1]);
40 if((d
=dwarfopen(pe
)) == nil
)
41 sysfatal("dwarfopen: %r");
43 if(dwarfenum(d
, &s
) < 0)
44 sysfatal("dwarfenumall: %r");
46 while(dwarfnextsym(d
, &s
) == 1){
49 print("compileunit %s\n", s
.attrs
.name
);
60 case TagFormalParameter
:
65 if(s
.attrs
.isexternal
)
67 print("%c %s", c
, s
.attrs
.name
);
68 if(s
.attrs
.have
.lowpc
)
69 print(" 0x%lux-0x%lux", s
.attrs
.lowpc
, s
.attrs
.highpc
);
70 switch(s
.attrs
.have
.location
){
72 print(" @ %.*H", s
.attrs
.location
.b
.len
, s
.attrs
.location
.b
.data
);
75 print(" @ 0x%lux", s
.attrs
.location
.c
);
78 if(s
.attrs
.have
.ranges
)
79 print(" ranges@0x%lux", s
.attrs
.ranges
);
81 if(s
.attrs
.have
.lowpc
){
82 if(dwarfpctoline(d
, s
.attrs
.lowpc
, &cdir
, &dir
, &file
, &line
, &mtime
, &length
) < 0)
83 print("\tcould not find source: %r\n");
85 print("\t%s/%s:%lud mtime=%lud length=%lud\n",
86 cdir
, file
, line
, mtime
, length
);
88 print("\t%s/%s/%s:%lud mtime=%lud length=%lud\n",
89 cdir
, dir
, file
, line
, mtime
, length
);
91 if(0) printrules(d
, s
.attrs
.lowpc
);
92 if(0) printrules(d
, (s
.attrs
.lowpc
+s
.attrs
.highpc
)/2);
101 printrules(Dwarf
*d
, ulong pc
)
107 if(dwarfunwind(d
, pc
, &cfa
, &ra
, r
, nelem(r
)) < 0)
108 print("\tcannot unwind from pc 0x%lux: %r\n", pc
);
110 print("\tpc=0x%lux cfa=%R ra=%R", pc
, &cfa
, &ra
);
111 for(i
=0; i
<nelem(r
); i
++)
112 if(r
[i
].type
!= RuleSame
)
113 print(" r%d=%R", i
, &r
[i
]);
123 if((e
= va_arg(fmt
->args
, DwarfExpr
*)) == nil
)
124 return fmtstrcpy(fmt
, "<nil>");
128 return fmtstrcpy(fmt
, "undef");
130 return fmtstrcpy(fmt
, "same");
132 return fmtprint(fmt
, "%ld(cfa)", e
->offset
);
134 return fmtprint(fmt
, "r%ld", e
->reg
);
136 return fmtprint(fmt
, "%ld(r%ld)", e
->offset
, e
->reg
);
138 return fmtprint(fmt
, "l.%.*H", e
->loc
.len
, e
->loc
.data
);
140 return fmtprint(fmt
, "?%d", e
->type
);