diff options
| author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-06-18 12:39:23 +0000 |
|---|---|---|
| committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-06-18 12:39:23 +0000 |
| commit | 2b80dc46855486d6871e58511259f4b601dffcd9 (patch) | |
| tree | b438afbff1f87123b228fcb914c7ee7f802e3879 /gcc/ada/gcc-interface/decl.c | |
| parent | 61c95d27915f6edaaf10f4aaaa29e39bd8d7611f (diff) | |
| download | gcc-2b80dc46855486d6871e58511259f4b601dffcd9.tar.gz | |
2009-06-18 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk r148653
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@148658 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/gcc-interface/decl.c')
| -rw-r--r-- | gcc/ada/gcc-interface/decl.c | 51 |
1 files changed, 33 insertions, 18 deletions
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 63ade27c5e9..974f6f0931b 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -5568,6 +5568,8 @@ prepend_attributes (Entity_Id gnat_entity, struct attrib ** attr_list) { Node_Id gnat_temp; + /* Attributes are stored as Representation Item pragmas. */ + for (gnat_temp = First_Rep_Item (gnat_entity); Present (gnat_temp); gnat_temp = Next_Rep_Item (gnat_temp)) if (Nkind (gnat_temp) == N_Pragma) @@ -5576,24 +5578,8 @@ prepend_attributes (Entity_Id gnat_entity, struct attrib ** attr_list) Node_Id gnat_assoc = Pragma_Argument_Associations (gnat_temp); enum attr_type etype; - if (Present (gnat_assoc) && Present (First (gnat_assoc)) - && Present (Next (First (gnat_assoc))) - && (Nkind (Expression (Next (First (gnat_assoc)))) - == N_String_Literal)) - { - gnu_arg0 = get_identifier (TREE_STRING_POINTER - (gnat_to_gnu - (Expression (Next - (First (gnat_assoc)))))); - if (Present (Next (Next (First (gnat_assoc)))) - && (Nkind (Expression (Next (Next (First (gnat_assoc))))) - == N_String_Literal)) - gnu_arg1 = get_identifier (TREE_STRING_POINTER - (gnat_to_gnu - (Expression - (Next (Next - (First (gnat_assoc))))))); - } + /* Map the kind of pragma at hand. Skip if this is not one + we know how to handle. */ switch (Get_Pragma_Id (Chars (Pragma_Identifier (gnat_temp)))) { @@ -5629,6 +5615,35 @@ prepend_attributes (Entity_Id gnat_entity, struct attrib ** attr_list) continue; } + /* See what arguments we have and turn them into GCC trees for + attribute handlers. These expect identifier for strings. We + handle at most two arguments, static expressions only. */ + + if (Present (gnat_assoc) && Present (First (gnat_assoc))) + { + Node_Id gnat_arg0 = Next (First (gnat_assoc)); + Node_Id gnat_arg1 = Empty; + + if (Present (gnat_arg0) + && Is_Static_Expression (Expression (gnat_arg0))) + { + gnu_arg0 = gnat_to_gnu (Expression (gnat_arg0)); + + if (TREE_CODE (gnu_arg0) == STRING_CST) + gnu_arg0 = get_identifier (TREE_STRING_POINTER (gnu_arg0)); + + gnat_arg1 = Next (gnat_arg0); + } + + if (Present (gnat_arg1) + && Is_Static_Expression (Expression (gnat_arg1))) + { + gnu_arg1 = gnat_to_gnu (Expression (gnat_arg1)); + + if (TREE_CODE (gnu_arg1) == STRING_CST) + gnu_arg1 = get_identifier (TREE_STRING_POINTER (gnu_arg1)); + } + } /* Prepend to the list now. Make a list of the argument we might have, as GCC expects it. */ |
