From 18e7a3f4fa69e5256148329aeed7207ba3f1ece8 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Sun, 7 Nov 2021 13:39:18 +0200 Subject: [PATCH] Cleanup, better symbol handling, improves LTO --- Core/apu.c | 3 --- Core/apu.h | 19 +++++++++---------- Core/camera.h | 2 +- Core/cheats.h | 4 ++-- Core/debugger.h | 18 +++++++++--------- Core/defs.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ Core/display.h | 8 ++++---- Core/gb.h | 37 ++----------------------------------- Core/gb_struct_def.h | 5 ----- Core/joypad.h | 4 ++-- Core/mbc.h | 6 +++--- Core/memory.h | 8 ++++---- Core/printer.h | 2 +- Core/rewind.h | 6 +++--- Core/rumble.h | 4 ++-- Core/save_state.h | 4 ++-- Core/sgb.h | 8 ++++---- Core/sm83_cpu.h | 4 ++-- Core/symbol_hash.h | 12 ++++++------ Core/timing.h | 12 ++++++------ Core/workboy.h | 2 +- Makefile | 2 +- 22 files changed, 108 insertions(+), 106 deletions(-) create mode 100644 Core/defs.h delete mode 100644 Core/gb_struct_def.h diff --git a/Core/apu.c b/Core/apu.c index 8386b91..9a5f852 100644 --- a/Core/apu.c +++ b/Core/apu.c @@ -4,9 +4,6 @@ #include #include "gb.h" -#define likely(x) __builtin_expect((x), 1) -#define unlikely(x) __builtin_expect((x), 0) - static const uint8_t duties[] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, diff --git a/Core/apu.h b/Core/apu.h index ad1e197..7fa91da 100644 --- a/Core/apu.h +++ b/Core/apu.h @@ -3,8 +3,7 @@ #include #include #include -#include "gb_struct_def.h" - +#include "defs.h" #ifdef GB_INTERNAL /* Speed = 1 / Length (in seconds) */ @@ -172,14 +171,14 @@ void GB_set_interference_volume(GB_gameboy_t *gb, double volume); void GB_apu_set_sample_callback(GB_gameboy_t *gb, GB_sample_callback_t callback); #ifdef GB_INTERNAL -bool GB_apu_is_DAC_enabled(GB_gameboy_t *gb, unsigned index); -void GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value); -uint8_t GB_apu_read(GB_gameboy_t *gb, uint8_t reg); -void GB_apu_div_event(GB_gameboy_t *gb); -void GB_apu_div_secondary_event(GB_gameboy_t *gb); -void GB_apu_init(GB_gameboy_t *gb); -void GB_apu_run(GB_gameboy_t *gb); -void GB_apu_update_cycles_per_sample(GB_gameboy_t *gb); +bool internal GB_apu_is_DAC_enabled(GB_gameboy_t *gb, unsigned index); +void internal GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value); +uint8_t internal GB_apu_read(GB_gameboy_t *gb, uint8_t reg); +void internal GB_apu_div_event(GB_gameboy_t *gb); +void internal GB_apu_div_secondary_event(GB_gameboy_t *gb); +void internal GB_apu_init(GB_gameboy_t *gb); +void internal GB_apu_run(GB_gameboy_t *gb); +void internal GB_apu_update_cycles_per_sample(GB_gameboy_t *gb); #endif #endif /* apu_h */ diff --git a/Core/camera.h b/Core/camera.h index 21c69b6..1461f3a 100644 --- a/Core/camera.h +++ b/Core/camera.h @@ -1,7 +1,7 @@ #ifndef camera_h #define camera_h #include -#include "gb_struct_def.h" +#include "defs.h" typedef uint8_t (*GB_camera_get_pixel_callback_t)(GB_gameboy_t *gb, uint8_t x, uint8_t y); typedef void (*GB_camera_update_request_callback_t)(GB_gameboy_t *gb); diff --git a/Core/cheats.h b/Core/cheats.h index cf8aa20..68bbe1b 100644 --- a/Core/cheats.h +++ b/Core/cheats.h @@ -1,6 +1,6 @@ #ifndef cheats_h #define cheats_h -#include "gb_struct_def.h" +#include "defs.h" #define GB_CHEAT_ANY_BANK 0xFFFF @@ -20,7 +20,7 @@ int GB_save_cheats(GB_gameboy_t *gb, const char *path); #ifdef GB_DISABLE_CHEATS #define GB_apply_cheat(...) #else -void GB_apply_cheat(GB_gameboy_t *gb, uint16_t address, uint8_t *value); +void internal GB_apply_cheat(GB_gameboy_t *gb, uint16_t address, uint8_t *value); #endif #endif diff --git a/Core/debugger.h b/Core/debugger.h index 0678b30..e2e49f2 100644 --- a/Core/debugger.h +++ b/Core/debugger.h @@ -2,7 +2,7 @@ #define debugger_h #include #include -#include "gb_struct_def.h" +#include "defs.h" #include "symbol_hash.h" @@ -17,14 +17,14 @@ #define GB_debugger_add_symbol(gb, bank, address, symbol) ((void)bank, (void)address, (void)symbol) #else -void GB_debugger_run(GB_gameboy_t *gb); -void GB_debugger_handle_async_commands(GB_gameboy_t *gb); -void GB_debugger_call_hook(GB_gameboy_t *gb, uint16_t call_addr); -void GB_debugger_ret_hook(GB_gameboy_t *gb); -void GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, uint16_t addr, uint8_t value); -void GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, uint16_t addr); -const GB_bank_symbol_t *GB_debugger_find_symbol(GB_gameboy_t *gb, uint16_t addr); -void GB_debugger_add_symbol(GB_gameboy_t *gb, uint16_t bank, uint16_t address, const char *symbol); +void internal GB_debugger_run(GB_gameboy_t *gb); +void internal GB_debugger_handle_async_commands(GB_gameboy_t *gb); +void internal GB_debugger_call_hook(GB_gameboy_t *gb, uint16_t call_addr); +void internal GB_debugger_ret_hook(GB_gameboy_t *gb); +void internal GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, uint16_t addr, uint8_t value); +void internal GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, uint16_t addr); +const GB_bank_symbol_t *internal GB_debugger_find_symbol(GB_gameboy_t *gb, uint16_t addr); +void internal GB_debugger_add_symbol(GB_gameboy_t *gb, uint16_t bank, uint16_t address, const char *symbol); #endif /* GB_DISABLE_DEBUGGER */ #endif diff --git a/Core/defs.h b/Core/defs.h new file mode 100644 index 0000000..629cc2b --- /dev/null +++ b/Core/defs.h @@ -0,0 +1,44 @@ +#ifndef defs_h +#define defs_h + +#ifdef GB_INTERNAL + +// "Keyword" definitions +#define likely(x) __builtin_expect((x), 1) +#define unlikely(x) __builtin_expect((x), 0) + +#define internal __attribute__((visibility("hidden"))) + +#if __clang__ +#define unrolled _Pragma("unroll") +#elif __GNUC__ >= 8 +#define unrolled _Pragma("GCC unroll 8") +#else +#define unrolled +#endif + +/* Todo: similar macros are everywhere, clean this up and remove direct calls to bswap */ +#ifdef GB_BIG_ENDIAN +#define LE16(x) __builtin_bswap16(x) +#define LE32(x) __builtin_bswap32(x) +#define LE64(x) __builtin_bswap64(x) +#define BE16(x) (x) +#define BE32(x) (x) +#define BE64(x) (x) +#else +#define LE16(x) (x) +#define LE32(x) (x) +#define LE64(x) (x) +#define BE16(x) __builtin_bswap16(x) +#define BE32(x) __builtin_bswap32(x) +#define BE64(x) __builtin_bswap64(x) +#endif +#endif + +#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8) +#define __builtin_bswap16(x) ({ typeof(x) _x = (x); _x >> 8 | _x << 8; }) +#endif + +struct GB_gameboy_s; +typedef struct GB_gameboy_s GB_gameboy_t; +#endif diff --git a/Core/display.h b/Core/display.h index 085985d..cd6064a 100644 --- a/Core/display.h +++ b/Core/display.h @@ -6,10 +6,10 @@ #include #ifdef GB_INTERNAL -void GB_display_run(GB_gameboy_t *gb, uint8_t cycles); -void GB_palette_changed(GB_gameboy_t *gb, bool background_palette, uint8_t index); -void GB_STAT_update(GB_gameboy_t *gb); -void GB_lcd_off(GB_gameboy_t *gb); +void internal GB_display_run(GB_gameboy_t *gb, uint8_t cycles); +void internal GB_palette_changed(GB_gameboy_t *gb, bool background_palette, uint8_t index); +void internal GB_STAT_update(GB_gameboy_t *gb); +void internal GB_lcd_off(GB_gameboy_t *gb); enum { GB_OBJECT_PRIORITY_X, diff --git a/Core/gb.h b/Core/gb.h index 3dbd7b3..145eac5 100644 --- a/Core/gb.h +++ b/Core/gb.h @@ -5,7 +5,7 @@ #include #include -#include "gb_struct_def.h" +#include "defs.h" #include "save_state.h" #include "apu.h" @@ -35,17 +35,6 @@ #define GB_MODEL_PAL_BIT 0x40 #define GB_MODEL_NO_SFC_BIT 0x80 -#ifdef GB_INTERNAL -#if __clang__ -#define unrolled _Pragma("unroll") -#elif __GNUC__ >= 8 -#define unrolled _Pragma("GCC unroll 8") -#else -#define unrolled -#endif - -#endif - #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #define GB_BIG_ENDIAN #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ @@ -54,28 +43,6 @@ #error Unable to detect endianess #endif -#ifdef GB_INTERNAL -/* Todo: similar macros are everywhere, clean this up and remove direct calls to bswap */ -#ifdef GB_BIG_ENDIAN -#define LE16(x) __builtin_bswap16(x) -#define LE32(x) __builtin_bswap32(x) -#define LE64(x) __builtin_bswap64(x) -#define BE16(x) (x) -#define BE32(x) (x) -#define BE64(x) (x) -#else -#define LE16(x) (x) -#define LE32(x) (x) -#define LE64(x) (x) -#define BE16(x) __builtin_bswap16(x) -#define BE32(x) __builtin_bswap32(x) -#define BE64(x) __builtin_bswap64(x) -#endif -#endif - -#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8) -#define __builtin_bswap16(x) ({ typeof(x) _x = (x); _x >> 8 | _x << 8; }) -#endif typedef struct { struct GB_color_s { @@ -889,7 +856,7 @@ void GB_get_rom_title(GB_gameboy_t *gb, char *title); uint32_t GB_get_rom_crc32(GB_gameboy_t *gb); #ifdef GB_INTERNAL -void GB_borrow_sgb_border(GB_gameboy_t *gb); +void internal GB_borrow_sgb_border(GB_gameboy_t *gb); #endif #endif /* GB_h */ diff --git a/Core/gb_struct_def.h b/Core/gb_struct_def.h deleted file mode 100644 index 0e0ebd1..0000000 --- a/Core/gb_struct_def.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef gb_struct_def_h -#define gb_struct_def_h -struct GB_gameboy_s; -typedef struct GB_gameboy_s GB_gameboy_t; -#endif diff --git a/Core/joypad.h b/Core/joypad.h index 21fad53..645021d 100644 --- a/Core/joypad.h +++ b/Core/joypad.h @@ -1,6 +1,6 @@ #ifndef joypad_h #define joypad_h -#include "gb_struct_def.h" +#include "defs.h" #include typedef enum { @@ -20,6 +20,6 @@ void GB_set_key_state_for_player(GB_gameboy_t *gb, GB_key_t index, unsigned play void GB_icd_set_joyp(GB_gameboy_t *gb, uint8_t value); #ifdef GB_INTERNAL -void GB_update_joyp(GB_gameboy_t *gb); +void internal GB_update_joyp(GB_gameboy_t *gb); #endif #endif /* joypad_h */ diff --git a/Core/mbc.h b/Core/mbc.h index 3bbe782..3253ec5 100644 --- a/Core/mbc.h +++ b/Core/mbc.h @@ -1,6 +1,6 @@ #ifndef MBC_h #define MBC_h -#include "gb_struct_def.h" +#include "defs.h" #include typedef struct { @@ -26,8 +26,8 @@ typedef struct { #ifdef GB_INTERNAL extern const GB_cartridge_t GB_cart_defs[256]; -void GB_update_mbc_mappings(GB_gameboy_t *gb); -void GB_configure_cart(GB_gameboy_t *gb); +void internal GB_update_mbc_mappings(GB_gameboy_t *gb); +void internal GB_configure_cart(GB_gameboy_t *gb); #endif #endif /* MBC_h */ diff --git a/Core/memory.h b/Core/memory.h index 80020f1..a53ab7c 100644 --- a/Core/memory.h +++ b/Core/memory.h @@ -1,6 +1,6 @@ #ifndef memory_h #define memory_h -#include "gb_struct_def.h" +#include "defs.h" #include typedef uint8_t (*GB_read_memory_callback_t)(GB_gameboy_t *gb, uint16_t addr, uint8_t data); @@ -9,9 +9,9 @@ void GB_set_read_memory_callback(GB_gameboy_t *gb, GB_read_memory_callback_t cal uint8_t GB_read_memory(GB_gameboy_t *gb, uint16_t addr); void GB_write_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value); #ifdef GB_INTERNAL -void GB_dma_run(GB_gameboy_t *gb); -void GB_hdma_run(GB_gameboy_t *gb); -void GB_trigger_oam_bug(GB_gameboy_t *gb, uint16_t address); +void internal GB_dma_run(GB_gameboy_t *gb); +void internal GB_hdma_run(GB_gameboy_t *gb); +void internal GB_trigger_oam_bug(GB_gameboy_t *gb, uint16_t address); #endif #endif /* memory_h */ diff --git a/Core/printer.h b/Core/printer.h index f5c9b27..f4ccfe4 100644 --- a/Core/printer.h +++ b/Core/printer.h @@ -2,7 +2,7 @@ #define printer_h #include #include -#include "gb_struct_def.h" +#include "defs.h" #define GB_PRINTER_MAX_COMMAND_LENGTH 0x280 #define GB_PRINTER_DATA_SIZE 0x280 diff --git a/Core/rewind.h b/Core/rewind.h index ad54841..a3e2edf 100644 --- a/Core/rewind.h +++ b/Core/rewind.h @@ -2,11 +2,11 @@ #define rewind_h #include -#include "gb_struct_def.h" +#include "defs.h" #ifdef GB_INTERNAL -void GB_rewind_push(GB_gameboy_t *gb); -void GB_rewind_free(GB_gameboy_t *gb); +void internal GB_rewind_push(GB_gameboy_t *gb); +void internal GB_rewind_free(GB_gameboy_t *gb); #endif bool GB_rewind_pop(GB_gameboy_t *gb); void GB_set_rewind_length(GB_gameboy_t *gb, double seconds); diff --git a/Core/rumble.h b/Core/rumble.h index eae9f37..196c191 100644 --- a/Core/rumble.h +++ b/Core/rumble.h @@ -1,7 +1,7 @@ #ifndef rumble_h #define rumble_h -#include "gb_struct_def.h" +#include "defs.h" typedef enum { GB_RUMBLE_DISABLED, @@ -10,7 +10,7 @@ typedef enum { } GB_rumble_mode_t; #ifdef GB_INTERNAL -void GB_handle_rumble(GB_gameboy_t *gb); +void internal GB_handle_rumble(GB_gameboy_t *gb); #endif void GB_set_rumble_mode(GB_gameboy_t *gb, GB_rumble_mode_t mode); diff --git a/Core/save_state.h b/Core/save_state.h index bf43a65..b57130f 100644 --- a/Core/save_state.h +++ b/Core/save_state.h @@ -36,8 +36,8 @@ static inline uint32_t state_magic(void) } /* For internal in-memory save states (rewind, debugger) that do not need BESS */ -size_t GB_get_save_state_size_no_bess(GB_gameboy_t *gb); -void GB_save_state_to_buffer_no_bess(GB_gameboy_t *gb, uint8_t *buffer); +size_t internal GB_get_save_state_size_no_bess(GB_gameboy_t *gb); +void internal GB_save_state_to_buffer_no_bess(GB_gameboy_t *gb, uint8_t *buffer); #endif #endif /* save_state_h */ diff --git a/Core/sgb.h b/Core/sgb.h index f4d60fe..7d961a1 100644 --- a/Core/sgb.h +++ b/Core/sgb.h @@ -1,6 +1,6 @@ #ifndef sgb_h #define sgb_h -#include "gb_struct_def.h" +#include "defs.h" #include #include @@ -58,9 +58,9 @@ struct GB_sgb_s { uint8_t received_header[0x54]; }; -void GB_sgb_write(GB_gameboy_t *gb, uint8_t value); -void GB_sgb_render(GB_gameboy_t *gb); -void GB_sgb_load_default_data(GB_gameboy_t *gb); +void internal GB_sgb_write(GB_gameboy_t *gb, uint8_t value); +void internal GB_sgb_render(GB_gameboy_t *gb); +void internal GB_sgb_load_default_data(GB_gameboy_t *gb); #endif diff --git a/Core/sm83_cpu.h b/Core/sm83_cpu.h index 49fa80b..95e6462 100644 --- a/Core/sm83_cpu.h +++ b/Core/sm83_cpu.h @@ -1,11 +1,11 @@ #ifndef sm83_cpu_h #define sm83_cpu_h -#include "gb_struct_def.h" +#include "defs.h" #include void GB_cpu_disassemble(GB_gameboy_t *gb, uint16_t pc, uint16_t count); #ifdef GB_INTERNAL -void GB_cpu_run(GB_gameboy_t *gb); +void internal GB_cpu_run(GB_gameboy_t *gb); #endif #endif /* sm83_cpu_h */ diff --git a/Core/symbol_hash.h b/Core/symbol_hash.h index 2a03c96..7efc475 100644 --- a/Core/symbol_hash.h +++ b/Core/symbol_hash.h @@ -27,12 +27,12 @@ typedef struct { } GB_reversed_symbol_map_t; #ifdef GB_INTERNAL -void GB_reversed_map_add_symbol(GB_reversed_symbol_map_t *map, uint16_t bank, GB_bank_symbol_t *symbol); -const GB_symbol_t *GB_reversed_map_find_symbol(GB_reversed_symbol_map_t *map, const char *name); -GB_bank_symbol_t *GB_map_add_symbol(GB_symbol_map_t *map, uint16_t addr, const char *name); -const GB_bank_symbol_t *GB_map_find_symbol(GB_symbol_map_t *map, uint16_t addr); -GB_symbol_map_t *GB_map_alloc(void); -void GB_map_free(GB_symbol_map_t *map); +void internal GB_reversed_map_add_symbol(GB_reversed_symbol_map_t *map, uint16_t bank, GB_bank_symbol_t *symbol); +const GB_symbol_t *internal GB_reversed_map_find_symbol(GB_reversed_symbol_map_t *map, const char *name); +GB_bank_symbol_t *internal GB_map_add_symbol(GB_symbol_map_t *map, uint16_t addr, const char *name); +const GB_bank_symbol_t *internal GB_map_find_symbol(GB_symbol_map_t *map, uint16_t addr); +GB_symbol_map_t *internal GB_map_alloc(void); +void internal GB_map_free(GB_symbol_map_t *map); #endif #endif /* symbol_hash_h */ diff --git a/Core/timing.h b/Core/timing.h index b53eeec..5e29e80 100644 --- a/Core/timing.h +++ b/Core/timing.h @@ -1,13 +1,13 @@ #ifndef timing_h #define timing_h -#include "gb_struct_def.h" +#include "defs.h" #ifdef GB_INTERNAL -void GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles); -void GB_emulate_timer_glitch(GB_gameboy_t *gb, uint8_t old_tac, uint8_t new_tac); -bool GB_timing_sync_turbo(GB_gameboy_t *gb); /* Returns true if should skip frame */ -void GB_timing_sync(GB_gameboy_t *gb); -void GB_set_internal_div_counter(GB_gameboy_t *gb, uint16_t value); +void internal GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles); +void internal GB_emulate_timer_glitch(GB_gameboy_t *gb, uint8_t old_tac, uint8_t new_tac); +bool internal GB_timing_sync_turbo(GB_gameboy_t *gb); /* Returns true if should skip frame */ +void internal GB_timing_sync(GB_gameboy_t *gb); +void internal GB_set_internal_div_counter(GB_gameboy_t *gb, uint16_t value); enum { GB_TIMA_RUNNING = 0, diff --git a/Core/workboy.h b/Core/workboy.h index d21f273..c99c272 100644 --- a/Core/workboy.h +++ b/Core/workboy.h @@ -3,7 +3,7 @@ #include #include #include -#include "gb_struct_def.h" +#include "defs.h" typedef struct { diff --git a/Makefile b/Makefile index 7016ac3..842883f 100644 --- a/Makefile +++ b/Makefile @@ -175,7 +175,7 @@ CFLAGS += -O3 -DNDEBUG STRIP := strip ifeq ($(PLATFORM),Darwin) LDFLAGS += -Wl,-exported_symbols_list,$(NULL) -STRIP := -@true +STRIP := strip -x endif ifneq ($(PLATFORM),windows32) LDFLAGS += -flto