get line numbers working on link and fix a bug in the creation of aux

functions
This commit is contained in:
Bill Currie 2002-07-17 14:19:30 +00:00
parent bff6291bfb
commit 34da93f251
8 changed files with 81 additions and 69 deletions

View File

@ -34,15 +34,6 @@
#include "QF/pr_debug.h" #include "QF/pr_debug.h"
extern int num_auxfunctions;
extern pr_auxfunction_t *auxfunctions;
extern int num_linenos;
extern pr_lineno_t *linenos;
extern int num_locals;
extern struct ddef_s *locals;
pr_auxfunction_t *new_auxfunction (void); pr_auxfunction_t *new_auxfunction (void);
pr_lineno_t *new_lineno (void); pr_lineno_t *new_lineno (void);
struct ddef_s *new_local (void); struct ddef_s *new_local (void);

View File

@ -67,6 +67,18 @@ typedef struct pr_info_s {
int error_count; int error_count;
struct reloc_s *relocs; struct reloc_s *relocs;
struct pr_auxfunction_s *auxfunctions;
int auxfunctions_size;
int num_auxfunctions;
struct pr_lineno_s *linenos;
int linenos_size;
int num_linenos;
ddef_t *locals;
int locals_size;
int num_locals;
} pr_info_t; } pr_info_t;
extern pr_info_t pr; extern pr_info_t pr;

View File

@ -44,50 +44,41 @@ static const char rcsid[] =
#include "QF/pr_comp.h" #include "QF/pr_comp.h"
#include "debug.h" #include "debug.h"
#include "qfcc.h"
static int auxfunctions_size;
int num_auxfunctions;
pr_auxfunction_t *auxfunctions;
static int linenos_size;
int num_linenos;
pr_lineno_t *linenos;
static int locals_size;
int num_locals;
ddef_t *locals;
pr_auxfunction_t * pr_auxfunction_t *
new_auxfunction (void) new_auxfunction (void)
{ {
if (num_auxfunctions == auxfunctions_size) { if (pr.num_auxfunctions == pr.auxfunctions_size) {
auxfunctions_size += 1024; pr.auxfunctions_size += 1024;
auxfunctions = realloc (auxfunctions, pr.auxfunctions = realloc (pr.auxfunctions,
auxfunctions_size * sizeof (pr_auxfunction_t)); pr.auxfunctions_size
* sizeof (pr_auxfunction_t));
} }
memset (&auxfunctions[num_auxfunctions], 0, memset (&pr.auxfunctions[pr.num_auxfunctions], 0,
sizeof (linenos[num_auxfunctions])); sizeof (pr_auxfunction_t));
return &auxfunctions[num_auxfunctions++]; return &pr.auxfunctions[pr.num_auxfunctions++];
} }
pr_lineno_t * pr_lineno_t *
new_lineno (void) new_lineno (void)
{ {
if (num_linenos == linenos_size) { if (pr.num_linenos == pr.linenos_size) {
linenos_size += 1024; pr.linenos_size += 1024;
linenos = realloc (linenos, linenos_size * sizeof (pr_lineno_t)); pr.linenos = realloc (pr.linenos,
pr.linenos_size * sizeof (pr_lineno_t));
} }
memset (&linenos[num_linenos], 0, sizeof (linenos[num_linenos])); memset (&pr.linenos[pr.num_linenos], 0, sizeof (pr_lineno_t));
return &linenos[num_linenos++]; return &pr.linenos[pr.num_linenos++];
} }
ddef_t * ddef_t *
new_local (void) new_local (void)
{ {
if (num_locals == locals_size) { if (pr.num_locals == pr.locals_size) {
locals_size += 1024; pr.locals_size += 1024;
locals = realloc (locals, locals_size * sizeof (ddef_t)); pr.locals = realloc (pr.locals, pr.locals_size * sizeof (ddef_t));
} }
memset (&locals[num_locals], 0, sizeof (locals[num_locals])); memset (&pr.locals[pr.num_locals], 0, sizeof (ddef_t));
return &locals[num_locals++]; return &pr.locals[pr.num_locals++];
} }

View File

@ -123,7 +123,7 @@ emit_statement (expr_t *e, opcode_t *op, def_t *var_a, def_t *var_b,
if (options.code.debug) { if (options.code.debug) {
int line = (e ? e->line : pr.source_line) - lineno_base; int line = (e ? e->line : pr.source_line) - lineno_base;
if (line != linenos[num_linenos - 1].line) { if (line != pr.linenos[pr.num_linenos - 1].line) {
pr_lineno_t *lineno = new_lineno (); pr_lineno_t *lineno = new_lineno ();
lineno->line = line; lineno->line = line;

View File

@ -52,6 +52,7 @@ static const char rcsid[] =
#include "function.h" #include "function.h"
#include "immediate.h" #include "immediate.h"
#include "opcodes.h" #include "opcodes.h"
#include "options.h"
#include "reloc.h" #include "reloc.h"
#include "type.h" #include "type.h"
@ -181,6 +182,8 @@ new_function (const char *name)
f->function_num = pr.num_functions++; f->function_num = pr.num_functions++;
f->s_name = ReuseString (name); f->s_name = ReuseString (name);
f->s_file = pr.source_file; f->s_file = pr.source_file;
if (options.code.debug)
f->aux = new_auxfunction ();
return f; return f;
} }
@ -224,6 +227,7 @@ finish_function (function_t *f)
if (f->aux) { if (f->aux) {
def_t *def; def_t *def;
f->aux->function = f->function_num; f->aux->function = f->function_num;
if (f->scope) {
for (def = f->scope->head; def; def = def->def_next) { for (def = f->scope->head; def; def = def->def_next) {
if (def->name) { if (def->name) {
ddef_t *d = new_local (); ddef_t *d = new_local ();
@ -236,6 +240,7 @@ finish_function (function_t *f)
} }
} }
} }
}
void void
emit_function (function_t *f, expr_t *e) emit_function (function_t *f, expr_t *e)

View File

@ -490,12 +490,11 @@ begin_function
$$->code = pr.code->size; $$->code = pr.code->size;
if (options.code.debug) { if (options.code.debug) {
pr_lineno_t *lineno = new_lineno (); pr_lineno_t *lineno = new_lineno ();
$$->aux = new_auxfunction ();
$$->aux->source_line = pr.source_line; $$->aux->source_line = pr.source_line;
$$->aux->line_info = lineno - linenos; $$->aux->line_info = lineno - pr.linenos;
$$->aux->local_defs = num_locals; $$->aux->local_defs = pr.num_locals;
lineno->fa.func = $$->aux - auxfunctions; lineno->fa.func = $$->aux - pr.auxfunctions;
} }
build_scope ($$, current_def, current_params); build_scope ($$, current_def, current_params);
current_scope = $$->scope; current_scope = $$->scope;

View File

@ -296,32 +296,33 @@ WriteData (int crc)
SafeWrite (h, &debug, sizeof (debug)); SafeWrite (h, &debug, sizeof (debug));
debug.auxfunctions = LittleLong (ftell (h)); debug.auxfunctions = LittleLong (ftell (h));
debug.num_auxfunctions = LittleLong (num_auxfunctions); debug.num_auxfunctions = LittleLong (pr.num_auxfunctions);
for (i = 0; i < num_auxfunctions; i++) { for (i = 0; i < pr.num_auxfunctions; i++) {
auxfunctions[i].function = LittleLong (auxfunctions[i].function); pr.auxfunctions[i].function = LittleLong (pr.auxfunctions[i].function);
auxfunctions[i].source_line = LittleLong (auxfunctions[i].source_line); pr.auxfunctions[i].source_line = LittleLong (pr.auxfunctions[i].source_line);
auxfunctions[i].line_info = LittleLong (auxfunctions[i].line_info); pr.auxfunctions[i].line_info = LittleLong (pr.auxfunctions[i].line_info);
auxfunctions[i].local_defs = LittleLong (auxfunctions[i].local_defs); pr.auxfunctions[i].local_defs = LittleLong (pr.auxfunctions[i].local_defs);
auxfunctions[i].num_locals = LittleLong (auxfunctions[i].num_locals); pr.auxfunctions[i].num_locals = LittleLong (pr.auxfunctions[i].num_locals);
} }
SafeWrite (h, auxfunctions, num_auxfunctions * sizeof (auxfunctions[0])); SafeWrite (h, pr.auxfunctions,
pr.num_auxfunctions * sizeof (pr_auxfunction_t));
debug.linenos = LittleLong (ftell (h)); debug.linenos = LittleLong (ftell (h));
debug.num_linenos = LittleLong (num_linenos); debug.num_linenos = LittleLong (pr.num_linenos);
for (i = 0; i < num_linenos; i++) { for (i = 0; i < pr.num_linenos; i++) {
linenos[i].fa.addr = LittleLong (linenos[i].fa.addr); pr.linenos[i].fa.addr = LittleLong (pr.linenos[i].fa.addr);
linenos[i].line = LittleLong (linenos[i].line); pr.linenos[i].line = LittleLong (pr.linenos[i].line);
} }
SafeWrite (h, linenos, num_linenos * sizeof (linenos[0])); SafeWrite (h, pr.linenos, pr.num_linenos * sizeof (pr_lineno_t));
debug.locals = LittleLong (ftell (h)); debug.locals = LittleLong (ftell (h));
debug.num_locals = LittleLong (num_locals); debug.num_locals = LittleLong (pr.num_locals);
for (i = 0; i < num_locals; i++) { for (i = 0; i < pr.num_locals; i++) {
locals[i].type = LittleShort (locals[i].type); pr.locals[i].type = LittleShort (pr.locals[i].type);
locals[i].ofs = LittleShort (locals[i].ofs); pr.locals[i].ofs = LittleShort (pr.locals[i].ofs);
locals[i].s_name = LittleLong (locals[i].s_name); pr.locals[i].s_name = LittleLong (pr.locals[i].s_name);
} }
SafeWrite (h, locals, num_locals * sizeof (locals[0])); SafeWrite (h, pr.locals, pr.num_locals * sizeof (ddef_t));
fseek (h, 0, SEEK_SET); fseek (h, 0, SEEK_SET);
SafeWrite (h, &debug, sizeof (debug)); SafeWrite (h, &debug, sizeof (debug));

View File

@ -155,6 +155,18 @@ dump_relocs (qfo_t *qfo)
} }
} }
void
dump_lines (qfo_t *qfo)
{
pr_lineno_t *line;
int i;
for (i = 0; i < qfo->num_lines; i++) {
line = qfo->lines + i;
printf ("%5d %5d %d\n", i, line->fa.addr, line->line);
}
}
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
@ -174,6 +186,7 @@ main (int argc, char **argv)
dump_defs (qfo); dump_defs (qfo);
dump_funcs (qfo); dump_funcs (qfo);
dump_relocs (qfo); dump_relocs (qfo);
dump_lines (qfo);
} }
return 0; return 0;
} }