more linking fixes

This commit is contained in:
Bill Currie 2002-07-12 06:17:24 +00:00
parent ce8f071b7c
commit 24d473c386
5 changed files with 26 additions and 9 deletions

View file

@ -51,6 +51,7 @@ typedef struct def_s {
unsigned managed:1; // managed temp
unsigned global:1; // globally declared def
unsigned external:1; // externally declared def
unsigned local:1; // function local def
string_t file; // source file
int line; // source line

View file

@ -36,7 +36,7 @@
#include "QF/pr_debug.h"
#define QFO "QFO"
#define QFO_VERSION 0x00001002 // MMmmmRRR 0.001.002 (hex)
#define QFO_VERSION 0x00001003 // MMmmmRRR 0.001.002 (hex)
typedef struct qfo_header_s {
char qfo[4];
@ -100,6 +100,7 @@ typedef struct qfo_function_s {
typedef struct qfo_reloc_s {
int ofs;
int type;
int def;
} qfo_reloc_t;
typedef struct qfo_s {

View file

@ -152,16 +152,22 @@ set_storage_bits (def_t *def, storage_class_t storage)
case st_global:
def->global = 1;
def->external = 0;
def->local = 0;
break;
case st_extern:
def->global = 1;
def->external = 1;
def->local = 0;
break;
case st_static:
def->external = 0;
def->global = 0;
def->local = 0;
break;
case st_local:
def->external = 0;
def->global = 0;
def->local = 1;
break;
}
def->initialized = 0;
@ -362,6 +368,7 @@ get_tempdef (type_t *type, scope_t *scope)
}
def->freed = def->removed = def->users = 0;
def->next = temp_scope.next;
set_storage_bits (def, st_local);
temp_scope.next = def;
return def;
}

View file

@ -162,7 +162,7 @@ add_defs (qfo_t *qfo)
def->full_type = strpool_addstr (type_strings,
qfo->types + def->full_type);
def->name = strpool_addstr (strings, qfo->strings + def->name);
if (!(def->flags & (QFOD_LOCAL | QFOD_ABSOLUTE))) {
if (!(def->flags & (QFOD_LOCAL | QFOD_EXTERNAL | QFOD_ABSOLUTE))) {
def->ofs += data_base;
}
def->relocs += reloc_base;
@ -171,11 +171,11 @@ add_defs (qfo_t *qfo)
if (def->flags & QFOD_EXTERNAL) {
if ((d = Hash_Find (defined_defs, strings->strings + def->name))) {
def->ofs = d->ofs;
def->flags = d->flags;
} else {
Hash_Add (extern_defs, def);
}
} else {
if (def->flags & QFOD_GLOBAL) {
if ((d = Hash_Find (defined_defs,
strings->strings + def->name))) {
@ -184,8 +184,6 @@ add_defs (qfo_t *qfo)
error (0, "%s redefined", strings->strings + def->name);
}
}
if (def->ofs)
def->ofs += data_base;
if (def->flags & QFOD_GLOBAL) {
while ((d = Hash_Find (extern_defs,
strings->strings + def->name))) {
@ -199,6 +197,7 @@ add_defs (qfo_t *qfo)
continue;
}
d->ofs = def->ofs;
d->flags = def->flags;
}
Hash_Add (defined_defs, def);
}
@ -265,6 +264,11 @@ fixup_relocs (qfo_t *qfo)
for (reloc = relocs.relocs + reloc_base;
reloc - relocs.relocs < relocs.num_relocs;
reloc++) {
if (reloc->def != -1
&& ((defs.defs[reloc->def].flags & QFOD_EXTERNAL)
|| (defs.defs[reloc->def].flags & QFOD_LOCAL)
|| (defs.defs[reloc->def].flags & QFOD_ABSOLUTE)))
continue;
switch ((reloc_type)reloc->type) {
case rel_none:
break;

View file

@ -129,15 +129,18 @@ flags (def_t *d)
flags |= QFOD_GLOBAL;
if (d->external)
flags |= QFOD_EXTERNAL;
if (d->local)
flags |= QFOD_LOCAL;
return flags;
}
static void
write_relocs (reloc_t *r, qfo_reloc_t **reloc)
write_relocs (reloc_t *r, qfo_reloc_t **reloc, int def)
{
while (r) {
(*reloc)->ofs = LittleLong (r->ofs);
(*reloc)->type = LittleLong (r->type);
(*reloc)->def = LittleLong (def);
(*reloc)++;
r = r->next;
}
@ -156,7 +159,7 @@ write_def (def_t *d, qfo_def_t *def, qfo_reloc_t **reloc)
def->flags = LittleLong (flags (d));
def->file = LittleLong (d->file);
def->line = LittleLong (d->line);
write_relocs (d->refs, reloc);
write_relocs (d->refs, reloc, d->obj_def);
}
static void
@ -195,13 +198,13 @@ setup_data (void)
func->num_parms = LittleLong (function_parms (f, func->parm_size));
func->relocs = LittleLong (reloc - relocs);
func->num_relocs = LittleLong (count_relocs (f->refs));
write_relocs (f->refs, &reloc);
write_relocs (f->refs, &reloc, -1);
if (f->scope)
for (d = f->scope->head; d; d = d->def_next)
write_def (d, def++, &reloc);
}
write_relocs (pr.relocs, &reloc);
write_relocs (pr.relocs, &reloc, -1);
for (st = pr.code->code; st - pr.code->code < pr.code->size; st++) {
st->op = LittleLong (st->op);
st->a = LittleLong (st->a);
@ -484,6 +487,7 @@ qfo_to_progs (qfo_t *qfo, pr_info_t *pr)
pd->absolute = (qd->flags & QFOD_ABSOLUTE) != 0;
pd->global = (qd->flags & QFOD_GLOBAL) != 0;
pd->external = (qd->flags & QFOD_EXTERNAL) != 0;
pd->local = (qd->flags & QFOD_LOCAL) != 0;
pd->file = qd->file;
pd->line = qd->line;
}