Fix problems with the MSP430 port's handling of persistent data.
PR target/78818 gcc * config/msp430/msp430.c (msp430_data_attr): Check that it's possible for a variable to have a section before checking if the section has a name. Set section to.persistent if persistent attribute is set. Warn if .persistent attribute is used on an automatic variable. tests * gcc.target/msp430/pr78818-real.c: New template for tests. * gcc.target/msp430/pr78818-auto.c: New test. * gcc.target/msp430/pr78818-data-region.c: New test. * gcc.target/msp430/pr78818-data-sec.c: New test. * gcc.target/msp430/pr78818-auto-warn.c: New test. From-SVN: r249222
This commit is contained in:
parent
0948d23fff
commit
61f5d85294
@ -1,3 +1,12 @@
|
||||
2017-06-15 Jozef Lawrynowicz <jozef.l@somniumtech.com>
|
||||
|
||||
PR target/78818
|
||||
* config/msp430/msp430.c (msp430_data_attr): Check that it's possible
|
||||
for a variable to have a section before checking if the section has a
|
||||
name.
|
||||
Set section to.persistent if persistent attribute is set.
|
||||
Warn if .persistent attribute is used on an automatic variable.
|
||||
|
||||
2017-06-15 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR rtl-optimization/80474
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include "expr.h"
|
||||
#include "langhooks.h"
|
||||
#include "builtins.h"
|
||||
#include "intl.h"
|
||||
|
||||
/* This file should be included last. */
|
||||
#include "target-def.h"
|
||||
@ -1993,10 +1994,24 @@ msp430_data_attr (tree * node,
|
||||
gcc_assert (args == NULL);
|
||||
|
||||
if (TREE_CODE (* node) != VAR_DECL)
|
||||
message = "%qE attribute only applies to variables";
|
||||
message = G_("%qE attribute only applies to variables");
|
||||
|
||||
if (DECL_SECTION_NAME (* node))
|
||||
message = "%qE attribute cannot be applied to variables with specific sections";
|
||||
/* Check that it's possible for the variable to have a section. */
|
||||
if ((TREE_STATIC (* node) || DECL_EXTERNAL (* node) || in_lto_p)
|
||||
&& DECL_SECTION_NAME (* node))
|
||||
message = G_("%qE attribute cannot be applied to variables with specific sections");
|
||||
|
||||
if (!message && TREE_NAME_EQ (name, ATTR_PERSIST) && !TREE_STATIC (* node)
|
||||
&& !TREE_PUBLIC (* node) && !DECL_EXTERNAL (* node))
|
||||
message = G_("%qE attribute has no effect on automatic variables");
|
||||
|
||||
/* It's not clear if there is anything that can be set here to prevent the
|
||||
front end placing the variable before the back end can handle it, in a
|
||||
similar way to how DECL_COMMON is used below.
|
||||
So just place the variable in the .persistent section now. */
|
||||
if ((TREE_STATIC (* node) || DECL_EXTERNAL (* node) || in_lto_p)
|
||||
&& TREE_NAME_EQ (name, ATTR_PERSIST))
|
||||
set_decl_section_name (* node, ".persistent");
|
||||
|
||||
/* If this var is thought to be common, then change this. Common variables
|
||||
are assigned to sections before the backend has a chance to process them. */
|
||||
|
@ -1,3 +1,12 @@
|
||||
2017-06-15 Jozef Lawrynowicz <jozef.l@somniumtech.com>
|
||||
|
||||
PR target/78818
|
||||
* gcc.target/msp430/pr78818-real.c: New template for tests.
|
||||
* gcc.target/msp430/pr78818-auto.c: New test.
|
||||
* gcc.target/msp430/pr78818-data-region.c: New test.
|
||||
* gcc.target/msp430/pr78818-data-sec.c: New test.
|
||||
* gcc.target/msp430/pr78818-auto-warn.c: New test.
|
||||
|
||||
2017-06-15 Thomas Preud'homme <thomas.preudhomme@arm.com>
|
||||
|
||||
* gcc.target/arm/its.c: Check that no IT blocks has more than 2
|
||||
|
16
gcc/testsuite/gcc.target/msp430/pr78818-auto-warn.c
Normal file
16
gcc/testsuite/gcc.target/msp430/pr78818-auto-warn.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
__attribute__((persistent)) int persistent_1_g = 1;
|
||||
__attribute__((persistent)) int persistent_2_g = 0;
|
||||
static __attribute__((persistent)) int persistent_3_g = 1;
|
||||
static __attribute__((persistent)) int persistent_4_g = 0;
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
__attribute__((persistent)) int persistent_1 = 1; /* { dg-warning "attribute has no effect on automatic" } */
|
||||
__attribute__((persistent)) int persistent_2 = 0; /* { dg-warning "attribute has no effect on automatic" } */
|
||||
static __attribute__((persistent)) int persistent_3 = 1;
|
||||
static __attribute__((persistent)) int persistent_4 = 0;
|
||||
return 0;
|
||||
}
|
5
gcc/testsuite/gcc.target/msp430/pr78818-auto.c
Normal file
5
gcc/testsuite/gcc.target/msp430/pr78818-auto.c
Normal file
@ -0,0 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
/* { dg-final { scan-assembler-not "\\.comm" } } */
|
||||
|
||||
#include "pr78818-real.c"
|
6
gcc/testsuite/gcc.target/msp430/pr78818-data-region.c
Normal file
6
gcc/testsuite/gcc.target/msp430/pr78818-data-region.c
Normal file
@ -0,0 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-mdata-region=either" } */
|
||||
|
||||
/* { dg-final { scan-assembler-not "\\.either" } } */
|
||||
|
||||
#include "pr78818-real.c"
|
7
gcc/testsuite/gcc.target/msp430/pr78818-data-sec.c
Normal file
7
gcc/testsuite/gcc.target/msp430/pr78818-data-sec.c
Normal file
@ -0,0 +1,7 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fdata-sections" } */
|
||||
|
||||
/* { dg-final { scan-assembler-not "\\.data" } } */
|
||||
/* { dg-final { scan-assembler-not "\\.bss" } } */
|
||||
|
||||
#include "pr78818-real.c"
|
9
gcc/testsuite/gcc.target/msp430/pr78818-real.c
Normal file
9
gcc/testsuite/gcc.target/msp430/pr78818-real.c
Normal file
@ -0,0 +1,9 @@
|
||||
__attribute__((persistent)) int persistent_1 = 1;
|
||||
__attribute__((persistent)) int persistent_2 = 0;
|
||||
static __attribute__((persistent)) int persistent_3 = 1;
|
||||
static __attribute__((persistent)) int persistent_4 = 0;
|
||||
|
||||
int main (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user