mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-04-12 18:40:23 +08:00
Upgrade label functions to 64-bit
This commit is contained in:
parent
9c98769a33
commit
4e8563d5c4
3
eval.c
3
eval.c
@ -666,7 +666,8 @@ static expr *expr6(int critical)
|
||||
{
|
||||
int32_t type;
|
||||
expr *e;
|
||||
int32_t label_seg, label_ofs;
|
||||
int32_t label_seg;
|
||||
int64_t label_ofs;
|
||||
|
||||
switch (i) {
|
||||
case '-':
|
||||
|
12
labels.c
12
labels.c
@ -59,12 +59,14 @@
|
||||
|
||||
union label { /* actual label structures */
|
||||
struct {
|
||||
int32_t segment, offset;
|
||||
int32_t segment;
|
||||
int64_t offset;
|
||||
char *label, *special;
|
||||
int is_global, is_norm;
|
||||
} defn;
|
||||
struct {
|
||||
int32_t movingon, dummy;
|
||||
int32_t movingon;
|
||||
int64_t dummy;
|
||||
union label *next;
|
||||
} admin;
|
||||
};
|
||||
@ -146,7 +148,7 @@ static union label *find_label(char *label, int create)
|
||||
return lfree++;
|
||||
}
|
||||
|
||||
bool lookup_label(char *label, int32_t *segment, int32_t *offset)
|
||||
bool lookup_label(char *label, int32_t *segment, int64_t *offset)
|
||||
{
|
||||
union label *lptr;
|
||||
|
||||
@ -173,7 +175,7 @@ bool is_extern(char *label)
|
||||
return (lptr && (lptr->defn.is_global & EXTERN_BIT));
|
||||
}
|
||||
|
||||
void redefine_label(char *label, int32_t segment, int32_t offset, char *special,
|
||||
void redefine_label(char *label, int32_t segment, int64_t offset, char *special,
|
||||
bool is_norm, bool isextrn, struct ofmt *ofmt,
|
||||
efunc error)
|
||||
{
|
||||
@ -246,7 +248,7 @@ void redefine_label(char *label, int32_t segment, int32_t offset, char *special,
|
||||
/* if (pass0 == 1) */
|
||||
}
|
||||
|
||||
void define_label(char *label, int32_t segment, int32_t offset, char *special,
|
||||
void define_label(char *label, int32_t segment, int64_t offset, char *special,
|
||||
bool is_norm, bool isextrn, struct ofmt *ofmt, efunc error)
|
||||
{
|
||||
union label *lptr;
|
||||
|
6
labels.h
6
labels.h
@ -12,12 +12,12 @@
|
||||
extern char lprefix[PREFIX_MAX];
|
||||
extern char lpostfix[PREFIX_MAX];
|
||||
|
||||
bool lookup_label(char *label, int32_t *segment, int32_t *offset);
|
||||
bool lookup_label(char *label, int32_t *segment, int64_t *offset);
|
||||
bool is_extern(char *label);
|
||||
void define_label(char *label, int32_t segment, int32_t offset, char *special,
|
||||
void define_label(char *label, int32_t segment, int64_t offset, char *special,
|
||||
bool is_norm, bool isextrn, struct ofmt *ofmt,
|
||||
efunc error);
|
||||
void redefine_label(char *label, int32_t segment, int32_t offset, char *special,
|
||||
void redefine_label(char *label, int32_t segment, int64_t offset, char *special,
|
||||
bool is_norm, bool isextrn, struct ofmt *ofmt,
|
||||
efunc error);
|
||||
void define_common(char *label, int32_t segment, int32_t size, char *special,
|
||||
|
8
nasm.h
8
nasm.h
@ -60,7 +60,7 @@ struct ofmt;
|
||||
/*
|
||||
* A label-lookup function should look like this.
|
||||
*/
|
||||
typedef bool (*lfunc) (char *label, int32_t *segment, int32_t *offset);
|
||||
typedef bool (*lfunc) (char *label, int32_t *segment, int64_t *offset);
|
||||
|
||||
/*
|
||||
* And a label-definition function like this. The boolean parameter
|
||||
@ -68,7 +68,7 @@ typedef bool (*lfunc) (char *label, int32_t *segment, int32_t *offset);
|
||||
* should affect the local-label system), or something odder like
|
||||
* an EQU or a segment-base symbol, which shouldn't.
|
||||
*/
|
||||
typedef void (*ldfunc) (char *label, int32_t segment, int32_t offset,
|
||||
typedef void (*ldfunc) (char *label, int32_t segment, int64_t offset,
|
||||
char *special, bool is_norm, bool isextrn,
|
||||
struct ofmt * ofmt, efunc error);
|
||||
|
||||
@ -740,7 +740,7 @@ struct ofmt {
|
||||
* been an EXTERN, a COMMON or a GLOBAL. The distinction should
|
||||
* be obvious to the output format from the other parameters.
|
||||
*/
|
||||
void (*symdef) (char *name, int32_t segment, int32_t offset,
|
||||
void (*symdef) (char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special);
|
||||
|
||||
/*
|
||||
@ -887,7 +887,7 @@ struct dfmt {
|
||||
* would be called before the output format version.
|
||||
*/
|
||||
|
||||
void (*debug_deflabel) (char *name, int32_t segment, int32_t offset,
|
||||
void (*debug_deflabel) (char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special);
|
||||
/*
|
||||
* debug_directive - called whenever a DEBUG directive other than 'LINE'
|
||||
|
@ -896,7 +896,7 @@ void null_debug_linenum(const char *filename, int32_t linenumber, int32_t segto)
|
||||
(void)linenumber;
|
||||
(void)segto;
|
||||
}
|
||||
void null_debug_deflabel(char *name, int32_t segment, int32_t offset,
|
||||
void null_debug_deflabel(char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special)
|
||||
{
|
||||
(void)name;
|
||||
|
@ -245,7 +245,7 @@ static int32_t aout_section_names(char *name, int pass, int *bits)
|
||||
return NO_SEG;
|
||||
}
|
||||
|
||||
static void aout_deflabel(char *name, int32_t segment, int32_t offset,
|
||||
static void aout_deflabel(char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special)
|
||||
{
|
||||
int pos = strslen + 4;
|
||||
|
@ -173,7 +173,7 @@ static int as86_add_string(char *name)
|
||||
return pos;
|
||||
}
|
||||
|
||||
static void as86_deflabel(char *name, int32_t segment, int32_t offset,
|
||||
static void as86_deflabel(char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special)
|
||||
{
|
||||
struct Symbol *sym;
|
||||
|
@ -662,7 +662,8 @@ static void bin_cleanup(int debuginfo)
|
||||
}
|
||||
/* Display symbols information. */
|
||||
if (map_control & MAP_SYMBOLS) {
|
||||
int32_t segment, offset;
|
||||
int32_t segment;
|
||||
int64_t offset;
|
||||
|
||||
fprintf(rf, "-- Symbols ");
|
||||
for (h = 68; h; h--)
|
||||
@ -675,7 +676,7 @@ static void bin_cleanup(int debuginfo)
|
||||
fprintf(rf, "\n\nValue Name\n");
|
||||
for (l = no_seg_labels; l; l = l->next) {
|
||||
lookup_label(l->name, &segment, &offset);
|
||||
fprintf(rf, "%08"PRIX32" %s\n", offset, l->name);
|
||||
fprintf(rf, "%08"PRIX64" %s\n", offset, l->name);
|
||||
}
|
||||
fprintf(rf, "\n\n");
|
||||
}
|
||||
@ -839,7 +840,7 @@ static void bin_out(int32_t segto, const void *data, uint32_t type,
|
||||
}
|
||||
}
|
||||
|
||||
static void bin_deflabel(char *name, int32_t segment, int32_t offset,
|
||||
static void bin_deflabel(char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special)
|
||||
{
|
||||
(void)segment; /* Don't warn that this parameter is unused */
|
||||
|
@ -358,7 +358,7 @@ static int32_t coff_section_names(char *name, int pass, int *bits)
|
||||
return sects[i]->index;
|
||||
}
|
||||
|
||||
static void coff_deflabel(char *name, int32_t segment, int32_t offset,
|
||||
static void coff_deflabel(char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special)
|
||||
{
|
||||
int pos = strslen + 4;
|
||||
@ -845,7 +845,7 @@ static void coff_write_symbols(void)
|
||||
*/
|
||||
memset(filename, 0, 18); /* useful zeroed buffer */
|
||||
|
||||
for (i = 0; i < nsects; i++) {
|
||||
for (i = 0; i < (uint32_t) nsects; i++) {
|
||||
coff_symbol(sects[i]->name, 0L, 0L, i + 1, 3, 1);
|
||||
fwriteint32_t(sects[i]->len, coffp);
|
||||
fwriteint16_t(sects[i]->nrelocs, coffp);
|
||||
|
@ -207,7 +207,7 @@ static struct Symbol *lastsym;
|
||||
|
||||
void stabs32_init(struct ofmt *, void *, FILE *, efunc);
|
||||
void stabs32_linenum(const char *filename, int32_t linenumber, int32_t);
|
||||
void stabs32_deflabel(char *, int32_t, int32_t, int, char *);
|
||||
void stabs32_deflabel(char *, int32_t, int64_t, int, char *);
|
||||
void stabs32_directive(const char *, const char *);
|
||||
void stabs32_typevalue(int32_t);
|
||||
void stabs32_output(int, void *);
|
||||
@ -444,7 +444,7 @@ static int32_t elf_section_names(char *name, int pass, int *bits)
|
||||
return sects[i]->index;
|
||||
}
|
||||
|
||||
static void elf_deflabel(char *name, int32_t segment, int32_t offset,
|
||||
static void elf_deflabel(char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special)
|
||||
{
|
||||
int pos = strslen;
|
||||
@ -1375,7 +1375,7 @@ void stabs32_linenum(const char *filename, int32_t linenumber, int32_t segto)
|
||||
currentline = linenumber;
|
||||
}
|
||||
|
||||
void stabs32_deflabel(char *name, int32_t segment, int32_t offset, int is_global,
|
||||
void stabs32_deflabel(char *name, int32_t segment, int64_t offset, int is_global,
|
||||
char *special)
|
||||
{
|
||||
(void)name;
|
||||
|
@ -218,7 +218,7 @@ static struct Symbol *lastsym;
|
||||
|
||||
void stabs64_init(struct ofmt *, void *, FILE *, efunc);
|
||||
void stabs64_linenum(const char *filename, int32_t linenumber, int32_t);
|
||||
void stabs64_deflabel(char *, int32_t, int32_t, int, char *);
|
||||
void stabs64_deflabel(char *, int32_t, int64_t, int, char *);
|
||||
void stabs64_directive(const char *, const char *);
|
||||
void stabs64_typevalue(int32_t);
|
||||
void stabs64_output(int, void *);
|
||||
@ -456,7 +456,7 @@ static int32_t elf_section_names(char *name, int pass, int *bits)
|
||||
return sects[i]->index;
|
||||
}
|
||||
|
||||
static void elf_deflabel(char *name, int32_t segment, int32_t offset,
|
||||
static void elf_deflabel(char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special)
|
||||
{
|
||||
int pos = strslen;
|
||||
@ -1389,7 +1389,7 @@ void stabs64_linenum(const char *filename, int32_t linenumber, int32_t segto)
|
||||
currentline = linenumber;
|
||||
}
|
||||
|
||||
void stabs64_deflabel(char *name, int32_t segment, int32_t offset, int is_global,
|
||||
void stabs64_deflabel(char *name, int32_t segment, int64_t offset, int is_global,
|
||||
char *special)
|
||||
{
|
||||
(void)name;
|
||||
|
@ -255,7 +255,7 @@ static void ieee_cleanup(int debuginfo)
|
||||
* callback for labels
|
||||
*/
|
||||
static void ieee_deflabel(char *name, int32_t segment,
|
||||
int32_t offset, int is_global, char *special)
|
||||
int64_t offset, int is_global, char *special)
|
||||
{
|
||||
/*
|
||||
* We have three cases:
|
||||
@ -1348,7 +1348,7 @@ static void dbgls_linnum(const char *lnfname, int32_t lineno, int32_t segto)
|
||||
|
||||
}
|
||||
static void dbgls_deflabel(char *name, int32_t segment,
|
||||
int32_t offset, int is_global, char *special)
|
||||
int64_t offset, int is_global, char *special)
|
||||
{
|
||||
struct ieeeSection *seg;
|
||||
|
||||
|
@ -631,7 +631,7 @@ static int32_t macho_section(char *name, int pass, int *bits)
|
||||
return NO_SEG;
|
||||
}
|
||||
|
||||
static void macho_symdef(char *name, int32_t section, int32_t offset,
|
||||
static void macho_symdef(char *name, int32_t section, int64_t offset,
|
||||
int is_global, char *special)
|
||||
{
|
||||
struct symbol *sym;
|
||||
|
@ -726,7 +726,7 @@ static void obj_ext_set_defwrt(struct External *ext, char *id)
|
||||
}
|
||||
|
||||
static void obj_deflabel(char *name, int32_t segment,
|
||||
int32_t offset, int is_global, char *special)
|
||||
int64_t offset, int is_global, char *special)
|
||||
{
|
||||
/*
|
||||
* We have three cases:
|
||||
@ -2407,7 +2407,7 @@ static void dbgbi_linnum(const char *lnfname, int32_t lineno, int32_t segto)
|
||||
|
||||
}
|
||||
static void dbgbi_deflabel(char *name, int32_t segment,
|
||||
int32_t offset, int is_global, char *special)
|
||||
int64_t offset, int is_global, char *special)
|
||||
{
|
||||
struct Segment *seg;
|
||||
|
||||
|
@ -353,7 +353,7 @@ static void write_modname_rec(struct ModRec *r)
|
||||
/*
|
||||
* Handle export, import and common records.
|
||||
*/
|
||||
static void rdf2_deflabel(char *name, int32_t segment, int32_t offset,
|
||||
static void rdf2_deflabel(char *name, int32_t segment, int64_t offset,
|
||||
int is_global, char *special)
|
||||
{
|
||||
struct ExportRec r;
|
||||
|
Loading…
x
Reference in New Issue
Block a user