diff options
author | Jozef Lawrynowicz <jozef.l@somniumtech.com> | 2017-05-30 10:49:29 +0000 |
---|---|---|
committer | Nick Clifton <nickc@gcc.gnu.org> | 2017-05-30 10:49:29 +0000 |
commit | b3125625df0b0895b0acbc2949d2a03dc4971145 (patch) | |
tree | 2343a92808c2b8228f1f25d64b9b63f388034431 /gcc | |
parent | b2deed1233639aa49836571d2082dba0ddbd86b4 (diff) | |
download | gcc-b3125625df0b0895b0acbc2949d2a03dc4971145.zip gcc-b3125625df0b0895b0acbc2949d2a03dc4971145.tar.gz gcc-b3125625df0b0895b0acbc2949d2a03dc4971145.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/msp430/msp430.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/msp430/interrupt_fn_placement.c | 13 |
4 files changed, 40 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4700b36..49a8a61 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-05-30 Jozef Lawrynowicz <jozef.l@somniumtech.com> + + 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 <mliska@suse.cz> PR other/80909 diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c index 710a97b..dd53dea 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 682f95fe..0ae60f0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-05-30 Jozef Lawrynowicz <jozef.l@somniumtech.com> + + PR target/78838 + * gcc.target/msp430/interrupt_fn_placement.c: New test. + 2017-05-30 Richard Biener <rguenther@suse.de> 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 0000000..c88bfc3 --- /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); +} |