diff options
author | Jozef Lawrynowicz <jozef.l@mittosystems.com> | 2020-11-23 12:06:39 +0000 |
---|---|---|
committer | Jozef Lawrynowicz <jozef.l@mittosystems.com> | 2020-11-23 12:15:51 +0000 |
commit | 762ca20364a590be2cb9c79c0101ccbff74b5de1 (patch) | |
tree | b865ba9ae2ac517d369987c8329cd9623cb31478 /gcc/tree.h | |
parent | fb8309d4abdcd4c8de07bd4c42e22d1e80471765 (diff) | |
download | gcc-762ca20364a590be2cb9c79c0101ccbff74b5de1.zip gcc-762ca20364a590be2cb9c79c0101ccbff74b5de1.tar.gz gcc-762ca20364a590be2cb9c79c0101ccbff74b5de1.tar.bz2 |
Implement the "persistent" attribute
The "persistent" attribute is used for variables that are initialized
by the program loader, but are not initialized by the runtime startup
code. "persistent" variables are placed in a non-volatile area of
memory, which allows their value to "persist" between processor resets.
gcc/c-family/ChangeLog:
* c-attribs.c (handle_special_var_sec_attribute): New.
(handle_noinit_attribute): Remove.
(attr_noinit_exclusions): Rename to...
(attr_section_exclusions): ...this, and add "persistent" attribute
exclusion.
(c_common_attribute_table): Add "persistent" attribute.
gcc/ChangeLog:
* doc/extend.texi (Common Variable Attributes): Document the
"persistent" variable attribute.
* doc/sourcebuild.texi (Effective-Target Keywords): Document
the "persistent" effective target keyword.
* tree.h (DECL_PERSISTENT_P): Define.
* varasm.c (bss_initializer_p): Return false for a
DECL_PERSISTENT_P decl initialized to zero.
(default_section_type_flags): Handle the ".persistent" section.
(default_elf_select_section): Likewise.
(default_unique_section): Likewise.
gcc/testsuite/ChangeLog:
* gcc.c-torture/execute/noinit-attribute.c: Moved to...
* c-c++-common/torture/attr-noinit-main.inc: ...here.
* lib/target-supports.exp (check_effective_target_persistent): New.
* c-c++-common/torture/attr-noinit-1.c: New test.
* c-c++-common/torture/attr-noinit-2.c: New test.
* c-c++-common/torture/attr-noinit-3.c: New test.
* c-c++-common/torture/attr-noinit-invalid.c: New test.
* c-c++-common/torture/attr-persistent-1.c: New test.
* c-c++-common/torture/attr-persistent-2.c: New test.
* c-c++-common/torture/attr-persistent-3.c: New test.
* c-c++-common/torture/attr-persistent-invalid.c: New test.
* c-c++-common/torture/attr-persistent-main.inc: New test.
Diffstat (limited to 'gcc/tree.h')
-rw-r--r-- | gcc/tree.h | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -2669,6 +2669,13 @@ extern tree vector_element_bits_tree (const_tree); (DECL_P (DECL) \ && (lookup_attribute ("noinit", DECL_ATTRIBUTES (DECL)) != NULL_TREE)) +/* Nonzero for a decl that is decorated with the "persistent" attribute. + decls with this attribute are placed into the ".persistent" section, so they + are not initialized by the target's startup code. */ +#define DECL_PERSISTENT_P(DECL) \ + (DECL_P (DECL) \ + && (lookup_attribute ("persistent", DECL_ATTRIBUTES (DECL)) != NULL_TREE)) + /* For function local variables of COMPLEX and VECTOR types, indicates that the variable is not aliased, and that all modifications to the variable have been adjusted so that |