mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-17 01:11:45 +00:00
more linking fixes
This commit is contained in:
parent
ce8f071b7c
commit
24d473c386
5 changed files with 26 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue