X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=deps%2Flightning%2Flib%2Fjit_disasm.c;h=90d90b0f192477f76631b96fe88abb54e096fb14;hb=b68d544b28b604e2e88e2dbab5b55826a03a269e;hp=15b91b9131196f738a883c5e1b526ddf7e348dff;hpb=a34093eb63d1645fd2de9b412efe2587df9fdb3f;p=pcsx_rearmed.git diff --git a/deps/lightning/lib/jit_disasm.c b/deps/lightning/lib/jit_disasm.c index 15b91b91..90d90b0f 100644 --- a/deps/lightning/lib/jit_disasm.c +++ b/deps/lightning/lib/jit_disasm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2019 Free Software Foundation, Inc. + * Copyright (C) 2012-2023 Free Software Foundation, Inc. * * This file is part of GNU lightning. * @@ -50,15 +50,30 @@ static asymbol *disasm_synthetic; static long disasm_num_symbols; static long disasm_num_synthetic; static jit_state_t *disasm_jit; -#define disasm_stream stdout +static FILE *disasm_stream; +#endif + +#if BINUTILS_2_38 +static int fprintf_styled(void * stream, enum disassembler_style style, const char* fmt, ...) +{ + va_list args; + int r; + + va_start(args, fmt); + r = vfprintf(disasm_stream, fmt, args); + va_end(args); + + return r; +} #endif /* * Implementation */ void -jit_init_debug(const char *progname) +jit_init_debug(const char *progname, FILE *stream) { + jit_init_print(stream); #if DISASSEMBLER bfd_init(); @@ -73,64 +88,29 @@ jit_init_debug(const char *progname) } bfd_check_format(disasm_bfd, bfd_object); bfd_check_format(disasm_bfd, bfd_archive); + if (!disasm_stream) + disasm_stream = stream; + +#if BINUTILS_2_38 + INIT_DISASSEMBLE_INFO(disasm_info, disasm_stream, fprintf, fprintf_styled); +#else INIT_DISASSEMBLE_INFO(disasm_info, disasm_stream, fprintf); -# if defined(__i386__) || defined(__x86_64__) - disasm_info.arch = bfd_arch_i386; -# if defined(__x86_64__) -# if __WORDSIZE == 32 - disasm_info.mach = bfd_mach_x64_32; -# else - disasm_info.mach = bfd_mach_x86_64; -# endif -# else - disasm_info.mach = bfd_mach_i386_i386; -# endif -# endif -# if defined(__powerpc__) - disasm_info.arch = bfd_arch_powerpc; - disasm_info.mach = bfd_mach_ppc64; -# if HAVE_DISASSEMBLE_INIT_FOR_TARGET +#endif + disasm_info.arch = bfd_get_arch(disasm_bfd); + disasm_info.mach = bfd_get_mach(disasm_bfd); + +# if HAVE_DISASSEMBLE_INIT_FOR_TARGET disassemble_init_for_target(&disasm_info); -# elif HAVE_DISASSEMBLE_INIT_POWERPC - disassemble_init_powerpc(&disasm_info); -# endif -# if defined(__powerpc64__) +# endif + +# if defined(__powerpc64__) disasm_info.disassembler_options = "64"; -# endif -# if HAVE_DISASSEMBLE_INIT_FOR_TARGET - disassemble_init_for_target(&disasm_info); -# elif HAVE_DISASSEMBLE_INIT_POWERPC - disassemble_init_powerpc(&disasm_info); -# endif # endif -# if defined(__sparc__) +# if defined(__sparc__) || defined(__s390__) || defined(__s390x__) disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG; # endif # if defined(__s390__) || defined(__s390x__) - disasm_info.arch = bfd_arch_s390; -# if __WORDSIZE == 32 - disasm_info.mach = bfd_mach_s390_31; -# else - disasm_info.mach = bfd_mach_s390_64; -# endif - disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG; disasm_info.disassembler_options = "zarch"; -# endif -# if defined(__alpha__) - disasm_info.arch = bfd_arch_alpha; - disasm_info.mach = bfd_mach_alpha_ev6; -# endif -# if defined(__hppa__) - disasm_info.arch = bfd_arch_hppa; - disasm_info.mach = bfd_mach_hppa10; -# endif -# if defined(__riscv) - disasm_info.arch = bfd_arch_riscv; -# if __WORDSIZE == 32 - disasm_info.mach = bfd_mach_riscv32; -# else - disasm_info.mach = bfd_mach_riscv64; -# endif # endif disasm_info.print_address_func = disasm_print_address; @@ -276,7 +256,7 @@ disasm_print_address(bfd_vma addr, struct disassemble_info *info) int line; char buffer[address_buffer_length]; - sprintf(buffer, address_buffer_format, (long long)addr); + sprintf(buffer, address_buffer_format, addr); (*info->fprintf_func)(info->stream, "0x%s", buffer); # define _jit disasm_jit @@ -339,7 +319,10 @@ _disassemble(jit_state_t *_jit, jit_pointer_t code, jit_int32_t length) char *name, *old_name; char *file, *old_file; int line, old_line; -#if __arm__ +#if __riscv && __WORDSIZE == 64 + jit_word_t *vector; + jit_int32_t offset; +#elif __arm__ jit_int32_t offset; jit_bool_t data_info; jit_int32_t data_offset; @@ -352,6 +335,10 @@ _disassemble(jit_state_t *_jit, jit_pointer_t code, jit_int32_t length) jit_uword_t prevw; #endif +#if __riscv && __WORDSIZE == 64 + end -= _jitc->consts.hash.count * 8; +#endif + #if __arm__ data_info = _jitc && _jitc->data_info.ptr; data_offset = 0; @@ -374,7 +361,7 @@ _disassemble(jit_state_t *_jit, jit_pointer_t code, jit_int32_t length) } while (node && (jit_uword_t)(prevw + node->offset) == (jit_uword_t)pc) { jit_print_node(node); - fputc('\n', stdout); + fputc('\n', disasm_stream); prevw += node->offset; node = node->next; } @@ -419,11 +406,22 @@ _disassemble(jit_state_t *_jit, jit_pointer_t code, jit_int32_t length) old_line = line; } - bytes = sprintf(buffer, address_buffer_format, (long long)pc); + bytes = sprintf(buffer, address_buffer_format, pc); (*disasm_info.fprintf_func)(disasm_stream, "%*c0x%s\t", 16 - bytes, ' ', buffer); pc += (*disasm_print)(pc, &disasm_info); putc('\n', disasm_stream); } +#if __riscv && __WORDSIZE == 64 + for (vector = (jit_word_t *)end, offset = 0; + offset < _jitc->consts.hash.count; offset++) { + bytes = sprintf(buffer, address_buffer_format, + (long long)end + offset * sizeof(jit_word_t)); + (*disasm_info.fprintf_func)(disasm_stream, + "%*c0x%s\t.quad\t0x%016lx\t# (%ld)\n", + 16 - bytes, ' ', buffer, + vector[offset], vector[offset]); + } +#endif } #endif