mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
Make ARMv8-M attribute cmse_nonsecure_call work in Ada
Unlike most other machine attributes, this one does not work in Ada because, while it applies to pointer-to-function types, it is explicitly marked as requiring declarations in the implementation. Now, in Ada, machine attributes are specified like this: type Non_Secure is access procedure; pragma Machine_Attribute (Non_Secure, "cmse_nonsecure_call"); i.e. not attached to the declaration of Non_Secure. The change extends the support to Ada by also accepting pointer-to-function types in the handler. gcc/ * config/arm/arm.cc (arm_attribute_table) <cmse_nonsecure_call>: Change decl_required field to false. (arm_handle_cmse_nonsecure_call): Deal with a TYPE node. gcc/testsuite/ * gnat.dg/machine_attr2.ads, gnat.dg/machine_attr2.adb: New test.
This commit is contained in:
@@ -375,7 +375,7 @@ static const struct attribute_spec arm_attribute_table[] =
|
||||
/* ARMv8-M Security Extensions support. */
|
||||
{ "cmse_nonsecure_entry", 0, 0, true, false, false, false,
|
||||
arm_handle_cmse_nonsecure_entry, NULL },
|
||||
{ "cmse_nonsecure_call", 0, 0, true, false, false, true,
|
||||
{ "cmse_nonsecure_call", 0, 0, false, false, false, true,
|
||||
arm_handle_cmse_nonsecure_call, NULL },
|
||||
{ "Advanced SIMD type", 1, 1, false, true, false, true, NULL, NULL },
|
||||
{ NULL, 0, 0, false, false, false, false, NULL, NULL }
|
||||
@@ -7605,8 +7605,8 @@ arm_handle_cmse_nonsecure_call (tree *node, tree name,
|
||||
int /* flags */,
|
||||
bool *no_add_attrs)
|
||||
{
|
||||
tree decl = NULL_TREE, fntype = NULL_TREE;
|
||||
tree type;
|
||||
tree decl = NULL_TREE;
|
||||
tree fntype, type;
|
||||
|
||||
if (!use_cmse)
|
||||
{
|
||||
@@ -7616,16 +7616,20 @@ arm_handle_cmse_nonsecure_call (tree *node, tree name,
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
if (TREE_CODE (*node) == VAR_DECL || TREE_CODE (*node) == TYPE_DECL)
|
||||
if (DECL_P (*node))
|
||||
{
|
||||
decl = *node;
|
||||
fntype = TREE_TYPE (decl);
|
||||
}
|
||||
fntype = TREE_TYPE (*node);
|
||||
|
||||
while (fntype != NULL_TREE && TREE_CODE (fntype) == POINTER_TYPE)
|
||||
if (TREE_CODE (*node) == VAR_DECL || TREE_CODE (*node) == TYPE_DECL)
|
||||
decl = *node;
|
||||
}
|
||||
else
|
||||
fntype = *node;
|
||||
|
||||
while (fntype && TREE_CODE (fntype) == POINTER_TYPE)
|
||||
fntype = TREE_TYPE (fntype);
|
||||
|
||||
if (!decl || TREE_CODE (fntype) != FUNCTION_TYPE)
|
||||
if ((DECL_P (*node) && !decl) || TREE_CODE (fntype) != FUNCTION_TYPE)
|
||||
{
|
||||
warning (OPT_Wattributes, "%qE attribute only applies to base type of a "
|
||||
"function pointer", name);
|
||||
@@ -7640,10 +7644,17 @@ arm_handle_cmse_nonsecure_call (tree *node, tree name,
|
||||
|
||||
/* Prevent trees being shared among function types with and without
|
||||
cmse_nonsecure_call attribute. */
|
||||
type = TREE_TYPE (decl);
|
||||
if (decl)
|
||||
{
|
||||
type = build_distinct_type_copy (TREE_TYPE (decl));
|
||||
TREE_TYPE (decl) = type;
|
||||
}
|
||||
else
|
||||
{
|
||||
type = build_distinct_type_copy (*node);
|
||||
*node = type;
|
||||
}
|
||||
|
||||
type = build_distinct_type_copy (type);
|
||||
TREE_TYPE (decl) = type;
|
||||
fntype = type;
|
||||
|
||||
while (TREE_CODE (fntype) != FUNCTION_TYPE)
|
||||
|
||||
15
gcc/testsuite/gnat.dg/machine_attr2.adb
Normal file
15
gcc/testsuite/gnat.dg/machine_attr2.adb
Normal file
@@ -0,0 +1,15 @@
|
||||
-- { dg-do compile { target arm*-*-* } }
|
||||
-- { dg-options "-mcpu=cortex-m33 -mcmse" }
|
||||
|
||||
package body Machine_Attr2 is
|
||||
|
||||
procedure Call (Proc : Non_Secure) is
|
||||
begin
|
||||
Proc.all;
|
||||
end;
|
||||
|
||||
procedure Foo; -- { dg-warning "only applies to base type" }
|
||||
pragma Machine_Attribute (Foo, "cmse_nonsecure_call");
|
||||
procedure Foo is null;
|
||||
|
||||
end Machine_Attr2;
|
||||
8
gcc/testsuite/gnat.dg/machine_attr2.ads
Normal file
8
gcc/testsuite/gnat.dg/machine_attr2.ads
Normal file
@@ -0,0 +1,8 @@
|
||||
package Machine_Attr2 is
|
||||
|
||||
type Non_Secure is access procedure;
|
||||
pragma Machine_Attribute (Non_Secure, "cmse_nonsecure_call");
|
||||
|
||||
procedure Call (Proc : Non_Secure);
|
||||
|
||||
end Machine_Attr2;
|
||||
Reference in New Issue
Block a user