Revision f54b3f92 dyngen.c
b/dyngen.c | ||
---|---|---|
117 | 117 |
#define elf_check_arch(x) ((x) == EM_68K) |
118 | 118 |
#define ELF_USES_RELOCA |
119 | 119 |
|
120 |
#elif defined(HOST_HPPA) |
|
121 |
|
|
122 |
#define ELF_CLASS ELFCLASS32 |
|
123 |
#define ELF_ARCH EM_PARISC |
|
124 |
#define elf_check_arch(x) ((x) == EM_PARISC) |
|
125 |
#define ELF_USES_RELOCA |
|
126 |
|
|
120 | 127 |
#elif defined(HOST_MIPS) |
121 | 128 |
|
122 | 129 |
#define ELF_CLASS ELFCLASS32 |
... | ... | |
1223 | 1230 |
snprintf(name, name_size, "param%s", p); |
1224 | 1231 |
return 1; |
1225 | 1232 |
} else { |
1226 |
#ifdef HOST_SPARC
|
|
1233 |
#if defined(HOST_SPARC) || defined(HOST_HPPA)
|
|
1227 | 1234 |
if (sym_name[0] == '.') |
1228 | 1235 |
snprintf(name, name_size, |
1229 | 1236 |
"(long)(&__dot_%s)", |
... | ... | |
1661 | 1668 |
error("rts expected at the end of %s", name); |
1662 | 1669 |
copy_size = p - p_start; |
1663 | 1670 |
} |
1671 |
#elif defined(HOST_HPPA) |
|
1672 |
{ |
|
1673 |
uint8_t *p; |
|
1674 |
p = p_start; |
|
1675 |
while (p < p_end) { |
|
1676 |
uint32_t insn = get32((uint32_t *)p); |
|
1677 |
if (insn == 0x6bc23fd9 || /* stw rp,-14(sp) */ |
|
1678 |
insn == 0x08030241 || /* copy r3,r1 */ |
|
1679 |
insn == 0x081e0243 || /* copy sp,r3 */ |
|
1680 |
(insn & 0xffffc000) == 0x37de0000 || /* ldo x(sp),sp */ |
|
1681 |
(insn & 0xffffc000) == 0x6fc10000) /* stwm r1,x(sp) */ |
|
1682 |
p += 4; |
|
1683 |
else |
|
1684 |
break; |
|
1685 |
} |
|
1686 |
start_offset += p - p_start; |
|
1687 |
p_start = p; |
|
1688 |
p = p_end - 4; |
|
1689 |
|
|
1690 |
while (p > p_start) { |
|
1691 |
uint32_t insn = get32((uint32_t *)p); |
|
1692 |
if ((insn & 0xffffc000) == 0x347e0000 || /* ldo x(r3),sp */ |
|
1693 |
(insn & 0xffe0c000) == 0x4fc00000 || /* ldwm x(sp),rx */ |
|
1694 |
(insn & 0xffffc000) == 0x37de0000 || /* ldo x(sp),sp */ |
|
1695 |
insn == 0x48623fd9 || /* ldw -14(r3),rp */ |
|
1696 |
insn == 0xe840c000 || /* bv r0(rp) */ |
|
1697 |
insn == 0xe840c002) /* bv,n r0(rp) */ |
|
1698 |
p -= 4; |
|
1699 |
else |
|
1700 |
break; |
|
1701 |
} |
|
1702 |
p += 4; |
|
1703 |
if (p <= p_start) |
|
1704 |
error("empty code for %s", name); |
|
1705 |
|
|
1706 |
copy_size = p - p_start; |
|
1707 |
} |
|
1664 | 1708 |
#elif defined(HOST_MIPS) || defined(HOST_MIPS64) |
1665 | 1709 |
{ |
1666 | 1710 |
#define INSN_RETURN 0x03e00008 |
... | ... | |
1746 | 1790 |
!strstart(sym_name, "__op_param", NULL) && |
1747 | 1791 |
!strstart(sym_name, "__op_jmp", NULL) && |
1748 | 1792 |
!strstart(sym_name, "__op_gen_label", NULL)) { |
1749 |
#if defined(HOST_SPARC) |
|
1793 |
#if defined(HOST_SPARC) || defined(HOST_HPPA)
|
|
1750 | 1794 |
if (sym_name[0] == '.') { |
1751 | 1795 |
fprintf(outfile, |
1752 | 1796 |
"extern char __dot_%s __asm__(\"%s\");\n", |
... | ... | |
1774 | 1818 |
} |
1775 | 1819 |
} |
1776 | 1820 |
|
1821 |
#ifdef __hppa__ |
|
1822 |
fprintf(outfile, " memcpy(gen_code_ptr, (void *)((char *)__canonicalize_funcptr_for_compare(%s)+%d), %d);\n", |
|
1823 |
name, (int)(start_offset - offset), copy_size); |
|
1824 |
#else |
|
1777 | 1825 |
fprintf(outfile, " memcpy(gen_code_ptr, (void *)((char *)&%s+%d), %d);\n", |
1778 | 1826 |
name, (int)(start_offset - offset), copy_size); |
1827 |
#endif |
|
1779 | 1828 |
|
1780 | 1829 |
/* emit code offset information */ |
1781 | 1830 |
{ |
... | ... | |
2581 | 2630 |
} |
2582 | 2631 |
} |
2583 | 2632 |
} |
2633 |
#elif defined(HOST_HPPA) |
|
2634 |
{ |
|
2635 |
char relname[256]; |
|
2636 |
int type, is_label; |
|
2637 |
int addend; |
|
2638 |
int reloc_offset; |
|
2639 |
for (i = 0, rel = relocs; i < nb_relocs; i++, rel++) { |
|
2640 |
if (rel->r_offset >= start_offset && |
|
2641 |
rel->r_offset < start_offset + copy_size) { |
|
2642 |
sym_name = get_rel_sym_name(rel); |
|
2643 |
sym_name = strtab + symtab[ELF32_R_SYM(rel->r_info)].st_name; |
|
2644 |
is_label = get_reloc_expr(relname, sizeof(relname), sym_name); |
|
2645 |
type = ELF32_R_TYPE(rel->r_info); |
|
2646 |
addend = rel->r_addend; |
|
2647 |
reloc_offset = rel->r_offset - start_offset; |
|
2648 |
|
|
2649 |
if (is_label) { |
|
2650 |
switch (type) { |
|
2651 |
case R_PARISC_PCREL17F: |
|
2652 |
fprintf(outfile, |
|
2653 |
" tcg_out_reloc(s, gen_code_ptr + %d, %d, %s, %d);\n", |
|
2654 |
reloc_offset, type, relname, addend); |
|
2655 |
break; |
|
2656 |
default: |
|
2657 |
error("unsupported hppa label relocation (%d)", type); |
|
2658 |
} |
|
2659 |
} else { |
|
2660 |
switch (type) { |
|
2661 |
case R_PARISC_DIR21L: |
|
2662 |
fprintf(outfile, |
|
2663 |
" hppa_patch21l((uint32_t *)(gen_code_ptr + %d), %s, %d);\n", |
|
2664 |
reloc_offset, relname, addend); |
|
2665 |
break; |
|
2666 |
case R_PARISC_DIR14R: |
|
2667 |
fprintf(outfile, |
|
2668 |
" hppa_patch14r((uint32_t *)(gen_code_ptr + %d), %s, %d);\n", |
|
2669 |
reloc_offset, relname, addend); |
|
2670 |
break; |
|
2671 |
case R_PARISC_PCREL17F: |
|
2672 |
if (strstart(sym_name, "__op_gen_label", NULL)) { |
|
2673 |
fprintf(outfile, |
|
2674 |
" hppa_patch17f((uint32_t *)(gen_code_ptr + %d), %s, %d);\n", |
|
2675 |
reloc_offset, relname, addend); |
|
2676 |
} else { |
|
2677 |
fprintf(outfile, |
|
2678 |
" HPPA_RECORD_BRANCH(hppa_stubs, (uint32_t *)(gen_code_ptr + %d), %s);\n", |
|
2679 |
reloc_offset, relname); |
|
2680 |
} |
|
2681 |
break; |
|
2682 |
case R_PARISC_DPREL21L: |
|
2683 |
if (strstart(sym_name, "__op_param", &p)) |
|
2684 |
fprintf(outfile, |
|
2685 |
" hppa_load_imm21l((uint32_t *)(gen_code_ptr + %d), param%s, %d);\n", |
|
2686 |
reloc_offset, p, addend); |
|
2687 |
else |
|
2688 |
fprintf(outfile, |
|
2689 |
" hppa_patch21l_dprel((uint32_t *)(gen_code_ptr + %d), %s, %d);\n", |
|
2690 |
reloc_offset, relname, addend); |
|
2691 |
break; |
|
2692 |
case R_PARISC_DPREL14R: |
|
2693 |
if (strstart(sym_name, "__op_param", &p)) |
|
2694 |
fprintf(outfile, |
|
2695 |
" hppa_load_imm14r((uint32_t *)(gen_code_ptr + %d), param%s, %d);\n", |
|
2696 |
reloc_offset, p, addend); |
|
2697 |
else |
|
2698 |
fprintf(outfile, |
|
2699 |
" hppa_patch14r_dprel((uint32_t *)(gen_code_ptr + %d), %s, %d);\n", |
|
2700 |
reloc_offset, relname, addend); |
|
2701 |
break; |
|
2702 |
default: |
|
2703 |
error("unsupported hppa relocation (%d)", type); |
|
2704 |
} |
|
2705 |
} |
|
2706 |
} |
|
2707 |
} |
|
2708 |
} |
|
2584 | 2709 |
#elif defined(HOST_MIPS) || defined(HOST_MIPS64) |
2585 | 2710 |
{ |
2586 | 2711 |
for (i = 0, rel = relocs; i < nb_relocs; i++, rel++) { |
Also available in: Unified diff