fix dyngen on HPPA hosts

(Stuart Brady)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4227 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
aurel32 2008-04-20 20:19:54 +00:00
parent 2408a5273f
commit b29d8ae4d4
1 changed files with 30 additions and 1 deletions

View File

@ -1759,7 +1759,36 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
}
if (gen_switch == 2) {
fprintf(outfile, "DEF(%s, %d, %d)\n", name + 3, nb_args, copy_size);
#if defined(HOST_HPPA)
int op_size = copy_size;
int has_stubs = 0;
char relname[256];
int type, is_label;
for (i = 0, rel = relocs; i < nb_relocs; i++, rel++) {
if (rel->r_offset >= start_offset &&
rel->r_offset < start_offset + copy_size) {
sym_name = get_rel_sym_name(rel);
sym_name = strtab + symtab[ELF32_R_SYM(rel->r_info)].st_name;
is_label = get_reloc_expr(relname, sizeof(relname), sym_name);
type = ELF32_R_TYPE(rel->r_info);
if (!is_label && type == R_PARISC_PCREL17F) {
has_stubs = 1;
op_size += 8; /* ldil and be,n instructions */
}
}
}
if (has_stubs)
op_size += 4; /* b,l,n instruction, to skip past the stubs */
fprintf(outfile, "DEF(%s, %d, %d)\n", name + 3, nb_args, op_size);
#else
fprintf(outfile, "DEF(%s, %d, %d)\n", name + 3, nb_args, copy_size);
#endif
} else if (gen_switch == 1) {
/* output C code */