From 72c984f2a340fb769e1f3ab7f44307d0337314d8 Mon Sep 17 00:00:00 2001 From: marxin Date: Wed, 4 Jun 2014 09:44:33 +0000 Subject: [PATCH] New attribute lookup function addition * tree.h (private_lookup_attribute_starting): New function. (lookup_attribute_starting): Likewise. * tree.c (private_lookup_attribute_starting): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211219 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/tree.c | 38 ++++++++++++++++++++++++++++++++++++++ gcc/tree.h | 22 ++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1f42a28b2c7..de07e5caca0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2014-06-04 Martin Liska + * tree.h (private_lookup_attribute_starting): New function. + (lookup_attribute_starting): Likewise. + * tree.c (private_lookup_attribute_starting): Likewise. + +2014-06-04 Martin Liska + * cgraph.h (expand_thunk): New argument added. (address_taken_from_non_vtable_p): New global function. * ipa-visibility.c (address_taken_from_non_vtable_p): Likewise. diff --git a/gcc/tree.c b/gcc/tree.c index de16549a099..c6e4bcbacd8 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -5759,6 +5759,44 @@ private_lookup_attribute (const char *attr_name, size_t attr_len, tree list) return list; } +/* Given an attribute name ATTR_NAME and a list of attributes LIST, + return a pointer to the attribute's list first element if the attribute + starts with ATTR_NAME. ATTR_NAME must be in the form 'text' (not + '__text__'). */ + +tree +private_lookup_attribute_by_prefix (const char *attr_name, size_t attr_len, + tree list) +{ + while (list) + { + size_t ident_len = IDENTIFIER_LENGTH (get_attribute_name (list)); + + if (attr_len > ident_len) + { + list = TREE_CHAIN (list); + continue; + } + + const char *p = IDENTIFIER_POINTER (get_attribute_name (list)); + + if (strncmp (attr_name, p, attr_len) == 0) + break; + + /* TODO: If we made sure that attributes were stored in the + canonical form without '__...__' (ie, as in 'text' as opposed + to '__text__') then we could avoid the following case. */ + if (p[0] == '_' && p[1] == '_' && + strncmp (attr_name, p + 2, attr_len) == 0) + break; + + list = TREE_CHAIN (list); + } + + return list; +} + + /* A variant of lookup_attribute() that can be used with an identifier as the first argument, and where the identifier can be either 'text' or '__text__'. diff --git a/gcc/tree.h b/gcc/tree.h index 5392fddfef7..2637b55fa36 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -3736,6 +3736,10 @@ extern tree merge_type_attributes (tree, tree); and you should never call it directly. */ extern tree private_lookup_attribute (const char *, size_t, tree); +/* This function is a private implementation detail + of lookup_attribute_by_prefix() and you should never call it directly. */ +extern tree private_lookup_attribute_by_prefix (const char *, size_t, tree); + /* Given an attribute name ATTR_NAME and a list of attributes LIST, return a pointer to the attribute's list element if the attribute is part of the list, or NULL_TREE if not found. If the attribute @@ -3758,6 +3762,24 @@ lookup_attribute (const char *attr_name, tree list) return private_lookup_attribute (attr_name, strlen (attr_name), list); } +/* Given an attribute name ATTR_NAME and a list of attributes LIST, + return a pointer to the attribute's list first element if the attribute + starts with ATTR_NAME. ATTR_NAME must be in the form 'text' (not + '__text__'). */ + +static inline tree +lookup_attribute_by_prefix (const char *attr_name, tree list) +{ + gcc_checking_assert (attr_name[0] != '_'); + /* In most cases, list is NULL_TREE. */ + if (list == NULL_TREE) + return NULL_TREE; + else + return private_lookup_attribute_by_prefix (attr_name, strlen (attr_name), + list); +} + + /* This function is a private implementation detail of is_attribute_p() and you should never call it directly. */ extern bool private_is_attribute_p (const char *, size_t, const_tree); -- 2.11.4.GIT