commit 0d9b48883997b5c93d30155895e6d8e6ca7052c7
Merge: 6cb68c3 949e634
Author: Michael Matz
Date: Mon Dec 16 05:39:37 2019 +0100
WIP on mob: 6cb68c3 arm64: fix some casts
diff --cc tcc.h
index 30f7eb9,30f7eb9..7164a76
--- a/tcc.h
+++ b/tcc.h
@@@ -1488,8 -1488,8 +1488,10 @@@ ST_FUNC int find_elf_sym(Section *s, co
ST_FUNC void put_elf_reloc(Section *symtab, Section *s, unsigned long offset, int type, int symbol);
ST_FUNC void put_elf_reloca(Section *symtab, Section *s, unsigned long offset, int type, int symbol, addr_t addend);
++ST_FUNC void put_stab(TCCState *s1, unsigned strndx, int type, int other, int desc, unsigned long value);
ST_FUNC void put_stabs(TCCState *s1, const char *str, int type, int other, int desc, unsigned long value);
--ST_FUNC void put_stabs_r(TCCState *s1, const char *str, int type, int other, int desc, unsigned long value, Section *sec, int sym_index);
++ST_FUNC void put_stab_r(TCCState *s1, unsigned strndx, int type, int other, int desc, unsigned long value, int sym_index);
++ST_FUNC void put_stabs_r(TCCState *s1, const char *str, int type, int other, int desc, unsigned long value, int sym_index);
ST_FUNC void put_stabn(TCCState *s1, int type, int other, int desc, int value);
ST_FUNC void resolve_common_syms(TCCState *s1);
diff --cc tccelf.c
index 9d7391c,9d7391c..c32a3d4
--- a/tccelf.c
+++ b/tccelf.c
@@@ -781,25 -781,25 +781,37 @@@ ST_FUNC void squeeze_multi_relocs(Secti
/* put stab debug information */
--ST_FUNC void put_stabs(TCCState *s1, const char *str, int type, int other, int desc,
-- unsigned long value)
++ST_FUNC void put_stab(TCCState *s1, unsigned strndx, int type, int other,
++ int desc, unsigned long value)
{
Stab_Sym *sym;
sym = section_ptr_add(stab_section, sizeof(Stab_Sym));
-- if (str) {
-- sym->n_strx = put_elf_str(stab_section->link, str);
-- } else {
-- sym->n_strx = 0;
-- }
++ sym->n_strx = strndx;
sym->n_type = type;
sym->n_other = other;
sym->n_desc = desc;
sym->n_value = value;
}
--ST_FUNC void put_stabs_r(TCCState *s1, const char *str, int type, int other, int desc,
-- unsigned long value, Section *sec, int sym_index)
++ST_FUNC void put_stabs(TCCState *s1, const char *str, int type, int other,
++ int desc, unsigned long value)
++{
++ put_stab(s1, str ? put_elf_str(stab_section->link, str) : 0,
++ type, other, desc, value);
++}
++
++ST_FUNC void put_stab_r(TCCState *s1, unsigned strndx, int type, int other,
++ int desc, unsigned long value, int sym_index)
++{
++ put_stab(s1, strndx, type, other, desc, value);
++ put_elf_reloc(symtab_section, stab_section,
++ stab_section->data_offset - sizeof(unsigned int),
++ R_DATA_32, sym_index);
++}
++
++ST_FUNC void put_stabs_r(TCCState *s1, const char *str, int type, int other,
++ int desc, unsigned long value, int sym_index)
{
put_stabs(s1, str, type, other, desc, value);
put_elf_reloc(symtab_section, stab_section,
@@@ -809,7 -809,7 +821,7 @@@
ST_FUNC void put_stabn(TCCState *s1, int type, int other, int desc, int value)
{
-- put_stabs(s1, NULL, type, other, desc, value);
++ put_stab(s1, 0, type, other, desc, value);
}
ST_FUNC struct sym_attr *get_sym_attr(TCCState *s1, int index, int alloc)
diff --cc tccgen.c
index 1d1fe8a,1d1fe8a..4340e3d
--- a/tccgen.c
+++ b/tccgen.c
@@@ -216,9 -216,9 +216,10 @@@ ST_FUNC void tcc_debug_start(TCCState *
#endif
pstrcat(buf, sizeof(buf), "/");
put_stabs_r(s1, buf, N_SO, 0, 0,
-- text_section->data_offset, text_section, section_sym);
++ text_section->data_offset, section_sym);
put_stabs_r(s1, file->prev->filename, N_SO, 0, 0,
-- text_section->data_offset, text_section, section_sym);
++ text_section->data_offset, section_sym);
++ put_stabs(s1, "int:t1=r1;-2147483648;2147483647;", N_LSYM, 0, 0, 0);
new_file = last_line_num = 0;
func_ind = -1;
/* we're currently 'including' the */
@@@ -238,7 -238,7 +239,7 @@@ ST_FUNC void tcc_debug_end(TCCState *s1
if (!s1->do_debug)
return;
put_stabs_r(s1, NULL, N_SO, 0, 0,
-- text_section->data_offset, text_section, section_sym);
++ text_section->data_offset, section_sym);
}
static BufferedFile* put_new_file(TCCState *s1)
@@@ -248,7 -248,7 +249,7 @@@
if (f->filename[0] == ':')
f = f->prev;
if (f && new_file) {
-- put_stabs_r(s1, f->filename, N_SOL, 0, 0, ind, text_section, section_sym);
++ put_stabs_r(s1, f->filename, N_SOL, 0, 0, ind, section_sym);
new_file = last_line_num = 0;
}
return f;
@@@ -268,11 -268,11 +269,88 @@@ ST_FUNC void tcc_debug_line(TCCState *s
put_stabn(s1, N_SLINE, 0, f->line_num, ind - func_ind);
} else {
/* from tcc_assemble */
-- put_stabs_r(s1, NULL, N_SLINE, 0, f->line_num, ind, text_section, section_sym);
++ put_stabs_r(s1, NULL, N_SLINE, 0, f->line_num, ind, section_sym);
}
last_line_num = f->line_num;
}
++struct Dbgblock {
++ int sind, eind; /* start and end ind */
++ int nvars, avars; /* count and alloced vars */
++ struct Dbgvar {
++ unsigned char type;
++ unsigned int value;
++ unsigned int strndx;
++ } *vars;
++ struct Dbgblock *child, *next, *parent;
++};
++static struct Dbgblock *dbgblock, *rootdbgblock;
++static void dbg_open_block(void)
++{
++ struct Dbgblock *b = tcc_mallocz(sizeof *b);
++ b->sind = ind;
++ b->parent = dbgblock;
++ if (dbgblock) {
++ b->next = dbgblock->child;
++ dbgblock->child = b;
++ } else
++ rootdbgblock = b;
++ dbgblock = b;
++}
++
++static void dbg_close_block(void)
++{
++ dbgblock->eind = ind;
++ dbgblock = dbgblock->parent;
++}
++
++static void dbg_add_var(unsigned char type, unsigned value, unsigned strndx)
++{
++ struct Dbgvar *d;
++ if (dbgblock->nvars == dbgblock->avars) {
++ dbgblock->vars = tcc_realloc(dbgblock->vars, (1 + 2 * dbgblock->avars) * sizeof(dbgblock->vars[0]));
++ memset(dbgblock->vars + dbgblock->nvars, 0, (1 + dbgblock->avars) * sizeof(dbgblock->vars[0]));
++ dbgblock->avars = 1 + 2 * dbgblock->avars;
++ }
++ d = dbgblock->vars + dbgblock->nvars++;
++ d->type = type;
++ d->value = value;
++ d->strndx = strndx;
++}
++
++static void dbg_add_funcstabs(void)
++{
++ struct Dbgblock *b, *n;
++ if (dbgblock)
++ tcc_error("huh");
++ for (b = rootdbgblock; b;) {
++ int i;
++ for (i = b->nvars; i--;) {
++ if (b->vars[i].type == N_LCSYM || b->vars[i].type == N_STSYM)
++ put_stab_r(tcc_state, b->vars[i].strndx, b->vars[i].type, 0, 0, 0, b->vars[i].value);
++ else
++ put_stab(tcc_state, b->vars[i].strndx, b->vars[i].type, 0, 0, b->vars[i].value);
++ }
++ tcc_free(b->vars);
++ b->nvars = 0;
++ b->vars = NULL;
++ put_stabn(tcc_state, N_LBRAC, 0, 0, b->sind - func_ind);
++ n = b->child;
++ if (!n) {
++ while (1) {
++ put_stabn(tcc_state, N_RBRAC, 0, 0, b->eind - func_ind);
++ if ((n = b->next) || !(n = b->parent))
++ break;
++ tcc_free(b);
++ b = n;
++ }
++ tcc_free(b);
++ }
++ b = n;
++ }
++ rootdbgblock = NULL;
++}
++
/* put function symbol */
ST_FUNC void tcc_debug_funcstart(TCCState *s1, Sym *sym)
{
@@@ -283,8 -283,8 +361,9 @@@
/* XXX: we put here a dummy type */
snprintf(buf, sizeof(buf), "%s:%c1",
funcname, sym->type.t & VT_STATIC ? 'f' : 'F');
-- put_stabs_r(s1, buf, N_FUN, 0, f->line_num, 0, cur_text_section, sym->c);
++ put_stabs_r(s1, buf, N_FUN, 0, f->line_num, 0, sym->c);
tcc_debug_line(s1);
++ dbg_open_block();
}
/* put function size */
@@@ -292,6 -292,6 +371,8 @@@ ST_FUNC void tcc_debug_funcend(TCCStat
{
if (!s1->do_debug)
return;
++ dbg_close_block();
++ dbg_add_funcstabs();
#if 0 // this seems to confuse gnu tools
put_stabn(s1, N_FUN, 0, 0, size);
#endif
@@@ -324,6 -324,6 +405,37 @@@ ST_FUNC void tcc_debug_eincl(TCCState *
new_file = 1;
}
++static CString stabstr;
++static void tcc_debug_sym(Sym *sym)
++{
++ unsigned char type;
++ unsigned strndx;
++ unsigned long value;
++ char *symdesc = "";
++ if (!tcc_state->do_debug)
++ return;
++ cstr_reset(&stabstr);
++ value = 0;
++ if ((sym->r & VT_VALMASK) == VT_LOCAL) {
++ type = N_LSYM, value = (unsigned)sym->c;
++ } else if (sym->type.t & VT_STATIC) {
++ ElfSym *esym = elfsym(sym);
++ symdesc = sym->sym_scope ? "V" : "S";
++ type = esym->st_shndx == bss_section->sh_num ? N_LCSYM : N_STSYM;
++ value = sym->c; /* symindex for reloc */
++ } else {
++ type = N_GSYM;
++ symdesc = "G";
++ }
++ cstr_printf(&stabstr, "%s:%s%d", get_tok_str(sym->v, NULL), symdesc, 1);
++ strndx = put_elf_str(stab_section->link, stabstr.data);
++ if (dbgblock)
++ dbg_add_var(type, value, strndx);
++ else if (type == N_LCSYM || type == N_STSYM)
++ put_stab_r(tcc_state, strndx, type, 0, 0, 0, value);
++ else
++ put_stab(tcc_state, strndx, type, 0, 0, value);
++}
/* ------------------------------------------------------------------------- */
ST_FUNC int tccgen_compile(TCCState *s1)
{
@@@ -6441,6 -6441,6 +6553,9 @@@ void new_scope(struct scope *o
o->llstk = local_label_stack;
++local_scope;
++
++ if (tcc_state->do_debug)
++ dbg_open_block();
}
void prev_scope(struct scope *o, int is_expr)
@@@ -6450,6 -6450,6 +6565,9 @@@
if (o->cl.s != o->prev->cl.s)
block_cleanup(o->prev);
++ if (tcc_state->do_debug)
++ dbg_close_block();
++
/* pop locally defined labels */
label_pop(&local_label_stack, o->llstk, is_expr);
@@@ -7616,6 -7616,6 +7734,8 @@@ static void decl_initializer_alloc(CTyp
}
#endif
}
++ if (v && sym)
++ tcc_debug_sym(sym);
if (type->t & VT_VLA) {
int a;