diff options
Diffstat (limited to 'gcc/ada/utils.c')
-rw-r--r-- | gcc/ada/utils.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/gcc/ada/utils.c b/gcc/ada/utils.c index 4c2a7c9..b19cb45 100644 --- a/gcc/ada/utils.c +++ b/gcc/ada/utils.c @@ -74,6 +74,11 @@ tree gnat_std_decls[(int) ADT_LAST]; /* Functions to call for each of the possible raise reasons. */ tree gnat_raise_decls[(int) LAST_REASON_CODE + 1]; +/* List of functions called automatically at the beginning and + end of execution, on targets without .ctors/.dtors sections. */ +tree static_ctors; +tree static_dtors; + /* Associates a GNAT tree node to a GCC tree node. It is used in `save_gnu_tree', `get_gnu_tree' and `present_gnu_tree'. See documentation of `save_gnu_tree' for more info. */ @@ -1509,8 +1514,11 @@ process_attributes (tree decl, struct attrib *attr_list) break; case ATTR_LINK_ALIAS: - TREE_STATIC (decl) = 1; - assemble_alias (decl, attr_list->name); + if (! DECL_EXTERNAL (decl)) + { + TREE_STATIC (decl) = 1; + assemble_alias (decl, attr_list->name); + } break; case ATTR_WEAK_EXTERNAL: @@ -1533,6 +1541,16 @@ process_attributes (tree decl, struct attrib *attr_list) post_error ("?section attributes are not supported for this target", attr_list->error_point); break; + + case ATTR_LINK_CONSTRUCTOR: + DECL_STATIC_CONSTRUCTOR (decl) = 1; + TREE_USED (decl) = 1; + break; + + case ATTR_LINK_DESTRUCTOR: + DECL_STATIC_DESTRUCTOR (decl) = 1; + TREE_USED (decl) = 1; + break; } } @@ -1728,6 +1746,14 @@ end_subprog_body (tree body) if (type_annotate_only) return; + /* If we don't have .ctors/.dtors sections, and this is a static + constructor or destructor, it must be recorded now. */ + if (DECL_STATIC_CONSTRUCTOR (fndecl) && !targetm.have_ctors_dtors) + static_ctors = tree_cons (NULL_TREE, fndecl, static_ctors); + + if (DECL_STATIC_DESTRUCTOR (fndecl) && !targetm.have_ctors_dtors) + static_dtors = tree_cons (NULL_TREE, fndecl, static_dtors); + /* We do different things for nested and non-nested functions. ??? This should be in cgraph. */ if (!DECL_CONTEXT (fndecl)) |