@@ -404,6 +404,15 @@ int dasm_link(Dst_DECL, size_t *szp)
404
404
return DASM_S_OK ;
405
405
}
406
406
407
+ #ifdef DASM_ADD_VENEER
408
+ #define CK_REL (x , o ) \
409
+ do { if (!(x) && !(n = DASM_ADD_VENEER(D, buffer, ins, b, cp, o))) \
410
+ return DASM_S_RANGE_REL|(p-D->actionlist-1); \
411
+ } while (0)
412
+ #else
413
+ #define CK_REL (x , o ) CK(x, RANGE_REL)
414
+ #endif
415
+
407
416
#ifdef DASM_CHECKS
408
417
#define CK (x , st ) \
409
418
do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)
@@ -444,7 +453,7 @@ int dasm_encode(Dst_DECL, void *buffer)
444
453
if (n < 0 ) {
445
454
ptrdiff_t na = (ptrdiff_t )D -> globals [- n ] - (ptrdiff_t )cp + 4 ;
446
455
n = (int )na ;
447
- CK ((ptrdiff_t )n == na , RANGE_REL );
456
+ CK_REL ((ptrdiff_t )n == na , na );
448
457
goto patchrel ;
449
458
}
450
459
/* fallthrough */
@@ -453,18 +462,18 @@ int dasm_encode(Dst_DECL, void *buffer)
453
462
n = * DASM_POS2PTR (D , n ) - (int )((char * )cp - base ) + 4 ;
454
463
patchrel :
455
464
if (!(ins & 0xf800 )) { /* B, BL */
456
- CK ((n & 3 ) == 0 && ((n + 0x08000000 ) >> 28 ) == 0 , RANGE_REL );
465
+ CK_REL ((n & 3 ) == 0 && ((n + 0x08000000 ) >> 28 ) == 0 , n );
457
466
cp [-1 ] |= ((n >> 2 ) & 0x03ffffff );
458
467
} else if ((ins & 0x800 )) { /* B.cond, CBZ, CBNZ, LDR* literal */
459
- CK ((n & 3 ) == 0 && ((n + 0x00100000 ) >> 21 ) == 0 , RANGE_REL );
468
+ CK_REL ((n & 3 ) == 0 && ((n + 0x00100000 ) >> 21 ) == 0 , n );
460
469
cp [-1 ] |= ((n << 3 ) & 0x00ffffe0 );
461
470
} else if ((ins & 0x3000 ) == 0x2000 ) { /* ADR */
462
- CK (((n + 0x00100000 ) >> 21 ) == 0 , RANGE_REL );
471
+ CK_REL (((n + 0x00100000 ) >> 21 ) == 0 , n );
463
472
cp [-1 ] |= ((n << 3 ) & 0x00ffffe0 ) | ((n & 3 ) << 29 );
464
473
} else if ((ins & 0x3000 ) == 0x3000 ) { /* ADRP */
465
474
cp [-1 ] |= ((n >> 9 ) & 0x00ffffe0 ) | (((n >> 12 ) & 3 ) << 29 );
466
475
} else if ((ins & 0x1000 )) { /* TBZ, TBNZ */
467
- CK ((n & 3 ) == 0 && ((n + 0x00008000 ) >> 16 ) == 0 , RANGE_REL );
476
+ CK_REL ((n & 3 ) == 0 && ((n + 0x00008000 ) >> 16 ) == 0 , n );
468
477
cp [-1 ] |= ((n << 3 ) & 0x0007ffe0 );
469
478
} else if ((ins & 0x8000 )) { /* absolute */
470
479
cp [0 ] = (unsigned int )((ptrdiff_t )cp - 4 + n );
@@ -475,7 +484,7 @@ int dasm_encode(Dst_DECL, void *buffer)
475
484
case DASM_REL_A : {
476
485
ptrdiff_t na = (((ptrdiff_t )(* b ++ ) << 32 ) | (unsigned int )n ) - (ptrdiff_t )cp + 4 ;
477
486
n = (int )na ;
478
- CK ((ptrdiff_t )n == na , RANGE_REL );
487
+ CK_REL ((ptrdiff_t )n == na , na );
479
488
goto patchrel ;
480
489
}
481
490
case DASM_LABEL_LG :
0 commit comments