New attribute lookup function addition

* tree.h (private_lookup_attribute_starting): New function.
	(lookup_attribute_starting): Likewise.
	* tree.c (private_lookup_attribute_starting): Likewise.

From-SVN: r211219
This commit is contained in:
Martin Liska 2014-06-04 11:44:33 +02:00 committed by Martin Liska
parent d211e47192
commit 8a57e88dc6
3 changed files with 66 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2014-06-04 Martin Liska <mliska@suse.cz>
* tree.h (private_lookup_attribute_starting): New function.
(lookup_attribute_starting): Likewise.
* tree.c (private_lookup_attribute_starting): Likewise.
2014-06-04 Martin Liska <mliska@suse.cz>
* cgraph.h (expand_thunk): New argument added.

View File

@ -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__'.

View File

@ -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);