diff --git a/gcc/flags.h b/gcc/flags.h index 52f5228..39e998e 100755 --- a/gcc/flags.h +++ b/gcc/flags.h @@ -454,3 +454,6 @@ extern int flag_hex_asm; /* Nonzero if generated DWARF debug info should be corrected rather than match the original (buggy) GCC 2.95.x output. */ extern int flag_fixed_debug_line_info; + +/* Nonzero if prologue bug should be fixed. */ +extern int flag_prologue_bugfix; diff --git a/gcc/thumb.c b/gcc/thumb.c index ac122f7..f773ec0 100755 --- a/gcc/thumb.c +++ b/gcc/thumb.c @@ -717,8 +717,11 @@ far_jump_used_p() rtx insn; #ifndef OLD_COMPILER - if (current_function_has_far_jump) - return 1; + if (!flag_prologue_bugfix) + { + if (current_function_has_far_jump) + return 1; + } #endif for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) diff --git a/gcc/toplev.c b/gcc/toplev.c index 0629081..696598e 100755 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -588,6 +588,9 @@ int flag_hex_asm = 0; /* Fix buggy DWARF line info generation. */ int flag_fixed_debug_line_info = 0; +/* Fix prologue bug in new compiler. */ +int flag_prologue_bugfix = 0; + typedef struct { char *string; @@ -729,6 +732,16 @@ lang_independent_options f_options[] = "Use hex instead of decimal in assembly output"}, {"fix-debug-line", &flag_fixed_debug_line_info, 1, "Generate fixed DWARF line info"}, + /* This flag fixes a bug in the newer agbcc version that causes `lr` to be + saved onto the stack in functions where it is not necessary. This is + needed to produce matching code for certain GBA games. + + This flag is defined under OLD_COMPILER to prevent a situation where a game + that uses both agbcc and old_agbcc (e.g., pokepinballrs) needs to maintain two + separate lists of flags depending on the compiler used for a specific file. + Otherwise, old_agbcc will throw an error. */ + {"prologue-bugfix", &flag_prologue_bugfix, 1, + "Prevent unnecessary saving of the lr register to the stack"}, }; #define NUM_ELEM(a) (sizeof (a) / sizeof ((a)[0]))