aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2011-09-30 15:48:51 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2011-09-30 08:48:51 -0700
commitad7715f324194274f98b65b631f38750c94be717 (patch)
treeb1c7697f32847eac92ce0179e818e846546c227b /gcc/lto
parent11e69edcdc7031f74bf09d582851caf909a4a198 (diff)
downloadgcc-ad7715f324194274f98b65b631f38750c94be717.zip
gcc-ad7715f324194274f98b65b631f38750c94be717.tar.gz
gcc-ad7715f324194274f98b65b631f38750c94be717.tar.bz2
Use 64bit integer for LTO symbol ID.
gcc/lto 2011-09-30 H.J. Lu <hongjiu.lu@intel.com> Andi Kleen <ak@linux.intel.com> PR lto/50568 * lto.c (lto_splay_tree_delete_id): New. (lto_splay_tree_compare_ids): Likewise. (lto_splay_tree_lookup): Likewise. (lto_splay_tree_id_equal_p): Likewise. (lto_splay_tree_insert): Likewise. (lto_splay_tree_new): Likewise. (lto_resolution_read): Change id to unsigned HOST_WIDE_INT. Use lto_splay_tree_id_equal_p and lto_splay_tree_lookup. (create_subid_section_table): Use lto_splay_tree_lookup and lto_splay_tree_insert. (lto_file_read): Use lto_splay_tree_new. lto-plugin/ 2011-09-30 H.J. Lu <hongjiu.lu@intel.com> Andi Kleen <ak@linux.intel.com> PR lto/50568 * lto-plugin.c (sym_aux): Change id to unsigned long long. (plugin_symtab): Likewise. (dump_symtab): Likewise. (resolve_conflicts): Likewise. (process_symtab): Likewise. Co-Authored-By: Andi Kleen <ak@linux.intel.com> From-SVN: r179395
Diffstat (limited to 'gcc/lto')
-rw-r--r--gcc/lto/ChangeLog16
-rw-r--r--gcc/lto/lto.c84
2 files changed, 92 insertions, 8 deletions
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index ab9ea68..6ca8f5b 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,19 @@
+2011-09-30 H.J. Lu <hongjiu.lu@intel.com>
+ Andi Kleen <ak@linux.intel.com>
+
+ PR lto/50568
+ * lto.c (lto_splay_tree_delete_id): New.
+ (lto_splay_tree_compare_ids): Likewise.
+ (lto_splay_tree_lookup): Likewise.
+ (lto_splay_tree_id_equal_p): Likewise.
+ (lto_splay_tree_insert): Likewise.
+ (lto_splay_tree_new): Likewise.
+ (lto_resolution_read): Change id to unsigned HOST_WIDE_INT.
+ Use lto_splay_tree_id_equal_p and lto_splay_tree_lookup.
+ (create_subid_section_table): Use lto_splay_tree_lookup and
+ lto_splay_tree_insert.
+ (lto_file_read): Use lto_splay_tree_new.
+
2011-09-26 Andi Kleen <ak@linux.intel.com>
* lto.c (lto_resolution_read): Remove id dumping.
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 77eb1a1..778e33e 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -93,6 +93,71 @@ lto_obj_create_section_hash_table (void)
return htab_create (37, hash_name, eq_name, free_with_string);
}
+/* Delete an allocated integer KEY in the splay tree. */
+
+static void
+lto_splay_tree_delete_id (splay_tree_key key)
+{
+ free ((void *) key);
+}
+
+/* Compare splay tree node ids A and B. */
+
+static int
+lto_splay_tree_compare_ids (splay_tree_key a, splay_tree_key b)
+{
+ unsigned HOST_WIDE_INT ai;
+ unsigned HOST_WIDE_INT bi;
+
+ ai = *(unsigned HOST_WIDE_INT *) a;
+ bi = *(unsigned HOST_WIDE_INT *) b;
+
+ if (ai < bi)
+ return -1;
+ else if (ai > bi)
+ return 1;
+ return 0;
+}
+
+/* Look up splay tree node by ID in splay tree T. */
+
+static splay_tree_node
+lto_splay_tree_lookup (splay_tree t, unsigned HOST_WIDE_INT id)
+{
+ return splay_tree_lookup (t, (splay_tree_key) &id);
+}
+
+/* Check if KEY has ID. */
+
+static bool
+lto_splay_tree_id_equal_p (splay_tree_key key, unsigned HOST_WIDE_INT id)
+{
+ return *(unsigned HOST_WIDE_INT *) key == id;
+}
+
+/* Insert a splay tree node into tree T with ID as key and FILE_DATA as value.
+ The ID is allocated separately because we need HOST_WIDE_INTs which may
+ be wider than a splay_tree_key. */
+
+static void
+lto_splay_tree_insert (splay_tree t, unsigned HOST_WIDE_INT id,
+ struct lto_file_decl_data *file_data)
+{
+ unsigned HOST_WIDE_INT *idp = XCNEW (unsigned HOST_WIDE_INT);
+ *idp = id;
+ splay_tree_insert (t, (splay_tree_key) idp, (splay_tree_value) file_data);
+}
+
+/* Create a splay tree. */
+
+static splay_tree
+lto_splay_tree_new (void)
+{
+ return splay_tree_new (lto_splay_tree_compare_ids,
+ lto_splay_tree_delete_id,
+ NULL);
+}
+
/* Read the constructors and inits. */
static void
@@ -944,14 +1009,16 @@ lto_resolution_read (splay_tree file_ids, FILE *resolution, lto_file *file)
for (i = 0; i < num_symbols; i++)
{
int t;
- unsigned index, id;
+ unsigned index;
+ unsigned HOST_WIDE_INT id;
char r_str[27];
enum ld_plugin_symbol_resolution r = (enum ld_plugin_symbol_resolution) 0;
unsigned int j;
unsigned int lto_resolution_str_len =
sizeof (lto_resolution_str) / sizeof (char *);
- t = fscanf (resolution, "%u %x %26s %*[^\n]\n", &index, &id, r_str);
+ t = fscanf (resolution, "%u " HOST_WIDE_INT_PRINT_HEX_PURE " %26s %*[^\n]\n",
+ &index, &id, r_str);
if (t != 3)
internal_error ("invalid line in the resolution file");
if (index > max_index)
@@ -968,11 +1035,12 @@ lto_resolution_read (splay_tree file_ids, FILE *resolution, lto_file *file)
if (j == lto_resolution_str_len)
internal_error ("invalid resolution in the resolution file");
- if (!(nd && nd->key == id))
+ if (!(nd && lto_splay_tree_id_equal_p (nd->key, id)))
{
- nd = splay_tree_lookup (file_ids, id);
+ nd = lto_splay_tree_lookup (file_ids, id);
if (nd == NULL)
- internal_error ("resolution sub id %x not in object file", id);
+ internal_error ("resolution sub id " HOST_WIDE_INT_PRINT_HEX_PURE
+ " not in object file", id);
}
file_data = (struct lto_file_decl_data *)nd->value;
@@ -1015,7 +1083,7 @@ create_subid_section_table (void **slot, void *data)
return 1;
/* Find hash table of sub module id */
- nd = splay_tree_lookup (file_ids, id);
+ nd = lto_splay_tree_lookup (file_ids, id);
if (nd != NULL)
{
file_data = (struct lto_file_decl_data *)nd->value;
@@ -1026,7 +1094,7 @@ create_subid_section_table (void **slot, void *data)
memset(file_data, 0, sizeof (struct lto_file_decl_data));
file_data->id = id;
file_data->section_hash_table = lto_obj_create_section_hash_table ();;
- splay_tree_insert (file_ids, id, (splay_tree_value)file_data);
+ lto_splay_tree_insert (file_ids, id, file_data);
}
/* Copy section into sub module hash table */
@@ -1104,7 +1172,7 @@ lto_file_read (lto_file *file, FILE *resolution_file, int *count)
/* Find all sub modules in the object and put their sections into new hash
tables in a splay tree. */
- file_ids = splay_tree_new (splay_tree_compare_ints, NULL, NULL);
+ file_ids = lto_splay_tree_new ();
htab_traverse (section_hash_table, create_subid_section_table, file_ids);
/* Add resolutions to file ids */