diff options
author | Mike Pall <mike> | 2021-03-31 18:36:44 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2021-03-31 18:36:44 +0200 |
commit | 20f556e53190ab9a735b932f5d868d45ec536a70 (patch) | |
tree | 76eadb0310ec75132a016a246168f154494c6650 /dynasm | |
parent | d1132afb25e2ba66d5d4c287b886a3c0a61bd9db (diff) | |
download | luajit-20f556e53190ab9a735b932f5d868d45ec536a70.tar.gz luajit-20f556e53190ab9a735b932f5d868d45ec536a70.tar.bz2 luajit-20f556e53190ab9a735b932f5d868d45ec536a70.zip |
DynASM: Fix global label references
ARM64 patch contributed by Hao Sun and Nick Gasson.
Diffstat (limited to 'dynasm')
-rw-r--r-- | dynasm/dasm_arm.h | 7 | ||||
-rw-r--r-- | dynasm/dasm_arm64.h | 7 | ||||
-rw-r--r-- | dynasm/dasm_mips.h | 7 | ||||
-rw-r--r-- | dynasm/dasm_ppc.h | 7 |
4 files changed, 20 insertions, 8 deletions
diff --git a/dynasm/dasm_arm.h b/dynasm/dasm_arm.h index a7295663..ebcf4ac0 100644 --- a/dynasm/dasm_arm.h +++ b/dynasm/dasm_arm.h | |||
@@ -294,7 +294,7 @@ int dasm_link(Dst_DECL, size_t *szp) | |||
294 | 294 | ||
295 | { /* Handle globals not defined in this translation unit. */ | 295 | { /* Handle globals not defined in this translation unit. */ |
296 | int idx; | 296 | int idx; |
297 | for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { | 297 | for (idx = 10; idx*sizeof(int) < D->lgsize; idx++) { |
298 | int n = D->lglabels[idx]; | 298 | int n = D->lglabels[idx]; |
299 | /* Undefined label: Collapse rel chain and replace with marker (< 0). */ | 299 | /* Undefined label: Collapse rel chain and replace with marker (< 0). */ |
300 | while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } | 300 | while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } |
@@ -371,7 +371,10 @@ int dasm_encode(Dst_DECL, void *buffer) | |||
371 | ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000; | 371 | ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000; |
372 | break; | 372 | break; |
373 | case DASM_REL_LG: | 373 | case DASM_REL_LG: |
374 | CK(n >= 0, UNDEF_LG); | 374 | if (n < 0) { |
375 | n = (int)((ptrdiff_t)D->globals[-n] - (ptrdiff_t)cp - 4); | ||
376 | goto patchrel; | ||
377 | } | ||
375 | /* fallthrough */ | 378 | /* fallthrough */ |
376 | case DASM_REL_PC: | 379 | case DASM_REL_PC: |
377 | CK(n >= 0, UNDEF_PC); | 380 | CK(n >= 0, UNDEF_PC); |
diff --git a/dynasm/dasm_arm64.h b/dynasm/dasm_arm64.h index b2251532..5ff4414c 100644 --- a/dynasm/dasm_arm64.h +++ b/dynasm/dasm_arm64.h | |||
@@ -354,7 +354,7 @@ int dasm_link(Dst_DECL, size_t *szp) | |||
354 | 354 | ||
355 | { /* Handle globals not defined in this translation unit. */ | 355 | { /* Handle globals not defined in this translation unit. */ |
356 | int idx; | 356 | int idx; |
357 | for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { | 357 | for (idx = 10; idx*sizeof(int) < D->lgsize; idx++) { |
358 | int n = D->lglabels[idx]; | 358 | int n = D->lglabels[idx]; |
359 | /* Undefined label: Collapse rel chain and replace with marker (< 0). */ | 359 | /* Undefined label: Collapse rel chain and replace with marker (< 0). */ |
360 | while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } | 360 | while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } |
@@ -432,7 +432,10 @@ int dasm_encode(Dst_DECL, void *buffer) | |||
432 | ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000; | 432 | ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000; |
433 | break; | 433 | break; |
434 | case DASM_REL_LG: | 434 | case DASM_REL_LG: |
435 | CK(n >= 0, UNDEF_LG); | 435 | if (n < 0) { |
436 | n = (int)((ptrdiff_t)D->globals[-n] - (ptrdiff_t)cp + 4); | ||
437 | goto patchrel; | ||
438 | } | ||
436 | /* fallthrough */ | 439 | /* fallthrough */ |
437 | case DASM_REL_PC: | 440 | case DASM_REL_PC: |
438 | CK(n >= 0, UNDEF_PC); | 441 | CK(n >= 0, UNDEF_PC); |
diff --git a/dynasm/dasm_mips.h b/dynasm/dasm_mips.h index 2fd7d71f..b99b56b0 100644 --- a/dynasm/dasm_mips.h +++ b/dynasm/dasm_mips.h | |||
@@ -273,7 +273,7 @@ int dasm_link(Dst_DECL, size_t *szp) | |||
273 | 273 | ||
274 | { /* Handle globals not defined in this translation unit. */ | 274 | { /* Handle globals not defined in this translation unit. */ |
275 | int idx; | 275 | int idx; |
276 | for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { | 276 | for (idx = 10; idx*sizeof(int) < D->lgsize; idx++) { |
277 | int n = D->lglabels[idx]; | 277 | int n = D->lglabels[idx]; |
278 | /* Undefined label: Collapse rel chain and replace with marker (< 0). */ | 278 | /* Undefined label: Collapse rel chain and replace with marker (< 0). */ |
279 | while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } | 279 | while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } |
@@ -349,7 +349,10 @@ int dasm_encode(Dst_DECL, void *buffer) | |||
349 | ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; | 349 | ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; |
350 | break; | 350 | break; |
351 | case DASM_REL_LG: | 351 | case DASM_REL_LG: |
352 | CK(n >= 0, UNDEF_LG); | 352 | if (n < 0) { |
353 | n = (int)((ptrdiff_t)D->globals[-n] - (ptrdiff_t)cp); | ||
354 | goto patchrel; | ||
355 | } | ||
353 | /* fallthrough */ | 356 | /* fallthrough */ |
354 | case DASM_REL_PC: | 357 | case DASM_REL_PC: |
355 | CK(n >= 0, UNDEF_PC); | 358 | CK(n >= 0, UNDEF_PC); |
diff --git a/dynasm/dasm_ppc.h b/dynasm/dasm_ppc.h index ae540e46..35264f2e 100644 --- a/dynasm/dasm_ppc.h +++ b/dynasm/dasm_ppc.h | |||
@@ -277,7 +277,7 @@ int dasm_link(Dst_DECL, size_t *szp) | |||
277 | 277 | ||
278 | { /* Handle globals not defined in this translation unit. */ | 278 | { /* Handle globals not defined in this translation unit. */ |
279 | int idx; | 279 | int idx; |
280 | for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { | 280 | for (idx = 10; idx*sizeof(int) < D->lgsize; idx++) { |
281 | int n = D->lglabels[idx]; | 281 | int n = D->lglabels[idx]; |
282 | /* Undefined label: Collapse rel chain and replace with marker (< 0). */ | 282 | /* Undefined label: Collapse rel chain and replace with marker (< 0). */ |
283 | while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } | 283 | while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } |
@@ -353,7 +353,10 @@ int dasm_encode(Dst_DECL, void *buffer) | |||
353 | ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; | 353 | ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; |
354 | break; | 354 | break; |
355 | case DASM_REL_LG: | 355 | case DASM_REL_LG: |
356 | CK(n >= 0, UNDEF_LG); | 356 | if (n < 0) { |
357 | n = (int)((ptrdiff_t)D->globals[-n] - (ptrdiff_t)cp); | ||
358 | goto patchrel; | ||
359 | } | ||
357 | /* fallthrough */ | 360 | /* fallthrough */ |
358 | case DASM_REL_PC: | 361 | case DASM_REL_PC: |
359 | CK(n >= 0, UNDEF_PC); | 362 | CK(n >= 0, UNDEF_PC); |