Pass 64-bit instruction lengths to back-ends.
authorCharles Crayne <chuck@thor.crayne.org>
Wed, 7 Nov 2007 05:48:12 +0000 (21:48 -0800)
committerCharles Crayne <chuck@thor.crayne.org>
Wed, 7 Nov 2007 05:48:12 +0000 (21:48 -0800)
13 files changed:
assemble.c
listing.c
nasm.h
output/outaout.c
output/outas86.c
output/outbin.c
output/outcoff.c
output/outelf32.c
output/outelf64.c
output/outieee.c
output/outmacho.c
output/outobj.c
output/outrdf2.c

index cd45f8e..80c95f1 100644 (file)
@@ -164,7 +164,7 @@ static void warn_overflow(int size, int64_t data)
  * generator at the same time.
  */
 static void out(int64_t offset, int32_t segto, const void *data,
-                uint32_t type, int32_t segment, int32_t wrt)
+                uint64_t type, int32_t segment, int32_t wrt)
 {
     static int32_t lineno = 0;     /* static!!! */
     static char *lnfname = NULL;
@@ -1334,7 +1334,7 @@ static void gencode(int32_t segment, int64_t offset, int bits,
             else
                 size = (bits == 16) ? 2 : 4;
             if (opx->segment != segment) {
-                int32_t reltype = (size == 2 ? OUT_REL2ADR : OUT_REL4ADR);
+                int64_t reltype = (size == 2 ? OUT_REL2ADR : OUT_REL4ADR);
                 data = opx->offset;
                 out(offset, segment, &data, reltype + insn_end - offset,
                     opx->segment, opx->wrt);
index 1844b53..4cec187 100644 (file)
--- a/listing.c
+++ b/listing.c
@@ -125,9 +125,9 @@ static void list_out(int32_t offset, char *str)
     strcat(listdata, str);
 }
 
-static void list_output(int32_t offset, const void *data, uint32_t type)
+static void list_output(int32_t offset, const void *data, uint64_t type)
 {
-    uint32_t typ, size;
+    uint64_t typ, size;
 
     if (!listp || suppress || user_nolist)      /* fbk - 9/2/00 */
         return;
@@ -208,7 +208,7 @@ static void list_output(int32_t offset, const void *data, uint32_t type)
         list_out(offset, q);
     } else if (typ == OUT_RESERVE) {
         char q[20];
-        snprintf(q, sizeof(q), "<res %08"PRIX32">", size);
+        snprintf(q, sizeof(q), "<res %08"PRIX64">", size);
         list_out(offset, q);
     }
 }
diff --git a/nasm.h b/nasm.h
index 42798f1..2c96a4c 100644 (file)
--- a/nasm.h
+++ b/nasm.h
@@ -100,7 +100,7 @@ typedef struct {
      * work with when doing things like uplevel(LIST_TIMES) or
      * uplevel(LIST_INCBIN).
      */
-    void (*output) (int32_t, const void *, uint32_t);
+    void (*output) (int32_t, const void *, uint64_t);
 
     /*
      * Called to send a text line to the listing generator. The
@@ -709,7 +709,7 @@ struct ofmt {
      * The `type' argument specifies the type of output data, and
      * usually the size as well: its contents are described below.
      */
-    void (*output) (int32_t segto, const void *data, uint32_t type,
+    void (*output) (int32_t segto, const void *data, uint64_t type,
                     int32_t segment, int32_t wrt);
 
     /*
@@ -840,13 +840,14 @@ struct ofmt {
  * OUT_RAWDATA, in which case it points to an "uint8_t"
  * array.
  */
-#define OUT_RAWDATA 0x00000000UL
-#define OUT_ADDRESS 0x10000000UL
-#define OUT_REL2ADR 0x20000000UL
-#define OUT_REL4ADR 0x30000000UL
-#define OUT_RESERVE 0x40000000UL
-#define OUT_TYPMASK 0xF0000000UL
-#define OUT_SIZMASK 0x0FFFFFFFUL
+#define OUT_RAWDATA (uint64_t)0x0000000000000000
+#define OUT_ADDRESS (uint64_t)0x1000000000000000
+#define OUT_REL2ADR (uint64_t)0x2000000000000000
+#define OUT_REL4ADR (uint64_t)0x3000000000000000
+#define OUT_RESERVE (uint64_t)0x4000000000000000
+#define OUT_REL8ADR (uint64_t)0x5000000000000000
+#define OUT_TYPMASK (uint64_t)0xF000000000000000
+#define OUT_SIZMASK (uint64_t)0x0FFFFFFFFFFFFFFF
 
 /*
  * ------------------------------------------------------------
index dae8d39..179635f 100644 (file)
@@ -568,7 +568,7 @@ static int32_t aout_add_gotoff_reloc(struct Section *sect, int32_t segment,
     return offset - asym->value;
 }
 
-static void aout_out(int32_t segto, const void *data, uint32_t type,
+static void aout_out(int32_t segto, const void *data, uint64_t type,
                      int32_t segment, int32_t wrt)
 {
     struct Section *s;
index ddac669..02e682c 100644 (file)
@@ -254,11 +254,11 @@ static void as86_add_piece(struct Section *sect, int type, int32_t offset,
         p->number = raa_read(bsym, segment), p->type = 2;
 }
 
-static void as86_out(int32_t segto, const void *data, uint32_t type,
+static void as86_out(int32_t segto, const void *data, uint64_t type,
                      int32_t segment, int32_t wrt)
 {
     struct Section *s;
-    int32_t realbytes = type & OUT_SIZMASK;
+    int64_t realbytes = type & OUT_SIZMASK;
     int32_t offset;
     uint8_t mydata[4], *p;
 
index bc36610..9faf1d5 100644 (file)
@@ -737,12 +737,12 @@ static void bin_cleanup(int debuginfo)
     }
 }
 
-static void bin_out(int32_t segto, const void *data, uint32_t type,
+static void bin_out(int32_t segto, const void *data, uint64_t type,
                     int32_t segment, int32_t wrt)
 {
     uint8_t *p, mydata[8];
     struct Section *s;
-    int32_t realbytes;
+    int64_t realbytes;
 
 
     if (wrt != NO_SEG) {
index 171cd0b..3f87c02 100644 (file)
@@ -456,7 +456,7 @@ static int32_t coff_add_reloc(struct Section *sect, int32_t segment,
         return 0;
 }
 
-static void coff_out(int32_t segto, const void *data, uint32_t type,
+static void coff_out(int32_t segto, const void *data, uint64_t type,
                      int32_t segment, int32_t wrt)
 {
     struct Section *s;
index 2652f60..c60e21e 100644 (file)
@@ -772,7 +772,7 @@ static int32_t elf_add_gsym_reloc(struct Section *sect,
     return offset - sym->value;
 }
 
-static void elf_out(int32_t segto, const void *data, uint32_t type,
+static void elf_out(int32_t segto, const void *data, uint64_t type,
                     int32_t segment, int32_t wrt)
 {
     struct Section *s;
index d3ca8f9..a58959f 100644 (file)
@@ -784,7 +784,7 @@ static int32_t elf_add_gsym_reloc(struct Section *sect,
     return offset - sym->value;
 }
 
-static void elf_out(int32_t segto, const void *data, uint32_t type,
+static void elf_out(int32_t segto, const void *data, uint64_t type,
                     int32_t segment, int32_t wrt)
 {
     struct Section *s;
@@ -1438,7 +1438,7 @@ void stabs64_typevalue(int32_t type)
             stype = STT_OBJECT;
             break;
         case TY_OWORD:
-            ssize = 8;
+            ssize = 16;
             stype = STT_OBJECT;
             break;
         case TY_COMMON:
index bb9ce9a..2953c8d 100644 (file)
@@ -161,7 +161,7 @@ extern struct ofmt of_ieee;
 
 static void ieee_data_new(struct ieeeSection *);
 static void ieee_write_fixup(int32_t, int32_t, struct ieeeSection *,
-                             int, uint32_t, int32_t);
+                             int, uint64_t, int32_t);
 static void ieee_install_fixup(struct ieeeSection *, struct ieeeFixupp *);
 static int32_t ieee_segment(char *, int, int *);
 static void ieee_write_file(int debuginfo);
@@ -372,10 +372,10 @@ static void ieee_deflabel(char *name, int32_t segment,
 /*
  * Put data out
  */
-static void ieee_out(int32_t segto, const void *data, uint32_t type,
+static void ieee_out(int32_t segto, const void *data, uint64_t type,
                      int32_t segment, int32_t wrt)
 {
-    uint32_t size, realtype;
+    uint64_t size, realtype;
     const uint8_t *ucdata;
     int32_t ldata;
     struct ieeeSection *seg;
@@ -455,7 +455,7 @@ static void ieee_data_new(struct ieeeSection *segto)
  */
 static void ieee_write_fixup(int32_t segment, int32_t wrt,
                              struct ieeeSection *segto, int size,
-                             uint32_t realtype, int32_t offset)
+                             uint64_t realtype, int32_t offset)
 {
     struct ieeeSection *target;
     struct ieeeFixupp s;
index 0eeefe5..29d8dbc 100644 (file)
@@ -386,7 +386,7 @@ static void add_reloc(struct section *sect, int32_t section,
     ++sect->nreloc;
 }
 
-static void macho_output(int32_t secto, const void *data, uint32_t type,
+static void macho_output(int32_t secto, const void *data, uint64_t type,
                          int32_t section, int32_t wrt)
 {
     struct section *s, *sbss;
index 6463d65..a73b011 100644 (file)
@@ -996,10 +996,10 @@ static void obj_write_fixup(ObjRecord * orp, int bytes,
                             int segrel, int32_t seg, int32_t wrt,
                             struct Segment *segto);
 
-static void obj_out(int32_t segto, const void *data, uint32_t type,
+static void obj_out(int32_t segto, const void *data, uint64_t type,
                     int32_t segment, int32_t wrt)
 {
-    uint32_t size, realtype;
+    uint64_t size, realtype;
     const uint8_t *ucdata;
     int32_t ldata;
     struct Segment *seg;
index 0122ff7..3c7b682 100644 (file)
@@ -507,10 +507,10 @@ static int getsegmentlength(int segment)
     return segments[i].seglength;
 }
 
-static void rdf2_out(int32_t segto, const void *data, uint32_t type,
+static void rdf2_out(int32_t segto, const void *data, uint64_t type,
                      int32_t segment, int32_t wrt)
 {
-    int32_t bytes = type & OUT_SIZMASK;
+    int64_t bytes = type & OUT_SIZMASK;
     struct RelocRec rr;
     uint8_t databuf[8], *pd;
     int seg;