diff options
author | Jozef Lawrynowicz <jozef.l@mittosystems.com> | 2018-11-16 23:53:30 +0000 |
---|---|---|
committer | Jozef Lawrynowicz <jozefl@gcc.gnu.org> | 2018-11-16 23:53:30 +0000 |
commit | cac6691c1375ea292e430d2c5780ebd3372f5f66 (patch) | |
tree | 26e6b0d4664cd6bc308e5010c9c81781e26aaebe | |
parent | 8808260dfd1f7f25e7464bcf8006235677830672 (diff) | |
download | gcc-cac6691c1375ea292e430d2c5780ebd3372f5f66.zip gcc-cac6691c1375ea292e430d2c5780ebd3372f5f66.tar.gz gcc-cac6691c1375ea292e430d2c5780ebd3372f5f66.tar.bz2 |
re PR target/87927 (ICE: segmentation fault with patchable_function_entry attribute for msp430-elf -mlarge)
2018-11-16 Jozef Lawrynowicz <jozef.l@mittosystems.com>
PR target/87927
* target-def.h: Initialize TARGET_ASM_{,UN}ALIGNED_P{S,D,T}I_OP.
Add them to the TARGET_ASM_{,UN}ALIGNED_INT_OP structs.
* target.def: Enumerate TARGET_ASM_{,UN}ALIGNED_P{S,D,T}I_OP in
the byte_op hook.
* target.h: Add psi, pdi, pti to struct asm_int_op definition.
* targhooks.c (default_print_patchable_function_entry): Assert
asm_int_op does not return a NULL string.
* varasm.c (integer_asm_op): Return the op for a partial int type
when the requested size does not correspond to an integer type.
* config/msp430/msp430.c: Initialize TARGET_ASM_{,UN}ALIGNED_PSI_OP.
* doc/tm.texi: Regenerate.
From-SVN: r266226
-rw-r--r-- | gcc/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/config/msp430/msp430.c | 5 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 6 | ||||
-rw-r--r-- | gcc/target-def.h | 15 | ||||
-rw-r--r-- | gcc/target.def | 6 | ||||
-rw-r--r-- | gcc/target.h | 3 | ||||
-rw-r--r-- | gcc/targhooks.c | 4 | ||||
-rw-r--r-- | gcc/varasm.c | 14 |
8 files changed, 67 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4b87c43..43b8544 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2018-11-16 Jozef Lawrynowicz <jozef.l@mittosystems.com> + + PR target/87927 + * target-def.h: Initialize TARGET_ASM_{,UN}ALIGNED_P{S,D,T}I_OP. + Add them to the TARGET_ASM_{,UN}ALIGNED_INT_OP structs. + * target.def: Enumerate TARGET_ASM_{,UN}ALIGNED_P{S,D,T}I_OP in + the byte_op hook. + * target.h: Add psi, pdi, pti to struct asm_int_op definition. + * targhooks.c (default_print_patchable_function_entry): Assert + asm_int_op does not return a NULL string. + * varasm.c (integer_asm_op): Return the op for a partial int type + when the requested size does not correspond to an integer type. + * config/msp430/msp430.c: Initialize TARGET_ASM_{,UN}ALIGNED_PSI_OP. + * doc/tm.texi: Regenerate. + 2018-11-12 Jason Merrill <jason@redhat.com> * gimplify.c (gimplify_case_label_expr): Handle hot/cold attributes. diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c index 7d305b1..3a41cc0 100644 --- a/gcc/config/msp430/msp430.c +++ b/gcc/config/msp430/msp430.c @@ -3469,6 +3469,11 @@ msp430_print_operand_raw (FILE * file, rtx op) } } +#undef TARGET_ASM_ALIGNED_PSI_OP +#define TARGET_ASM_ALIGNED_PSI_OP "\t.long\t" +#undef TARGET_ASM_UNALIGNED_PSI_OP +#define TARGET_ASM_UNALIGNED_PSI_OP TARGET_ASM_ALIGNED_PSI_OP + #undef TARGET_PRINT_OPERAND_ADDRESS #define TARGET_PRINT_OPERAND_ADDRESS msp430_print_operand_addr diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 0a2ad9a..e348f0a 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -8036,12 +8036,18 @@ hook. @deftypevr {Target Hook} {const char *} TARGET_ASM_BYTE_OP @deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_HI_OP +@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_PSI_OP @deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_SI_OP +@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_PDI_OP @deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_DI_OP +@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_PTI_OP @deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_TI_OP @deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_HI_OP +@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_PSI_OP @deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_SI_OP +@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_PDI_OP @deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_DI_OP +@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_PTI_OP @deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_TI_OP These hooks specify assembly directives for creating certain kinds of integer object. The @code{TARGET_ASM_BYTE_OP} directive creates a diff --git a/gcc/target-def.h b/gcc/target-def.h index 695198b..fb968e6 100644 --- a/gcc/target-def.h +++ b/gcc/target-def.h @@ -47,6 +47,15 @@ #define TARGET_ASM_UNALIGNED_TI_OP NULL #endif /* OBJECT_FORMAT_ELF */ +/* There is no standard way to handle P{S,D,T}Imode, targets must implement them + if required. */ +#define TARGET_ASM_ALIGNED_PSI_OP NULL +#define TARGET_ASM_UNALIGNED_PSI_OP NULL +#define TARGET_ASM_ALIGNED_PDI_OP NULL +#define TARGET_ASM_UNALIGNED_PDI_OP NULL +#define TARGET_ASM_ALIGNED_PTI_OP NULL +#define TARGET_ASM_UNALIGNED_PTI_OP NULL + #if !defined(TARGET_ASM_CONSTRUCTOR) && !defined(USE_COLLECT2) # ifdef CTORS_SECTION_ASM_OP # define TARGET_ASM_CONSTRUCTOR default_ctor_section_asm_out_constructor @@ -89,14 +98,20 @@ #define TARGET_ASM_ALIGNED_INT_OP \ {TARGET_ASM_ALIGNED_HI_OP, \ + TARGET_ASM_ALIGNED_PSI_OP, \ TARGET_ASM_ALIGNED_SI_OP, \ + TARGET_ASM_ALIGNED_PDI_OP, \ TARGET_ASM_ALIGNED_DI_OP, \ + TARGET_ASM_ALIGNED_PTI_OP, \ TARGET_ASM_ALIGNED_TI_OP} #define TARGET_ASM_UNALIGNED_INT_OP \ {TARGET_ASM_UNALIGNED_HI_OP, \ + TARGET_ASM_UNALIGNED_PSI_OP, \ TARGET_ASM_UNALIGNED_SI_OP, \ + TARGET_ASM_UNALIGNED_PDI_OP, \ TARGET_ASM_UNALIGNED_DI_OP, \ + TARGET_ASM_UNALIGNED_PTI_OP, \ TARGET_ASM_UNALIGNED_TI_OP} #if !defined (TARGET_FUNCTION_INCOMING_ARG) diff --git a/gcc/target.def b/gcc/target.def index f9469d6..96f37e0 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -45,12 +45,18 @@ DEFHOOKPODX (close_paren, const char *, ")") DEFHOOKPOD (byte_op, "@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_HI_OP\n\ +@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_PSI_OP\n\ @deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_SI_OP\n\ +@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_PDI_OP\n\ @deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_DI_OP\n\ +@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_PTI_OP\n\ @deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_TI_OP\n\ @deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_HI_OP\n\ +@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_PSI_OP\n\ @deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_SI_OP\n\ +@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_PDI_OP\n\ @deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_DI_OP\n\ +@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_PTI_OP\n\ @deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_TI_OP\n\ These hooks specify assembly directives for creating certain kinds\n\ of integer object. The @code{TARGET_ASM_BYTE_OP} directive creates a\n\ diff --git a/gcc/target.h b/gcc/target.h index 8968580..663926b 100644 --- a/gcc/target.h +++ b/gcc/target.h @@ -158,8 +158,11 @@ extern bool stmt_in_inner_loop_p (struct _stmt_vec_info *); struct asm_int_op { const char *hi; + const char *psi; const char *si; + const char *pdi; const char *di; + const char *pti; const char *ti; }; diff --git a/gcc/targhooks.c b/gcc/targhooks.c index bcbd534..41ccffe 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -1807,13 +1807,15 @@ default_print_patchable_function_entry (FILE *file, char buf[256]; static int patch_area_number; section *previous_section = in_section; + const char *asm_op = integer_asm_op (POINTER_SIZE_UNITS, false); + gcc_assert (asm_op != NULL); patch_area_number++; ASM_GENERATE_INTERNAL_LABEL (buf, "LPFE", patch_area_number); switch_to_section (get_section ("__patchable_function_entries", 0, NULL)); - fputs (integer_asm_op (POINTER_SIZE_UNITS, false), file); + fputs (asm_op, file); assemble_name_raw (file, buf); fputc ('\n', file); diff --git a/gcc/varasm.c b/gcc/varasm.c index 545e13f..243d205 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -2733,10 +2733,24 @@ integer_asm_op (int size, int aligned_p) return targetm.asm_out.byte_op; case 2: return ops->hi; + case 3: + return ops->psi; case 4: return ops->si; + case 5: + case 6: + case 7: + return ops->pdi; case 8: return ops->di; + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + return ops->pti; case 16: return ops->ti; default: |