new function hash search function
This commit is contained in:
parent
99d6a2907b
commit
48f53dd3e4
@ -270,14 +270,42 @@ rap_optimization_clean ()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Type definition for hash value maps. */
|
||||||
|
#define HL_CFI_MAP_CACHE_SIZE 3
|
||||||
|
struct cfi_function_hash_maps_t
|
||||||
|
{
|
||||||
|
struct pointer_map_t map;
|
||||||
|
// FIFO cache.
|
||||||
|
struct cfi_function_hash_pair_t
|
||||||
|
{
|
||||||
|
tree type;
|
||||||
|
rap_hash_value_type val;
|
||||||
|
} cfi_cache [HL_CFI_MAP_CACHE_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Constains the fucntion type and hash value maps. */
|
||||||
|
static struct pointer_map_t *cfi_function_hash_maps;
|
||||||
|
|
||||||
/* Search the [function type : hash value] table, if not have compatiable
|
/* Search the [function type : hash value] table, if not have compatiable
|
||||||
type match, create one and insert into the table. */
|
type match, create one and insert into the table. */
|
||||||
static rap_hash_value_type
|
static rap_hash_value_type
|
||||||
find_or_create_cfi_hash_val (tree type)
|
find_or_create_cfi_hash_val (tree type)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
|
gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
|
||||||
|
//struct pointer_map_t *cfi_function_hash_maps;
|
||||||
|
if (! cfi_function_hash_maps.map)
|
||||||
|
cfi_function_hash_maps.map = pointer_map_create ();
|
||||||
|
|
||||||
|
/* Search */
|
||||||
|
for (i = 0; i < HL_CFI_MAP_CACHE_SIZE; i++)
|
||||||
|
if (types_compatible_p (type, cfi_function_hash_maps.cfi_cache[i].type))
|
||||||
|
return cfi_function_hash_maps.cfi_cache.val;
|
||||||
|
|
||||||
|
|
||||||
|
/* Update */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,12 +319,12 @@ build_cfi_hash_tree (gimple cs, int direct)
|
|||||||
{
|
{
|
||||||
//tree hash_tree, var;
|
//tree hash_tree, var;
|
||||||
rap_hash_value_type val;
|
rap_hash_value_type val;
|
||||||
tree decl, type;
|
tree decl, func_type;
|
||||||
|
|
||||||
gcc_assert(is_gimple_call (cs));
|
gcc_assert(is_gimple_call (cs));
|
||||||
|
|
||||||
decl = gimple_call_fn (cs);
|
decl = gimple_call_fn (cs);
|
||||||
type = TREE_TYPE (TREE_TYPE (decl));
|
func_type = TREE_TYPE (TREE_TYPE (decl));
|
||||||
// safe guard
|
// safe guard
|
||||||
gcc_assert (TREE_CODE (decl) == SSA_NAME);
|
gcc_assert (TREE_CODE (decl) == SSA_NAME);
|
||||||
gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
|
gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
|
||||||
@ -309,7 +337,7 @@ build_cfi_hash_tree (gimple cs, int direct)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tree target, func, func_type;
|
tree target, off_type;
|
||||||
int target_offset;
|
int target_offset;
|
||||||
|
|
||||||
gcc_assert (direct == BUILD_TARGET_HASH_TREE);
|
gcc_assert (direct == BUILD_TARGET_HASH_TREE);
|
||||||
@ -323,12 +351,12 @@ build_cfi_hash_tree (gimple cs, int direct)
|
|||||||
if (UNITS_PER_WORD == 8)
|
if (UNITS_PER_WORD == 8)
|
||||||
{
|
{
|
||||||
target_offset = - 2 * sizeof(rap_hash_value_type);
|
target_offset = - 2 * sizeof(rap_hash_value_type);
|
||||||
type = long_integer_type_node;
|
off_type = long_integer_type_node;
|
||||||
}
|
}
|
||||||
else if (UNITS_PER_WORD == 4)
|
else if (UNITS_PER_WORD == 4)
|
||||||
{
|
{
|
||||||
target_offset = - sizeof(rap_hash_value_type);
|
target_offset = - sizeof(rap_hash_value_type);
|
||||||
type = integer_type_node;
|
off_type = integer_type_node;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
gcc_unreachable();
|
gcc_unreachable();
|
||||||
@ -338,7 +366,10 @@ build_cfi_hash_tree (gimple cs, int direct)
|
|||||||
|
|
||||||
// integer_ptr_type_node
|
// integer_ptr_type_node
|
||||||
// func is the function pointer, ADDR_EXPR, pointer(function)
|
// func is the function pointer, ADDR_EXPR, pointer(function)
|
||||||
fold_build2 (MEM_REF, type, func,
|
gcc_assert (FUNCTION_POINTER_TYPE_P ( TREE_TYPE (decl)));
|
||||||
|
// type is the result type of cast.
|
||||||
|
fold_build2 (MEM_REF, off_type, decl,
|
||||||
|
// This is a pointer type tree reprensent the offset.
|
||||||
build_int_cst_wide (integer_ptr_type_node,
|
build_int_cst_wide (integer_ptr_type_node,
|
||||||
TREE_INT_CST_LOW (target_offset),
|
TREE_INT_CST_LOW (target_offset),
|
||||||
TREE_INT_CST_HIGH (target_offset)));
|
TREE_INT_CST_HIGH (target_offset)));
|
||||||
@ -373,11 +404,6 @@ build_fe_cfi (gimple_stmt_iterator *gp)
|
|||||||
/* Build the condition expression and insert into the code block, because
|
/* Build the condition expression and insert into the code block, because
|
||||||
the conditional import new branch, so we also need update the blocks */
|
the conditional import new branch, so we also need update the blocks */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// types_compatible_p
|
// types_compatible_p
|
||||||
|
Loading…
Reference in New Issue
Block a user