From b3125625df0b0895b0acbc2949d2a03dc4971145 Mon Sep 17 00:00:00 2001 From: Jozef Lawrynowicz Date: Tue, 30 May 2017 10:49:29 +0000 Subject: [PATCH] re PR target/78838 (msp430 option -mcode-region=either, -ffunction-sections, and interrupt function attributes cause incorrect section to be created) PR target/78838 gcc * config/msp430/msp430.c (gen_prefix): Return NULL when section name is .lowtext. (has_section_name): New function. testsuite * gcc.target/msp430/interrupt_fn_placement.c: New test. From-SVN: r248674 --- gcc/ChangeLog | 7 +++++++ gcc/config/msp430/msp430.c | 15 +++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ .../gcc.target/msp430/interrupt_fn_placement.c | 13 +++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/gcc.target/msp430/interrupt_fn_placement.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4700b36069a..49a8a613547 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-05-30 Jozef Lawrynowicz + + PR target/78838 + * config/msp430/msp430.c (gen_prefix): Return NULL when section name is + .lowtext. + (has_section_name): New function. + 2017-05-30 Martin Liska PR other/80909 diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c index 710a97b2958..dd53dea685b 100644 --- a/gcc/config/msp430/msp430.c +++ b/gcc/config/msp430/msp430.c @@ -1818,6 +1818,15 @@ is_critical_func (tree decl = current_function_decl) return has_attr (ATTR_CRIT, decl); } +static bool +has_section_name (const char * name, tree decl = current_function_decl) +{ + if (decl == NULL_TREE) + return false; + return (DECL_SECTION_NAME (decl) + && (strcmp (name, DECL_SECTION_NAME (decl)) == 0)); +} + #undef TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS #define TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS msp430_allocate_stack_slots_for_args @@ -2167,6 +2176,12 @@ gen_prefix (tree decl) if (has_attr ("section", decl)) return NULL; + /* If the function has been put in the .lowtext section (because it is an + interrupt handler, and the large memory model is used), then do not add + any prefixes. */ + if (has_section_name (".lowtext", decl)) + return NULL; + /* If the object has __attribute__((lower)) then use the ".lower." prefix. */ if (has_attr (ATTR_LOWER, decl)) return lower_prefix; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 682f95fe074..0ae60f0c952 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-05-30 Jozef Lawrynowicz + + PR target/78838 + * gcc.target/msp430/interrupt_fn_placement.c: New test. + 2017-05-30 Richard Biener PR middle-end/80876 diff --git a/gcc/testsuite/gcc.target/msp430/interrupt_fn_placement.c b/gcc/testsuite/gcc.target/msp430/interrupt_fn_placement.c new file mode 100644 index 00000000000..c88bfc3d0c3 --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/interrupt_fn_placement.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-mlarge -mcode-region=either -ffunction-sections" } */ +/* { dg-final { scan-assembler-not "\\.either\\.lowtext" } } */ + +void __attribute__ ((interrupt (2))) ir_1 (void) +{ + while (1); +} + +int main (void) +{ + while (1); +} -- 2.30.2