From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K0LTn-0001Kz-Uf for qemu-devel@nongnu.org; Sun, 25 May 2008 15:02:04 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K0LTk-0001JN-Cz for qemu-devel@nongnu.org; Sun, 25 May 2008 15:02:03 -0400 Received: from [199.232.76.173] (port=54518 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K0LTj-0001JJ-Vb for qemu-devel@nongnu.org; Sun, 25 May 2008 15:02:00 -0400 Received: from savannah.gnu.org ([199.232.41.3]:56401 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1K0LTh-0001bJ-OA for qemu-devel@nongnu.org; Sun, 25 May 2008 15:02:00 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1K0LSs-0003U7-Gm for qemu-devel@nongnu.org; Sun, 25 May 2008 19:01:06 +0000 Received: from bellard by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1K0LSs-0003U2-5p for qemu-devel@nongnu.org; Sun, 25 May 2008 19:01:06 +0000 MIME-Version: 1.0 Errors-To: bellard Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Fabrice Bellard Message-Id: Date: Sun, 25 May 2008 19:01:06 +0000 Subject: [Qemu-devel] [4585] ppc dyngen fix (malc) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 4585 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4585 Author: bellard Date: 2008-05-25 19:01:05 +0000 (Sun, 25 May 2008) Log Message: ----------- ppc dyngen fix (malc) Modified Paths: -------------- trunk/dyngen.c Modified: trunk/dyngen.c =================================================================== --- trunk/dyngen.c 2008-05-25 18:59:57 UTC (rev 4584) +++ trunk/dyngen.c 2008-05-25 19:01:05 UTC (rev 4585) @@ -1910,10 +1910,11 @@ char relname[256]; int type; int addend; + int is_label; int reloc_offset; for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { if (rel->r_offset >= start_offset && - rel->r_offset < start_offset + copy_size) { + rel->r_offset < start_offset + copy_size) { sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; reloc_offset = rel->r_offset - start_offset; if (strstart(sym_name, "__op_jmp", &p)) { @@ -1930,32 +1931,45 @@ get_reloc_expr(relname, sizeof(relname), sym_name); type = ELF32_R_TYPE(rel->r_info); + is_label = get_reloc_expr(relname, sizeof(relname), sym_name); addend = rel->r_addend; - switch(type) { - case R_PPC_ADDR32: - fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", - reloc_offset, relname, addend); - break; - case R_PPC_ADDR16_LO: - fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d);\n", - reloc_offset, relname, addend); - break; - case R_PPC_ADDR16_HI: - fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d) >> 16;\n", - reloc_offset, relname, addend); - break; - case R_PPC_ADDR16_HA: - fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d + 0x8000) >> 16;\n", - reloc_offset, relname, addend); - break; - case R_PPC_REL24: - /* warning: must be at 32 MB distancy */ - fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = (*(uint32_t *)(gen_code_ptr + %d) & ~0x03fffffc) | ((%s - (long)(gen_code_ptr + %d) + %d) & 0x03fffffc);\n", - reloc_offset, reloc_offset, relname, reloc_offset, addend); - break; - default: - error("unsupported powerpc relocation (%d)", type); + if (is_label) { + switch (type) { + case R_PPC_REL24: + fprintf (outfile, " tcg_out_reloc(s, gen_code_ptr + %d, %d, %s, %d);\n", + reloc_offset, type, relname, addend); + break; + default: + error ("unsupported ppc relocation (%d)", type); + } } + else { + switch(type) { + case R_PPC_ADDR32: + fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", + reloc_offset, relname, addend); + break; + case R_PPC_ADDR16_LO: + fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d);\n", + reloc_offset, relname, addend); + break; + case R_PPC_ADDR16_HI: + fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d) >> 16;\n", + reloc_offset, relname, addend); + break; + case R_PPC_ADDR16_HA: + fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d + 0x8000) >> 16;\n", + reloc_offset, relname, addend); + break; + case R_PPC_REL24: + /* warning: must be at 32 MB distancy */ + fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = (*(uint32_t *)(gen_code_ptr + %d) & ~0x03fffffc) | ((%s - (long)(gen_code_ptr + %d) + %d) & 0x03fffffc);\n", + reloc_offset, reloc_offset, relname, reloc_offset, addend); + break; + default: + error("unsupported powerpc relocation (%d)", type); + } + } } } #elif defined(CONFIG_FORMAT_MACH)