Clear up WRITE macros causing compile failures with Watcom
authorH. Peter Anvin <hpa@zytor.com>
Sat, 16 Feb 2008 23:25:02 +0000 (15:25 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Sat, 16 Feb 2008 23:25:02 +0000 (15:25 -0800)
The OpenWatcom compiler warns about invalid shifts (correctly, it
appears) due to the non-X86_MEMORY versions of the various WRITE
macros.  Fix.

nasmlib.h
output/outelf64.c

index 6300312..565aee1 100644 (file)
--- a/nasmlib.h
+++ b/nasmlib.h
@@ -213,38 +213,50 @@ void standard_extension(char *inname, char *outname, char *extension,
 
 #else /* !X86_MEMORY */
 
-#define WRITECHAR(p,v) \
-  do { \
-    *(p)++ = (v) & 0xFF; \
-  } while (0)
-
-#define WRITESHORT(p,v) \
-  do { \
-    WRITECHAR(p,v); \
-    WRITECHAR(p,(v) >> 8); \
-  } while (0)
-
-#define WRITELONG(p,v) \
-  do { \
-    WRITECHAR(p,v); \
-    WRITECHAR(p,(v) >> 8); \
-    WRITECHAR(p,(v) >> 16); \
-    WRITECHAR(p,(v) >> 24); \
-  } while (0)
-
-#define WRITEDLONG(p,v) \
-  do { \
-    WRITECHAR(p,v); \
-    WRITECHAR(p,(v) >> 8); \
-    WRITECHAR(p,(v) >> 16); \
-    WRITECHAR(p,(v) >> 24); \
-    WRITECHAR(p,(v) >> 32); \
-    WRITECHAR(p,(v) >> 40); \
-    WRITECHAR(p,(v) >> 48); \
-    WRITECHAR(p,(v) >> 56); \
-  } while (0)
-
-#define WRITEADDR(p,v,s) \
+#define WRITECHAR(p,v)                         \
+    do {                                       \
+       uint8_t *_p = (uint8_t *)(p);           \
+       uint8_t _v = (v);                       \
+       _p[0] = _v;                             \
+       (p) = (void *)(_p + 1);                 \
+    } while (0)
+
+#define WRITESHORT(p,v)                                \
+    do {                                       \
+       uint8_t *_p = (uint8_t *)(p);           \
+       uint16_t _v = (v);                      \
+       _p[0] = _v;                             \
+       _p[1] = _v >> 8;                        \
+       (p) = (void *)(_p + 2);                 \
+    } while (0)
+
+#define WRITELONG(p,v)                         \
+    do {                                       \
+       uint8_t *_p = (uint8_t *)(p);           \
+       uint32_t _v = (v);                      \
+       _p[0] = _v;                             \
+       _p[1] = _v >> 8;                        \
+       _p[2] = _v >> 16;                       \
+       _p[3] = _v >> 24;                       \
+       (p) = (void *)(_p + 4);                 \
+    } while (0)
+
+#define WRITEDLONG(p,v)                                \
+    do {                                       \
+       uint8_t *_p = (uint8_t *)(p);           \
+       uint64_t _v = (v);                      \
+       _p[0] = _v;                             \
+       _p[1] = _v >> 8;                        \
+       _p[2] = _v >> 16;                       \
+       _p[3] = _v >> 24;                       \
+       _p[4] = _v >> 32;                       \
+       _p[5] = _v >> 40;                       \
+       _p[6] = _v >> 48;                       \
+       _p[7] = _v >> 56;                       \
+       (p) = (void *)(_p + 8);                 \
+    } while (0)
+
+#define WRITEADDR(p,v,s)                       \
     do {                                       \
        int _s = (s);                           \
        uint64_t _v = (v);                      \
index f5a0bb0..9cb4772 100644 (file)
 #define WSAACHAR(s,p,v)                                \
     do {                                       \
        *(uint8_t *)(p) = (v);                  \
-       saa_wbytes(s, p, 1);                            \
+       saa_wbytes(s, p, 1);                    \
     } while (0)
 
-#define WSAASHORT(s,p,v)                               \
+#define WSAASHORT(s,p,v)                       \
     do {                                       \
        *(uint16_t *)(p) = (v);                 \
-       saa_wbytes(s, p, 2);                            \
+       saa_wbytes(s, p, 2);                    \
     } while (0)
 
 #define WSAALONG(s,p,v)                                \
     do {                                       \
        *(uint32_t *)(p) = (v);                 \
-       saa_wbytes(s, p, 4);                            \
+       saa_wbytes(s, p, 4);                    \
     } while (0)
 
-#define WSAADLONG(s,p,v)                               \
+#define WSAADLONG(s,p,v)                       \
     do {                                       \
        *(uint64_t *)(p) = (v);                 \
-       saa_wbytes(s, p, 8);                            \
+       saa_wbytes(s, p, 8);                    \
     } while (0)
 
 #define WSAAADDR(a,p,v,s)                      \
     do {                                       \
        uint64_t _v = (v);                      \
        memcpy((p), &_v, (s));                  \
-       saa_wbytes(a, p, s);                            \
+       saa_wbytes(a, p, s);                    \
     } while (0)
 
 #else /* !X86_MEMORY */
 
-#define WSAACHAR(s,p,v) \
-  do { \
-    *(p) = (v) & 0xFF; \
-    saa_wbytes(s, p, 1);                               \
-  } while (0)
+#define WSAACHAR(s,p,v)                        \
+    do {                                       \
+       *(uint8_t *)p = (v);                    \
+       saa_wbytes(s, p, 1);                    \
+    } while (0)
 
-#define WSAASHORT(s,p,v) \
-  do { \
-    WSAACHAR(s,p,v); \
-    WSAACHAR(p+1,(v) >> 8); \
-  } while (0)
+#define WSAASHORT(s,p,v)                       \
+    do {                                       \
+       uint16_t _v = (v);                      \
+       uint8_t *_p = (uint8_t *)(p);           \
+       _p[0] = _v;                             \
+       _p[1] = _v >> 8;                        \
+       saa_wbytes(s, _p, 2);                   \
+    } while (0)
 
-#define WSAALONG(s,p,v) \
-  do { \
-    WSAACHAR(s,p,v); \
-    WSAACHAR(p+1,(v) >> 8); \
-    WSAACHAR(p+2,(v) >> 16); \
-    WSAACHAR(p+3,(v) >> 24); \
-  } while (0)
+#define WSAALONG(s,p,v)                                \
+    do {                                       \
+       uint32_t _v = (v);                      \
+       uint8_t *_p = (uint8_t *)(p);           \
+       _p[0] = _v;                             \
+       _p[1] = _v >> 8;                        \
+       _p[2] = _v >> 16;                       \
+       _p[3] = _v >> 24;                       \
+       saa_wbytes(s, _p, 4);                   \
+    } while (0)
 
-#define WSAADLONG(s,p,v) \
-  do { \
-    WSAACHAR(s,p,v); \
-    WSAACHAR(p+1,(v) >> 8); \
-    WSAACHAR(p+2,(v) >> 16); \
-    WSAACHAR(p+3,(v) >> 24); \
-    WSAACHAR(p+4,(v) >> 32); \
-    WSAACHAR(p+5,(v) >> 40); \
-    WSAACHAR(p+6,(v) >> 48); \
-    WSAACHAR(p+7,(v) >> 56); \
-  } while (0)
+#define WSAADLONG(s,p,v)                       \
+    do {                                       \
+       uint64_t _v = (v);                      \
+       uint8_t *_p = (uint8_t *)(p);           \
+       _p[0] = _v;                             \
+       _p[1] = _v >> 8;                        \
+       _p[2] = _v >> 16;                       \
+       _p[3] = _v >> 24;                       \
+       _p[4] = _v >> 32;                       \
+       _p[5] = _v >> 40;                       \
+       _p[6] = _v >> 48;                       \
+       _p[7] = _v >> 56;                       \
+       saa_wbytes(s, _p, 8);                   \
+    } while (0)
 
-#define WSAAADDR(a,p,v,s) \
+#define WSAAADDR(a,p,v,s)                      \
     do {                                       \
-       int _s = (s);                           \
        uint64_t _v = (v);                      \
-       while (_s--) {                          \
-           WSAACHAR(a,p,_v);                   \
-           _v >>= 8;                           \
-       }                                       \
-    } while(0)
+       uint8_t *_p = (uint8_t *)(p);           \
+       _p[0] = _v;                             \
+       _p[1] = _v >> 8;                        \
+       _p[2] = _v >> 16;                       \
+       _p[3] = _v >> 24;                       \
+       _p[4] = _v >> 32;                       \
+       _p[5] = _v >> 40;                       \
+       _p[6] = _v >> 48;                       \
+       _p[7] = _v >> 56;                       \
+       saa_wbytes(a, _p, s);                   \
+    } while (0)
 
 #endif
 
@@ -2006,12 +2020,13 @@ void dwarf64_typevalue(int32_t type)
 /* called from elf_out with type == TY_STABSSYMLIN */
 void dwarf64_output(int type, void *param)
 {
-  (void)type;
   int ln, aa, inx, maxln, soc;
   struct symlininfo *s;
   struct SAA *plinep;
 
-   s = (struct symlininfo *)param;
+  (void)type;
+
+  s = (struct symlininfo *)param;
    /* line number info is only gathered for executable sections */
    if (!(sects[s->section]->flags & SHF_EXECINSTR))
      return;