Skip to content

Commit

Permalink
PR ada/21952
Browse files Browse the repository at this point in the history
	* gigi.h (gnat_internal_attribute_table): Declare.
	* misc.c (LANG_HOOKS_ATTRIBUTE_TABLE): Define to above.
	* utils.c (gnat_internal_attribute_table): New global variable.
	(builtin_function): Always call decl_attributes on the builtin.
	(handle_const_attribute): New static function.
	(handle_nothrow_attribute): Likewise.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116926 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
ebotcazou committed Sep 13, 2006
1 parent a5517fc commit 60c8389
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 2 deletions.
10 changes: 10 additions & 0 deletions gcc/ada/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
2006-09-13 Eric Botcazou <[email protected]>

PR ada/21952
* gigi.h (gnat_internal_attribute_table): Declare.
* misc.c (LANG_HOOKS_ATTRIBUTE_TABLE): Define to above.
* utils.c (gnat_internal_attribute_table): New global variable.
(builtin_function): Always call decl_attributes on the builtin.
(handle_const_attribute): New static function.
(handle_nothrow_attribute): Likewise.

2006-07-28 Volker Reichelt <[email protected]>

* Make-lang.in: Use $(HEADER_H) instead of header.h in dependencies.
Expand Down
4 changes: 3 additions & 1 deletion gcc/ada/gigi.h
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,6 @@ extern int force_global;
type whose bit width is Pmode. Assume "long" is such a type here. */
#undef SIZE_TYPE
#define SIZE_TYPE "long int"


/* Data structures used to represent attributes. */

Expand All @@ -332,6 +331,9 @@ struct attrib
Node_Id error_point;
};

/* Table of machine-independent internal attributes. */
extern const struct attribute_spec gnat_internal_attribute_table[];

/* Define the entries in the standard data array. */
enum standard_datatypes
{
Expand Down
2 changes: 2 additions & 0 deletions gcc/ada/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,8 @@ static tree gnat_type_max_size (tree);
#define LANG_HOOKS_UNSIGNED_TYPE gnat_unsigned_type
#undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE
#define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE gnat_signed_or_unsigned_type
#undef LANG_HOOKS_ATTRIBUTE_TABLE
#define LANG_HOOKS_ATTRIBUTE_TABLE gnat_internal_attribute_table

const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;

Expand Down
54 changes: 53 additions & 1 deletion gcc/ada/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,21 @@ tree gnat_raise_decls[(int) LAST_REASON_CODE + 1];
tree static_ctors;
tree static_dtors;

/* Forward declarations for handlers of attributes. */
static tree handle_const_attribute (tree *, tree, tree, int, bool *);
static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);

/* Table of machine-independent internal attributes for Ada. We support
this minimal set ot attributes to accomodate the Alpha back-end which
unconditionally puts them on its builtins. */
const struct attribute_spec gnat_internal_attribute_table[] =
{
/* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
{ "const", 0, 0, true, false, false, handle_const_attribute },
{ "nothrow", 0, 0, true, false, false, handle_nothrow_attribute },
{ NULL, 0, 0, false, false, false, NULL }
};

/* 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. */
Expand Down Expand Up @@ -1826,11 +1841,48 @@ builtin_function (const char *name, tree type, int function_code,
gnat_pushdecl (decl, Empty);
DECL_BUILT_IN_CLASS (decl) = class;
DECL_FUNCTION_CODE (decl) = function_code;

/* Possibly apply some default attributes to this built-in function. */
if (attrs)
decl_attributes (&decl, attrs, ATTR_FLAG_BUILT_IN);
decl_attributes (&decl, attrs, ATTR_FLAG_BUILT_IN);
else
decl_attributes (&decl, NULL_TREE, 0);

return decl;
}

/* Handle a "const" attribute; arguments as in
struct attribute_spec.handler. */

static tree
handle_const_attribute (tree *node, tree ARG_UNUSED (name),
tree ARG_UNUSED (args), int ARG_UNUSED (flags),
bool *no_add_attrs)
{
if (TREE_CODE (*node) == FUNCTION_DECL)
TREE_READONLY (*node) = 1;
else
*no_add_attrs = true;

return NULL_TREE;
}

/* Handle a "nothrow" attribute; arguments as in
struct attribute_spec.handler. */

static tree
handle_nothrow_attribute (tree *node, tree ARG_UNUSED (name),
tree ARG_UNUSED (args), int ARG_UNUSED (flags),
bool *no_add_attrs)
{
if (TREE_CODE (*node) == FUNCTION_DECL)
TREE_NOTHROW (*node) = 1;
else
*no_add_attrs = true;

return NULL_TREE;
}

/* Return an integer type with the number of bits of precision given by
PRECISION. UNSIGNEDP is nonzero if the type is unsigned; otherwise
it is a signed type. */
Expand Down

0 comments on commit 60c8389

Please sign in to comment.