DEF_VEC_P(lto_out_decl_state_ptr);
DEF_VEC_ALLOC_P(lto_out_decl_state_ptr, heap);
+/* Compact representation of a index <-> resolution pair. Unpacked to an
+ vector later. */
+struct res_pair
+{
+ ld_plugin_symbol_resolution_t res;
+ unsigned index;
+};
+typedef struct res_pair res_pair;
+
+DEF_VEC_O(res_pair);
+DEF_VEC_ALLOC_O(res_pair, heap);
+
/* One of these is allocated for each object file that being compiled
by lto. This structure contains the tables that are needed by the
serialized functions and ipa passes to connect themselves to the
unsigned HOST_WIDE_INT id;
/* Symbol resolutions for this file */
- VEC(ld_plugin_symbol_resolution_t,heap) * GTY((skip)) resolutions;
+ VEC(res_pair, heap) * GTY((skip)) respairs;
+ unsigned max_index;
struct gcov_ctr_summary GTY((skip)) profile_info;
};
unsigned int num_symbols;
unsigned int i;
struct lto_file_decl_data *file_data;
- unsigned max_index = 0;
splay_tree_node nd = NULL;
if (!resolution)
unsigned int j;
unsigned int lto_resolution_str_len =
sizeof (lto_resolution_str) / sizeof (char *);
+ res_pair rp;
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)
- max_index = index;
for (j = 0; j < lto_resolution_str_len; j++)
{
}
file_data = (struct lto_file_decl_data *)nd->value;
- VEC_safe_grow_cleared (ld_plugin_symbol_resolution_t, heap,
- file_data->resolutions,
- max_index + 1);
- VEC_replace (ld_plugin_symbol_resolution_t,
- file_data->resolutions, index, r);
+ /* The indexes are very sparse. To save memory save them in a compact
+ format that is only unpacked later when the subfile is processed. */
+ rp.res = r;
+ rp.index = index;
+ VEC_safe_push (res_pair, heap, file_data->respairs, rp);
+ if (file_data->max_index < index)
+ file_data->max_index = index;
}
}
{
const char *data;
size_t len;
+ VEC(ld_plugin_symbol_resolution_t,heap) *resolutions = NULL;
+ int i;
+ res_pair *rp;
+
+ /* Create vector for fast access of resolution. We do this lazily
+ to save memory. */
+ VEC_safe_grow_cleared (ld_plugin_symbol_resolution_t, heap,
+ resolutions,
+ file_data->max_index + 1);
+ for (i = 0; VEC_iterate (res_pair, file_data->respairs, i, rp); i++)
+ VEC_replace (ld_plugin_symbol_resolution_t, resolutions, rp->index, rp->res);
+ VEC_free (res_pair, heap, file_data->respairs);
file_data->renaming_hash_table = lto_create_renaming_table ();
file_data->file_name = file->filename;
internal_error ("cannot read LTO decls from %s", file_data->file_name);
return;
}
- lto_read_decls (file_data, data, file_data->resolutions);
+ /* Frees resolutions */
+ lto_read_decls (file_data, data, resolutions);
lto_free_section_data (file_data, LTO_section_decls, NULL, data, len);
}