[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [4585] ppc dyngen fix (malc)
From: |
Fabrice Bellard |
Subject: |
[Qemu-devel] [4585] ppc dyngen fix (malc) |
Date: |
Sun, 25 May 2008 19:01:06 +0000 |
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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [4585] ppc dyngen fix (malc),
Fabrice Bellard <=