Dwarf update
Some small updates in tccdbg.c found by checking readelf output from gcc/clang. - Change encoding type bool type - Fix enum signed/unsigned - Do not hash anon symbol - Use correct filename/line_number for global variables - Fix compiler warning in tcc_get_dwarf_info - Use unsigned long long for array indexes - Display correct first line of function in gdb
This commit is contained in:
parent
748e38ad99
commit
e7396c99b0
1 changed files with 39 additions and 18 deletions
57
tccdbg.c
57
tccdbg.c
|
@ -68,7 +68,7 @@ static const struct {
|
||||||
/* if default char is unsigned */
|
/* if default char is unsigned */
|
||||||
{ VT_BYTE | VT_UNSIGNED, 1, DW_ATE_unsigned_char, "unsigned char:t25=r25;0;255;" },
|
{ VT_BYTE | VT_UNSIGNED, 1, DW_ATE_unsigned_char, "unsigned char:t25=r25;0;255;" },
|
||||||
/* boolean type */
|
/* boolean type */
|
||||||
{ VT_BOOL, 1, DW_ATE_unsigned_char, "bool:t26=r26;0;255;" },
|
{ VT_BOOL, 1, DW_ATE_boolean, "bool:t26=r26;0;255;" },
|
||||||
{ VT_VOID, 1, DW_ATE_unsigned_char, "void:t27=27" },
|
{ VT_VOID, 1, DW_ATE_unsigned_char, "void:t27=27" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -98,17 +98,18 @@ static const struct {
|
||||||
#define DWARF_ABBREV_ARRAY_TYPE 8
|
#define DWARF_ABBREV_ARRAY_TYPE 8
|
||||||
#define DWARF_ABBREV_SUBRANGE_TYPE 9
|
#define DWARF_ABBREV_SUBRANGE_TYPE 9
|
||||||
#define DWARF_ABBREV_TYPEDEF 10
|
#define DWARF_ABBREV_TYPEDEF 10
|
||||||
#define DWARF_ABBREV_ENUMERATOR 11
|
#define DWARF_ABBREV_ENUMERATOR_SIGNED 11
|
||||||
#define DWARF_ABBREV_ENUMERATION_TYPE 12
|
#define DWARF_ABBREV_ENUMERATOR_UNSIGNED 12
|
||||||
#define DWARF_ABBREV_MEMBER 13
|
#define DWARF_ABBREV_ENUMERATION_TYPE 13
|
||||||
#define DWARF_ABBREV_MEMBER_BF 14
|
#define DWARF_ABBREV_MEMBER 14
|
||||||
#define DWARF_ABBREV_STRUCTURE_TYPE 15
|
#define DWARF_ABBREV_MEMBER_BF 15
|
||||||
#define DWARF_ABBREV_UNION_TYPE 16
|
#define DWARF_ABBREV_STRUCTURE_TYPE 16
|
||||||
#define DWARF_ABBREV_SUBPROGRAM_EXTERNAL 17
|
#define DWARF_ABBREV_UNION_TYPE 17
|
||||||
#define DWARF_ABBREV_SUBPROGRAM_STATIC 18
|
#define DWARF_ABBREV_SUBPROGRAM_EXTERNAL 18
|
||||||
#define DWARF_ABBREV_LEXICAL_BLOCK 19
|
#define DWARF_ABBREV_SUBPROGRAM_STATIC 19
|
||||||
#define DWARF_ABBREV_SUBROUTINE_TYPE 20
|
#define DWARF_ABBREV_LEXICAL_BLOCK 20
|
||||||
#define DWARF_ABBREV_FORMAL_PARAMETER2 21
|
#define DWARF_ABBREV_SUBROUTINE_TYPE 21
|
||||||
|
#define DWARF_ABBREV_FORMAL_PARAMETER2 22
|
||||||
|
|
||||||
/* all entries should have been generated with dwarf_uleb128 except
|
/* all entries should have been generated with dwarf_uleb128 except
|
||||||
has_children. All values are currently below 128 so this currently
|
has_children. All values are currently below 128 so this currently
|
||||||
|
@ -175,9 +176,13 @@ static const unsigned char dwarf_abbrev_init[] = {
|
||||||
DW_AT_decl_line, DW_FORM_udata,
|
DW_AT_decl_line, DW_FORM_udata,
|
||||||
DW_AT_type, DW_FORM_ref4,
|
DW_AT_type, DW_FORM_ref4,
|
||||||
0, 0,
|
0, 0,
|
||||||
DWARF_ABBREV_ENUMERATOR, DW_TAG_enumerator, 0,
|
DWARF_ABBREV_ENUMERATOR_SIGNED, DW_TAG_enumerator, 0,
|
||||||
DW_AT_name, DW_FORM_strp,
|
DW_AT_name, DW_FORM_strp,
|
||||||
DW_AT_const_value, DW_FORM_data4,
|
DW_AT_const_value, DW_FORM_sdata,
|
||||||
|
0, 0,
|
||||||
|
DWARF_ABBREV_ENUMERATOR_UNSIGNED, DW_TAG_enumerator, 0,
|
||||||
|
DW_AT_name, DW_FORM_strp,
|
||||||
|
DW_AT_const_value, DW_FORM_udata,
|
||||||
0, 0,
|
0, 0,
|
||||||
DWARF_ABBREV_ENUMERATION_TYPE, DW_TAG_enumeration_type, 1,
|
DWARF_ABBREV_ENUMERATION_TYPE, DW_TAG_enumeration_type, 1,
|
||||||
DW_AT_name, DW_FORM_strp,
|
DW_AT_name, DW_FORM_strp,
|
||||||
|
@ -1222,7 +1227,10 @@ ST_FUNC void tcc_debug_fix_anon(TCCState *s1, CType *t)
|
||||||
if (t->ref == debug_anon_hash[i].type) {
|
if (t->ref == debug_anon_hash[i].type) {
|
||||||
Sym sym = {0}; sym .type = *t ;
|
Sym sym = {0}; sym .type = *t ;
|
||||||
|
|
||||||
|
/* Trick to not hash this struct */
|
||||||
|
debug_info = (struct _debug_info *) t;
|
||||||
debug_type = tcc_get_dwarf_info(s1, &sym);
|
debug_type = tcc_get_dwarf_info(s1, &sym);
|
||||||
|
debug_info = NULL;
|
||||||
for (j = 0; j < debug_anon_hash[i].n_debug_type; j++)
|
for (j = 0; j < debug_anon_hash[i].n_debug_type; j++)
|
||||||
write32le(dwarf_info_section->data +
|
write32le(dwarf_info_section->data +
|
||||||
debug_anon_hash[i].debug_type[j],
|
debug_anon_hash[i].debug_type[j],
|
||||||
|
@ -1380,6 +1388,8 @@ static int tcc_get_dwarf_info(TCCState *s1, Sym *s)
|
||||||
int last_pos = -1;
|
int last_pos = -1;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
|
if (new_file)
|
||||||
|
put_new_file(s1);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
type = t->type.t & ~(VT_STORAGE | VT_CONSTANT | VT_VOLATILE | VT_VLA);
|
type = t->type.t & ~(VT_STORAGE | VT_CONSTANT | VT_VOLATILE | VT_VLA);
|
||||||
if ((type & VT_BTYPE) != VT_BYTE)
|
if ((type & VT_BTYPE) != VT_BYTE)
|
||||||
|
@ -1467,7 +1477,7 @@ static int tcc_get_dwarf_info(TCCState *s1, Sym *s)
|
||||||
debug_type = tcc_debug_find(s1, t, 1);
|
debug_type = tcc_debug_find(s1, t, 1);
|
||||||
if (debug_type == -1) {
|
if (debug_type == -1) {
|
||||||
int pos_sib, pos_type;
|
int pos_sib, pos_type;
|
||||||
Sym sym = {0}; sym .type.t = VT_INT | (type & VT_UNSIGNED) ;
|
Sym sym = {0}; sym.type.t = VT_INT | (type & VT_UNSIGNED);
|
||||||
|
|
||||||
pos_type = tcc_get_dwarf_info(s1, &sym);
|
pos_type = tcc_get_dwarf_info(s1, &sym);
|
||||||
debug_type = tcc_debug_add(s1, t, 1);
|
debug_type = tcc_debug_add(s1, t, 1);
|
||||||
|
@ -1486,11 +1496,16 @@ static int tcc_get_dwarf_info(TCCState *s1, Sym *s)
|
||||||
e = t;
|
e = t;
|
||||||
while (e->next) {
|
while (e->next) {
|
||||||
e = e->next;
|
e = e->next;
|
||||||
dwarf_data1(dwarf_info_section, DWARF_ABBREV_ENUMERATOR);
|
dwarf_data1(dwarf_info_section,
|
||||||
|
type & VT_UNSIGNED ? DWARF_ABBREV_ENUMERATOR_UNSIGNED
|
||||||
|
: DWARF_ABBREV_ENUMERATOR_SIGNED);
|
||||||
dwarf_strp(dwarf_info_section,
|
dwarf_strp(dwarf_info_section,
|
||||||
(e->v & ~SYM_FIELD) >= SYM_FIRST_ANOM
|
(e->v & ~SYM_FIELD) >= SYM_FIRST_ANOM
|
||||||
? "" : get_tok_str(e->v & ~SYM_FIELD, NULL));
|
? "" : get_tok_str(e->v & ~SYM_FIELD, NULL));
|
||||||
dwarf_data4(dwarf_info_section, e->enum_val);
|
if (type & VT_UNSIGNED)
|
||||||
|
dwarf_uleb128(dwarf_info_section, e->enum_val);
|
||||||
|
else
|
||||||
|
dwarf_sleb128(dwarf_info_section, e->enum_val);
|
||||||
}
|
}
|
||||||
dwarf_data1(dwarf_info_section, 0);
|
dwarf_data1(dwarf_info_section, 0);
|
||||||
write32le(dwarf_info_section->data + pos_sib,
|
write32le(dwarf_info_section->data + pos_sib,
|
||||||
|
@ -1521,6 +1536,7 @@ static int tcc_get_dwarf_info(TCCState *s1, Sym *s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
retval = debug_type;
|
retval = debug_type;
|
||||||
|
e = NULL;
|
||||||
t = s;
|
t = s;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
type = t->type.t & ~(VT_STORAGE | VT_CONSTANT | VT_VOLATILE | VT_VLA);
|
type = t->type.t & ~(VT_STORAGE | VT_CONSTANT | VT_VOLATILE | VT_VLA);
|
||||||
|
@ -1543,7 +1559,11 @@ static int tcc_get_dwarf_info(TCCState *s1, Sym *s)
|
||||||
}
|
}
|
||||||
else if (type == (VT_PTR | VT_ARRAY)) {
|
else if (type == (VT_PTR | VT_ARRAY)) {
|
||||||
int sib_pos, sub_type;
|
int sib_pos, sub_type;
|
||||||
Sym sym = {0}; sym .type.t = VT_INT | VT_UNSIGNED ;
|
#if LONG_SIZE == 4
|
||||||
|
Sym sym = {0}; sym.type.t = VT_LONG | VT_INT | VT_UNSIGNED;
|
||||||
|
#else
|
||||||
|
Sym sym = {0}; sym.type.t = VT_LLONG | VT_LONG | VT_UNSIGNED;
|
||||||
|
#endif
|
||||||
|
|
||||||
sub_type = tcc_get_dwarf_info(s1, &sym);
|
sub_type = tcc_get_dwarf_info(s1, &sym);
|
||||||
i = dwarf_info_section->data_offset;
|
i = dwarf_info_section->data_offset;
|
||||||
|
@ -1761,6 +1781,7 @@ ST_FUNC void tcc_debug_funcstart(TCCState *s1, Sym *sym)
|
||||||
|
|
||||||
if (s1->dwarf) {
|
if (s1->dwarf) {
|
||||||
tcc_debug_line(s1);
|
tcc_debug_line(s1);
|
||||||
|
dwarf_line_op(s1, DW_LNS_copy);
|
||||||
dwarf_info.func = sym;
|
dwarf_info.func = sym;
|
||||||
dwarf_info.line = file->line_num;
|
dwarf_info.line = file->line_num;
|
||||||
if (s1->do_backtrace) {
|
if (s1->do_backtrace) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue