Commit 3442e8964e7ed6a79cf22e82232e4341a1805d82
1 parent
e89f07d3
64-bit host/cross fixes.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1742 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
58 additions
and
52 deletions
dyngen.c
| ... | ... | @@ -1679,7 +1679,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1679 | 1679 | #endif |
| 1680 | 1680 | if (val >= start_offset && val <= start_offset + copy_size) { |
| 1681 | 1681 | n = strtol(p, NULL, 10); |
| 1682 | - fprintf(outfile, " label_offsets[%d] = %ld + (gen_code_ptr - gen_code_buf);\n", n, val - start_offset); | |
| 1682 | + fprintf(outfile, " label_offsets[%d] = %ld + (gen_code_ptr - gen_code_buf);\n", n, (long)(val - start_offset)); | |
| 1683 | 1683 | } |
| 1684 | 1684 | } |
| 1685 | 1685 | } |
| ... | ... | @@ -1696,12 +1696,14 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1696 | 1696 | char name[256]; |
| 1697 | 1697 | int type; |
| 1698 | 1698 | int addend; |
| 1699 | + int reloc_offset; | |
| 1699 | 1700 | for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
| 1700 | 1701 | if (rel->r_offset >= start_offset && |
| 1701 | 1702 | rel->r_offset < start_offset + copy_size) { |
| 1702 | 1703 | sym_name = get_rel_sym_name(rel); |
| 1703 | 1704 | if (!sym_name) |
| 1704 | 1705 | continue; |
| 1706 | + reloc_offset = rel->r_offset - start_offset; | |
| 1705 | 1707 | if (strstart(sym_name, "__op_jmp", &p)) { |
| 1706 | 1708 | int n; |
| 1707 | 1709 | n = strtol(p, NULL, 10); |
| ... | ... | @@ -1710,10 +1712,10 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1710 | 1712 | chaining: the offset of the instruction |
| 1711 | 1713 | needs to be stored */ |
| 1712 | 1714 | fprintf(outfile, " jmp_offsets[%d] = %d + (gen_code_ptr - gen_code_buf);\n", |
| 1713 | - n, rel->r_offset - start_offset); | |
| 1715 | + n, reloc_offset); | |
| 1714 | 1716 | continue; |
| 1715 | 1717 | } |
| 1716 | - | |
| 1718 | + | |
| 1717 | 1719 | get_reloc_expr(name, sizeof(name), sym_name); |
| 1718 | 1720 | addend = get32((uint32_t *)(text + rel->r_offset)); |
| 1719 | 1721 | #ifdef CONFIG_FORMAT_ELF |
| ... | ... | @@ -1721,11 +1723,11 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1721 | 1723 | switch(type) { |
| 1722 | 1724 | case R_386_32: |
| 1723 | 1725 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", |
| 1724 | - rel->r_offset - start_offset, name, addend); | |
| 1726 | + reloc_offset, name, addend); | |
| 1725 | 1727 | break; |
| 1726 | 1728 | case R_386_PC32: |
| 1727 | 1729 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d;\n", |
| 1728 | - rel->r_offset - start_offset, name, rel->r_offset - start_offset, addend); | |
| 1730 | + reloc_offset, name, reloc_offset, addend); | |
| 1729 | 1731 | break; |
| 1730 | 1732 | default: |
| 1731 | 1733 | error("unsupported i386 relocation (%d)", type); |
| ... | ... | @@ -1748,11 +1750,11 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1748 | 1750 | switch(type) { |
| 1749 | 1751 | case DIR32: |
| 1750 | 1752 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", |
| 1751 | - rel->r_offset - start_offset, name, addend); | |
| 1753 | + reloc_offset, name, addend); | |
| 1752 | 1754 | break; |
| 1753 | 1755 | case DISP32: |
| 1754 | 1756 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d -4;\n", |
| 1755 | - rel->r_offset - start_offset, name, rel->r_offset - start_offset, addend); | |
| 1757 | + reloc_offset, name, reloc_offset, addend); | |
| 1756 | 1758 | break; |
| 1757 | 1759 | default: |
| 1758 | 1760 | error("unsupported i386 relocation (%d)", type); |
| ... | ... | @@ -1768,6 +1770,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1768 | 1770 | char name[256]; |
| 1769 | 1771 | int type; |
| 1770 | 1772 | int addend; |
| 1773 | + int reloc_offset; | |
| 1771 | 1774 | for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
| 1772 | 1775 | if (rel->r_offset >= start_offset && |
| 1773 | 1776 | rel->r_offset < start_offset + copy_size) { |
| ... | ... | @@ -1775,18 +1778,19 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1775 | 1778 | get_reloc_expr(name, sizeof(name), sym_name); |
| 1776 | 1779 | type = ELF32_R_TYPE(rel->r_info); |
| 1777 | 1780 | addend = rel->r_addend; |
| 1781 | + reloc_offset = rel->r_offset - start_offset; | |
| 1778 | 1782 | switch(type) { |
| 1779 | 1783 | case R_X86_64_32: |
| 1780 | 1784 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = (uint32_t)%s + %d;\n", |
| 1781 | - rel->r_offset - start_offset, name, addend); | |
| 1785 | + reloc_offset, name, addend); | |
| 1782 | 1786 | break; |
| 1783 | 1787 | case R_X86_64_32S: |
| 1784 | 1788 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = (int32_t)%s + %d;\n", |
| 1785 | - rel->r_offset - start_offset, name, addend); | |
| 1789 | + reloc_offset, name, addend); | |
| 1786 | 1790 | break; |
| 1787 | 1791 | case R_X86_64_PC32: |
| 1788 | 1792 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d;\n", |
| 1789 | - rel->r_offset - start_offset, name, rel->r_offset - start_offset, addend); | |
| 1793 | + reloc_offset, name, reloc_offset, addend); | |
| 1790 | 1794 | break; |
| 1791 | 1795 | default: |
| 1792 | 1796 | error("unsupported X86_64 relocation (%d)", type); |
| ... | ... | @@ -1800,10 +1804,12 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1800 | 1804 | char name[256]; |
| 1801 | 1805 | int type; |
| 1802 | 1806 | int addend; |
| 1807 | + int reloc_offset; | |
| 1803 | 1808 | for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
| 1804 | 1809 | if (rel->r_offset >= start_offset && |
| 1805 | 1810 | rel->r_offset < start_offset + copy_size) { |
| 1806 | 1811 | sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; |
| 1812 | + reloc_offset = rel->r_offset - start_offset; | |
| 1807 | 1813 | if (strstart(sym_name, "__op_jmp", &p)) { |
| 1808 | 1814 | int n; |
| 1809 | 1815 | n = strtol(p, NULL, 10); |
| ... | ... | @@ -1812,7 +1818,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1812 | 1818 | chaining: the offset of the instruction |
| 1813 | 1819 | needs to be stored */ |
| 1814 | 1820 | fprintf(outfile, " jmp_offsets[%d] = %d + (gen_code_ptr - gen_code_buf);\n", |
| 1815 | - n, rel->r_offset - start_offset); | |
| 1821 | + n, reloc_offset); | |
| 1816 | 1822 | continue; |
| 1817 | 1823 | } |
| 1818 | 1824 | |
| ... | ... | @@ -1822,24 +1828,24 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1822 | 1828 | switch(type) { |
| 1823 | 1829 | case R_PPC_ADDR32: |
| 1824 | 1830 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", |
| 1825 | - rel->r_offset - start_offset, name, addend); | |
| 1831 | + reloc_offset, name, addend); | |
| 1826 | 1832 | break; |
| 1827 | 1833 | case R_PPC_ADDR16_LO: |
| 1828 | 1834 | fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d);\n", |
| 1829 | - rel->r_offset - start_offset, name, addend); | |
| 1835 | + reloc_offset, name, addend); | |
| 1830 | 1836 | break; |
| 1831 | 1837 | case R_PPC_ADDR16_HI: |
| 1832 | 1838 | fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d) >> 16;\n", |
| 1833 | - rel->r_offset - start_offset, name, addend); | |
| 1839 | + reloc_offset, name, addend); | |
| 1834 | 1840 | break; |
| 1835 | 1841 | case R_PPC_ADDR16_HA: |
| 1836 | 1842 | fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d + 0x8000) >> 16;\n", |
| 1837 | - rel->r_offset - start_offset, name, addend); | |
| 1843 | + reloc_offset, name, addend); | |
| 1838 | 1844 | break; |
| 1839 | 1845 | case R_PPC_REL24: |
| 1840 | 1846 | /* warning: must be at 32 MB distancy */ |
| 1841 | 1847 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = (*(uint32_t *)(gen_code_ptr + %d) & ~0x03fffffc) | ((%s - (long)(gen_code_ptr + %d) + %d) & 0x03fffffc);\n", |
| 1842 | - rel->r_offset - start_offset, rel->r_offset - start_offset, name, rel->r_offset - start_offset, addend); | |
| 1848 | + reloc_offset, reloc_offset, name, reloc_offset, addend); | |
| 1843 | 1849 | break; |
| 1844 | 1850 | default: |
| 1845 | 1851 | error("unsupported powerpc relocation (%d)", type); |
| ... | ... | @@ -1941,6 +1947,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1941 | 1947 | char name[256]; |
| 1942 | 1948 | int type; |
| 1943 | 1949 | int addend; |
| 1950 | + int reloc_offset; | |
| 1944 | 1951 | for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
| 1945 | 1952 | if (rel->r_offset >= start_offset && |
| 1946 | 1953 | rel->r_offset < start_offset + copy_size) { |
| ... | ... | @@ -1948,18 +1955,19 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1948 | 1955 | get_reloc_expr(name, sizeof(name), sym_name); |
| 1949 | 1956 | type = ELF32_R_TYPE(rel->r_info); |
| 1950 | 1957 | addend = rel->r_addend; |
| 1958 | + reloc_offset = rel->r_offset - start_offset; | |
| 1951 | 1959 | switch(type) { |
| 1952 | 1960 | case R_390_32: |
| 1953 | 1961 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", |
| 1954 | - rel->r_offset - start_offset, name, addend); | |
| 1962 | + reloc_offset, name, addend); | |
| 1955 | 1963 | break; |
| 1956 | 1964 | case R_390_16: |
| 1957 | 1965 | fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = %s + %d;\n", |
| 1958 | - rel->r_offset - start_offset, name, addend); | |
| 1966 | + reloc_offset, name, addend); | |
| 1959 | 1967 | break; |
| 1960 | 1968 | case R_390_8: |
| 1961 | 1969 | fprintf(outfile, " *(uint8_t *)(gen_code_ptr + %d) = %s + %d;\n", |
| 1962 | - rel->r_offset - start_offset, name, addend); | |
| 1970 | + reloc_offset, name, addend); | |
| 1963 | 1971 | break; |
| 1964 | 1972 | default: |
| 1965 | 1973 | error("unsupported s390 relocation (%d)", type); |
| ... | ... | @@ -1972,17 +1980,19 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 1972 | 1980 | for (i = 0, rel = relocs; i < nb_relocs; i++, rel++) { |
| 1973 | 1981 | if (rel->r_offset >= start_offset && rel->r_offset < start_offset + copy_size) { |
| 1974 | 1982 | int type; |
| 1983 | + long reloc_offset; | |
| 1975 | 1984 | |
| 1976 | 1985 | type = ELF64_R_TYPE(rel->r_info); |
| 1977 | 1986 | sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name; |
| 1987 | + reloc_offset = rel->r_offset - start_offset; | |
| 1978 | 1988 | switch (type) { |
| 1979 | 1989 | case R_ALPHA_GPDISP: |
| 1980 | 1990 | /* The gp is just 32 bit, and never changes, so it's easiest to emit it |
| 1981 | 1991 | as an immediate instead of constructing it from the pv or ra. */ |
| 1982 | 1992 | fprintf(outfile, " immediate_ldah(gen_code_ptr + %ld, gp);\n", |
| 1983 | - rel->r_offset - start_offset); | |
| 1993 | + reloc_offset); | |
| 1984 | 1994 | fprintf(outfile, " immediate_lda(gen_code_ptr + %ld, gp);\n", |
| 1985 | - rel->r_offset - start_offset + rel->r_addend); | |
| 1995 | + reloc_offset + (int)rel->r_addend); | |
| 1986 | 1996 | break; |
| 1987 | 1997 | case R_ALPHA_LITUSE: |
| 1988 | 1998 | /* jsr to literal hint. Could be used to optimize to bsr. Ignore for |
| ... | ... | @@ -2002,18 +2012,18 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2002 | 2012 | special treatment. */ |
| 2003 | 2013 | if (strstart(sym_name, "__op_param", &p)) |
| 2004 | 2014 | fprintf(outfile, " immediate_ldah(gen_code_ptr + %ld, param%s);\n", |
| 2005 | - rel->r_offset - start_offset, p); | |
| 2015 | + reloc_offset, p); | |
| 2006 | 2016 | break; |
| 2007 | 2017 | case R_ALPHA_GPRELLOW: |
| 2008 | 2018 | if (strstart(sym_name, "__op_param", &p)) |
| 2009 | 2019 | fprintf(outfile, " immediate_lda(gen_code_ptr + %ld, param%s);\n", |
| 2010 | - rel->r_offset - start_offset, p); | |
| 2020 | + reloc_offset, p); | |
| 2011 | 2021 | break; |
| 2012 | 2022 | case R_ALPHA_BRSGP: |
| 2013 | 2023 | /* PC-relative jump. Tweak offset to skip the two instructions that try to |
| 2014 | 2024 | set up the gp from the pv. */ |
| 2015 | 2025 | fprintf(outfile, " fix_bsr(gen_code_ptr + %ld, (uint8_t *) &%s - (gen_code_ptr + %ld + 4) + 8);\n", |
| 2016 | - rel->r_offset - start_offset, sym_name, rel->r_offset - start_offset); | |
| 2026 | + reloc_offset, sym_name, reloc_offset); | |
| 2017 | 2027 | break; |
| 2018 | 2028 | default: |
| 2019 | 2029 | error("unsupported Alpha relocation (%d)", type); |
| ... | ... | @@ -2035,6 +2045,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2035 | 2045 | || rel->r_offset >= start_offset + copy_size) |
| 2036 | 2046 | continue; |
| 2037 | 2047 | sym_name = (strtab + symtab[sym_idx].st_name); |
| 2048 | + code_offset = rel->r_offset - start_offset; | |
| 2038 | 2049 | if (strstart(sym_name, "__op_jmp", &p)) { |
| 2039 | 2050 | int n; |
| 2040 | 2051 | n = strtol(p, NULL, 10); |
| ... | ... | @@ -2044,13 +2055,12 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2044 | 2055 | needs to be stored */ |
| 2045 | 2056 | fprintf(outfile, " jmp_offsets[%d] =" |
| 2046 | 2057 | "%ld + (gen_code_ptr - gen_code_buf);\n", |
| 2047 | - n, rel->r_offset - start_offset); | |
| 2058 | + n, code_offset); | |
| 2048 | 2059 | continue; |
| 2049 | 2060 | } |
| 2050 | 2061 | get_reloc_expr(name, sizeof(name), sym_name); |
| 2051 | 2062 | type = ELF64_R_TYPE(rel->r_info); |
| 2052 | 2063 | addend = rel->r_addend; |
| 2053 | - code_offset = rel->r_offset - start_offset; | |
| 2054 | 2064 | switch(type) { |
| 2055 | 2065 | case R_IA64_IMM64: |
| 2056 | 2066 | fprintf(outfile, |
| ... | ... | @@ -2101,6 +2111,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2101 | 2111 | char name[256]; |
| 2102 | 2112 | int type; |
| 2103 | 2113 | int addend; |
| 2114 | + int reloc_offset; | |
| 2104 | 2115 | for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
| 2105 | 2116 | if (rel->r_offset >= start_offset && |
| 2106 | 2117 | rel->r_offset < start_offset + copy_size) { |
| ... | ... | @@ -2108,10 +2119,11 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2108 | 2119 | get_reloc_expr(name, sizeof(name), sym_name); |
| 2109 | 2120 | type = ELF32_R_TYPE(rel->r_info); |
| 2110 | 2121 | addend = rel->r_addend; |
| 2122 | + reloc_offset = rel->r_offset - start_offset; | |
| 2111 | 2123 | switch(type) { |
| 2112 | 2124 | case R_SPARC_32: |
| 2113 | 2125 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", |
| 2114 | - rel->r_offset - start_offset, name, addend); | |
| 2126 | + reloc_offset, name, addend); | |
| 2115 | 2127 | break; |
| 2116 | 2128 | case R_SPARC_HI22: |
| 2117 | 2129 | fprintf(outfile, |
| ... | ... | @@ -2119,9 +2131,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2119 | 2131 | "((*(uint32_t *)(gen_code_ptr + %d)) " |
| 2120 | 2132 | " & ~0x3fffff) " |
| 2121 | 2133 | " | (((%s + %d) >> 10) & 0x3fffff);\n", |
| 2122 | - rel->r_offset - start_offset, | |
| 2123 | - rel->r_offset - start_offset, | |
| 2124 | - name, addend); | |
| 2134 | + reloc_offset, reloc_offset, name, addend); | |
| 2125 | 2135 | break; |
| 2126 | 2136 | case R_SPARC_LO10: |
| 2127 | 2137 | fprintf(outfile, |
| ... | ... | @@ -2129,9 +2139,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2129 | 2139 | "((*(uint32_t *)(gen_code_ptr + %d)) " |
| 2130 | 2140 | " & ~0x3ff) " |
| 2131 | 2141 | " | ((%s + %d) & 0x3ff);\n", |
| 2132 | - rel->r_offset - start_offset, | |
| 2133 | - rel->r_offset - start_offset, | |
| 2134 | - name, addend); | |
| 2142 | + reloc_offset, reloc_offset, name, addend); | |
| 2135 | 2143 | break; |
| 2136 | 2144 | case R_SPARC_WDISP30: |
| 2137 | 2145 | fprintf(outfile, |
| ... | ... | @@ -2140,10 +2148,8 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2140 | 2148 | " & ~0x3fffffff) " |
| 2141 | 2149 | " | ((((%s + %d) - (long)(gen_code_ptr + %d))>>2) " |
| 2142 | 2150 | " & 0x3fffffff);\n", |
| 2143 | - rel->r_offset - start_offset, | |
| 2144 | - rel->r_offset - start_offset, | |
| 2145 | - name, addend, | |
| 2146 | - rel->r_offset - start_offset); | |
| 2151 | + reloc_offset, reloc_offset, name, addend, | |
| 2152 | + reloc_offset); | |
| 2147 | 2153 | break; |
| 2148 | 2154 | default: |
| 2149 | 2155 | error("unsupported sparc relocation (%d)", type); |
| ... | ... | @@ -2156,6 +2162,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2156 | 2162 | char name[256]; |
| 2157 | 2163 | int type; |
| 2158 | 2164 | int addend; |
| 2165 | + int reloc_offset; | |
| 2159 | 2166 | for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
| 2160 | 2167 | if (rel->r_offset >= start_offset && |
| 2161 | 2168 | rel->r_offset < start_offset + copy_size) { |
| ... | ... | @@ -2163,10 +2170,11 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2163 | 2170 | get_reloc_expr(name, sizeof(name), sym_name); |
| 2164 | 2171 | type = ELF64_R_TYPE(rel->r_info); |
| 2165 | 2172 | addend = rel->r_addend; |
| 2173 | + reloc_offset = rel->r_offset - start_offset; | |
| 2166 | 2174 | switch(type) { |
| 2167 | 2175 | case R_SPARC_32: |
| 2168 | 2176 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", |
| 2169 | - rel->r_offset - start_offset, name, addend); | |
| 2177 | + reloc_offset, name, addend); | |
| 2170 | 2178 | break; |
| 2171 | 2179 | case R_SPARC_HI22: |
| 2172 | 2180 | fprintf(outfile, |
| ... | ... | @@ -2174,9 +2182,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2174 | 2182 | "((*(uint32_t *)(gen_code_ptr + %d)) " |
| 2175 | 2183 | " & ~0x3fffff) " |
| 2176 | 2184 | " | (((%s + %d) >> 10) & 0x3fffff);\n", |
| 2177 | - rel->r_offset - start_offset, | |
| 2178 | - rel->r_offset - start_offset, | |
| 2179 | - name, addend); | |
| 2185 | + reloc_offset, reloc_offset, name, addend); | |
| 2180 | 2186 | break; |
| 2181 | 2187 | case R_SPARC_LO10: |
| 2182 | 2188 | fprintf(outfile, |
| ... | ... | @@ -2184,9 +2190,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2184 | 2190 | "((*(uint32_t *)(gen_code_ptr + %d)) " |
| 2185 | 2191 | " & ~0x3ff) " |
| 2186 | 2192 | " | ((%s + %d) & 0x3ff);\n", |
| 2187 | - rel->r_offset - start_offset, | |
| 2188 | - rel->r_offset - start_offset, | |
| 2189 | - name, addend); | |
| 2193 | + reloc_offset, reloc_offset, name, addend); | |
| 2190 | 2194 | break; |
| 2191 | 2195 | case R_SPARC_WDISP30: |
| 2192 | 2196 | fprintf(outfile, |
| ... | ... | @@ -2195,10 +2199,8 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2195 | 2199 | " & ~0x3fffffff) " |
| 2196 | 2200 | " | ((((%s + %d) - (long)(gen_code_ptr + %d))>>2) " |
| 2197 | 2201 | " & 0x3fffffff);\n", |
| 2198 | - rel->r_offset - start_offset, | |
| 2199 | - rel->r_offset - start_offset, | |
| 2200 | - name, addend, | |
| 2201 | - rel->r_offset - start_offset); | |
| 2202 | + reloc_offset, reloc_offset, name, addend, | |
| 2203 | + reloc_offset); | |
| 2202 | 2204 | break; |
| 2203 | 2205 | default: |
| 2204 | 2206 | error("unsupported sparc64 relocation (%d)", type); |
| ... | ... | @@ -2211,6 +2213,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2211 | 2213 | char name[256]; |
| 2212 | 2214 | int type; |
| 2213 | 2215 | int addend; |
| 2216 | + int reloc_offset; | |
| 2214 | 2217 | |
| 2215 | 2218 | arm_emit_ldr_info(name, start_offset, outfile, p_start, p_end, |
| 2216 | 2219 | relocs, nb_relocs); |
| ... | ... | @@ -2225,14 +2228,15 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2225 | 2228 | get_reloc_expr(name, sizeof(name), sym_name); |
| 2226 | 2229 | type = ELF32_R_TYPE(rel->r_info); |
| 2227 | 2230 | addend = get32((uint32_t *)(text + rel->r_offset)); |
| 2231 | + reloc_offset = rel->r_offset - start_offset; | |
| 2228 | 2232 | switch(type) { |
| 2229 | 2233 | case R_ARM_ABS32: |
| 2230 | 2234 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", |
| 2231 | - rel->r_offset - start_offset, name, addend); | |
| 2235 | + reloc_offset, name, addend); | |
| 2232 | 2236 | break; |
| 2233 | 2237 | case R_ARM_PC24: |
| 2234 | 2238 | fprintf(outfile, " arm_reloc_pc24((uint32_t *)(gen_code_ptr + %d), 0x%x, %s);\n", |
| 2235 | - rel->r_offset - start_offset, addend, name); | |
| 2239 | + reloc_offset, addend, name); | |
| 2236 | 2240 | break; |
| 2237 | 2241 | default: |
| 2238 | 2242 | error("unsupported arm relocation (%d)", type); |
| ... | ... | @@ -2245,6 +2249,7 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2245 | 2249 | char name[256]; |
| 2246 | 2250 | int type; |
| 2247 | 2251 | int addend; |
| 2252 | + int reloc_offset; | |
| 2248 | 2253 | Elf32_Sym *sym; |
| 2249 | 2254 | for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
| 2250 | 2255 | if (rel->r_offset >= start_offset && |
| ... | ... | @@ -2254,16 +2259,17 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, |
| 2254 | 2259 | get_reloc_expr(name, sizeof(name), sym_name); |
| 2255 | 2260 | type = ELF32_R_TYPE(rel->r_info); |
| 2256 | 2261 | addend = get32((uint32_t *)(text + rel->r_offset)) + rel->r_addend; |
| 2262 | + reloc_offset = rel->r_offset - start_offset; | |
| 2257 | 2263 | switch(type) { |
| 2258 | 2264 | case R_68K_32: |
| 2259 | 2265 | fprintf(outfile, " /* R_68K_32 RELOC, offset %x */\n", rel->r_offset) ; |
| 2260 | 2266 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %#x;\n", |
| 2261 | - rel->r_offset - start_offset, name, addend ); | |
| 2267 | + reloc_offset, name, addend ); | |
| 2262 | 2268 | break; |
| 2263 | 2269 | case R_68K_PC32: |
| 2264 | 2270 | fprintf(outfile, " /* R_68K_PC32 RELOC, offset %x */\n", rel->r_offset); |
| 2265 | 2271 | fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %#x) + %#x;\n", |
| 2266 | - rel->r_offset - start_offset, name, rel->r_offset - start_offset, /*sym->st_value+*/ addend); | |
| 2272 | + reloc_offset, name, reloc_offset, /*sym->st_value+*/ addend); | |
| 2267 | 2273 | break; |
| 2268 | 2274 | default: |
| 2269 | 2275 | error("unsupported m68k relocation (%d)", type); | ... | ... |