summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJozef Lawrynowicz <jozef.l@mittosystems.com>2018-11-16 23:53:30 +0000
committerJozef Lawrynowicz <jozefl@gcc.gnu.org>2018-11-16 23:53:30 +0000
commitcac6691c1375ea292e430d2c5780ebd3372f5f66 (patch)
tree26e6b0d4664cd6bc308e5010c9c81781e26aaebe
parent8808260dfd1f7f25e7464bcf8006235677830672 (diff)
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/ChangeLog15
-rw-r--r--gcc/config/msp430/msp430.c5
-rw-r--r--gcc/doc/tm.texi6
-rw-r--r--gcc/target-def.h15
-rw-r--r--gcc/target.def6
-rw-r--r--gcc/target.h3
-rw-r--r--gcc/targhooks.c4
-rw-r--r--gcc/varasm.c14
8 files changed, 67 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4b87c43a2ea..43b854451cc 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 7d305b1bece..3a41cc011e7 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 0a2ad9a745e..e348f0a7da6 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 695198b9555..fb968e66616 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 f9469d69cb0..96f37e0462b 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 8968580e432..663926b0896 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 bcbd534e32d..41ccffe8645 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 545e13fef6a..243d205c1f5 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: