ping
The MSP430 target supports the automatic placement of functions and data in different memory regions when passing the "-mdata-region=either" and "-mcode-region=either" options. MSP430x devices support the large memory model, "-mlarge", which enables 20 bit pointers, however the vector table across all MSP430 targets only accepts 16-bit pointers. To prevent the use of 20-bit pointers in the vector table when the large memory model is used, the MSP430 backend currently places functions specified with the interrupt attribute in a section called ".lowtext". This section is placed at the beginning of .text in the MSP430 linker scripts. PR target/78838 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78838) reports that a function with the interrupt attribute is placed in a non-existent section ".either.lowtext" when "-mlarge", "-mcode-region=either" and "-ffunction-sections" are passed. The backend has correctly decided to place the function in .lowtext, but has applied the .either prefix which is undesirable. No additional .lower/.upper/.either prefixes should be applied to the section name once it has been placed in .lowtext, the patch below implements this. I've built and tested successfully with no regressions reported: Target is msp430-unknown-elf Host is x86_64-unknown-linux-gnu Testsuite variations: msp430-sim/-mcpu=msp430x/-mlarge/-mdata-region=either/-mcode-region=either The section .lowtext will only be utilised if the large memory model is used, which is why I have only tested with this testsuite variation. I haven't run the g++ testsuite because msp430-elf doesn't build with C++ support at the moment: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79242 I don't have write access to the GCC SVN repository, so if this patch is satisfactory, I would appreciate if someone could commit it for me. Thanks. --- 2017-02-XX Jozef Lawrynowicz <joze...@somniumtech.com> gcc/ PR target/78838 * config/msp430/msp430.c (gen_prefix): Return NULL when section name is .lowtext (msp430_section_is_lowtext): New function. gcc/testsuite PR target/78838 * gcc.target/msp430/interrupt_fn_placement.c: New test From: Jozef Lawrynowicz <joze...@somniumtech.com> Date: Wed, 15 Feb 2017 13:03:40 +0000 Subject: [PATCH] [MSP430] PR78838: Do not add section name prefixes when the section name is .lowtext --- gcc/config/msp430/msp430.c | 14 ++++++++++++++ gcc/testsuite/gcc.target/msp430/interrupt_fn_placement.c | 9 +++++++++ 2 files changed, 23 insertions(+) create mode 100644 gcc/testsuite/gcc.target/msp430/interrupt_fn_placement.c diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c index 6f63116..c9dffb1 100644 --- a/gcc/config/msp430/msp430.c +++ b/gcc/config/msp430/msp430.c @@ -1808,6 +1808,15 @@ is_critical_func (tree decl = current_function_decl) return has_attr (ATTR_CRIT, decl); } +static bool +msp430_section_is_lowtext (tree decl = current_function_decl) +{ + if (decl == NULL_TREE) + return false; + const char * dec_name = DECL_SECTION_NAME (decl); + return dec_name && strcmp (".lowtext", dec_name) == 0; +} + #undef TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS #define TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS msp430_allocate_stack_slots_for_args @@ -2146,6 +2155,11 @@ 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 (msp430_section_is_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/gcc.target/msp430/interrupt_fn_placement.c b/gcc/testsuite/gcc.target/msp430/interrupt_fn_placement.c new file mode 100644 index 0000000..d5d2113 --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/interrupt_fn_placement.c @@ -0,0 +1,9 @@ +/* { dg-do link } */ +/* { dg-options "-mlarge -mcode-region=either -ffunction-sections" } */ + +void __attribute__((interrupt(2))) ir_1(void) { +} + +int main(void) { + while(1); +} -- 1.8.3.1