]> granicus.if.org Git - yasm/commitdiff
Revert [1251]. From further investigation, ML64's generation of REL32 in
authorPeter Johnson <peter@tortall.net>
Sat, 1 Oct 2005 05:47:54 +0000 (05:47 -0000)
committerPeter Johnson <peter@tortall.net>
Sat, 1 Oct 2005 05:47:54 +0000 (05:47 -0000)
these cases seems to be a bug.  If you get a linker error about ADDR32, it
means you aren't using RIP-relative instructions.  Note this means to access
an array you need to do:
  lea rax, [var wrt rip] ; generates RIP-relative insn and REL32 reloc
  mov rcx, [rax+rbx]     ; rbx is index
and not:
  mov rcx, [var+rbx]     ; generates ADDR32 reloc
At least when trying to build a DLL (the ADDR32 reloc fails the DLL link).
When building statically, ADDR32 should work okay and thus the latter form
can be used.

svn path=/trunk/yasm/; revision=1257

libyasm/bytecode.c
libyasm/bytecode.h
modules/objfmts/coff/coff-objfmt.c
modules/objfmts/win64/tests/win64-dataref.hex

index d2e658de5a90dc8bc5a3dff605b12db2121e94f3..2c212b0489a9ac23bfa2b308ba36c993b9d82aa4 100644 (file)
@@ -432,12 +432,6 @@ yasm_bc_create_data(yasm_datavalhead *datahead, unsigned int size,
     return yasm_bc_create_common(&bc_data_callback, data, line);
 }
 
-int
-yasm_bc_is_data(const yasm_bytecode *bc)
-{
-    return (bc->callback == &bc_data_callback);
-}
-
 static void
 bc_reserve_destroy(void *contents)
 {
index daf56e8abfbd324a67c339aeb59e24f7b97e0073..79d940b9788d884fd132994e5d1c33f933a2f408 100644 (file)
@@ -141,12 +141,6 @@ void yasm_bc_set_multiple(yasm_bytecode *bc, /*@keep@*/ yasm_expr *e);
 /*@only@*/ yasm_bytecode *yasm_bc_create_data
     (yasm_datavalhead *datahead, unsigned int size, unsigned long line);
 
-/** Find out if a bytecode is a data bytecode.
- * \param bc       bytecode
- * \return Nonzero if bytecode is a data bytecode, otherwise 0.
- */
-int yasm_bc_is_data(const yasm_bytecode *bc);
-
 /** Create a bytecode reserving space.
  * \param numitems     number of reserve "items" (kept, do not free)
  * \param itemsize     reserved size (in bytes) for each item
index 1f2cbcddaa65ef277933913e2dfc7e59cb1313c4..a40a168b997956dcd1cc155d78e0e52533eaa539 100644 (file)
@@ -455,7 +455,6 @@ coff_objfmt_output_expr(yasm_expr **ep, unsigned char *buf, size_t destsize,
             * $$ in.
             * For Win32 COFF, need to reference to next bytecode, so add '$'
             * (really $+$.len) in.
-            * For Win64 COFF, don't add anything in.
             */
            if (objfmt_coff->win32)
                *ep = yasm_expr_create(YASM_EXPR_ADD, yasm_expr_expr(*ep),
@@ -478,16 +477,8 @@ coff_objfmt_output_expr(yasm_expr **ep, unsigned char *buf, size_t destsize,
                if (valsize == 32) {
                    if (info->csd->flags2 & COFF_FLAG_NOBASE)
                        reloc->type = COFF_RELOC_AMD64_ADDR32NB;
-                   else if (!objfmt_coff->win64 || yasm_bc_is_data(bc))
+                   else
                        reloc->type = COFF_RELOC_AMD64_ADDR32;
-                   else {
-                       /* I don't understand this, but ML64 generates REL32
-                        * for all instructions, regardless of whether they
-                        * are RIP relative.  Obviously this is either handled
-                        * by the linker or by the compiler at a higher level!
-                        */
-                       reloc->type = COFF_RELOC_AMD64_REL32;
-                   }
                } else if (valsize == 64)
                    reloc->type = COFF_RELOC_AMD64_ADDR64;
                else {
index 02b53df69adcaa5d41e7632a4a700cb5390b792b..fa604a6fce465438dd7b220a3114ce124ce78fe6 100644 (file)
@@ -682,7 +682,7 @@ c4
 00 
 00 
 00 
-04 
+02 
 00 
 07 
 00 
@@ -712,7 +712,7 @@ c4
 00 
 00 
 00 
-04 
+02 
 00 
 1f 
 00 
@@ -752,7 +752,7 @@ c4
 00 
 00 
 00 
-04 
+02 
 00 
 42 
 00 
@@ -762,7 +762,7 @@ c4
 00 
 00 
 00 
-04 
+02 
 00 
 48 
 00 
@@ -782,7 +782,7 @@ c4
 00 
 00 
 00 
-04 
+02 
 00 
 60 
 00 
@@ -812,7 +812,7 @@ c4
 00 
 00 
 00 
-04 
+02 
 00 
 83 
 00 
@@ -822,7 +822,7 @@ c4
 00 
 00 
 00 
-04 
+02 
 00 
 89 
 00 
@@ -862,7 +862,7 @@ a1
 00 
 00 
 00 
-04 
+02 
 00 
 a8 
 00 
@@ -902,7 +902,7 @@ bf
 00 
 00 
 00 
-04 
+02 
 00 
 c4 
 00 
@@ -912,7 +912,7 @@ c4
 00 
 00 
 00 
-04 
+02 
 00 
 ca 
 00 
@@ -952,7 +952,7 @@ e2
 00 
 00 
 00 
-04 
+02 
 00 
 e9 
 00 
@@ -992,7 +992,7 @@ f8
 00 
 00 
 00 
-04 
+02 
 00 
 05 
 01 
@@ -1002,7 +1002,7 @@ f8
 00 
 00 
 00 
-04 
+02 
 00 
 0b 
 01 
@@ -1042,7 +1042,7 @@ f8
 00 
 00 
 00 
-04 
+02 
 00 
 2a 
 01 
@@ -1082,7 +1082,7 @@ f8
 00 
 00 
 00 
-04 
+02 
 00 
 46 
 01 
@@ -1092,7 +1092,7 @@ f8
 00 
 00 
 00 
-04 
+02 
 00 
 4c 
 01 
@@ -1132,7 +1132,7 @@ f8
 00 
 00 
 00 
-04 
+02 
 00 
 6b 
 01 
@@ -1172,7 +1172,7 @@ f8
 00 
 00 
 00 
-04 
+02 
 00 
 87 
 01 
@@ -1560,7 +1560,7 @@ b6
 00 
 00 
 00 
-04 
+02 
 00 
 2d 
 00 
@@ -1600,7 +1600,7 @@ b6
 00 
 00 
 00 
-04 
+02 
 00 
 2e 
 66