aboutsummaryrefslogtreecommitdiff
path: root/dynasm
diff options
context:
space:
mode:
Diffstat (limited to 'dynasm')
-rw-r--r--dynasm/dasm_arm.h16
-rw-r--r--dynasm/dasm_arm64.h16
-rw-r--r--dynasm/dasm_mips.h16
-rw-r--r--dynasm/dasm_ppc.h16
-rw-r--r--dynasm/dasm_x86.h18
5 files changed, 26 insertions, 56 deletions
diff --git a/dynasm/dasm_arm.h b/dynasm/dasm_arm.h
index fbfebee0..aa16014e 100644
--- a/dynasm/dasm_arm.h
+++ b/dynasm/dasm_arm.h
@@ -70,7 +70,7 @@ struct dasm_State {
70 size_t lgsize; 70 size_t lgsize;
71 int *pclabels; /* PC label chains/pos ptrs. */ 71 int *pclabels; /* PC label chains/pos ptrs. */
72 size_t pcsize; 72 size_t pcsize;
73 void **globals; /* Array of globals (bias -10). */ 73 void **globals; /* Array of globals. */
74 dasm_Section *section; /* Pointer to active section. */ 74 dasm_Section *section; /* Pointer to active section. */
75 size_t codesize; /* Total size of all code sections. */ 75 size_t codesize; /* Total size of all code sections. */
76 int maxsection; /* 0 <= sectionidx < maxsection. */ 76 int maxsection; /* 0 <= sectionidx < maxsection. */
@@ -87,7 +87,6 @@ void dasm_init(Dst_DECL, int maxsection)
87{ 87{
88 dasm_State *D; 88 dasm_State *D;
89 size_t psz = 0; 89 size_t psz = 0;
90 int i;
91 Dst_REF = NULL; 90 Dst_REF = NULL;
92 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); 91 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));
93 D = Dst_REF; 92 D = Dst_REF;
@@ -98,12 +97,7 @@ void dasm_init(Dst_DECL, int maxsection)
98 D->pcsize = 0; 97 D->pcsize = 0;
99 D->globals = NULL; 98 D->globals = NULL;
100 D->maxsection = maxsection; 99 D->maxsection = maxsection;
101 for (i = 0; i < maxsection; i++) { 100 memset((void *)D->sections, 0, maxsection * sizeof(dasm_Section));
102 D->sections[i].buf = NULL; /* Need this for pass3. */
103 D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);
104 D->sections[i].bsize = 0;
105 D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */
106 }
107} 101}
108 102
109/* Free DynASM state. */ 103/* Free DynASM state. */
@@ -123,7 +117,7 @@ void dasm_free(Dst_DECL)
123void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) 117void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)
124{ 118{
125 dasm_State *D = Dst_REF; 119 dasm_State *D = Dst_REF;
126 D->globals = gl - 10; /* Negative bias to compensate for locals. */ 120 D->globals = gl;
127 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); 121 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));
128} 122}
129 123
@@ -372,7 +366,7 @@ int dasm_encode(Dst_DECL, void *buffer)
372 break; 366 break;
373 case DASM_REL_LG: 367 case DASM_REL_LG:
374 if (n < 0) { 368 if (n < 0) {
375 n = (int)((ptrdiff_t)D->globals[-n] - (ptrdiff_t)cp - 4); 369 n = (int)((ptrdiff_t)D->globals[-n-10] - (ptrdiff_t)cp - 4);
376 goto patchrel; 370 goto patchrel;
377 } 371 }
378 /* fallthrough */ 372 /* fallthrough */
@@ -396,7 +390,7 @@ int dasm_encode(Dst_DECL, void *buffer)
396 } 390 }
397 break; 391 break;
398 case DASM_LABEL_LG: 392 case DASM_LABEL_LG:
399 ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); 393 ins &= 2047; if (ins >= 20) D->globals[ins-20] = (void *)(base + n);
400 break; 394 break;
401 case DASM_LABEL_PC: break; 395 case DASM_LABEL_PC: break;
402 case DASM_IMM: 396 case DASM_IMM:
diff --git a/dynasm/dasm_arm64.h b/dynasm/dasm_arm64.h
index 47c9c37d..e04898f1 100644
--- a/dynasm/dasm_arm64.h
+++ b/dynasm/dasm_arm64.h
@@ -72,7 +72,7 @@ struct dasm_State {
72 size_t lgsize; 72 size_t lgsize;
73 int *pclabels; /* PC label chains/pos ptrs. */ 73 int *pclabels; /* PC label chains/pos ptrs. */
74 size_t pcsize; 74 size_t pcsize;
75 void **globals; /* Array of globals (bias -10). */ 75 void **globals; /* Array of globals. */
76 dasm_Section *section; /* Pointer to active section. */ 76 dasm_Section *section; /* Pointer to active section. */
77 size_t codesize; /* Total size of all code sections. */ 77 size_t codesize; /* Total size of all code sections. */
78 int maxsection; /* 0 <= sectionidx < maxsection. */ 78 int maxsection; /* 0 <= sectionidx < maxsection. */
@@ -89,7 +89,6 @@ void dasm_init(Dst_DECL, int maxsection)
89{ 89{
90 dasm_State *D; 90 dasm_State *D;
91 size_t psz = 0; 91 size_t psz = 0;
92 int i;
93 Dst_REF = NULL; 92 Dst_REF = NULL;
94 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); 93 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));
95 D = Dst_REF; 94 D = Dst_REF;
@@ -100,12 +99,7 @@ void dasm_init(Dst_DECL, int maxsection)
100 D->pcsize = 0; 99 D->pcsize = 0;
101 D->globals = NULL; 100 D->globals = NULL;
102 D->maxsection = maxsection; 101 D->maxsection = maxsection;
103 for (i = 0; i < maxsection; i++) { 102 memset((void *)D->sections, 0, maxsection * sizeof(dasm_Section));
104 D->sections[i].buf = NULL; /* Need this for pass3. */
105 D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);
106 D->sections[i].bsize = 0;
107 D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */
108 }
109} 103}
110 104
111/* Free DynASM state. */ 105/* Free DynASM state. */
@@ -125,7 +119,7 @@ void dasm_free(Dst_DECL)
125void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) 119void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)
126{ 120{
127 dasm_State *D = Dst_REF; 121 dasm_State *D = Dst_REF;
128 D->globals = gl - 10; /* Negative bias to compensate for locals. */ 122 D->globals = gl;
129 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); 123 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));
130} 124}
131 125
@@ -444,7 +438,7 @@ int dasm_encode(Dst_DECL, void *buffer)
444 break; 438 break;
445 case DASM_REL_LG: 439 case DASM_REL_LG:
446 if (n < 0) { 440 if (n < 0) {
447 ptrdiff_t na = (ptrdiff_t)D->globals[-n] - (ptrdiff_t)cp + 4; 441 ptrdiff_t na = (ptrdiff_t)D->globals[-n-10] - (ptrdiff_t)cp + 4;
448 n = (int)na; 442 n = (int)na;
449 CK((ptrdiff_t)n == na, RANGE_REL); 443 CK((ptrdiff_t)n == na, RANGE_REL);
450 goto patchrel; 444 goto patchrel;
@@ -487,7 +481,7 @@ int dasm_encode(Dst_DECL, void *buffer)
487 goto patchrel; 481 goto patchrel;
488 } 482 }
489 case DASM_LABEL_LG: 483 case DASM_LABEL_LG:
490 ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); 484 ins &= 2047; if (ins >= 20) D->globals[ins-20] = (void *)(base + n);
491 break; 485 break;
492 case DASM_LABEL_PC: break; 486 case DASM_LABEL_PC: break;
493 case DASM_IMM: 487 case DASM_IMM:
diff --git a/dynasm/dasm_mips.h b/dynasm/dasm_mips.h
index 3e99a005..495eaa0e 100644
--- a/dynasm/dasm_mips.h
+++ b/dynasm/dasm_mips.h
@@ -69,7 +69,7 @@ struct dasm_State {
69 size_t lgsize; 69 size_t lgsize;
70 int *pclabels; /* PC label chains/pos ptrs. */ 70 int *pclabels; /* PC label chains/pos ptrs. */
71 size_t pcsize; 71 size_t pcsize;
72 void **globals; /* Array of globals (bias -10). */ 72 void **globals; /* Array of globals. */
73 dasm_Section *section; /* Pointer to active section. */ 73 dasm_Section *section; /* Pointer to active section. */
74 size_t codesize; /* Total size of all code sections. */ 74 size_t codesize; /* Total size of all code sections. */
75 int maxsection; /* 0 <= sectionidx < maxsection. */ 75 int maxsection; /* 0 <= sectionidx < maxsection. */
@@ -86,7 +86,6 @@ void dasm_init(Dst_DECL, int maxsection)
86{ 86{
87 dasm_State *D; 87 dasm_State *D;
88 size_t psz = 0; 88 size_t psz = 0;
89 int i;
90 Dst_REF = NULL; 89 Dst_REF = NULL;
91 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); 90 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));
92 D = Dst_REF; 91 D = Dst_REF;
@@ -97,12 +96,7 @@ void dasm_init(Dst_DECL, int maxsection)
97 D->pcsize = 0; 96 D->pcsize = 0;
98 D->globals = NULL; 97 D->globals = NULL;
99 D->maxsection = maxsection; 98 D->maxsection = maxsection;
100 for (i = 0; i < maxsection; i++) { 99 memset((void *)D->sections, 0, maxsection * sizeof(dasm_Section));
101 D->sections[i].buf = NULL; /* Need this for pass3. */
102 D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);
103 D->sections[i].bsize = 0;
104 D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */
105 }
106} 100}
107 101
108/* Free DynASM state. */ 102/* Free DynASM state. */
@@ -122,7 +116,7 @@ void dasm_free(Dst_DECL)
122void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) 116void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)
123{ 117{
124 dasm_State *D = Dst_REF; 118 dasm_State *D = Dst_REF;
125 D->globals = gl - 10; /* Negative bias to compensate for locals. */ 119 D->globals = gl;
126 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); 120 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));
127} 121}
128 122
@@ -350,7 +344,7 @@ int dasm_encode(Dst_DECL, void *buffer)
350 break; 344 break;
351 case DASM_REL_LG: 345 case DASM_REL_LG:
352 if (n < 0) { 346 if (n < 0) {
353 n = (int)((ptrdiff_t)D->globals[-n] - (ptrdiff_t)cp); 347 n = (int)((ptrdiff_t)D->globals[-n-10] - (ptrdiff_t)cp);
354 goto patchrel; 348 goto patchrel;
355 } 349 }
356 /* fallthrough */ 350 /* fallthrough */
@@ -369,7 +363,7 @@ int dasm_encode(Dst_DECL, void *buffer)
369 } 363 }
370 break; 364 break;
371 case DASM_LABEL_LG: 365 case DASM_LABEL_LG:
372 ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); 366 ins &= 2047; if (ins >= 20) D->globals[ins-20] = (void *)(base + n);
373 break; 367 break;
374 case DASM_LABEL_PC: break; 368 case DASM_LABEL_PC: break;
375 case DASM_IMMS: 369 case DASM_IMMS:
diff --git a/dynasm/dasm_ppc.h b/dynasm/dasm_ppc.h
index fdb89bce..30b757e3 100644
--- a/dynasm/dasm_ppc.h
+++ b/dynasm/dasm_ppc.h
@@ -69,7 +69,7 @@ struct dasm_State {
69 size_t lgsize; 69 size_t lgsize;
70 int *pclabels; /* PC label chains/pos ptrs. */ 70 int *pclabels; /* PC label chains/pos ptrs. */
71 size_t pcsize; 71 size_t pcsize;
72 void **globals; /* Array of globals (bias -10). */ 72 void **globals; /* Array of globals. */
73 dasm_Section *section; /* Pointer to active section. */ 73 dasm_Section *section; /* Pointer to active section. */
74 size_t codesize; /* Total size of all code sections. */ 74 size_t codesize; /* Total size of all code sections. */
75 int maxsection; /* 0 <= sectionidx < maxsection. */ 75 int maxsection; /* 0 <= sectionidx < maxsection. */
@@ -86,7 +86,6 @@ void dasm_init(Dst_DECL, int maxsection)
86{ 86{
87 dasm_State *D; 87 dasm_State *D;
88 size_t psz = 0; 88 size_t psz = 0;
89 int i;
90 Dst_REF = NULL; 89 Dst_REF = NULL;
91 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); 90 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));
92 D = Dst_REF; 91 D = Dst_REF;
@@ -97,12 +96,7 @@ void dasm_init(Dst_DECL, int maxsection)
97 D->pcsize = 0; 96 D->pcsize = 0;
98 D->globals = NULL; 97 D->globals = NULL;
99 D->maxsection = maxsection; 98 D->maxsection = maxsection;
100 for (i = 0; i < maxsection; i++) { 99 memset((void *)D->sections, 0, maxsection * sizeof(dasm_Section));
101 D->sections[i].buf = NULL; /* Need this for pass3. */
102 D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);
103 D->sections[i].bsize = 0;
104 D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */
105 }
106} 100}
107 101
108/* Free DynASM state. */ 102/* Free DynASM state. */
@@ -122,7 +116,7 @@ void dasm_free(Dst_DECL)
122void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) 116void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)
123{ 117{
124 dasm_State *D = Dst_REF; 118 dasm_State *D = Dst_REF;
125 D->globals = gl - 10; /* Negative bias to compensate for locals. */ 119 D->globals = gl;
126 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); 120 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));
127} 121}
128 122
@@ -354,7 +348,7 @@ int dasm_encode(Dst_DECL, void *buffer)
354 break; 348 break;
355 case DASM_REL_LG: 349 case DASM_REL_LG:
356 if (n < 0) { 350 if (n < 0) {
357 n = (int)((ptrdiff_t)D->globals[-n] - (ptrdiff_t)cp); 351 n = (int)((ptrdiff_t)D->globals[-n-10] - (ptrdiff_t)cp);
358 goto patchrel; 352 goto patchrel;
359 } 353 }
360 /* fallthrough */ 354 /* fallthrough */
@@ -368,7 +362,7 @@ int dasm_encode(Dst_DECL, void *buffer)
368 cp[-1] |= ((n+4) & ((ins & 2048) ? 0x0000fffc: 0x03fffffc)); 362 cp[-1] |= ((n+4) & ((ins & 2048) ? 0x0000fffc: 0x03fffffc));
369 break; 363 break;
370 case DASM_LABEL_LG: 364 case DASM_LABEL_LG:
371 ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); 365 ins &= 2047; if (ins >= 20) D->globals[ins-20] = (void *)(base + n);
372 break; 366 break;
373 case DASM_LABEL_PC: break; 367 case DASM_LABEL_PC: break;
374 case DASM_IMM: 368 case DASM_IMM:
diff --git a/dynasm/dasm_x86.h b/dynasm/dasm_x86.h
index f0327302..66a68ea5 100644
--- a/dynasm/dasm_x86.h
+++ b/dynasm/dasm_x86.h
@@ -68,7 +68,7 @@ struct dasm_State {
68 size_t lgsize; 68 size_t lgsize;
69 int *pclabels; /* PC label chains/pos ptrs. */ 69 int *pclabels; /* PC label chains/pos ptrs. */
70 size_t pcsize; 70 size_t pcsize;
71 void **globals; /* Array of globals (bias -10). */ 71 void **globals; /* Array of globals. */
72 dasm_Section *section; /* Pointer to active section. */ 72 dasm_Section *section; /* Pointer to active section. */
73 size_t codesize; /* Total size of all code sections. */ 73 size_t codesize; /* Total size of all code sections. */
74 int maxsection; /* 0 <= sectionidx < maxsection. */ 74 int maxsection; /* 0 <= sectionidx < maxsection. */
@@ -85,7 +85,6 @@ void dasm_init(Dst_DECL, int maxsection)
85{ 85{
86 dasm_State *D; 86 dasm_State *D;
87 size_t psz = 0; 87 size_t psz = 0;
88 int i;
89 Dst_REF = NULL; 88 Dst_REF = NULL;
90 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); 89 DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));
91 D = Dst_REF; 90 D = Dst_REF;
@@ -96,12 +95,7 @@ void dasm_init(Dst_DECL, int maxsection)
96 D->pcsize = 0; 95 D->pcsize = 0;
97 D->globals = NULL; 96 D->globals = NULL;
98 D->maxsection = maxsection; 97 D->maxsection = maxsection;
99 for (i = 0; i < maxsection; i++) { 98 memset((void *)D->sections, 0, maxsection * sizeof(dasm_Section));
100 D->sections[i].buf = NULL; /* Need this for pass3. */
101 D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);
102 D->sections[i].bsize = 0;
103 D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */
104 }
105} 99}
106 100
107/* Free DynASM state. */ 101/* Free DynASM state. */
@@ -121,7 +115,7 @@ void dasm_free(Dst_DECL)
121void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) 115void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)
122{ 116{
123 dasm_State *D = Dst_REF; 117 dasm_State *D = Dst_REF;
124 D->globals = gl - 10; /* Negative bias to compensate for locals. */ 118 D->globals = gl;
125 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); 119 DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));
126} 120}
127 121
@@ -445,7 +439,7 @@ int dasm_encode(Dst_DECL, void *buffer)
445 break; 439 break;
446 } 440 }
447 case DASM_REL_LG: p++; if (n >= 0) goto rel_pc; 441 case DASM_REL_LG: p++; if (n >= 0) goto rel_pc;
448 b++; n = (int)(ptrdiff_t)D->globals[-n]; 442 b++; n = (int)(ptrdiff_t)D->globals[-n-10];
449 /* fallthrough */ 443 /* fallthrough */
450 case DASM_REL_A: rel_a: 444 case DASM_REL_A: rel_a:
451 n -= (unsigned int)(ptrdiff_t)(cp+4); goto wd; /* !x64 */ 445 n -= (unsigned int)(ptrdiff_t)(cp+4); goto wd; /* !x64 */
@@ -459,7 +453,7 @@ int dasm_encode(Dst_DECL, void *buffer)
459 } 453 }
460 case DASM_IMM_LG: 454 case DASM_IMM_LG:
461 p++; 455 p++;
462 if (n < 0) { dasma((ptrdiff_t)D->globals[-n]); break; } 456 if (n < 0) { dasma((ptrdiff_t)D->globals[-n-10]); break; }
463 /* fallthrough */ 457 /* fallthrough */
464 case DASM_IMM_PC: { 458 case DASM_IMM_PC: {
465 int *pb = DASM_POS2PTR(D, n); 459 int *pb = DASM_POS2PTR(D, n);
@@ -469,7 +463,7 @@ int dasm_encode(Dst_DECL, void *buffer)
469 case DASM_LABEL_LG: { 463 case DASM_LABEL_LG: {
470 int idx = *p++; 464 int idx = *p++;
471 if (idx >= 10) 465 if (idx >= 10)
472 D->globals[idx] = (void *)(base + (*p == DASM_SETLABEL ? *b : n)); 466 D->globals[idx-10] = (void *)(base + (*p == DASM_SETLABEL ? *b : n));
473 break; 467 break;
474 } 468 }
475 case DASM_LABEL_PC: case DASM_SETLABEL: break; 469 case DASM_LABEL_PC: case DASM_SETLABEL: break;