Replace fixed size array that was holding vtable pointers with a vector, allowing dynamic resizing.
Replace fixed size array that was holding vtable pointers with a vector, allowing dynamic resizing. ALso fix issues with warning diagnostics. From-SVN: r202060
This commit is contained in:
parent
1b08b73439
commit
b208ba4056
@ -1,3 +1,23 @@
|
|||||||
|
2013-08-27 Caroline Tice <cmtice@google.com>
|
||||||
|
|
||||||
|
* vtable-class-hierarchy.c: Remove unnecessary include statements.
|
||||||
|
(MAX_SET_SIZE): Remove unnecessary constant.
|
||||||
|
(register_construction_vtables): Make vtable_ptr_array parameter
|
||||||
|
into a vector; remove num_args parameter. Change array accesses to
|
||||||
|
vector accesses.
|
||||||
|
(register_other_binfo_vtables): Ditto.
|
||||||
|
(insert_call_to_register_set): Ditto.
|
||||||
|
(insert_call_to_register_pair): Ditto.
|
||||||
|
(output_set_info): Ditto. Also change warning calls to warning_at
|
||||||
|
calls, and fix format of warning messages.
|
||||||
|
(register_all_pairs): Change vtbl_ptr_array from an array into a
|
||||||
|
vector. Remove num_vtable_args (replace with calls to vector length).
|
||||||
|
Change array stores & accesses to vector functions. Change calls to
|
||||||
|
register_construction_vtables, register_other_binfo_vtables,
|
||||||
|
insert_call_to_register_set, insert_call_to_register_pair and
|
||||||
|
output_set_info to match their new signatures. Change warning to
|
||||||
|
warning_at and fix the format of the warning message.
|
||||||
|
|
||||||
2013-08-27 Jakub Jelinek <jakub@redhat.com>
|
2013-08-27 Jakub Jelinek <jakub@redhat.com>
|
||||||
Aldy Hernandez <aldyh@redhat.com>
|
Aldy Hernandez <aldyh@redhat.com>
|
||||||
|
|
||||||
|
@ -113,29 +113,12 @@ along with GCC; see the file COPYING3. If not see
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "coretypes.h"
|
#include "coretypes.h"
|
||||||
#include "tm.h"
|
|
||||||
#include "timevar.h"
|
|
||||||
#include "cpplib.h"
|
|
||||||
#include "tree.h"
|
|
||||||
#include "cp-tree.h"
|
#include "cp-tree.h"
|
||||||
#include "intl.h"
|
|
||||||
#include "c-family/c-pragma.h"
|
|
||||||
#include "decl.h"
|
|
||||||
#include "flags.h"
|
|
||||||
#include "diagnostic-core.h"
|
|
||||||
#include "output.h"
|
#include "output.h"
|
||||||
#include "target.h"
|
|
||||||
#include "cgraph.h"
|
#include "cgraph.h"
|
||||||
#include "c-family/c-common.h"
|
|
||||||
#include "c-family/c-objc.h"
|
|
||||||
#include "plugin.h"
|
|
||||||
#include "tree-iterator.h"
|
#include "tree-iterator.h"
|
||||||
#include "vtable-verify.h"
|
#include "vtable-verify.h"
|
||||||
#include "gimple.h"
|
#include "gimple.h"
|
||||||
#include "bitmap.h"
|
|
||||||
#include "libiberty.h"
|
|
||||||
|
|
||||||
#define MAX_SET_SIZE 5000
|
|
||||||
|
|
||||||
static int num_calls_to_regset = 0;
|
static int num_calls_to_regset = 0;
|
||||||
static int num_calls_to_regpair = 0;
|
static int num_calls_to_regpair = 0;
|
||||||
@ -508,7 +491,7 @@ build_string_from_id (tree identifier)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
register_construction_vtables (tree base_class, tree record_type,
|
register_construction_vtables (tree base_class, tree record_type,
|
||||||
tree *vtable_ptr_array, int *num_args)
|
vec<tree> *vtable_ptr_array)
|
||||||
{
|
{
|
||||||
tree vtbl_var_decl;
|
tree vtbl_var_decl;
|
||||||
|
|
||||||
@ -587,10 +570,7 @@ register_construction_vtables (tree base_class, tree record_type,
|
|||||||
/* Add this vtable pointer to our set of valid
|
/* Add this vtable pointer to our set of valid
|
||||||
pointers for the base class. */
|
pointers for the base class. */
|
||||||
|
|
||||||
gcc_assert (*num_args < (MAX_SET_SIZE - 1));
|
vtable_ptr_array->safe_push (value);
|
||||||
|
|
||||||
vtable_ptr_array[*num_args] = value;
|
|
||||||
*num_args = *num_args + 1;
|
|
||||||
current_set_size++;
|
current_set_size++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -617,7 +597,7 @@ register_construction_vtables (tree base_class, tree record_type,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
register_other_binfo_vtables (tree binfo, tree base_class,
|
register_other_binfo_vtables (tree binfo, tree base_class,
|
||||||
tree *vtable_ptr_array, int *num_args)
|
vec<tree> *vtable_ptr_array)
|
||||||
{
|
{
|
||||||
unsigned ix;
|
unsigned ix;
|
||||||
tree base_binfo;
|
tree base_binfo;
|
||||||
@ -641,16 +621,12 @@ register_other_binfo_vtables (tree binfo, tree base_class,
|
|||||||
base_class);
|
base_class);
|
||||||
if (!already_registered)
|
if (!already_registered)
|
||||||
{
|
{
|
||||||
gcc_assert (*num_args < (MAX_SET_SIZE - 1));
|
vtable_ptr_array->safe_push (vtable_address);
|
||||||
|
|
||||||
vtable_ptr_array[*num_args] = vtable_address;
|
|
||||||
*num_args = *num_args + 1;
|
|
||||||
current_set_size++;
|
current_set_size++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
register_other_binfo_vtables (base_binfo, base_class, vtable_ptr_array,
|
register_other_binfo_vtables (base_binfo, base_class, vtable_ptr_array);
|
||||||
num_args);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -735,7 +711,8 @@ write_out_current_set_data (tree base_class, int set_size)
|
|||||||
|
|
||||||
if (class_data_log_fd == -1)
|
if (class_data_log_fd == -1)
|
||||||
{
|
{
|
||||||
warning (0, "Unable to open log file 'vtv_class_set_sizes.log'");
|
warning_at (UNKNOWN_LOCATION, 0,
|
||||||
|
"unable to open log file %<vtv_class_set_sizes.log%>: %m");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -775,11 +752,12 @@ build_key_buffer_arg (tree base_ptr_var_decl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
insert_call_to_register_set (tree class_name, int num_args,
|
insert_call_to_register_set (tree class_name,
|
||||||
tree *vtbl_ptr_array, tree body, tree arg1,
|
vec<tree> *vtbl_ptr_array, tree body, tree arg1,
|
||||||
tree arg2, tree size_hint_arg)
|
tree arg2, tree size_hint_arg)
|
||||||
{
|
{
|
||||||
tree call_expr;
|
tree call_expr;
|
||||||
|
int num_args = vtbl_ptr_array->length();
|
||||||
char *array_arg_name = ACONCAT (("__vptr_array_",
|
char *array_arg_name = ACONCAT (("__vptr_array_",
|
||||||
IDENTIFIER_POINTER (class_name), NULL));
|
IDENTIFIER_POINTER (class_name), NULL));
|
||||||
tree array_arg_type = build_array_type_nelts (build_pointer_type
|
tree array_arg_type = build_array_type_nelts (build_pointer_type
|
||||||
@ -808,7 +786,7 @@ insert_call_to_register_set (tree class_name, int num_args,
|
|||||||
|
|
||||||
for (k = 0; k < num_args; ++k)
|
for (k = 0; k < num_args; ++k)
|
||||||
{
|
{
|
||||||
CONSTRUCTOR_APPEND_ELT (array_elements, NULL_TREE, vtbl_ptr_array[k]);
|
CONSTRUCTOR_APPEND_ELT (array_elements, NULL_TREE, (*vtbl_ptr_array)[k]);
|
||||||
}
|
}
|
||||||
|
|
||||||
initial = build_constructor (TREE_TYPE (array_arg), array_elements);
|
initial = build_constructor (TREE_TYPE (array_arg), array_elements);
|
||||||
@ -833,14 +811,18 @@ insert_call_to_register_set (tree class_name, int num_args,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
insert_call_to_register_pair (tree vtable_address, int num_args, tree arg1,
|
insert_call_to_register_pair (vec<tree> *vtbl_ptr_array, tree arg1,
|
||||||
tree arg2, tree size_hint_arg, tree str1,
|
tree arg2, tree size_hint_arg, tree str1,
|
||||||
tree str2, tree body)
|
tree str2, tree body)
|
||||||
{
|
{
|
||||||
tree call_expr;
|
tree call_expr;
|
||||||
|
int num_args = vtbl_ptr_array->length();
|
||||||
|
tree vtable_address = NULL_TREE;
|
||||||
|
|
||||||
if (num_args == 0)
|
if (num_args == 0)
|
||||||
vtable_address = build_int_cst (build_pointer_type (void_type_node), 0);
|
vtable_address = build_int_cst (build_pointer_type (void_type_node), 0);
|
||||||
|
else
|
||||||
|
vtable_address = (*vtbl_ptr_array)[0];
|
||||||
|
|
||||||
if (flag_vtv_debug)
|
if (flag_vtv_debug)
|
||||||
call_expr = build_call_expr (vlt_register_pairs_fndecl, 6, arg1, arg2,
|
call_expr = build_call_expr (vlt_register_pairs_fndecl, 6, arg1, arg2,
|
||||||
@ -854,11 +836,12 @@ insert_call_to_register_pair (tree vtable_address, int num_args, tree arg1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
output_set_info (tree record_type, tree *vtbl_ptr_array, int array_size)
|
output_set_info (tree record_type, vec<tree> vtbl_ptr_array)
|
||||||
{
|
{
|
||||||
static int vtv_debug_log_fd = -1;
|
static int vtv_debug_log_fd = -1;
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
int bytes_written __attribute__ ((unused));
|
int bytes_written __attribute__ ((unused));
|
||||||
|
int array_len = vtbl_ptr_array.length();
|
||||||
const char *class_name =
|
const char *class_name =
|
||||||
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (TYPE_NAME (record_type)));
|
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (TYPE_NAME (record_type)));
|
||||||
char *file_name = get_log_file_name ("vtv_set_ptr_data.log");
|
char *file_name = get_log_file_name ("vtv_set_ptr_data.log");
|
||||||
@ -868,11 +851,12 @@ output_set_info (tree record_type, tree *vtbl_ptr_array, int array_size)
|
|||||||
O_WRONLY | O_APPEND | O_CREAT, S_IRWXU);
|
O_WRONLY | O_APPEND | O_CREAT, S_IRWXU);
|
||||||
if (vtv_debug_log_fd == -1)
|
if (vtv_debug_log_fd == -1)
|
||||||
{
|
{
|
||||||
warning (0, "Unable to open log file 'vtv_set_ptr_data.log'");
|
warning_at (UNKNOWN_LOCATION, 0,
|
||||||
|
"unable to open log file %<vtv_set_ptr_data.log%>: %m");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < array_size; ++i)
|
for (int i = 0; i < array_len; ++i)
|
||||||
{
|
{
|
||||||
const char *vptr_name = "unknown";
|
const char *vptr_name = "unknown";
|
||||||
int vptr_offset = 0;
|
int vptr_offset = 0;
|
||||||
@ -911,8 +895,7 @@ static bool
|
|||||||
register_all_pairs (tree body)
|
register_all_pairs (tree body)
|
||||||
{
|
{
|
||||||
bool registered_at_least_one = false;
|
bool registered_at_least_one = false;
|
||||||
tree vtbl_ptr_array[MAX_SET_SIZE];
|
vec<tree> *vtbl_ptr_array = NULL;
|
||||||
int num_vtable_args = 0;
|
|
||||||
unsigned j;
|
unsigned j;
|
||||||
|
|
||||||
for (j = 0; j < num_vtable_map_nodes; ++j)
|
for (j = 0; j < num_vtable_map_nodes; ++j)
|
||||||
@ -938,7 +921,11 @@ register_all_pairs (tree body)
|
|||||||
new_type = build_pointer_type (TREE_TYPE (base_ptr_var_decl));
|
new_type = build_pointer_type (TREE_TYPE (base_ptr_var_decl));
|
||||||
arg1 = build1 (ADDR_EXPR, new_type, base_ptr_var_decl);
|
arg1 = build1 (ADDR_EXPR, new_type, base_ptr_var_decl);
|
||||||
|
|
||||||
num_vtable_args = 0;
|
/* We need a fresh vector for each iteration. */
|
||||||
|
if (vtbl_ptr_array)
|
||||||
|
vec_free (vtbl_ptr_array);
|
||||||
|
|
||||||
|
vec_alloc (vtbl_ptr_array, 10);
|
||||||
|
|
||||||
for (i = 0; i < num_vtable_map_nodes; ++i)
|
for (i = 0; i < num_vtable_map_nodes; ++i)
|
||||||
if (bitmap_bit_p (current->class_info->descendants, i))
|
if (bitmap_bit_p (current->class_info->descendants, i))
|
||||||
@ -977,25 +964,22 @@ register_all_pairs (tree body)
|
|||||||
|
|
||||||
if (!already_registered)
|
if (!already_registered)
|
||||||
{
|
{
|
||||||
|
vtbl_ptr_array->safe_push (vtable_address);
|
||||||
vtbl_ptr_array[num_vtable_args++] = vtable_address;
|
|
||||||
|
|
||||||
/* Find and handle any 'extra' vtables associated
|
/* Find and handle any 'extra' vtables associated
|
||||||
with this class, via virtual inheritance. */
|
with this class, via virtual inheritance. */
|
||||||
register_construction_vtables (base_class, class_type,
|
register_construction_vtables (base_class, class_type,
|
||||||
vtbl_ptr_array,
|
vtbl_ptr_array);
|
||||||
&num_vtable_args);
|
|
||||||
|
|
||||||
/* Find and handle any 'extra' vtables associated
|
/* Find and handle any 'extra' vtables associated
|
||||||
with this class, via multiple inheritance. */
|
with this class, via multiple inheritance. */
|
||||||
register_other_binfo_vtables (binfo, base_class,
|
register_other_binfo_vtables (binfo, base_class,
|
||||||
vtbl_ptr_array,
|
vtbl_ptr_array);
|
||||||
&num_vtable_args);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
current_set_size = num_vtable_args;
|
current_set_size = vtbl_ptr_array->length();
|
||||||
|
|
||||||
/* Sometimes we need to initialize the set symbol even if we are
|
/* Sometimes we need to initialize the set symbol even if we are
|
||||||
not adding any vtable pointers to the set in the current
|
not adding any vtable pointers to the set in the current
|
||||||
@ -1009,9 +993,12 @@ register_all_pairs (tree body)
|
|||||||
/* If we have added vtable pointers to the set in this
|
/* If we have added vtable pointers to the set in this
|
||||||
compilation unit, adjust the size hint for the set's hash
|
compilation unit, adjust the size hint for the set's hash
|
||||||
table appropriately. */
|
table appropriately. */
|
||||||
if (num_vtable_args > 0)
|
if (vtbl_ptr_array->length() > 0)
|
||||||
while ((size_t) num_vtable_args > size_hint)
|
{
|
||||||
size_hint <<= 1;
|
unsigned len = vtbl_ptr_array->length();
|
||||||
|
while ((size_t) len > size_hint)
|
||||||
|
size_hint <<= 1;
|
||||||
|
}
|
||||||
size_hint_arg = build_int_cst (size_type_node, size_hint);
|
size_hint_arg = build_int_cst (size_type_node, size_hint);
|
||||||
|
|
||||||
/* Get the key-buffer argument. */
|
/* Get the key-buffer argument. */
|
||||||
@ -1023,23 +1010,23 @@ register_all_pairs (tree body)
|
|||||||
|
|
||||||
if (flag_vtv_debug)
|
if (flag_vtv_debug)
|
||||||
output_set_info (current->class_info->class_type,
|
output_set_info (current->class_info->class_type,
|
||||||
vtbl_ptr_array, num_vtable_args);
|
*vtbl_ptr_array);
|
||||||
|
|
||||||
if (num_vtable_args > 1)
|
if (vtbl_ptr_array->length() > 1)
|
||||||
{
|
{
|
||||||
insert_call_to_register_set (current->class_name, num_vtable_args,
|
insert_call_to_register_set (current->class_name,
|
||||||
vtbl_ptr_array, body, arg1, arg2,
|
vtbl_ptr_array, body, arg1, arg2,
|
||||||
size_hint_arg);
|
size_hint_arg);
|
||||||
registered_at_least_one = true;
|
registered_at_least_one = true;
|
||||||
}
|
}
|
||||||
else if (num_vtable_args >= 0)
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
if (num_vtable_args > 0
|
if (vtbl_ptr_array->length() > 0
|
||||||
|| (current->is_used
|
|| (current->is_used
|
||||||
|| (current->registered.size() > 0)))
|
|| (current->registered.size() > 0)))
|
||||||
{
|
{
|
||||||
insert_call_to_register_pair (vtbl_ptr_array[0], num_vtable_args,
|
insert_call_to_register_pair (vtbl_ptr_array,
|
||||||
arg1, arg2, size_hint_arg, str1,
|
arg1, arg2, size_hint_arg, str1,
|
||||||
str2, body);
|
str2, body);
|
||||||
registered_at_least_one = true;
|
registered_at_least_one = true;
|
||||||
@ -1114,7 +1101,8 @@ write_out_vtv_count_data (void)
|
|||||||
O_WRONLY | O_APPEND | O_CREAT, S_IRWXU);
|
O_WRONLY | O_APPEND | O_CREAT, S_IRWXU);
|
||||||
if (vtv_count_log_fd == -1)
|
if (vtv_count_log_fd == -1)
|
||||||
{
|
{
|
||||||
warning (0, "Unable to open log file 'vtv_count_data.log'");
|
warning_at (UNKNOWN_LOCATION, 0,
|
||||||
|
"unable to open log file %<vtv_count_data.log%>: %m");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user