diff options
Diffstat (limited to 'gcc/config/arm')
-rw-r--r-- | gcc/config/arm/arm.c | 58 | ||||
-rw-r--r-- | gcc/config/arm/arm.h | 16 | ||||
-rw-r--r-- | gcc/config/arm/bpabi.h | 3 |
3 files changed, 50 insertions, 27 deletions
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 44cbc8e..2ff010b 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -193,12 +193,13 @@ static bool arm_align_anon_bitfield (void); static bool arm_return_in_msb (const_tree); static bool arm_must_pass_in_stack (enum machine_mode, const_tree); static bool arm_return_in_memory (const_tree, const_tree); -#ifdef TARGET_UNWIND_INFO +#if ARM_UNWIND_INFO static void arm_unwind_emit (FILE *, rtx); static bool arm_output_ttype (rtx); static void arm_asm_emit_except_personality (rtx); static void arm_asm_init_sections (void); #endif +static enum unwind_info_type arm_except_unwind_info (void); static void arm_dwarf_handle_frame_unspec (const char *, rtx, int); static rtx arm_dwarf_register_span (rtx); @@ -461,7 +462,7 @@ static const struct attribute_spec arm_attribute_table[] = #undef TARGET_MUST_PASS_IN_STACK #define TARGET_MUST_PASS_IN_STACK arm_must_pass_in_stack -#ifdef TARGET_UNWIND_INFO +#if ARM_UNWIND_INFO #undef TARGET_ASM_UNWIND_EMIT #define TARGET_ASM_UNWIND_EMIT arm_unwind_emit @@ -477,7 +478,10 @@ static const struct attribute_spec arm_attribute_table[] = #undef TARGET_ASM_INIT_SECTIONS #define TARGET_ASM_INIT_SECTIONS arm_asm_init_sections -#endif /* TARGET_UNWIND_INFO */ +#endif /* ARM_UNWIND_INFO */ + +#undef TARGET_EXCEPT_UNWIND_INFO +#define TARGET_EXCEPT_UNWIND_INFO arm_except_unwind_info #undef TARGET_DWARF_HANDLE_FRAME_UNSPEC #define TARGET_DWARF_HANDLE_FRAME_UNSPEC arm_dwarf_handle_frame_unspec @@ -2032,7 +2036,7 @@ arm_compute_func_type (void) if (optimize > 0 && (TREE_NOTHROW (current_function_decl) || !(flag_unwind_tables - || (flag_exceptions && !USING_SJLJ_EXCEPTIONS))) + || (flag_exceptions && arm_except_unwind_info () != UI_SJLJ))) && TREE_THIS_VOLATILE (current_function_decl)) type |= ARM_FT_VOLATILE; @@ -15719,7 +15723,8 @@ arm_expand_prologue (void) using the EABI unwinder, to prevent faulting instructions from being swapped with a stack adjustment. */ if (crtl->profile || !TARGET_SCHED_PROLOG - || (ARM_EABI_UNWIND_TABLES && cfun->can_throw_non_call_exceptions)) + || (arm_except_unwind_info () == UI_TARGET + && cfun->can_throw_non_call_exceptions)) emit_insn (gen_blockage ()); /* If the link register is being kept alive, with the return address in it, @@ -19575,7 +19580,7 @@ thumb_pushpop (FILE *f, unsigned long mask, int push, int *cfa_offset, return; } - if (ARM_EABI_UNWIND_TABLES && push) + if (push && arm_except_unwind_info () == UI_TARGET) { fprintf (f, "\t.save\t{"); for (regno = 0; regno < 15; regno++) @@ -20515,7 +20520,8 @@ thumb1_expand_prologue (void) using the EABI unwinder, to prevent faulting instructions from being swapped with a stack adjustment. */ if (crtl->profile || !TARGET_SCHED_PROLOG - || (ARM_EABI_UNWIND_TABLES && cfun->can_throw_non_call_exceptions)) + || (arm_except_unwind_info () == UI_TARGET + && cfun->can_throw_non_call_exceptions)) emit_insn (gen_blockage ()); cfun->machine->lr_save_eliminated = !thumb_force_lr_save (); @@ -20628,7 +20634,7 @@ thumb1_output_function_prologue (FILE *f, HOST_WIDE_INT size ATTRIBUTE_UNUSED) if (crtl->args.pretend_args_size) { /* Output unwind directive for the stack adjustment. */ - if (ARM_EABI_UNWIND_TABLES) + if (arm_except_unwind_info () == UI_TARGET) fprintf (f, "\t.pad #%d\n", crtl->args.pretend_args_size); @@ -20698,7 +20704,7 @@ thumb1_output_function_prologue (FILE *f, HOST_WIDE_INT size ATTRIBUTE_UNUSED) work_register = thumb_find_work_register (live_regs_mask); - if (ARM_EABI_UNWIND_TABLES) + if (arm_except_unwind_info () == UI_TARGET) asm_fprintf (f, "\t.pad #16\n"); asm_fprintf @@ -22061,7 +22067,7 @@ arm_dwarf_register_span (rtx rtl) return p; } -#ifdef TARGET_UNWIND_INFO +#if ARM_UNWIND_INFO /* Emit unwind directives for a store-multiple instruction or stack pointer push during alignment. These should only ever be generated by the function prologue code, so @@ -22275,7 +22281,7 @@ arm_unwind_emit (FILE * asm_out_file, rtx insn) { rtx pat; - if (!ARM_EABI_UNWIND_TABLES) + if (arm_except_unwind_info () != UI_TARGET) return; if (!(flag_unwind_tables || crtl->uses_eh_lsda) @@ -22344,7 +22350,33 @@ arm_asm_init_sections (void) exception_section = get_unnamed_section (0, output_section_asm_op, "\t.handlerdata"); } -#endif /* TARGET_UNWIND_INFO */ +#endif /* ARM_UNWIND_INFO */ + +/* Implement TARGET_EXCEPT_UNWIND_INFO. */ + +static enum unwind_info_type +arm_except_unwind_info (void) +{ + /* Honor the --enable-sjlj-exceptions configure switch. */ +#ifdef CONFIG_SJLJ_EXCEPTIONS + if (CONFIG_SJLJ_EXCEPTIONS) + return UI_SJLJ; +#endif + + /* If not using ARM EABI unwind tables... */ + if (ARM_UNWIND_INFO) + { + /* For simplicity elsewhere in this file, indicate that all unwind + info is disabled if we're not emitting unwind tables. */ + if (!flag_exceptions && !flag_unwind_tables) + return UI_NONE; + else + return UI_TARGET; + } + + /* ... we use sjlj exceptions for backwards compatibility. */ + return UI_SJLJ; +} /* Handle UNSPEC DWARF call frame instructions. These are needed for dynamic @@ -22376,7 +22408,7 @@ arm_dwarf_handle_frame_unspec (const char *label, rtx pattern, int index) void arm_output_fn_unwind (FILE * f, bool prologue) { - if (!ARM_EABI_UNWIND_TABLES) + if (arm_except_unwind_info () != UI_TARGET) return; if (prologue) diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index 9bd1c69..9bbe346 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -948,14 +948,11 @@ extern int arm_structure_size_boundary; #define FIRST_HI_REGNUM 8 #define LAST_HI_REGNUM 11 -#ifndef TARGET_UNWIND_INFO -/* We use sjlj exceptions for backwards compatibility. */ -#define MUST_USE_SJLJ_EXCEPTIONS 1 +/* Overridden by config/arm/bpabi.h. */ +#ifndef ARM_UNWIND_INFO +#define ARM_UNWIND_INFO 0 #endif -/* We can generate DWARF2 Unwind info, even though we don't use it. */ -#define DWARF2_UNWIND_INFO 1 - /* Use r0 and r1 to pass exception handling information. */ #define EH_RETURN_DATA_REGNO(N) (((N) < 2) ? N : INVALID_REGNUM) @@ -2033,13 +2030,6 @@ typedef struct #define ARM_OUTPUT_FN_UNWIND(F, PROLOGUE) arm_output_fn_unwind (F, PROLOGUE) -#ifdef TARGET_UNWIND_INFO -#define ARM_EABI_UNWIND_TABLES \ - ((!USING_SJLJ_EXCEPTIONS && flag_exceptions) || flag_unwind_tables) -#else -#define ARM_EABI_UNWIND_TABLES 0 -#endif - /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx and check its validity for a certain class. We have two alternate definitions for each of them. diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h index c6cdca4..9a59b47 100644 --- a/gcc/config/arm/bpabi.h +++ b/gcc/config/arm/bpabi.h @@ -26,7 +26,8 @@ #define TARGET_BPABI (TARGET_AAPCS_BASED) /* BPABI targets use EABI frame unwinding tables. */ -#define TARGET_UNWIND_INFO 1 +#undef ARM_UNWIND_INFO +#define ARM_UNWIND_INFO 1 /* Section 4.1 of the AAPCS requires the use of VFP format. */ #undef FPUTYPE_DEFAULT |