Commit a2a64a1f2db407fcebbf03c6e2b366bb2a2beecc

Authored by balrog
1 parent 811d4cf4

Remove dyngen ARM code, which did't build.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4501 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 5 additions and 414 deletions
dyngen.c
@@ -1284,161 +1284,6 @@ get_plt_index (const char *name, unsigned long addend) @@ -1284,161 +1284,6 @@ get_plt_index (const char *name, unsigned long addend)
1284 1284
1285 #endif 1285 #endif
1286 1286
1287 -#ifdef HOST_ARM  
1288 -  
1289 -int arm_emit_ldr_info(const char *name, unsigned long start_offset,  
1290 - FILE *outfile, uint8_t *p_start, uint8_t *p_end,  
1291 - ELF_RELOC *relocs, int nb_relocs)  
1292 -{  
1293 - uint8_t *p;  
1294 - uint32_t insn;  
1295 - int offset, min_offset, pc_offset, data_size, spare, max_pool;  
1296 - uint8_t data_allocated[1024];  
1297 - unsigned int data_index;  
1298 - int type;  
1299 -  
1300 - memset(data_allocated, 0, sizeof(data_allocated));  
1301 -  
1302 - p = p_start;  
1303 - min_offset = p_end - p_start;  
1304 - spare = 0x7fffffff;  
1305 - while (p < p_start + min_offset) {  
1306 - insn = get32((uint32_t *)p);  
1307 - /* TODO: Armv5e ldrd. */  
1308 - /* TODO: VFP load. */  
1309 - if ((insn & 0x0d5f0000) == 0x051f0000) {  
1310 - /* ldr reg, [pc, #im] */  
1311 - offset = insn & 0xfff;  
1312 - if (!(insn & 0x00800000))  
1313 - offset = -offset;  
1314 - max_pool = 4096;  
1315 - type = 0;  
1316 - } else if ((insn & 0x0e5f0f00) == 0x0c1f0100) {  
1317 - /* FPA ldf. */  
1318 - offset = (insn & 0xff) << 2;  
1319 - if (!(insn & 0x00800000))  
1320 - offset = -offset;  
1321 - max_pool = 1024;  
1322 - type = 1;  
1323 - } else if ((insn & 0x0fff0000) == 0x028f0000) {  
1324 - /* Some gcc load a doubleword immediate with  
1325 - add regN, pc, #imm  
1326 - ldmia regN, {regN, regM}  
1327 - Hope and pray the compiler never generates somethin like  
1328 - add reg, pc, #imm1; ldr reg, [reg, #-imm2]; */  
1329 - int r;  
1330 -  
1331 - r = (insn & 0xf00) >> 7;  
1332 - offset = ((insn & 0xff) >> r) | ((insn & 0xff) << (32 - r));  
1333 - max_pool = 1024;  
1334 - type = 2;  
1335 - } else {  
1336 - max_pool = 0;  
1337 - type = -1;  
1338 - }  
1339 - if (type >= 0) {  
1340 - /* PC-relative load needs fixing up. */  
1341 - if (spare > max_pool - offset)  
1342 - spare = max_pool - offset;  
1343 - if ((offset & 3) !=0)  
1344 - error("%s:%04x: pc offset must be 32 bit aligned",  
1345 - name, start_offset + p - p_start);  
1346 - if (offset < 0)  
1347 - error("%s:%04x: Embedded literal value",  
1348 - name, start_offset + p - p_start);  
1349 - pc_offset = p - p_start + offset + 8;  
1350 - if (pc_offset <= (p - p_start) ||  
1351 - pc_offset >= (p_end - p_start))  
1352 - error("%s:%04x: pc offset must point inside the function code",  
1353 - name, start_offset + p - p_start);  
1354 - if (pc_offset < min_offset)  
1355 - min_offset = pc_offset;  
1356 - if (outfile) {  
1357 - /* The intruction position */  
1358 - fprintf(outfile, " arm_ldr_ptr->ptr = gen_code_ptr + %d;\n",  
1359 - p - p_start);  
1360 - /* The position of the constant pool data. */  
1361 - data_index = ((p_end - p_start) - pc_offset) >> 2;  
1362 - fprintf(outfile, " arm_ldr_ptr->data_ptr = arm_data_ptr - %d;\n",  
1363 - data_index);  
1364 - fprintf(outfile, " arm_ldr_ptr->type = %d;\n", type);  
1365 - fprintf(outfile, " arm_ldr_ptr++;\n");  
1366 - }  
1367 - }  
1368 - p += 4;  
1369 - }  
1370 -  
1371 - /* Copy and relocate the constant pool data. */  
1372 - data_size = (p_end - p_start) - min_offset;  
1373 - if (data_size > 0 && outfile) {  
1374 - spare += min_offset;  
1375 - fprintf(outfile, " arm_data_ptr -= %d;\n", data_size >> 2);  
1376 - fprintf(outfile, " arm_pool_ptr -= %d;\n", data_size);  
1377 - fprintf(outfile, " if (arm_pool_ptr > gen_code_ptr + %d)\n"  
1378 - " arm_pool_ptr = gen_code_ptr + %d;\n",  
1379 - spare, spare);  
1380 -  
1381 - data_index = 0;  
1382 - for (pc_offset = min_offset;  
1383 - pc_offset < p_end - p_start;  
1384 - pc_offset += 4) {  
1385 -  
1386 - ELF_RELOC *rel;  
1387 - int i, addend, type;  
1388 - const char *sym_name;  
1389 - char relname[1024];  
1390 -  
1391 - /* data value */  
1392 - addend = get32((uint32_t *)(p_start + pc_offset));  
1393 - relname[0] = '\0';  
1394 - for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {  
1395 - if (rel->r_offset == (pc_offset + start_offset)) {  
1396 - sym_name = get_rel_sym_name(rel);  
1397 - /* the compiler leave some unnecessary references to the code */  
1398 - get_reloc_expr(relname, sizeof(relname), sym_name);  
1399 - type = ELF32_R_TYPE(rel->r_info);  
1400 - if (type != R_ARM_ABS32)  
1401 - error("%s: unsupported data relocation", name);  
1402 - break;  
1403 - }  
1404 - }  
1405 - fprintf(outfile, " arm_data_ptr[%d] = 0x%x",  
1406 - data_index, addend);  
1407 - if (relname[0] != '\0')  
1408 - fprintf(outfile, " + %s", relname);  
1409 - fprintf(outfile, ";\n");  
1410 -  
1411 - data_index++;  
1412 - }  
1413 - }  
1414 -  
1415 - if (p == p_start)  
1416 - goto arm_ret_error;  
1417 - p -= 4;  
1418 - insn = get32((uint32_t *)p);  
1419 - /* The last instruction must be an ldm instruction. There are several  
1420 - forms generated by gcc:  
1421 - ldmib sp, {..., pc} (implies a sp adjustment of +4)  
1422 - ldmia sp, {..., pc}  
1423 - ldmea fp, {..., pc} */  
1424 - if ((insn & 0xffff8000) == 0xe99d8000) {  
1425 - if (outfile) {  
1426 - fprintf(outfile,  
1427 - " *(uint32_t *)(gen_code_ptr + %d) = 0xe28dd004;\n",  
1428 - p - p_start);  
1429 - }  
1430 - p += 4;  
1431 - } else if ((insn & 0xffff8000) != 0xe89d8000  
1432 - && (insn & 0xffff8000) != 0xe91b8000) {  
1433 - arm_ret_error:  
1434 - if (!outfile)  
1435 - printf("%s: invalid epilog\n", name);  
1436 - }  
1437 - return p - p_start;  
1438 -}  
1439 -#endif  
1440 -  
1441 -  
1442 #define MAX_ARGS 3 1287 #define MAX_ARGS 3
1443 1288
1444 /* generate op code */ 1289 /* generate op code */
@@ -1633,27 +1478,6 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -1633,27 +1478,6 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
1633 1478
1634 copy_size = p - p_start; 1479 copy_size = p - p_start;
1635 } 1480 }
1636 -#elif defined(HOST_ARM)  
1637 - {  
1638 - uint32_t insn;  
1639 -  
1640 - if ((p_end - p_start) <= 16)  
1641 - error("%s: function too small", name);  
1642 - if (get32((uint32_t *)p_start) != 0xe1a0c00d ||  
1643 - (get32((uint32_t *)(p_start + 4)) & 0xffff0000) != 0xe92d0000 ||  
1644 - get32((uint32_t *)(p_start + 8)) != 0xe24cb004)  
1645 - error("%s: invalid prolog", name);  
1646 - p_start += 12;  
1647 - start_offset += 12;  
1648 - insn = get32((uint32_t *)p_start);  
1649 - if ((insn & 0xffffff00) == 0xe24dd000) {  
1650 - /* Stack adjustment. Assume op uses the frame pointer. */  
1651 - p_start -= 4;  
1652 - start_offset -= 4;  
1653 - }  
1654 - copy_size = arm_emit_ldr_info(name, start_offset, NULL, p_start, p_end,  
1655 - relocs, nb_relocs);  
1656 - }  
1657 #elif defined(HOST_M68K) 1481 #elif defined(HOST_M68K)
1658 { 1482 {
1659 uint8_t *p; 1483 uint8_t *p;
@@ -1725,6 +1549,8 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -1725,6 +1549,8 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
1725 } 1549 }
1726 copy_size = p - p_start; 1550 copy_size = p - p_start;
1727 } 1551 }
  1552 +#elif defined(HOST_ARM)
  1553 + error("dyngen targets not supported on ARM");
1728 #else 1554 #else
1729 #error unsupported CPU 1555 #error unsupported CPU
1730 #endif 1556 #endif
@@ -2558,74 +2384,6 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -2558,74 +2384,6 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
2558 } 2384 }
2559 } 2385 }
2560 } 2386 }
2561 -#elif defined(HOST_ARM)  
2562 - {  
2563 - char relname[256];  
2564 - int type;  
2565 - int addend;  
2566 - int reloc_offset;  
2567 - uint32_t insn;  
2568 -  
2569 - insn = get32((uint32_t *)(p_start + 4));  
2570 - /* If prologue ends in sub sp, sp, #const then assume  
2571 - op has a stack frame and needs the frame pointer. */  
2572 - if ((insn & 0xffffff00) == 0xe24dd000) {  
2573 - int i;  
2574 - uint32_t opcode;  
2575 - opcode = 0xe28db000; /* add fp, sp, #0. */  
2576 -#if 0  
2577 -/* ??? Need to undo the extra stack adjustment at the end of the op.  
2578 - For now just leave the stack misaligned and hope it doesn't break anything  
2579 - too important. */  
2580 - if ((insn & 4) != 0) {  
2581 - /* Preserve doubleword stack alignment. */  
2582 - fprintf(outfile,  
2583 - " *(uint32_t *)(gen_code_ptr + 4)= 0x%x;\n",  
2584 - insn + 4);  
2585 - opcode -= 4;  
2586 - }  
2587 -#endif  
2588 - insn = get32((uint32_t *)(p_start - 4));  
2589 - /* Calculate the size of the saved registers,  
2590 - excluding pc. */  
2591 - for (i = 0; i < 15; i++) {  
2592 - if (insn & (1 << i))  
2593 - opcode += 4;  
2594 - }  
2595 - fprintf(outfile,  
2596 - " *(uint32_t *)gen_code_ptr = 0x%x;\n", opcode);  
2597 - }  
2598 - arm_emit_ldr_info(relname, start_offset, outfile, p_start, p_end,  
2599 - relocs, nb_relocs);  
2600 -  
2601 - for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {  
2602 - if (rel->r_offset >= start_offset &&  
2603 - rel->r_offset < start_offset + copy_size) {  
2604 - sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;  
2605 - /* the compiler leave some unnecessary references to the code */  
2606 - if (sym_name[0] == '\0')  
2607 - continue;  
2608 - get_reloc_expr(relname, sizeof(relname), sym_name);  
2609 - type = ELF32_R_TYPE(rel->r_info);  
2610 - addend = get32((uint32_t *)(text + rel->r_offset));  
2611 - reloc_offset = rel->r_offset - start_offset;  
2612 - switch(type) {  
2613 - case R_ARM_ABS32:  
2614 - fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n",  
2615 - reloc_offset, relname, addend);  
2616 - break;  
2617 - case R_ARM_PC24:  
2618 - case R_ARM_JUMP24:  
2619 - case R_ARM_CALL:  
2620 - fprintf(outfile, " arm_reloc_pc24((uint32_t *)(gen_code_ptr + %d), 0x%x, %s);\n",  
2621 - reloc_offset, addend, relname);  
2622 - break;  
2623 - default:  
2624 - error("unsupported arm relocation (%d)", type);  
2625 - }  
2626 - }  
2627 - }  
2628 - }  
2629 #elif defined(HOST_M68K) 2387 #elif defined(HOST_M68K)
2630 { 2388 {
2631 char relname[256]; 2389 char relname[256];
@@ -2810,6 +2568,8 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -2810,6 +2568,8 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
2810 } 2568 }
2811 } 2569 }
2812 } 2570 }
  2571 +#elif defined(HOST_ARM)
  2572 + error("dyngen targets not supported on ARM");
2813 #else 2573 #else
2814 #error unsupported CPU 2574 #error unsupported CPU
2815 #endif 2575 #endif
@@ -2868,59 +2628,7 @@ int gen_file(FILE *outfile, int out_type) @@ -2868,59 +2628,7 @@ int gen_file(FILE *outfile, int out_type)
2868 /* generate big code generation switch */ 2628 /* generate big code generation switch */
2869 2629
2870 #ifdef HOST_ARM 2630 #ifdef HOST_ARM
2871 -#error broken  
2872 - /* We need to know the size of all the ops so we can figure out when  
2873 - to emit constant pools. This must be consistent with opc.h. */  
2874 -fprintf(outfile,  
2875 -"static const uint32_t arm_opc_size[] = {\n"  
2876 -" 0,\n" /* end */  
2877 -" 0,\n" /* nop */  
2878 -" 0,\n" /* nop1 */  
2879 -" 0,\n" /* nop2 */  
2880 -" 0,\n"); /* nop3 */  
2881 - for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {  
2882 - const char *name;  
2883 - name = get_sym_name(sym);  
2884 - if (strstart(name, OP_PREFIX, NULL)) {  
2885 - fprintf(outfile, " %d,\n", sym->st_size);  
2886 - }  
2887 - }  
2888 -fprintf(outfile,  
2889 -"};\n");  
2890 -#endif  
2891 -  
2892 -#ifdef HOST_ARM  
2893 -#error broken  
2894 -/* Arm is tricky because it uses constant pools for loading immediate values.  
2895 - We assume (and require) each function is code followed by a constant pool.  
2896 - All the ops are small so this should be ok. For each op we figure  
2897 - out how much "spare" range we have in the load instructions. This allows  
2898 - us to insert subsequent ops in between the op and the constant pool,  
2899 - eliminating the neeed to jump around the pool.  
2900 -  
2901 - We currently generate:  
2902 -  
2903 - [ For this example we assume merging would move op1_pool out of range.  
2904 - In practice we should be able to combine many ops before the offset  
2905 - limits are reached. ]  
2906 - op1_code;  
2907 - op2_code;  
2908 - goto op3;  
2909 - op2_pool;  
2910 - op1_pool;  
2911 -op3:  
2912 - op3_code;  
2913 - ret;  
2914 - op3_pool;  
2915 -  
2916 - Ideally we'd put op1_pool before op2_pool, but that requires two passes.  
2917 - */  
2918 -fprintf(outfile,  
2919 -" uint8_t *last_gen_code_ptr = gen_code_buf;\n"  
2920 -" LDREntry *arm_ldr_ptr = arm_ldr_table;\n"  
2921 -" uint32_t *arm_data_ptr = arm_data_table + ARM_LDR_TABLE_SIZE;\n"  
2922 -/* Initialise the parmissible pool offset to an arbitary large value. */  
2923 -" uint8_t *arm_pool_ptr = gen_code_buf + 0x1000000;\n"); 2631 + error("dyngen targets not supported on ARM");
2924 #endif 2632 #endif
2925 #ifdef HOST_IA64 2633 #ifdef HOST_IA64
2926 #error broken 2634 #error broken
@@ -2981,20 +2689,6 @@ fprintf(outfile, @@ -2981,20 +2689,6 @@ fprintf(outfile,
2981 } 2689 }
2982 #endif 2690 #endif
2983 2691
2984 -#ifdef HOST_ARM  
2985 -#error broken  
2986 -/* Generate constant pool if needed */  
2987 -fprintf(outfile,  
2988 -" if (gen_code_ptr + arm_opc_size[*opc_ptr] >= arm_pool_ptr) {\n"  
2989 -" gen_code_ptr = arm_flush_ldr(gen_code_ptr, arm_ldr_table, "  
2990 -"arm_ldr_ptr, arm_data_ptr, arm_data_table + ARM_LDR_TABLE_SIZE, 1);\n"  
2991 -" last_gen_code_ptr = gen_code_ptr;\n"  
2992 -" arm_ldr_ptr = arm_ldr_table;\n"  
2993 -" arm_data_ptr = arm_data_table + ARM_LDR_TABLE_SIZE;\n"  
2994 -" arm_pool_ptr = gen_code_ptr + 0x1000000;\n"  
2995 -" }\n");  
2996 -#endif  
2997 -  
2998 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) { 2692 for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
2999 const char *name; 2693 const char *name;
3000 name = get_sym_name(sym); 2694 name = get_sym_name(sym);
tcg/tcg-dyngen.c
@@ -143,109 +143,6 @@ void fix_bsr(void *p, int offset) { @@ -143,109 +143,6 @@ void fix_bsr(void *p, int offset) {
143 143
144 #endif /* __alpha__ */ 144 #endif /* __alpha__ */
145 145
146 -#ifdef __arm__  
147 -  
148 -#define ARM_LDR_TABLE_SIZE 1024  
149 -  
150 -typedef struct LDREntry {  
151 - uint8_t *ptr;  
152 - uint32_t *data_ptr;  
153 - unsigned type:2;  
154 -} LDREntry;  
155 -  
156 -static LDREntry arm_ldr_table[1024];  
157 -static uint32_t arm_data_table[ARM_LDR_TABLE_SIZE];  
158 -  
159 -extern char exec_loop;  
160 -  
161 -static inline void arm_reloc_pc24(uint32_t *ptr, uint32_t insn, int val)  
162 -{  
163 - *ptr = (insn & ~0xffffff) | ((insn + ((val - (int)ptr) >> 2)) & 0xffffff);  
164 -}  
165 -  
166 -static uint8_t *arm_flush_ldr(uint8_t *gen_code_ptr,  
167 - LDREntry *ldr_start, LDREntry *ldr_end,  
168 - uint32_t *data_start, uint32_t *data_end,  
169 - int gen_jmp)  
170 -{  
171 - LDREntry *le;  
172 - uint32_t *ptr;  
173 - int offset, data_size, target;  
174 - uint8_t *data_ptr;  
175 - uint32_t insn;  
176 - uint32_t mask;  
177 -  
178 - data_size = (data_end - data_start) << 2;  
179 -  
180 - if (gen_jmp) {  
181 - /* generate branch to skip the data */  
182 - if (data_size == 0)  
183 - return gen_code_ptr;  
184 - target = (long)gen_code_ptr + data_size + 4;  
185 - arm_reloc_pc24((uint32_t *)gen_code_ptr, 0xeafffffe, target);  
186 - gen_code_ptr += 4;  
187 - }  
188 -  
189 - /* copy the data */  
190 - data_ptr = gen_code_ptr;  
191 - memcpy(gen_code_ptr, data_start, data_size);  
192 - gen_code_ptr += data_size;  
193 -  
194 - /* patch the ldr to point to the data */  
195 - for(le = ldr_start; le < ldr_end; le++) {  
196 - ptr = (uint32_t *)le->ptr;  
197 - offset = ((unsigned long)(le->data_ptr) - (unsigned long)data_start) +  
198 - (unsigned long)data_ptr -  
199 - (unsigned long)ptr - 8;  
200 - if (offset < 0) {  
201 - fprintf(stderr, "Negative constant pool offset\n");  
202 - tcg_abort();  
203 - }  
204 - switch (le->type) {  
205 - case 0: /* ldr */  
206 - mask = ~0x00800fff;  
207 - if (offset >= 4096) {  
208 - fprintf(stderr, "Bad ldr offset\n");  
209 - tcg_abort();  
210 - }  
211 - break;  
212 - case 1: /* ldc */  
213 - mask = ~0x008000ff;  
214 - if (offset >= 1024 ) {  
215 - fprintf(stderr, "Bad ldc offset\n");  
216 - tcg_abort();  
217 - }  
218 - break;  
219 - case 2: /* add */  
220 - mask = ~0xfff;  
221 - if (offset >= 1024 ) {  
222 - fprintf(stderr, "Bad add offset\n");  
223 - tcg_abort();  
224 - }  
225 - break;  
226 - default:  
227 - fprintf(stderr, "Bad pc relative fixup\n");  
228 - tcg_abort();  
229 - }  
230 - insn = *ptr & mask;  
231 - switch (le->type) {  
232 - case 0: /* ldr */  
233 - insn |= offset | 0x00800000;  
234 - break;  
235 - case 1: /* ldc */  
236 - insn |= (offset >> 2) | 0x00800000;  
237 - break;  
238 - case 2: /* add */  
239 - insn |= (offset >> 2) | 0xf00;  
240 - break;  
241 - }  
242 - *ptr = insn;  
243 - }  
244 - return gen_code_ptr;  
245 -}  
246 -  
247 -#endif /* __arm__ */  
248 -  
249 #ifdef __ia64 146 #ifdef __ia64
250 147
251 /* Patch instruction with "val" where "mask" has 1 bits. */ 148 /* Patch instruction with "val" where "mask" has 1 bits. */