#include "globals.h"
#include "naming.h"
#include "esb.h"
#include "esb_using_functions.h"
#include "print_sections.h"
#include "print_frames.h"
#include "sanitized.h"
extern
void
print_locs(Dwarf_Debug dbg)
{
Dwarf_Unsigned offset = 0;
Dwarf_Addr hipc_offset = 0;
Dwarf_Addr lopc_offset = 0;
Dwarf_Ptr data = 0;
Dwarf_Unsigned entry_len = 0;
Dwarf_Unsigned next_entry = 0;
int
index = 0;
int
lres = 0;
int
fres = 0;
Dwarf_Half address_size = 0;
Dwarf_Half offset_size = 0;
Dwarf_Half version = 2;
Dwarf_Error err = 0;
struct
esb_s exprstring;
unsigned loopct = 0;
esb_constructor(&exprstring);
glflags.current_section_id = DEBUG_LOC;
if
(!glflags.gf_do_print_dwarf) {
return
;
}
if
(!glflags.gf_use_old_dwarf_loclist) {
printf
(
"\n"
);
printf
(
"Printing location lists with -c is no longer supported\n"
);
return
;
}
fres = dwarf_get_address_size(dbg, &address_size, &err);
if
(fres != DW_DLV_OK) {
print_error(dbg,
"dwarf_get_address_size"
, fres, err);
}
fres = dwarf_get_offset_size(dbg, &offset_size, &err);
if
(fres != DW_DLV_OK) {
print_error(dbg,
"dwarf_get_address_size"
, fres, err);
}
#if 0
{
struct
esb_s truename;
char
buf[DWARF_SECNAME_BUFFER_SIZE];
esb_constructor_fixed(&truename,buf,
sizeof
(buf));
get_true_section_name(dbg,
".debug_loc"
,
&truename,TRUE);
printf
(
"\n%s\n"
,sanitized(esb_get_string(&truename)));
esb_destructor(&truename);
}
#endif
printf
(
"Format <i o b e l>: "
"index section-offset begin-addr end-addr length-of-block-entry\n"
);
for
(loopct = 0;
(lres = dwarf_get_loclist_entry(dbg, offset,
&hipc_offset, &lopc_offset,
&data, &entry_len,
&next_entry,
&err)) == DW_DLV_OK;
++loopct) {
get_string_from_locs(dbg,data,entry_len,address_size,
offset_size,
version,
&exprstring);
if
(!loopct) {
print_secname(dbg,
".debug_loc"
);
}
if
(glflags.gf_display_offsets) {
++index;
printf
(
" <iobel> [%8d] 0x%"
DW_PR_XZEROS DW_PR_DUx,
index, offset);
if
(glflags.verbose) {
printf
(
" <expr-off 0x%"
DW_PR_XZEROS DW_PR_DUx
">"
,
next_entry - entry_len);
}
}
printf
(
" 0x%"
DW_PR_XZEROS DW_PR_DUx
" 0x%"
DW_PR_XZEROS DW_PR_DUx
" %8"
DW_PR_DUu
" %s\n"
,
(Dwarf_Unsigned) lopc_offset,
(Dwarf_Unsigned) hipc_offset, entry_len,
esb_get_string(&exprstring));
esb_empty_string(&exprstring);
offset = next_entry;
}
if
(!loopct) {
print_secname(dbg,
".debug_loc"
);
}
esb_destructor(&exprstring);
if
(lres == DW_DLV_ERROR) {
print_error(dbg,
"dwarf_get_loclist_entry"
, lres, err);
}
}