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