1 1.1 mrg /* Read the GIMPLE representation from a file stream. 2 1.1 mrg 3 1.1 mrg Copyright (C) 2009-2022 Free Software Foundation, Inc. 4 1.1 mrg Contributed by Kenneth Zadeck <zadeck (at) naturalbridge.com> 5 1.1 mrg Re-implemented by Diego Novillo <dnovillo (at) google.com> 6 1.1 mrg 7 1.1 mrg This file is part of GCC. 8 1.1 mrg 9 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 10 1.1 mrg the terms of the GNU General Public License as published by the Free 11 1.1 mrg Software Foundation; either version 3, or (at your option) any later 12 1.1 mrg version. 13 1.1 mrg 14 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 15 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 17 1.1 mrg for more details. 18 1.1 mrg 19 1.1 mrg You should have received a copy of the GNU General Public License 20 1.1 mrg along with GCC; see the file COPYING3. If not see 21 1.1 mrg <http://www.gnu.org/licenses/>. */ 22 1.1 mrg 23 1.1 mrg #include "config.h" 24 1.1 mrg #include "system.h" 25 1.1 mrg #include "coretypes.h" 26 1.1 mrg #include "backend.h" 27 1.1 mrg #include "target.h" 28 1.1 mrg #include "rtl.h" 29 1.1 mrg #include "tree.h" 30 1.1 mrg #include "gimple.h" 31 1.1 mrg #include "cfghooks.h" 32 1.1 mrg #include "tree-pass.h" 33 1.1 mrg #include "ssa.h" 34 1.1 mrg #include "gimple-streamer.h" 35 1.1 mrg #include "toplev.h" 36 1.1 mrg #include "gimple-iterator.h" 37 1.1 mrg #include "tree-cfg.h" 38 1.1 mrg #include "tree-into-ssa.h" 39 1.1 mrg #include "tree-dfa.h" 40 1.1 mrg #include "tree-ssa.h" 41 1.1 mrg #include "except.h" 42 1.1 mrg #include "cgraph.h" 43 1.1 mrg #include "cfgloop.h" 44 1.1 mrg #include "debug.h" 45 1.1 mrg #include "alloc-pool.h" 46 1.1 mrg #include "toplev.h" 47 1.1 mrg 48 1.1 mrg /* Allocator used to hold string slot entries for line map streaming. */ 49 1.1 mrg static struct object_allocator<struct string_slot> *string_slot_allocator; 50 1.1 mrg 51 1.1 mrg /* The table to hold the file names. */ 52 1.1 mrg static hash_table<string_slot_hasher> *file_name_hash_table; 53 1.1 mrg 54 1.1 mrg /* The table to hold the relative pathname prefixes. */ 55 1.1 mrg 56 1.1 mrg /* This obstack holds file names used in locators. Line map datastructures 57 1.1 mrg points here and thus it needs to be kept allocated as long as linemaps 58 1.1 mrg exists. */ 59 1.1 mrg static struct obstack file_name_obstack; 60 1.1 mrg 61 1.1 mrg /* Map a pair of nul terminated strings where the first one can be 62 1.1 mrg pointer compared, but the second can't, to another string. */ 63 1.1 mrg struct string_pair_map 64 1.1 mrg { 65 1.1 mrg const char *str1; 66 1.1 mrg const char *str2; 67 1.1 mrg const char *str3; 68 1.1 mrg hashval_t hash; 69 1.1 mrg bool prefix; 70 1.1 mrg }; 71 1.1 mrg 72 1.1 mrg /* Allocator used to hold string pair map entries for line map streaming. */ 73 1.1 mrg static struct object_allocator<struct string_pair_map> 74 1.1 mrg *string_pair_map_allocator; 75 1.1 mrg 76 1.1 mrg struct string_pair_map_hasher : nofree_ptr_hash <string_pair_map> 77 1.1 mrg { 78 1.1 mrg static inline hashval_t hash (const string_pair_map *); 79 1.1 mrg static inline bool equal (const string_pair_map *, const string_pair_map *); 80 1.1 mrg }; 81 1.1 mrg 82 1.1 mrg inline hashval_t 83 1.1 mrg string_pair_map_hasher::hash (const string_pair_map *spm) 84 1.1 mrg { 85 1.1 mrg return spm->hash; 86 1.1 mrg } 87 1.1 mrg 88 1.1 mrg inline bool 89 1.1 mrg string_pair_map_hasher::equal (const string_pair_map *spm1, 90 1.1 mrg const string_pair_map *spm2) 91 1.1 mrg { 92 1.1 mrg return (spm1->hash == spm2->hash 93 1.1 mrg && spm1->str1 == spm2->str1 94 1.1 mrg && spm1->prefix == spm2->prefix 95 1.1 mrg && strcmp (spm1->str2, spm2->str2) == 0); 96 1.1 mrg } 97 1.1 mrg 98 1.1 mrg /* The table to hold the pairs of pathnames and corresponding 99 1.1 mrg resulting pathname. Used for both mapping of get_src_pwd () 100 1.1 mrg and recorded source working directory to relative path prefix 101 1.1 mrg from current working directory to the recorded one, and for 102 1.1 mrg mapping of that relative path prefix and some relative path 103 1.1 mrg to those concatenated. */ 104 1.1 mrg static hash_table<string_pair_map_hasher> *path_name_pair_hash_table; 105 1.1 mrg 106 1.1 mrg 107 1.1 mrg /* Check that tag ACTUAL has one of the given values. NUM_TAGS is the 108 1.1 mrg number of valid tag values to check. */ 109 1.1 mrg 110 1.1 mrg void 111 1.1 mrg lto_tag_check_set (enum LTO_tags actual, int ntags, ...) 112 1.1 mrg { 113 1.1 mrg va_list ap; 114 1.1 mrg int i; 115 1.1 mrg 116 1.1 mrg va_start (ap, ntags); 117 1.1 mrg for (i = 0; i < ntags; i++) 118 1.1 mrg if ((unsigned) actual == va_arg (ap, unsigned)) 119 1.1 mrg { 120 1.1 mrg va_end (ap); 121 1.1 mrg return; 122 1.1 mrg } 123 1.1 mrg 124 1.1 mrg va_end (ap); 125 1.1 mrg internal_error ("bytecode stream: unexpected tag %s", lto_tag_name (actual)); 126 1.1 mrg } 127 1.1 mrg 128 1.1 mrg 129 1.1 mrg /* Read LENGTH bytes from STREAM to ADDR. */ 130 1.1 mrg 131 1.1 mrg void 132 1.1 mrg lto_input_data_block (class lto_input_block *ib, void *addr, size_t length) 133 1.1 mrg { 134 1.1 mrg size_t i; 135 1.1 mrg unsigned char *const buffer = (unsigned char *) addr; 136 1.1 mrg 137 1.1 mrg for (i = 0; i < length; i++) 138 1.1 mrg buffer[i] = streamer_read_uchar (ib); 139 1.1 mrg } 140 1.1 mrg 141 1.1 mrg /* Compute the relative path to get to DATA_WD (absolute directory name) 142 1.1 mrg from CWD (another absolute directory name). E.g. for 143 1.1 mrg DATA_WD of "/tmp/foo/bar" and CWD of "/tmp/baz/qux" return 144 1.1 mrg "../../foo/bar". Returned string should be freed by the caller. 145 1.1 mrg Return NULL if absolute file name needs to be used. */ 146 1.1 mrg 147 1.1 mrg static char * 148 1.1 mrg relative_path_prefix (const char *data_wd, const char *cwd) 149 1.1 mrg { 150 1.1 mrg const char *d = data_wd; 151 1.1 mrg const char *c = cwd; 152 1.1 mrg #ifdef HAVE_DOS_BASED_FILE_SYSTEM 153 1.1 mrg if (d[1] == ':') 154 1.1 mrg { 155 1.1 mrg if (!IS_DIR_SEPARATOR (d[2])) 156 1.1 mrg return NULL; 157 1.1 mrg if (c[0] == d[0] && c[1] == ':' && IS_DIR_SEPARATOR (c[2])) 158 1.1 mrg { 159 1.1 mrg c += 3; 160 1.1 mrg d += 3; 161 1.1 mrg } 162 1.1 mrg else 163 1.1 mrg return NULL; 164 1.1 mrg } 165 1.1 mrg else if (c[1] == ':') 166 1.1 mrg return NULL; 167 1.1 mrg #endif 168 1.1 mrg do 169 1.1 mrg { 170 1.1 mrg while (IS_DIR_SEPARATOR (*d)) 171 1.1 mrg d++; 172 1.1 mrg while (IS_DIR_SEPARATOR (*c)) 173 1.1 mrg c++; 174 1.1 mrg size_t i; 175 1.1 mrg for (i = 0; c[i] && !IS_DIR_SEPARATOR (c[i]) && c[i] == d[i]; i++) 176 1.1 mrg ; 177 1.1 mrg if ((c[i] == '\0' || IS_DIR_SEPARATOR (c[i])) 178 1.1 mrg && (d[i] == '\0' || IS_DIR_SEPARATOR (d[i]))) 179 1.1 mrg { 180 1.1 mrg c += i; 181 1.1 mrg d += i; 182 1.1 mrg if (*c == '\0' || *d == '\0') 183 1.1 mrg break; 184 1.1 mrg } 185 1.1 mrg else 186 1.1 mrg break; 187 1.1 mrg } 188 1.1 mrg while (1); 189 1.1 mrg size_t num_up = 0; 190 1.1 mrg do 191 1.1 mrg { 192 1.1 mrg while (IS_DIR_SEPARATOR (*c)) 193 1.1 mrg c++; 194 1.1 mrg if (*c == '\0') 195 1.1 mrg break; 196 1.1 mrg num_up++; 197 1.1 mrg while (*c && !IS_DIR_SEPARATOR (*c)) 198 1.1 mrg c++; 199 1.1 mrg } 200 1.1 mrg while (1); 201 1.1 mrg while (IS_DIR_SEPARATOR (*d)) 202 1.1 mrg d++; 203 1.1 mrg size_t len = strlen (d); 204 1.1 mrg if (len == 0 && num_up == 0) 205 1.1 mrg return xstrdup ("."); 206 1.1 mrg char *ret = XNEWVEC (char, num_up * 3 + len + 1); 207 1.1 mrg char *p = ret; 208 1.1 mrg for (; num_up; num_up--) 209 1.1 mrg { 210 1.1 mrg const char dir_up[3] = { '.', '.', DIR_SEPARATOR }; 211 1.1 mrg memcpy (p, dir_up, 3); 212 1.1 mrg p += 3; 213 1.1 mrg } 214 1.1 mrg memcpy (p, d, len + 1); 215 1.1 mrg return ret; 216 1.1 mrg } 217 1.1 mrg 218 1.1 mrg /* Look up DATA_WD in hash table of relative prefixes. If found, 219 1.1 mrg return relative path from CWD to DATA_WD from the hash table, 220 1.1 mrg otherwise create it. */ 221 1.1 mrg 222 1.1 mrg static const char * 223 1.1 mrg canon_relative_path_prefix (const char *data_wd, const char *cwd) 224 1.1 mrg { 225 1.1 mrg if (!IS_ABSOLUTE_PATH (data_wd) || !IS_ABSOLUTE_PATH (cwd)) 226 1.1 mrg return NULL; 227 1.1 mrg 228 1.1 mrg if (!path_name_pair_hash_table) 229 1.1 mrg { 230 1.1 mrg path_name_pair_hash_table 231 1.1 mrg = new hash_table<string_pair_map_hasher> (37); 232 1.1 mrg string_pair_map_allocator 233 1.1 mrg = new object_allocator <struct string_pair_map> 234 1.1 mrg ("line map string pair map hash"); 235 1.1 mrg } 236 1.1 mrg 237 1.1 mrg inchash::hash h; 238 1.1 mrg h.add_ptr (cwd); 239 1.1 mrg h.merge_hash (htab_hash_string (data_wd)); 240 1.1 mrg h.add_int (true); 241 1.1 mrg 242 1.1 mrg string_pair_map s_slot; 243 1.1 mrg s_slot.str1 = cwd; 244 1.1 mrg s_slot.str2 = data_wd; 245 1.1 mrg s_slot.str3 = NULL; 246 1.1 mrg s_slot.hash = h.end (); 247 1.1 mrg s_slot.prefix = true; 248 1.1 mrg 249 1.1 mrg string_pair_map **slot 250 1.1 mrg = path_name_pair_hash_table->find_slot (&s_slot, INSERT); 251 1.1 mrg if (*slot == NULL) 252 1.1 mrg { 253 1.1 mrg /* Compute relative path from cwd directory to data_wd directory. 254 1.1 mrg E.g. if cwd is /tmp/foo/bar and data_wd is /tmp/baz/qux , 255 1.1 mrg it will return ../../baz/qux . */ 256 1.1 mrg char *relative_path = relative_path_prefix (data_wd, cwd); 257 1.1 mrg const char *relative = relative_path ? relative_path : data_wd; 258 1.1 mrg size_t relative_len = strlen (relative); 259 1.1 mrg gcc_assert (relative_len); 260 1.1 mrg 261 1.1 mrg size_t data_wd_len = strlen (data_wd); 262 1.1 mrg bool add_separator = false; 263 1.1 mrg if (!IS_DIR_SEPARATOR (relative[relative_len - 1])) 264 1.1 mrg add_separator = true; 265 1.1 mrg 266 1.1 mrg size_t len = relative_len + 1 + data_wd_len + 1 + add_separator; 267 1.1 mrg 268 1.1 mrg char *saved_string = XOBNEWVEC (&file_name_obstack, char, len); 269 1.1 mrg struct string_pair_map *new_slot 270 1.1 mrg = string_pair_map_allocator->allocate (); 271 1.1 mrg memcpy (saved_string, data_wd, data_wd_len + 1); 272 1.1 mrg memcpy (saved_string + data_wd_len + 1, relative, relative_len); 273 1.1 mrg if (add_separator) 274 1.1 mrg saved_string[len - 2] = DIR_SEPARATOR; 275 1.1 mrg saved_string[len - 1] = '\0'; 276 1.1 mrg new_slot->str1 = cwd; 277 1.1 mrg new_slot->str2 = saved_string; 278 1.1 mrg new_slot->str3 = saved_string + data_wd_len + 1; 279 1.1 mrg if (relative_len == 1 && relative[0] == '.') 280 1.1 mrg new_slot->str3 = NULL; 281 1.1 mrg new_slot->hash = s_slot.hash; 282 1.1 mrg new_slot->prefix = true; 283 1.1 mrg *slot = new_slot; 284 1.1 mrg free (relative_path); 285 1.1 mrg return new_slot->str3; 286 1.1 mrg } 287 1.1 mrg else 288 1.1 mrg { 289 1.1 mrg string_pair_map *old_slot = *slot; 290 1.1 mrg return old_slot->str3; 291 1.1 mrg } 292 1.1 mrg } 293 1.1 mrg 294 1.1 mrg /* Look up the pair of RELATIVE_PREFIX and STRING strings in a hash table. 295 1.1 mrg If found, return the concatenation of those from the hash table, 296 1.1 mrg otherwise concatenate them. */ 297 1.1 mrg 298 1.1 mrg static const char * 299 1.1 mrg canon_relative_file_name (const char *relative_prefix, const char *string) 300 1.1 mrg { 301 1.1 mrg inchash::hash h; 302 1.1 mrg h.add_ptr (relative_prefix); 303 1.1 mrg h.merge_hash (htab_hash_string (string)); 304 1.1 mrg 305 1.1 mrg string_pair_map s_slot; 306 1.1 mrg s_slot.str1 = relative_prefix; 307 1.1 mrg s_slot.str2 = string; 308 1.1 mrg s_slot.str3 = NULL; 309 1.1 mrg s_slot.hash = h.end (); 310 1.1 mrg s_slot.prefix = false; 311 1.1 mrg 312 1.1 mrg string_pair_map **slot 313 1.1 mrg = path_name_pair_hash_table->find_slot (&s_slot, INSERT); 314 1.1 mrg if (*slot == NULL) 315 1.1 mrg { 316 1.1 mrg size_t relative_prefix_len = strlen (relative_prefix); 317 1.1 mrg size_t string_len = strlen (string); 318 1.1 mrg size_t len = relative_prefix_len + string_len + 1; 319 1.1 mrg 320 1.1 mrg char *saved_string = XOBNEWVEC (&file_name_obstack, char, len); 321 1.1 mrg struct string_pair_map *new_slot 322 1.1 mrg = string_pair_map_allocator->allocate (); 323 1.1 mrg memcpy (saved_string, relative_prefix, relative_prefix_len); 324 1.1 mrg memcpy (saved_string + relative_prefix_len, string, string_len + 1); 325 1.1 mrg new_slot->str1 = relative_prefix; 326 1.1 mrg new_slot->str2 = saved_string + relative_prefix_len; 327 1.1 mrg new_slot->str3 = saved_string; 328 1.1 mrg new_slot->hash = s_slot.hash; 329 1.1 mrg new_slot->prefix = false; 330 1.1 mrg *slot = new_slot; 331 1.1 mrg return new_slot->str3; 332 1.1 mrg } 333 1.1 mrg else 334 1.1 mrg { 335 1.1 mrg string_pair_map *old_slot = *slot; 336 1.1 mrg return old_slot->str3; 337 1.1 mrg } 338 1.1 mrg } 339 1.1 mrg 340 1.1 mrg /* Lookup STRING in file_name_hash_table. If found, return the existing 341 1.1 mrg string, otherwise insert STRING as the canonical version. 342 1.1 mrg If STRING is a relative pathname and RELATIVE_PREFIX is non-NULL, use 343 1.1 mrg canon_relative_file_name instead. */ 344 1.1 mrg 345 1.1 mrg static const char * 346 1.1 mrg canon_file_name (const char *relative_prefix, const char *string) 347 1.1 mrg { 348 1.1 mrg if (relative_prefix && !IS_ABSOLUTE_PATH (string)) 349 1.1 mrg return canon_relative_file_name (relative_prefix, string); 350 1.1 mrg 351 1.1 mrg string_slot **slot; 352 1.1 mrg struct string_slot s_slot; 353 1.1 mrg size_t len = strlen (string); 354 1.1 mrg 355 1.1 mrg s_slot.s = string; 356 1.1 mrg s_slot.len = len; 357 1.1 mrg 358 1.1 mrg slot = file_name_hash_table->find_slot (&s_slot, INSERT); 359 1.1 mrg if (*slot == NULL) 360 1.1 mrg { 361 1.1 mrg char *saved_string; 362 1.1 mrg struct string_slot *new_slot; 363 1.1 mrg 364 1.1 mrg saved_string = XOBNEWVEC (&file_name_obstack, char, len + 1); 365 1.1 mrg new_slot = string_slot_allocator->allocate (); 366 1.1 mrg memcpy (saved_string, string, len + 1); 367 1.1 mrg new_slot->s = saved_string; 368 1.1 mrg new_slot->len = len; 369 1.1 mrg *slot = new_slot; 370 1.1 mrg return saved_string; 371 1.1 mrg } 372 1.1 mrg else 373 1.1 mrg { 374 1.1 mrg struct string_slot *old_slot = *slot; 375 1.1 mrg return old_slot->s; 376 1.1 mrg } 377 1.1 mrg } 378 1.1 mrg 379 1.1 mrg /* Pointer to currently alive instance of lto_location_cache. */ 380 1.1 mrg 381 1.1 mrg lto_location_cache *lto_location_cache::current_cache; 382 1.1 mrg 383 1.1 mrg /* Sort locations in source order. Start with file from last application. */ 384 1.1 mrg 385 1.1 mrg int 386 1.1 mrg lto_location_cache::cmp_loc (const void *pa, const void *pb) 387 1.1 mrg { 388 1.1 mrg const cached_location *a = ((const cached_location *)pa); 389 1.1 mrg const cached_location *b = ((const cached_location *)pb); 390 1.1 mrg const char *current_file = current_cache->current_file; 391 1.1 mrg int current_line = current_cache->current_line; 392 1.1 mrg 393 1.1 mrg if (a->file == current_file && b->file != current_file) 394 1.1 mrg return -1; 395 1.1 mrg if (a->file != current_file && b->file == current_file) 396 1.1 mrg return 1; 397 1.1 mrg if (a->file == current_file && b->file == current_file) 398 1.1 mrg { 399 1.1 mrg if (a->line == current_line && b->line != current_line) 400 1.1 mrg return -1; 401 1.1 mrg if (a->line != current_line && b->line == current_line) 402 1.1 mrg return 1; 403 1.1 mrg } 404 1.1 mrg if (a->file != b->file) 405 1.1 mrg return strcmp (a->file, b->file); 406 1.1 mrg if (a->sysp != b->sysp) 407 1.1 mrg return a->sysp ? 1 : -1; 408 1.1 mrg if (a->line != b->line) 409 1.1 mrg return a->line - b->line; 410 1.1 mrg if (a->col != b->col) 411 1.1 mrg return a->col - b->col; 412 1.1 mrg if ((a->block == NULL_TREE) != (b->block == NULL_TREE)) 413 1.1 mrg return a->block ? 1 : -1; 414 1.1 mrg if (a->block) 415 1.1 mrg { 416 1.1 mrg if (BLOCK_NUMBER (a->block) < BLOCK_NUMBER (b->block)) 417 1.1 mrg return -1; 418 1.1 mrg if (BLOCK_NUMBER (a->block) > BLOCK_NUMBER (b->block)) 419 1.1 mrg return 1; 420 1.1 mrg } 421 1.1 mrg return 0; 422 1.1 mrg } 423 1.1 mrg 424 1.1 mrg /* Apply all changes in location cache. Add locations into linemap and patch 425 1.1 mrg trees. */ 426 1.1 mrg 427 1.1 mrg bool 428 1.1 mrg lto_location_cache::apply_location_cache () 429 1.1 mrg { 430 1.1 mrg static const char *prev_file; 431 1.1 mrg if (!loc_cache.length ()) 432 1.1 mrg return false; 433 1.1 mrg if (loc_cache.length () > 1) 434 1.1 mrg loc_cache.qsort (cmp_loc); 435 1.1 mrg 436 1.1 mrg for (unsigned int i = 0; i < loc_cache.length (); i++) 437 1.1 mrg { 438 1.1 mrg struct cached_location loc = loc_cache[i]; 439 1.1 mrg 440 1.1 mrg if (current_file != loc.file) 441 1.1 mrg linemap_add (line_table, prev_file ? LC_RENAME : LC_ENTER, 442 1.1 mrg loc.sysp, loc.file, loc.line); 443 1.1 mrg else if (current_line != loc.line) 444 1.1 mrg { 445 1.1 mrg int max = loc.col; 446 1.1 mrg 447 1.1 mrg for (unsigned int j = i + 1; j < loc_cache.length (); j++) 448 1.1 mrg if (loc.file != loc_cache[j].file 449 1.1 mrg || loc.line != loc_cache[j].line) 450 1.1 mrg break; 451 1.1 mrg else if (max < loc_cache[j].col) 452 1.1 mrg max = loc_cache[j].col; 453 1.1 mrg linemap_line_start (line_table, loc.line, max + 1); 454 1.1 mrg } 455 1.1 mrg gcc_assert (*loc.loc == BUILTINS_LOCATION + 1); 456 1.1 mrg if (current_file != loc.file 457 1.1 mrg || current_line != loc.line 458 1.1 mrg || current_col != loc.col) 459 1.1 mrg { 460 1.1 mrg current_loc = linemap_position_for_column (line_table, loc.col); 461 1.1 mrg if (loc.block) 462 1.1 mrg current_loc = set_block (current_loc, loc.block); 463 1.1 mrg } 464 1.1 mrg else if (current_block != loc.block) 465 1.1 mrg { 466 1.1 mrg if (loc.block) 467 1.1 mrg current_loc = set_block (current_loc, loc.block); 468 1.1 mrg else 469 1.1 mrg current_loc = LOCATION_LOCUS (current_loc); 470 1.1 mrg } 471 1.1 mrg *loc.loc = current_loc; 472 1.1 mrg current_line = loc.line; 473 1.1 mrg prev_file = current_file = loc.file; 474 1.1 mrg current_col = loc.col; 475 1.1 mrg current_block = loc.block; 476 1.1 mrg } 477 1.1 mrg loc_cache.truncate (0); 478 1.1 mrg accepted_length = 0; 479 1.1 mrg return true; 480 1.1 mrg } 481 1.1 mrg 482 1.1 mrg /* Tree merging did not succeed; mark all changes in the cache as accepted. */ 483 1.1 mrg 484 1.1 mrg void 485 1.1 mrg lto_location_cache::accept_location_cache () 486 1.1 mrg { 487 1.1 mrg gcc_assert (current_cache == this); 488 1.1 mrg accepted_length = loc_cache.length (); 489 1.1 mrg } 490 1.1 mrg 491 1.1 mrg /* Tree merging did succeed; throw away recent changes. */ 492 1.1 mrg 493 1.1 mrg void 494 1.1 mrg lto_location_cache::revert_location_cache () 495 1.1 mrg { 496 1.1 mrg loc_cache.truncate (accepted_length); 497 1.1 mrg } 498 1.1 mrg 499 1.1 mrg /* Read a location bitpack from bit pack BP and either update *LOC directly 500 1.1 mrg or add it to the location cache. If IB is non-NULL, stream in a block 501 1.1 mrg afterwards. 502 1.1 mrg It is neccesary to call apply_location_cache to get *LOC updated. */ 503 1.1 mrg 504 1.1 mrg void 505 1.1 mrg lto_location_cache::input_location_and_block (location_t *loc, 506 1.1 mrg struct bitpack_d *bp, 507 1.1 mrg class lto_input_block *ib, 508 1.1 mrg class data_in *data_in) 509 1.1 mrg { 510 1.1 mrg static const char *stream_file; 511 1.1 mrg static int stream_line; 512 1.1 mrg static int stream_col; 513 1.1 mrg static bool stream_sysp; 514 1.1 mrg static tree stream_block; 515 1.1 mrg static const char *stream_relative_path_prefix; 516 1.1 mrg 517 1.1 mrg gcc_assert (current_cache == this); 518 1.1 mrg 519 1.1 mrg *loc = bp_unpack_int_in_range (bp, "location", 0, 520 1.1 mrg RESERVED_LOCATION_COUNT + 1); 521 1.1 mrg 522 1.1 mrg if (*loc < RESERVED_LOCATION_COUNT) 523 1.1 mrg { 524 1.1 mrg if (ib) 525 1.1 mrg { 526 1.1 mrg bool block_change = bp_unpack_value (bp, 1); 527 1.1 mrg if (block_change) 528 1.1 mrg stream_block = stream_read_tree (ib, data_in); 529 1.1 mrg if (stream_block) 530 1.1 mrg *loc = set_block (*loc, stream_block); 531 1.1 mrg } 532 1.1 mrg return; 533 1.1 mrg } 534 1.1 mrg 535 1.1 mrg bool file_change = (*loc == RESERVED_LOCATION_COUNT + 1); 536 1.1 mrg /* Keep value RESERVED_LOCATION_COUNT in *loc as linemap lookups will 537 1.1 mrg ICE on it. */ 538 1.1 mrg *loc = RESERVED_LOCATION_COUNT; 539 1.1 mrg bool line_change = bp_unpack_value (bp, 1); 540 1.1 mrg bool column_change = bp_unpack_value (bp, 1); 541 1.1 mrg 542 1.1 mrg if (file_change) 543 1.1 mrg { 544 1.1 mrg bool pwd_change = bp_unpack_value (bp, 1); 545 1.1 mrg if (pwd_change) 546 1.1 mrg { 547 1.1 mrg const char *pwd = bp_unpack_string (data_in, bp); 548 1.1 mrg const char *src_pwd = get_src_pwd (); 549 1.1 mrg if (strcmp (pwd, src_pwd) == 0) 550 1.1 mrg stream_relative_path_prefix = NULL; 551 1.1 mrg else 552 1.1 mrg stream_relative_path_prefix 553 1.1 mrg = canon_relative_path_prefix (pwd, src_pwd); 554 1.1 mrg } 555 1.1 mrg stream_file = canon_file_name (stream_relative_path_prefix, 556 1.1 mrg bp_unpack_string (data_in, bp)); 557 1.1 mrg stream_sysp = bp_unpack_value (bp, 1); 558 1.1 mrg } 559 1.1 mrg 560 1.1 mrg if (line_change) 561 1.1 mrg stream_line = bp_unpack_var_len_unsigned (bp); 562 1.1 mrg 563 1.1 mrg if (column_change) 564 1.1 mrg stream_col = bp_unpack_var_len_unsigned (bp); 565 1.1 mrg 566 1.1 mrg tree block = NULL_TREE; 567 1.1 mrg if (ib) 568 1.1 mrg { 569 1.1 mrg bool block_change = bp_unpack_value (bp, 1); 570 1.1 mrg if (block_change) 571 1.1 mrg stream_block = stream_read_tree (ib, data_in); 572 1.1 mrg block = stream_block; 573 1.1 mrg } 574 1.1 mrg 575 1.1 mrg /* This optimization saves location cache operations during gimple 576 1.1 mrg streaming. */ 577 1.1 mrg 578 1.1 mrg if (current_file == stream_file 579 1.1 mrg && current_line == stream_line 580 1.1 mrg && current_col == stream_col 581 1.1 mrg && current_sysp == stream_sysp) 582 1.1 mrg { 583 1.1 mrg if (current_block == block) 584 1.1 mrg *loc = current_loc; 585 1.1 mrg else if (block) 586 1.1 mrg *loc = set_block (current_loc, block); 587 1.1 mrg else 588 1.1 mrg *loc = LOCATION_LOCUS (current_loc); 589 1.1 mrg return; 590 1.1 mrg } 591 1.1 mrg 592 1.1 mrg struct cached_location entry 593 1.1 mrg = {stream_file, loc, stream_line, stream_col, stream_sysp, block}; 594 1.1 mrg loc_cache.safe_push (entry); 595 1.1 mrg } 596 1.1 mrg 597 1.1 mrg /* Read a location bitpack from bit pack BP and either update *LOC directly 598 1.1 mrg or add it to the location cache. 599 1.1 mrg It is neccesary to call apply_location_cache to get *LOC updated. */ 600 1.1 mrg 601 1.1 mrg void 602 1.1 mrg lto_location_cache::input_location (location_t *loc, struct bitpack_d *bp, 603 1.1 mrg class data_in *data_in) 604 1.1 mrg { 605 1.1 mrg return input_location_and_block (loc, bp, NULL, data_in); 606 1.1 mrg } 607 1.1 mrg 608 1.1 mrg /* Read a location bitpack from input block IB and either update *LOC directly 609 1.1 mrg or add it to the location cache. 610 1.1 mrg It is neccesary to call apply_location_cache to get *LOC updated. */ 611 1.1 mrg 612 1.1 mrg void 613 1.1 mrg lto_input_location (location_t *loc, struct bitpack_d *bp, 614 1.1 mrg class data_in *data_in) 615 1.1 mrg { 616 1.1 mrg data_in->location_cache.input_location (loc, bp, data_in); 617 1.1 mrg } 618 1.1 mrg 619 1.1 mrg /* Read a reference to a tree node from DATA_IN using input block IB. 620 1.1 mrg TAG is the expected node that should be found in IB, if TAG belongs 621 1.1 mrg to one of the indexable trees, expect to read a reference index to 622 1.1 mrg be looked up in one of the symbol tables, otherwise read the pysical 623 1.1 mrg representation of the tree using stream_read_tree. FN is the 624 1.1 mrg function scope for the read tree. */ 625 1.1 mrg 626 1.1 mrg tree 627 1.1 mrg lto_input_tree_ref (class lto_input_block *ib, class data_in *data_in, 628 1.1 mrg struct function *fn, enum LTO_tags tag) 629 1.1 mrg { 630 1.1 mrg unsigned HOST_WIDE_INT ix_u; 631 1.1 mrg tree result = NULL_TREE; 632 1.1 mrg 633 1.1 mrg if (tag == LTO_ssa_name_ref) 634 1.1 mrg { 635 1.1 mrg ix_u = streamer_read_uhwi (ib); 636 1.1 mrg result = (*SSANAMES (fn))[ix_u]; 637 1.1 mrg } 638 1.1 mrg else 639 1.1 mrg { 640 1.1 mrg gcc_checking_assert (tag == LTO_global_stream_ref); 641 1.1 mrg ix_u = streamer_read_uhwi (ib); 642 1.1 mrg result = (*data_in->file_data->current_decl_state 643 1.1 mrg ->streams[LTO_DECL_STREAM])[ix_u]; 644 1.1 mrg } 645 1.1 mrg 646 1.1 mrg gcc_assert (result); 647 1.1 mrg 648 1.1 mrg return result; 649 1.1 mrg } 650 1.1 mrg 651 1.1 mrg /* Read VAR_DECL reference to DATA from IB. */ 652 1.1 mrg 653 1.1 mrg tree 654 1.1 mrg lto_input_var_decl_ref (lto_input_block *ib, lto_file_decl_data *file_data) 655 1.1 mrg { 656 1.1 mrg unsigned int ix_u = streamer_read_uhwi (ib); 657 1.1 mrg tree result = (*file_data->current_decl_state 658 1.1 mrg ->streams[LTO_DECL_STREAM])[ix_u]; 659 1.1 mrg gcc_assert (TREE_CODE (result) == VAR_DECL); 660 1.1 mrg return result; 661 1.1 mrg } 662 1.1 mrg 663 1.1 mrg /* Read VAR_DECL reference to DATA from IB. */ 664 1.1 mrg 665 1.1 mrg tree 666 1.1 mrg lto_input_fn_decl_ref (lto_input_block *ib, lto_file_decl_data *file_data) 667 1.1 mrg { 668 1.1 mrg unsigned int ix_u = streamer_read_uhwi (ib); 669 1.1 mrg tree result = (*file_data->current_decl_state 670 1.1 mrg ->streams[LTO_DECL_STREAM])[ix_u]; 671 1.1 mrg gcc_assert (TREE_CODE (result) == FUNCTION_DECL); 672 1.1 mrg return result; 673 1.1 mrg } 674 1.1 mrg 675 1.1 mrg 676 1.1 mrg /* Read and return a double-linked list of catch handlers from input 677 1.1 mrg block IB, using descriptors in DATA_IN. */ 678 1.1 mrg 679 1.1 mrg static struct eh_catch_d * 680 1.1 mrg lto_input_eh_catch_list (class lto_input_block *ib, class data_in *data_in, 681 1.1 mrg eh_catch *last_p) 682 1.1 mrg { 683 1.1 mrg eh_catch first; 684 1.1 mrg enum LTO_tags tag; 685 1.1 mrg 686 1.1 mrg *last_p = first = NULL; 687 1.1 mrg tag = streamer_read_record_start (ib); 688 1.1 mrg while (tag) 689 1.1 mrg { 690 1.1 mrg tree list; 691 1.1 mrg eh_catch n; 692 1.1 mrg 693 1.1 mrg lto_tag_check_range (tag, LTO_eh_catch, LTO_eh_catch); 694 1.1 mrg 695 1.1 mrg /* Read the catch node. */ 696 1.1 mrg n = ggc_cleared_alloc<eh_catch_d> (); 697 1.1 mrg n->type_list = stream_read_tree (ib, data_in); 698 1.1 mrg n->filter_list = stream_read_tree (ib, data_in); 699 1.1 mrg n->label = stream_read_tree (ib, data_in); 700 1.1 mrg 701 1.1 mrg /* Register all the types in N->FILTER_LIST. */ 702 1.1 mrg for (list = n->filter_list; list; list = TREE_CHAIN (list)) 703 1.1 mrg add_type_for_runtime (TREE_VALUE (list)); 704 1.1 mrg 705 1.1 mrg /* Chain N to the end of the list. */ 706 1.1 mrg if (*last_p) 707 1.1 mrg (*last_p)->next_catch = n; 708 1.1 mrg n->prev_catch = *last_p; 709 1.1 mrg *last_p = n; 710 1.1 mrg 711 1.1 mrg /* Set the head of the list the first time through the loop. */ 712 1.1 mrg if (first == NULL) 713 1.1 mrg first = n; 714 1.1 mrg 715 1.1 mrg tag = streamer_read_record_start (ib); 716 1.1 mrg } 717 1.1 mrg 718 1.1 mrg return first; 719 1.1 mrg } 720 1.1 mrg 721 1.1 mrg 722 1.1 mrg /* Read and return EH region IX from input block IB, using descriptors 723 1.1 mrg in DATA_IN. */ 724 1.1 mrg 725 1.1 mrg static eh_region 726 1.1 mrg input_eh_region (class lto_input_block *ib, class data_in *data_in, int ix) 727 1.1 mrg { 728 1.1 mrg enum LTO_tags tag; 729 1.1 mrg eh_region r; 730 1.1 mrg 731 1.1 mrg /* Read the region header. */ 732 1.1 mrg tag = streamer_read_record_start (ib); 733 1.1 mrg if (tag == LTO_null) 734 1.1 mrg return NULL; 735 1.1 mrg 736 1.1 mrg r = ggc_cleared_alloc<eh_region_d> (); 737 1.1 mrg r->index = streamer_read_hwi (ib); 738 1.1 mrg 739 1.1 mrg gcc_assert (r->index == ix); 740 1.1 mrg 741 1.1 mrg /* Read all the region pointers as region numbers. We'll fix up 742 1.1 mrg the pointers once the whole array has been read. */ 743 1.1 mrg r->outer = (eh_region) (intptr_t) streamer_read_hwi (ib); 744 1.1 mrg r->inner = (eh_region) (intptr_t) streamer_read_hwi (ib); 745 1.1 mrg r->next_peer = (eh_region) (intptr_t) streamer_read_hwi (ib); 746 1.1 mrg 747 1.1 mrg switch (tag) 748 1.1 mrg { 749 1.1 mrg case LTO_ert_cleanup: 750 1.1 mrg r->type = ERT_CLEANUP; 751 1.1 mrg break; 752 1.1 mrg 753 1.1 mrg case LTO_ert_try: 754 1.1 mrg { 755 1.1 mrg struct eh_catch_d *last_catch; 756 1.1 mrg r->type = ERT_TRY; 757 1.1 mrg r->u.eh_try.first_catch = lto_input_eh_catch_list (ib, data_in, 758 1.1 mrg &last_catch); 759 1.1 mrg r->u.eh_try.last_catch = last_catch; 760 1.1 mrg break; 761 1.1 mrg } 762 1.1 mrg 763 1.1 mrg case LTO_ert_allowed_exceptions: 764 1.1 mrg { 765 1.1 mrg tree l; 766 1.1 mrg 767 1.1 mrg r->type = ERT_ALLOWED_EXCEPTIONS; 768 1.1 mrg r->u.allowed.type_list = stream_read_tree (ib, data_in); 769 1.1 mrg r->u.allowed.label = stream_read_tree (ib, data_in); 770 1.1 mrg r->u.allowed.filter = streamer_read_uhwi (ib); 771 1.1 mrg 772 1.1 mrg for (l = r->u.allowed.type_list; l ; l = TREE_CHAIN (l)) 773 1.1 mrg add_type_for_runtime (TREE_VALUE (l)); 774 1.1 mrg } 775 1.1 mrg break; 776 1.1 mrg 777 1.1 mrg case LTO_ert_must_not_throw: 778 1.1 mrg { 779 1.1 mrg r->type = ERT_MUST_NOT_THROW; 780 1.1 mrg r->u.must_not_throw.failure_decl = stream_read_tree (ib, data_in); 781 1.1 mrg bitpack_d bp = streamer_read_bitpack (ib); 782 1.1 mrg stream_input_location (&r->u.must_not_throw.failure_loc, 783 1.1 mrg &bp, data_in); 784 1.1 mrg } 785 1.1 mrg break; 786 1.1 mrg 787 1.1 mrg default: 788 1.1 mrg gcc_unreachable (); 789 1.1 mrg } 790 1.1 mrg 791 1.1 mrg r->landing_pads = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib); 792 1.1 mrg 793 1.1 mrg return r; 794 1.1 mrg } 795 1.1 mrg 796 1.1 mrg 797 1.1 mrg /* Read and return EH landing pad IX from input block IB, using descriptors 798 1.1 mrg in DATA_IN. */ 799 1.1 mrg 800 1.1 mrg static eh_landing_pad 801 1.1 mrg input_eh_lp (class lto_input_block *ib, class data_in *data_in, int ix) 802 1.1 mrg { 803 1.1 mrg enum LTO_tags tag; 804 1.1 mrg eh_landing_pad lp; 805 1.1 mrg 806 1.1 mrg /* Read the landing pad header. */ 807 1.1 mrg tag = streamer_read_record_start (ib); 808 1.1 mrg if (tag == LTO_null) 809 1.1 mrg return NULL; 810 1.1 mrg 811 1.1 mrg lto_tag_check_range (tag, LTO_eh_landing_pad, LTO_eh_landing_pad); 812 1.1 mrg 813 1.1 mrg lp = ggc_cleared_alloc<eh_landing_pad_d> (); 814 1.1 mrg lp->index = streamer_read_hwi (ib); 815 1.1 mrg gcc_assert (lp->index == ix); 816 1.1 mrg lp->next_lp = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib); 817 1.1 mrg lp->region = (eh_region) (intptr_t) streamer_read_hwi (ib); 818 1.1 mrg lp->post_landing_pad = stream_read_tree (ib, data_in); 819 1.1 mrg 820 1.1 mrg return lp; 821 1.1 mrg } 822 1.1 mrg 823 1.1 mrg 824 1.1 mrg /* After reading the EH regions, pointers to peer and children regions 825 1.1 mrg are region numbers. This converts all these region numbers into 826 1.1 mrg real pointers into the rematerialized regions for FN. ROOT_REGION 827 1.1 mrg is the region number for the root EH region in FN. */ 828 1.1 mrg 829 1.1 mrg static void 830 1.1 mrg fixup_eh_region_pointers (struct function *fn, HOST_WIDE_INT root_region) 831 1.1 mrg { 832 1.1 mrg unsigned i; 833 1.1 mrg vec<eh_region, va_gc> *eh_array = fn->eh->region_array; 834 1.1 mrg vec<eh_landing_pad, va_gc> *lp_array = fn->eh->lp_array; 835 1.1 mrg eh_region r; 836 1.1 mrg eh_landing_pad lp; 837 1.1 mrg 838 1.1 mrg gcc_assert (eh_array && lp_array); 839 1.1 mrg 840 1.1 mrg gcc_assert (root_region >= 0); 841 1.1 mrg fn->eh->region_tree = (*eh_array)[root_region]; 842 1.1 mrg 843 1.1 mrg #define FIXUP_EH_REGION(r) (r) = (*eh_array)[(HOST_WIDE_INT) (intptr_t) (r)] 844 1.1 mrg #define FIXUP_EH_LP(p) (p) = (*lp_array)[(HOST_WIDE_INT) (intptr_t) (p)] 845 1.1 mrg 846 1.1 mrg /* Convert all the index numbers stored in pointer fields into 847 1.1 mrg pointers to the corresponding slots in the EH region array. */ 848 1.1 mrg FOR_EACH_VEC_ELT (*eh_array, i, r) 849 1.1 mrg { 850 1.1 mrg /* The array may contain NULL regions. */ 851 1.1 mrg if (r == NULL) 852 1.1 mrg continue; 853 1.1 mrg 854 1.1 mrg gcc_assert (i == (unsigned) r->index); 855 1.1 mrg FIXUP_EH_REGION (r->outer); 856 1.1 mrg FIXUP_EH_REGION (r->inner); 857 1.1 mrg FIXUP_EH_REGION (r->next_peer); 858 1.1 mrg FIXUP_EH_LP (r->landing_pads); 859 1.1 mrg } 860 1.1 mrg 861 1.1 mrg /* Convert all the index numbers stored in pointer fields into 862 1.1 mrg pointers to the corresponding slots in the EH landing pad array. */ 863 1.1 mrg FOR_EACH_VEC_ELT (*lp_array, i, lp) 864 1.1 mrg { 865 1.1 mrg /* The array may contain NULL landing pads. */ 866 1.1 mrg if (lp == NULL) 867 1.1 mrg continue; 868 1.1 mrg 869 1.1 mrg gcc_assert (i == (unsigned) lp->index); 870 1.1 mrg FIXUP_EH_LP (lp->next_lp); 871 1.1 mrg FIXUP_EH_REGION (lp->region); 872 1.1 mrg } 873 1.1 mrg 874 1.1 mrg #undef FIXUP_EH_REGION 875 1.1 mrg #undef FIXUP_EH_LP 876 1.1 mrg } 877 1.1 mrg 878 1.1 mrg 879 1.1 mrg /* Initialize EH support. */ 880 1.1 mrg 881 1.1 mrg void 882 1.1 mrg lto_init_eh (void) 883 1.1 mrg { 884 1.1 mrg static bool eh_initialized_p = false; 885 1.1 mrg 886 1.1 mrg if (eh_initialized_p) 887 1.1 mrg return; 888 1.1 mrg 889 1.1 mrg /* Contrary to most other FEs, we only initialize EH support when at 890 1.1 mrg least one of the files in the set contains exception regions in 891 1.1 mrg it. Since this happens much later than the call to init_eh in 892 1.1 mrg lang_dependent_init, we have to set flag_exceptions and call 893 1.1 mrg init_eh again to initialize the EH tables. */ 894 1.1 mrg flag_exceptions = 1; 895 1.1 mrg init_eh (); 896 1.1 mrg 897 1.1 mrg eh_initialized_p = true; 898 1.1 mrg } 899 1.1 mrg 900 1.1 mrg 901 1.1 mrg /* Read the exception table for FN from IB using the data descriptors 902 1.1 mrg in DATA_IN. */ 903 1.1 mrg 904 1.1 mrg static void 905 1.1 mrg input_eh_regions (class lto_input_block *ib, class data_in *data_in, 906 1.1 mrg struct function *fn) 907 1.1 mrg { 908 1.1 mrg HOST_WIDE_INT i, root_region, len; 909 1.1 mrg enum LTO_tags tag; 910 1.1 mrg 911 1.1 mrg tag = streamer_read_record_start (ib); 912 1.1 mrg if (tag == LTO_null) 913 1.1 mrg return; 914 1.1 mrg 915 1.1 mrg lto_tag_check_range (tag, LTO_eh_table, LTO_eh_table); 916 1.1 mrg 917 1.1 mrg gcc_assert (fn->eh); 918 1.1 mrg 919 1.1 mrg root_region = streamer_read_hwi (ib); 920 1.1 mrg gcc_assert (root_region == (int) root_region); 921 1.1 mrg 922 1.1 mrg /* Read the EH region array. */ 923 1.1 mrg len = streamer_read_hwi (ib); 924 1.1 mrg gcc_assert (len == (int) len); 925 1.1 mrg if (len > 0) 926 1.1 mrg { 927 1.1 mrg vec_safe_grow_cleared (fn->eh->region_array, len, true); 928 1.1 mrg for (i = 0; i < len; i++) 929 1.1 mrg { 930 1.1 mrg eh_region r = input_eh_region (ib, data_in, i); 931 1.1 mrg (*fn->eh->region_array)[i] = r; 932 1.1 mrg } 933 1.1 mrg } 934 1.1 mrg 935 1.1 mrg /* Read the landing pads. */ 936 1.1 mrg len = streamer_read_hwi (ib); 937 1.1 mrg gcc_assert (len == (int) len); 938 1.1 mrg if (len > 0) 939 1.1 mrg { 940 1.1 mrg vec_safe_grow_cleared (fn->eh->lp_array, len, true); 941 1.1 mrg for (i = 0; i < len; i++) 942 1.1 mrg { 943 1.1 mrg eh_landing_pad lp = input_eh_lp (ib, data_in, i); 944 1.1 mrg (*fn->eh->lp_array)[i] = lp; 945 1.1 mrg } 946 1.1 mrg } 947 1.1 mrg 948 1.1 mrg /* Read the runtime type data. */ 949 1.1 mrg len = streamer_read_hwi (ib); 950 1.1 mrg gcc_assert (len == (int) len); 951 1.1 mrg if (len > 0) 952 1.1 mrg { 953 1.1 mrg vec_safe_grow_cleared (fn->eh->ttype_data, len, true); 954 1.1 mrg for (i = 0; i < len; i++) 955 1.1 mrg { 956 1.1 mrg tree ttype = stream_read_tree (ib, data_in); 957 1.1 mrg (*fn->eh->ttype_data)[i] = ttype; 958 1.1 mrg } 959 1.1 mrg } 960 1.1 mrg 961 1.1 mrg /* Read the table of action chains. */ 962 1.1 mrg len = streamer_read_hwi (ib); 963 1.1 mrg gcc_assert (len == (int) len); 964 1.1 mrg if (len > 0) 965 1.1 mrg { 966 1.1 mrg if (targetm.arm_eabi_unwinder) 967 1.1 mrg { 968 1.1 mrg vec_safe_grow_cleared (fn->eh->ehspec_data.arm_eabi, len, true); 969 1.1 mrg for (i = 0; i < len; i++) 970 1.1 mrg { 971 1.1 mrg tree t = stream_read_tree (ib, data_in); 972 1.1 mrg (*fn->eh->ehspec_data.arm_eabi)[i] = t; 973 1.1 mrg } 974 1.1 mrg } 975 1.1 mrg else 976 1.1 mrg { 977 1.1 mrg vec_safe_grow_cleared (fn->eh->ehspec_data.other, len, true); 978 1.1 mrg for (i = 0; i < len; i++) 979 1.1 mrg { 980 1.1 mrg uchar c = streamer_read_uchar (ib); 981 1.1 mrg (*fn->eh->ehspec_data.other)[i] = c; 982 1.1 mrg } 983 1.1 mrg } 984 1.1 mrg } 985 1.1 mrg 986 1.1 mrg /* Reconstruct the EH region tree by fixing up the peer/children 987 1.1 mrg pointers. */ 988 1.1 mrg fixup_eh_region_pointers (fn, root_region); 989 1.1 mrg 990 1.1 mrg tag = streamer_read_record_start (ib); 991 1.1 mrg lto_tag_check_range (tag, LTO_null, LTO_null); 992 1.1 mrg } 993 1.1 mrg 994 1.1 mrg 995 1.1 mrg /* Make a new basic block with index INDEX in function FN. */ 996 1.1 mrg 997 1.1 mrg static basic_block 998 1.1 mrg make_new_block (struct function *fn, unsigned int index) 999 1.1 mrg { 1000 1.1 mrg basic_block bb = alloc_block (); 1001 1.1 mrg bb->index = index; 1002 1.1 mrg SET_BASIC_BLOCK_FOR_FN (fn, index, bb); 1003 1.1 mrg n_basic_blocks_for_fn (fn)++; 1004 1.1 mrg return bb; 1005 1.1 mrg } 1006 1.1 mrg 1007 1.1 mrg 1008 1.1 mrg /* Read the CFG for function FN from input block IB. */ 1009 1.1 mrg 1010 1.1 mrg static void 1011 1.1 mrg input_cfg (class lto_input_block *ib, class data_in *data_in, 1012 1.1 mrg struct function *fn) 1013 1.1 mrg { 1014 1.1 mrg unsigned int bb_count; 1015 1.1 mrg basic_block p_bb; 1016 1.1 mrg unsigned int i; 1017 1.1 mrg int index; 1018 1.1 mrg 1019 1.1 mrg init_empty_tree_cfg_for_function (fn); 1020 1.1 mrg 1021 1.1 mrg profile_status_for_fn (fn) = streamer_read_enum (ib, profile_status_d, 1022 1.1 mrg PROFILE_LAST); 1023 1.1 mrg 1024 1.1 mrg bb_count = streamer_read_uhwi (ib); 1025 1.1 mrg 1026 1.1 mrg last_basic_block_for_fn (fn) = bb_count; 1027 1.1 mrg if (bb_count > basic_block_info_for_fn (fn)->length ()) 1028 1.1 mrg vec_safe_grow_cleared (basic_block_info_for_fn (fn), bb_count, true); 1029 1.1 mrg 1030 1.1 mrg if (bb_count > label_to_block_map_for_fn (fn)->length ()) 1031 1.1 mrg vec_safe_grow_cleared (label_to_block_map_for_fn (fn), bb_count, true); 1032 1.1 mrg 1033 1.1 mrg index = streamer_read_hwi (ib); 1034 1.1 mrg while (index != -1) 1035 1.1 mrg { 1036 1.1 mrg basic_block bb = BASIC_BLOCK_FOR_FN (fn, index); 1037 1.1 mrg unsigned int edge_count; 1038 1.1 mrg 1039 1.1 mrg if (bb == NULL) 1040 1.1 mrg bb = make_new_block (fn, index); 1041 1.1 mrg 1042 1.1 mrg edge_count = streamer_read_uhwi (ib); 1043 1.1 mrg 1044 1.1 mrg /* Connect up the CFG. */ 1045 1.1 mrg for (i = 0; i < edge_count; i++) 1046 1.1 mrg { 1047 1.1 mrg bitpack_d bp = streamer_read_bitpack (ib); 1048 1.1 mrg unsigned int dest_index = bp_unpack_var_len_unsigned (&bp); 1049 1.1 mrg unsigned int edge_flags = bp_unpack_var_len_unsigned (&bp); 1050 1.1 mrg basic_block dest = BASIC_BLOCK_FOR_FN (fn, dest_index); 1051 1.1 mrg 1052 1.1 mrg if (dest == NULL) 1053 1.1 mrg dest = make_new_block (fn, dest_index); 1054 1.1 mrg 1055 1.1 mrg edge e = make_edge (bb, dest, edge_flags); 1056 1.1 mrg data_in->location_cache.input_location_and_block (&e->goto_locus, 1057 1.1 mrg &bp, ib, data_in); 1058 1.1 mrg e->probability = profile_probability::stream_in (ib); 1059 1.1 mrg 1060 1.1 mrg } 1061 1.1 mrg 1062 1.1 mrg index = streamer_read_hwi (ib); 1063 1.1 mrg } 1064 1.1 mrg 1065 1.1 mrg p_bb = ENTRY_BLOCK_PTR_FOR_FN (fn); 1066 1.1 mrg index = streamer_read_hwi (ib); 1067 1.1 mrg while (index != -1) 1068 1.1 mrg { 1069 1.1 mrg basic_block bb = BASIC_BLOCK_FOR_FN (fn, index); 1070 1.1 mrg bb->prev_bb = p_bb; 1071 1.1 mrg p_bb->next_bb = bb; 1072 1.1 mrg p_bb = bb; 1073 1.1 mrg index = streamer_read_hwi (ib); 1074 1.1 mrg } 1075 1.1 mrg 1076 1.1 mrg /* ??? The cfgloop interface is tied to cfun. */ 1077 1.1 mrg gcc_assert (cfun == fn); 1078 1.1 mrg 1079 1.1 mrg /* Input the loop tree. */ 1080 1.1 mrg unsigned n_loops = streamer_read_uhwi (ib); 1081 1.1 mrg if (n_loops == 0) 1082 1.1 mrg return; 1083 1.1 mrg 1084 1.1 mrg struct loops *loops = ggc_cleared_alloc<struct loops> (); 1085 1.1 mrg init_loops_structure (fn, loops, n_loops); 1086 1.1 mrg set_loops_for_fn (fn, loops); 1087 1.1 mrg 1088 1.1 mrg /* Input each loop and associate it with its loop header so 1089 1.1 mrg flow_loops_find can rebuild the loop tree. */ 1090 1.1 mrg for (unsigned i = 1; i < n_loops; ++i) 1091 1.1 mrg { 1092 1.1 mrg int header_index = streamer_read_hwi (ib); 1093 1.1 mrg if (header_index == -1) 1094 1.1 mrg { 1095 1.1 mrg loops->larray->quick_push (NULL); 1096 1.1 mrg continue; 1097 1.1 mrg } 1098 1.1 mrg 1099 1.1 mrg class loop *loop = alloc_loop (); 1100 1.1 mrg loop->header = BASIC_BLOCK_FOR_FN (fn, header_index); 1101 1.1 mrg loop->header->loop_father = loop; 1102 1.1 mrg 1103 1.1 mrg /* Read everything copy_loop_info copies. */ 1104 1.1 mrg loop->estimate_state = streamer_read_enum (ib, loop_estimation, EST_LAST); 1105 1.1 mrg loop->any_upper_bound = streamer_read_hwi (ib); 1106 1.1 mrg if (loop->any_upper_bound) 1107 1.1 mrg loop->nb_iterations_upper_bound = streamer_read_widest_int (ib); 1108 1.1 mrg loop->any_likely_upper_bound = streamer_read_hwi (ib); 1109 1.1 mrg if (loop->any_likely_upper_bound) 1110 1.1 mrg loop->nb_iterations_likely_upper_bound = streamer_read_widest_int (ib); 1111 1.1 mrg loop->any_estimate = streamer_read_hwi (ib); 1112 1.1 mrg if (loop->any_estimate) 1113 1.1 mrg loop->nb_iterations_estimate = streamer_read_widest_int (ib); 1114 1.1 mrg 1115 1.1 mrg /* Read OMP SIMD related info. */ 1116 1.1 mrg loop->safelen = streamer_read_hwi (ib); 1117 1.1 mrg loop->unroll = streamer_read_hwi (ib); 1118 1.1 mrg loop->owned_clique = streamer_read_hwi (ib); 1119 1.1 mrg loop->dont_vectorize = streamer_read_hwi (ib); 1120 1.1 mrg loop->force_vectorize = streamer_read_hwi (ib); 1121 1.1 mrg loop->finite_p = streamer_read_hwi (ib); 1122 1.1 mrg loop->simduid = stream_read_tree (ib, data_in); 1123 1.1 mrg 1124 1.1 mrg place_new_loop (fn, loop); 1125 1.1 mrg 1126 1.1 mrg /* flow_loops_find doesn't like loops not in the tree, hook them 1127 1.1 mrg all as siblings of the tree root temporarily. */ 1128 1.1 mrg flow_loop_tree_node_add (loops->tree_root, loop); 1129 1.1 mrg } 1130 1.1 mrg 1131 1.1 mrg /* Rebuild the loop tree. */ 1132 1.1 mrg flow_loops_find (loops); 1133 1.1 mrg } 1134 1.1 mrg 1135 1.1 mrg 1136 1.1 mrg /* Read the SSA names array for function FN from DATA_IN using input 1137 1.1 mrg block IB. */ 1138 1.1 mrg 1139 1.1 mrg static void 1140 1.1 mrg input_ssa_names (class lto_input_block *ib, class data_in *data_in, 1141 1.1 mrg struct function *fn) 1142 1.1 mrg { 1143 1.1 mrg unsigned int i, size; 1144 1.1 mrg 1145 1.1 mrg size = streamer_read_uhwi (ib); 1146 1.1 mrg init_tree_ssa (fn, size); 1147 1.1 mrg cfun->gimple_df->in_ssa_p = true; 1148 1.1 mrg init_ssa_operands (fn); 1149 1.1 mrg 1150 1.1 mrg i = streamer_read_uhwi (ib); 1151 1.1 mrg while (i) 1152 1.1 mrg { 1153 1.1 mrg tree ssa_name, name; 1154 1.1 mrg bool is_default_def; 1155 1.1 mrg 1156 1.1 mrg /* Skip over the elements that had been freed. */ 1157 1.1 mrg while (SSANAMES (fn)->length () < i) 1158 1.1 mrg SSANAMES (fn)->quick_push (NULL_TREE); 1159 1.1 mrg 1160 1.1 mrg is_default_def = (streamer_read_uchar (ib) != 0); 1161 1.1 mrg name = stream_read_tree (ib, data_in); 1162 1.1 mrg ssa_name = make_ssa_name_fn (fn, name, NULL); 1163 1.1 mrg 1164 1.1 mrg if (is_default_def) 1165 1.1 mrg { 1166 1.1 mrg set_ssa_default_def (cfun, SSA_NAME_VAR (ssa_name), ssa_name); 1167 1.1 mrg SSA_NAME_DEF_STMT (ssa_name) = gimple_build_nop (); 1168 1.1 mrg } 1169 1.1 mrg 1170 1.1 mrg i = streamer_read_uhwi (ib); 1171 1.1 mrg } 1172 1.1 mrg } 1173 1.1 mrg 1174 1.1 mrg 1175 1.1 mrg /* Go through all NODE edges and fixup call_stmt pointers 1176 1.1 mrg so they point to STMTS. */ 1177 1.1 mrg 1178 1.1 mrg static void 1179 1.1 mrg fixup_call_stmt_edges_1 (struct cgraph_node *node, gimple **stmts, 1180 1.1 mrg struct function *fn) 1181 1.1 mrg { 1182 1.1 mrg #define STMT_UID_NOT_IN_RANGE(uid) \ 1183 1.1 mrg (gimple_stmt_max_uid (fn) < uid || uid == 0) 1184 1.1 mrg 1185 1.1 mrg struct cgraph_edge *cedge; 1186 1.1 mrg struct ipa_ref *ref = NULL; 1187 1.1 mrg unsigned int i; 1188 1.1 mrg 1189 1.1 mrg for (cedge = node->callees; cedge; cedge = cedge->next_callee) 1190 1.1 mrg { 1191 1.1 mrg if (STMT_UID_NOT_IN_RANGE (cedge->lto_stmt_uid)) 1192 1.1 mrg fatal_error (input_location, 1193 1.1 mrg "Cgraph edge statement index out of range"); 1194 1.1 mrg cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]); 1195 1.1 mrg cedge->lto_stmt_uid = 0; 1196 1.1 mrg if (!cedge->call_stmt) 1197 1.1 mrg fatal_error (input_location, 1198 1.1 mrg "Cgraph edge statement index not found"); 1199 1.1 mrg } 1200 1.1 mrg for (cedge = node->indirect_calls; cedge; cedge = cedge->next_callee) 1201 1.1 mrg { 1202 1.1 mrg if (STMT_UID_NOT_IN_RANGE (cedge->lto_stmt_uid)) 1203 1.1 mrg fatal_error (input_location, 1204 1.1 mrg "Cgraph edge statement index out of range"); 1205 1.1 mrg cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]); 1206 1.1 mrg cedge->lto_stmt_uid = 0; 1207 1.1 mrg if (!cedge->call_stmt) 1208 1.1 mrg fatal_error (input_location, "Cgraph edge statement index not found"); 1209 1.1 mrg } 1210 1.1 mrg for (i = 0; node->iterate_reference (i, ref); i++) 1211 1.1 mrg if (ref->lto_stmt_uid) 1212 1.1 mrg { 1213 1.1 mrg if (STMT_UID_NOT_IN_RANGE (ref->lto_stmt_uid)) 1214 1.1 mrg fatal_error (input_location, 1215 1.1 mrg "Reference statement index out of range"); 1216 1.1 mrg ref->stmt = stmts[ref->lto_stmt_uid - 1]; 1217 1.1 mrg ref->lto_stmt_uid = 0; 1218 1.1 mrg if (!ref->stmt) 1219 1.1 mrg fatal_error (input_location, "Reference statement index not found"); 1220 1.1 mrg } 1221 1.1 mrg } 1222 1.1 mrg 1223 1.1 mrg 1224 1.1 mrg /* Fixup call_stmt pointers in NODE and all clones. */ 1225 1.1 mrg 1226 1.1 mrg static void 1227 1.1 mrg fixup_call_stmt_edges (struct cgraph_node *orig, gimple **stmts) 1228 1.1 mrg { 1229 1.1 mrg struct cgraph_node *node; 1230 1.1 mrg struct function *fn; 1231 1.1 mrg 1232 1.1 mrg while (orig->clone_of) 1233 1.1 mrg orig = orig->clone_of; 1234 1.1 mrg fn = DECL_STRUCT_FUNCTION (orig->decl); 1235 1.1 mrg 1236 1.1 mrg if (!orig->thunk) 1237 1.1 mrg fixup_call_stmt_edges_1 (orig, stmts, fn); 1238 1.1 mrg if (orig->clones) 1239 1.1 mrg for (node = orig->clones; node != orig;) 1240 1.1 mrg { 1241 1.1 mrg if (!node->thunk) 1242 1.1 mrg fixup_call_stmt_edges_1 (node, stmts, fn); 1243 1.1 mrg if (node->clones) 1244 1.1 mrg node = node->clones; 1245 1.1 mrg else if (node->next_sibling_clone) 1246 1.1 mrg node = node->next_sibling_clone; 1247 1.1 mrg else 1248 1.1 mrg { 1249 1.1 mrg while (node != orig && !node->next_sibling_clone) 1250 1.1 mrg node = node->clone_of; 1251 1.1 mrg if (node != orig) 1252 1.1 mrg node = node->next_sibling_clone; 1253 1.1 mrg } 1254 1.1 mrg } 1255 1.1 mrg } 1256 1.1 mrg 1257 1.1 mrg 1258 1.1 mrg /* Input the base body of struct function FN from DATA_IN 1259 1.1 mrg using input block IB. */ 1260 1.1 mrg 1261 1.1 mrg static void 1262 1.1 mrg input_struct_function_base (struct function *fn, class data_in *data_in, 1263 1.1 mrg class lto_input_block *ib) 1264 1.1 mrg { 1265 1.1 mrg struct bitpack_d bp; 1266 1.1 mrg int len; 1267 1.1 mrg 1268 1.1 mrg /* Read the static chain and non-local goto save area. */ 1269 1.1 mrg fn->static_chain_decl = stream_read_tree (ib, data_in); 1270 1.1 mrg fn->nonlocal_goto_save_area = stream_read_tree (ib, data_in); 1271 1.1 mrg 1272 1.1 mrg /* Read all the local symbols. */ 1273 1.1 mrg len = streamer_read_hwi (ib); 1274 1.1 mrg if (len > 0) 1275 1.1 mrg { 1276 1.1 mrg int i; 1277 1.1 mrg vec_safe_grow_cleared (fn->local_decls, len, true); 1278 1.1 mrg for (i = 0; i < len; i++) 1279 1.1 mrg { 1280 1.1 mrg tree t = stream_read_tree (ib, data_in); 1281 1.1 mrg (*fn->local_decls)[i] = t; 1282 1.1 mrg } 1283 1.1 mrg } 1284 1.1 mrg 1285 1.1 mrg /* Input the current IL state of the function. */ 1286 1.1 mrg fn->curr_properties = streamer_read_uhwi (ib); 1287 1.1 mrg 1288 1.1 mrg /* Read all the attributes for FN. */ 1289 1.1 mrg bp = streamer_read_bitpack (ib); 1290 1.1 mrg fn->is_thunk = bp_unpack_value (&bp, 1); 1291 1.1 mrg fn->has_local_explicit_reg_vars = bp_unpack_value (&bp, 1); 1292 1.1 mrg fn->returns_pcc_struct = bp_unpack_value (&bp, 1); 1293 1.1 mrg fn->returns_struct = bp_unpack_value (&bp, 1); 1294 1.1 mrg fn->can_throw_non_call_exceptions = bp_unpack_value (&bp, 1); 1295 1.1 mrg fn->can_delete_dead_exceptions = bp_unpack_value (&bp, 1); 1296 1.1 mrg fn->always_inline_functions_inlined = bp_unpack_value (&bp, 1); 1297 1.1 mrg fn->after_inlining = bp_unpack_value (&bp, 1); 1298 1.1 mrg fn->stdarg = bp_unpack_value (&bp, 1); 1299 1.1 mrg fn->has_nonlocal_label = bp_unpack_value (&bp, 1); 1300 1.1 mrg fn->has_forced_label_in_static = bp_unpack_value (&bp, 1); 1301 1.1 mrg fn->calls_alloca = bp_unpack_value (&bp, 1); 1302 1.1 mrg fn->calls_setjmp = bp_unpack_value (&bp, 1); 1303 1.1 mrg fn->calls_eh_return = bp_unpack_value (&bp, 1); 1304 1.1 mrg fn->has_force_vectorize_loops = bp_unpack_value (&bp, 1); 1305 1.1 mrg fn->has_simduid_loops = bp_unpack_value (&bp, 1); 1306 1.1 mrg fn->va_list_fpr_size = bp_unpack_value (&bp, 8); 1307 1.1 mrg fn->va_list_gpr_size = bp_unpack_value (&bp, 8); 1308 1.1 mrg fn->last_clique = bp_unpack_value (&bp, sizeof (short) * 8); 1309 1.1 mrg 1310 1.1 mrg /* Input the function start and end loci. */ 1311 1.1 mrg stream_input_location (&fn->function_start_locus, &bp, data_in); 1312 1.1 mrg stream_input_location (&fn->function_end_locus, &bp, data_in); 1313 1.1 mrg 1314 1.1 mrg /* Restore the instance discriminators if present. */ 1315 1.1 mrg int instance_number = bp_unpack_value (&bp, 1); 1316 1.1 mrg if (instance_number) 1317 1.1 mrg { 1318 1.1 mrg instance_number = bp_unpack_value (&bp, sizeof (int) * CHAR_BIT); 1319 1.1 mrg maybe_create_decl_to_instance_map ()->put (fn->decl, instance_number); 1320 1.1 mrg } 1321 1.1 mrg } 1322 1.1 mrg 1323 1.1 mrg /* Read a chain of tree nodes from input block IB. DATA_IN contains 1324 1.1 mrg tables and descriptors for the file being read. */ 1325 1.1 mrg 1326 1.1 mrg static tree 1327 1.1 mrg streamer_read_chain (class lto_input_block *ib, class data_in *data_in) 1328 1.1 mrg { 1329 1.1 mrg tree first, prev, curr; 1330 1.1 mrg 1331 1.1 mrg /* The chain is written as NULL terminated list of trees. */ 1332 1.1 mrg first = prev = NULL_TREE; 1333 1.1 mrg do 1334 1.1 mrg { 1335 1.1 mrg curr = stream_read_tree (ib, data_in); 1336 1.1 mrg if (prev) 1337 1.1 mrg TREE_CHAIN (prev) = curr; 1338 1.1 mrg else 1339 1.1 mrg first = curr; 1340 1.1 mrg 1341 1.1 mrg prev = curr; 1342 1.1 mrg } 1343 1.1 mrg while (curr); 1344 1.1 mrg 1345 1.1 mrg return first; 1346 1.1 mrg } 1347 1.1 mrg 1348 1.1 mrg /* Read the body of function FN_DECL from DATA_IN using input block IB. */ 1349 1.1 mrg 1350 1.1 mrg static void 1351 1.1 mrg input_function (tree fn_decl, class data_in *data_in, 1352 1.1 mrg class lto_input_block *ib, class lto_input_block *ib_cfg, 1353 1.1 mrg cgraph_node *node) 1354 1.1 mrg { 1355 1.1 mrg struct function *fn; 1356 1.1 mrg enum LTO_tags tag; 1357 1.1 mrg gimple **stmts; 1358 1.1 mrg basic_block bb; 1359 1.1 mrg 1360 1.1 mrg tag = streamer_read_record_start (ib); 1361 1.1 mrg lto_tag_check (tag, LTO_function); 1362 1.1 mrg 1363 1.1 mrg /* Read decls for parameters and args. */ 1364 1.1 mrg DECL_RESULT (fn_decl) = stream_read_tree (ib, data_in); 1365 1.1 mrg DECL_ARGUMENTS (fn_decl) = streamer_read_chain (ib, data_in); 1366 1.1 mrg 1367 1.1 mrg /* Read debug args if available. */ 1368 1.1 mrg unsigned n_debugargs = streamer_read_uhwi (ib); 1369 1.1 mrg if (n_debugargs) 1370 1.1 mrg { 1371 1.1 mrg vec<tree, va_gc> **debugargs = decl_debug_args_insert (fn_decl); 1372 1.1 mrg vec_safe_grow (*debugargs, n_debugargs, true); 1373 1.1 mrg for (unsigned i = 0; i < n_debugargs; ++i) 1374 1.1 mrg (**debugargs)[i] = stream_read_tree (ib, data_in); 1375 1.1 mrg } 1376 1.1 mrg 1377 1.1 mrg /* Read the tree of lexical scopes for the function. */ 1378 1.1 mrg DECL_INITIAL (fn_decl) = stream_read_tree (ib, data_in); 1379 1.1 mrg unsigned block_leaf_count = streamer_read_uhwi (ib); 1380 1.1 mrg while (block_leaf_count--) 1381 1.1 mrg stream_read_tree (ib, data_in); 1382 1.1 mrg 1383 1.1 mrg if (!streamer_read_uhwi (ib)) 1384 1.1 mrg return; 1385 1.1 mrg 1386 1.1 mrg push_struct_function (fn_decl); 1387 1.1 mrg fn = DECL_STRUCT_FUNCTION (fn_decl); 1388 1.1 mrg 1389 1.1 mrg gimple_register_cfg_hooks (); 1390 1.1 mrg 1391 1.1 mrg input_struct_function_base (fn, data_in, ib); 1392 1.1 mrg input_cfg (ib_cfg, data_in, fn); 1393 1.1 mrg 1394 1.1 mrg /* Read all the SSA names. */ 1395 1.1 mrg input_ssa_names (ib, data_in, fn); 1396 1.1 mrg 1397 1.1 mrg /* Read the exception handling regions in the function. */ 1398 1.1 mrg input_eh_regions (ib, data_in, fn); 1399 1.1 mrg 1400 1.1 mrg gcc_assert (DECL_INITIAL (fn_decl)); 1401 1.1 mrg DECL_SAVED_TREE (fn_decl) = NULL_TREE; 1402 1.1 mrg 1403 1.1 mrg /* Read all the basic blocks. */ 1404 1.1 mrg tag = streamer_read_record_start (ib); 1405 1.1 mrg while (tag) 1406 1.1 mrg { 1407 1.1 mrg input_bb (ib, tag, data_in, fn, 1408 1.1 mrg node->count_materialization_scale); 1409 1.1 mrg tag = streamer_read_record_start (ib); 1410 1.1 mrg } 1411 1.1 mrg 1412 1.1 mrg /* Finalize gimple_location/gimple_block of stmts and phis. */ 1413 1.1 mrg data_in->location_cache.apply_location_cache (); 1414 1.1 mrg 1415 1.1 mrg /* Fix up the call statements that are mentioned in the callgraph 1416 1.1 mrg edges. */ 1417 1.1 mrg set_gimple_stmt_max_uid (cfun, 0); 1418 1.1 mrg FOR_ALL_BB_FN (bb, cfun) 1419 1.1 mrg { 1420 1.1 mrg gimple_stmt_iterator gsi; 1421 1.1 mrg for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1422 1.1 mrg { 1423 1.1 mrg gimple *stmt = gsi_stmt (gsi); 1424 1.1 mrg gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun)); 1425 1.1 mrg } 1426 1.1 mrg for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1427 1.1 mrg { 1428 1.1 mrg gimple *stmt = gsi_stmt (gsi); 1429 1.1 mrg gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun)); 1430 1.1 mrg } 1431 1.1 mrg } 1432 1.1 mrg stmts = (gimple **) xcalloc (gimple_stmt_max_uid (fn), sizeof (gimple *)); 1433 1.1 mrg FOR_ALL_BB_FN (bb, cfun) 1434 1.1 mrg { 1435 1.1 mrg gimple_stmt_iterator bsi = gsi_start_phis (bb); 1436 1.1 mrg while (!gsi_end_p (bsi)) 1437 1.1 mrg { 1438 1.1 mrg gimple *stmt = gsi_stmt (bsi); 1439 1.1 mrg gsi_next (&bsi); 1440 1.1 mrg stmts[gimple_uid (stmt)] = stmt; 1441 1.1 mrg } 1442 1.1 mrg bsi = gsi_start_bb (bb); 1443 1.1 mrg while (!gsi_end_p (bsi)) 1444 1.1 mrg { 1445 1.1 mrg gimple *stmt = gsi_stmt (bsi); 1446 1.1 mrg bool remove = false; 1447 1.1 mrg /* If we're recompiling LTO objects with debug stmts but 1448 1.1 mrg we're not supposed to have debug stmts, remove them now. 1449 1.1 mrg We can't remove them earlier because this would cause uid 1450 1.1 mrg mismatches in fixups, but we can do it at this point, as 1451 1.1 mrg long as debug stmts don't require fixups. 1452 1.1 mrg Similarly remove all IFN_*SAN_* internal calls */ 1453 1.1 mrg if (!flag_wpa) 1454 1.1 mrg { 1455 1.1 mrg if (is_gimple_debug (stmt) 1456 1.1 mrg && (gimple_debug_nonbind_marker_p (stmt) 1457 1.1 mrg ? !MAY_HAVE_DEBUG_MARKER_STMTS 1458 1.1 mrg : !MAY_HAVE_DEBUG_BIND_STMTS)) 1459 1.1 mrg remove = true; 1460 1.1 mrg /* In case the linemap overflows locations can be dropped 1461 1.1 mrg to zero. Thus do not keep nonsensical inline entry markers 1462 1.1 mrg we'd later ICE on. */ 1463 1.1 mrg tree block; 1464 1.1 mrg if (gimple_debug_inline_entry_p (stmt) 1465 1.1 mrg && (((block = gimple_block (stmt)) 1466 1.1 mrg && !inlined_function_outer_scope_p (block)) 1467 1.1 mrg || !debug_inline_points)) 1468 1.1 mrg remove = true; 1469 1.1 mrg if (is_gimple_call (stmt) 1470 1.1 mrg && gimple_call_internal_p (stmt)) 1471 1.1 mrg { 1472 1.1 mrg bool replace = false; 1473 1.1 mrg switch (gimple_call_internal_fn (stmt)) 1474 1.1 mrg { 1475 1.1 mrg case IFN_UBSAN_NULL: 1476 1.1 mrg if ((flag_sanitize 1477 1.1 mrg & (SANITIZE_NULL | SANITIZE_ALIGNMENT)) == 0) 1478 1.1 mrg replace = true; 1479 1.1 mrg break; 1480 1.1 mrg case IFN_UBSAN_BOUNDS: 1481 1.1 mrg if ((flag_sanitize & SANITIZE_BOUNDS) == 0) 1482 1.1 mrg replace = true; 1483 1.1 mrg break; 1484 1.1 mrg case IFN_UBSAN_VPTR: 1485 1.1 mrg if ((flag_sanitize & SANITIZE_VPTR) == 0) 1486 1.1 mrg replace = true; 1487 1.1 mrg break; 1488 1.1 mrg case IFN_UBSAN_OBJECT_SIZE: 1489 1.1 mrg if ((flag_sanitize & SANITIZE_OBJECT_SIZE) == 0) 1490 1.1 mrg replace = true; 1491 1.1 mrg break; 1492 1.1 mrg case IFN_UBSAN_PTR: 1493 1.1 mrg if ((flag_sanitize & SANITIZE_POINTER_OVERFLOW) == 0) 1494 1.1 mrg replace = true; 1495 1.1 mrg break; 1496 1.1 mrg case IFN_ASAN_MARK: 1497 1.1 mrg if ((flag_sanitize & SANITIZE_ADDRESS) == 0) 1498 1.1 mrg replace = true; 1499 1.1 mrg break; 1500 1.1 mrg case IFN_TSAN_FUNC_EXIT: 1501 1.1 mrg if ((flag_sanitize & SANITIZE_THREAD) == 0) 1502 1.1 mrg replace = true; 1503 1.1 mrg break; 1504 1.1 mrg default: 1505 1.1 mrg break; 1506 1.1 mrg } 1507 1.1 mrg if (replace) 1508 1.1 mrg { 1509 1.1 mrg gimple_call_set_internal_fn (as_a <gcall *> (stmt), 1510 1.1 mrg IFN_NOP); 1511 1.1 mrg update_stmt (stmt); 1512 1.1 mrg } 1513 1.1 mrg } 1514 1.1 mrg } 1515 1.1 mrg if (remove) 1516 1.1 mrg { 1517 1.1 mrg gimple_stmt_iterator gsi = bsi; 1518 1.1 mrg gsi_next (&bsi); 1519 1.1 mrg unlink_stmt_vdef (stmt); 1520 1.1 mrg release_defs (stmt); 1521 1.1 mrg gsi_remove (&gsi, true); 1522 1.1 mrg } 1523 1.1 mrg else 1524 1.1 mrg { 1525 1.1 mrg gsi_next (&bsi); 1526 1.1 mrg stmts[gimple_uid (stmt)] = stmt; 1527 1.1 mrg 1528 1.1 mrg /* Remember that the input function has begin stmt 1529 1.1 mrg markers, so that we know to expect them when emitting 1530 1.1 mrg debug info. */ 1531 1.1 mrg if (!cfun->debug_nonbind_markers 1532 1.1 mrg && gimple_debug_nonbind_marker_p (stmt)) 1533 1.1 mrg cfun->debug_nonbind_markers = true; 1534 1.1 mrg } 1535 1.1 mrg } 1536 1.1 mrg } 1537 1.1 mrg 1538 1.1 mrg /* Set the gimple body to the statement sequence in the entry 1539 1.1 mrg basic block. FIXME lto, this is fairly hacky. The existence 1540 1.1 mrg of a gimple body is used by the cgraph routines, but we should 1541 1.1 mrg really use the presence of the CFG. */ 1542 1.1 mrg { 1543 1.1 mrg edge_iterator ei = ei_start (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs); 1544 1.1 mrg gimple_set_body (fn_decl, bb_seq (ei_edge (ei)->dest)); 1545 1.1 mrg } 1546 1.1 mrg 1547 1.1 mrg update_max_bb_count (); 1548 1.1 mrg fixup_call_stmt_edges (node, stmts); 1549 1.1 mrg execute_all_ipa_stmt_fixups (node, stmts); 1550 1.1 mrg 1551 1.1 mrg free_dominance_info (CDI_DOMINATORS); 1552 1.1 mrg free_dominance_info (CDI_POST_DOMINATORS); 1553 1.1 mrg free (stmts); 1554 1.1 mrg pop_cfun (); 1555 1.1 mrg } 1556 1.1 mrg 1557 1.1 mrg /* Read the body of function FN_DECL from DATA_IN using input block IB. */ 1558 1.1 mrg 1559 1.1 mrg static void 1560 1.1 mrg input_constructor (tree var, class data_in *data_in, 1561 1.1 mrg class lto_input_block *ib) 1562 1.1 mrg { 1563 1.1 mrg DECL_INITIAL (var) = stream_read_tree (ib, data_in); 1564 1.1 mrg } 1565 1.1 mrg 1566 1.1 mrg 1567 1.1 mrg /* Read the body from DATA for function NODE and fill it in. 1568 1.1 mrg FILE_DATA are the global decls and types. SECTION_TYPE is either 1569 1.1 mrg LTO_section_function_body or LTO_section_static_initializer. If 1570 1.1 mrg section type is LTO_section_function_body, FN must be the decl for 1571 1.1 mrg that function. */ 1572 1.1 mrg 1573 1.1 mrg static void 1574 1.1 mrg lto_read_body_or_constructor (struct lto_file_decl_data *file_data, struct symtab_node *node, 1575 1.1 mrg const char *data, enum lto_section_type section_type) 1576 1.1 mrg { 1577 1.1 mrg const struct lto_function_header *header; 1578 1.1 mrg class data_in *data_in; 1579 1.1 mrg int cfg_offset; 1580 1.1 mrg int main_offset; 1581 1.1 mrg int string_offset; 1582 1.1 mrg tree fn_decl = node->decl; 1583 1.1 mrg 1584 1.1 mrg header = (const struct lto_function_header *) data; 1585 1.1 mrg if (TREE_CODE (node->decl) == FUNCTION_DECL) 1586 1.1 mrg { 1587 1.1 mrg cfg_offset = sizeof (struct lto_function_header); 1588 1.1 mrg main_offset = cfg_offset + header->cfg_size; 1589 1.1 mrg string_offset = main_offset + header->main_size; 1590 1.1 mrg } 1591 1.1 mrg else 1592 1.1 mrg { 1593 1.1 mrg main_offset = sizeof (struct lto_function_header); 1594 1.1 mrg string_offset = main_offset + header->main_size; 1595 1.1 mrg } 1596 1.1 mrg 1597 1.1 mrg data_in = lto_data_in_create (file_data, data + string_offset, 1598 1.1 mrg header->string_size, vNULL); 1599 1.1 mrg 1600 1.1 mrg if (section_type == LTO_section_function_body) 1601 1.1 mrg { 1602 1.1 mrg struct lto_in_decl_state *decl_state; 1603 1.1 mrg unsigned from; 1604 1.1 mrg 1605 1.1 mrg gcc_checking_assert (node); 1606 1.1 mrg 1607 1.1 mrg /* Use the function's decl state. */ 1608 1.1 mrg decl_state = lto_get_function_in_decl_state (file_data, fn_decl); 1609 1.1 mrg gcc_assert (decl_state); 1610 1.1 mrg file_data->current_decl_state = decl_state; 1611 1.1 mrg 1612 1.1 mrg 1613 1.1 mrg /* Set up the struct function. */ 1614 1.1 mrg from = data_in->reader_cache->nodes.length (); 1615 1.1 mrg lto_input_block ib_main (data + main_offset, header->main_size, 1616 1.1 mrg file_data->mode_table); 1617 1.1 mrg if (TREE_CODE (node->decl) == FUNCTION_DECL) 1618 1.1 mrg { 1619 1.1 mrg lto_input_block ib_cfg (data + cfg_offset, header->cfg_size, 1620 1.1 mrg file_data->mode_table); 1621 1.1 mrg input_function (fn_decl, data_in, &ib_main, &ib_cfg, 1622 1.1 mrg dyn_cast <cgraph_node *>(node)); 1623 1.1 mrg } 1624 1.1 mrg else 1625 1.1 mrg input_constructor (fn_decl, data_in, &ib_main); 1626 1.1 mrg data_in->location_cache.apply_location_cache (); 1627 1.1 mrg /* And fixup types we streamed locally. */ 1628 1.1 mrg { 1629 1.1 mrg struct streamer_tree_cache_d *cache = data_in->reader_cache; 1630 1.1 mrg unsigned len = cache->nodes.length (); 1631 1.1 mrg unsigned i; 1632 1.1 mrg for (i = len; i-- > from;) 1633 1.1 mrg { 1634 1.1 mrg tree t = streamer_tree_cache_get_tree (cache, i); 1635 1.1 mrg if (t == NULL_TREE) 1636 1.1 mrg continue; 1637 1.1 mrg 1638 1.1 mrg if (TYPE_P (t)) 1639 1.1 mrg { 1640 1.1 mrg gcc_assert (TYPE_CANONICAL (t) == NULL_TREE); 1641 1.1 mrg if (type_with_alias_set_p (t) 1642 1.1 mrg && canonical_type_used_p (t)) 1643 1.1 mrg TYPE_CANONICAL (t) = TYPE_MAIN_VARIANT (t); 1644 1.1 mrg if (TYPE_MAIN_VARIANT (t) != t) 1645 1.1 mrg { 1646 1.1 mrg gcc_assert (TYPE_NEXT_VARIANT (t) == NULL_TREE); 1647 1.1 mrg TYPE_NEXT_VARIANT (t) 1648 1.1 mrg = TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t)); 1649 1.1 mrg TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t)) = t; 1650 1.1 mrg } 1651 1.1 mrg } 1652 1.1 mrg } 1653 1.1 mrg } 1654 1.1 mrg 1655 1.1 mrg /* Restore decl state */ 1656 1.1 mrg file_data->current_decl_state = file_data->global_decl_state; 1657 1.1 mrg } 1658 1.1 mrg 1659 1.1 mrg lto_data_in_delete (data_in); 1660 1.1 mrg } 1661 1.1 mrg 1662 1.1 mrg 1663 1.1 mrg /* Read the body of NODE using DATA. FILE_DATA holds the global 1664 1.1 mrg decls and types. */ 1665 1.1 mrg 1666 1.1 mrg void 1667 1.1 mrg lto_input_function_body (struct lto_file_decl_data *file_data, 1668 1.1 mrg struct cgraph_node *node, const char *data) 1669 1.1 mrg { 1670 1.1 mrg lto_read_body_or_constructor (file_data, node, data, LTO_section_function_body); 1671 1.1 mrg } 1672 1.1 mrg 1673 1.1 mrg /* Read the body of NODE using DATA. FILE_DATA holds the global 1674 1.1 mrg decls and types. */ 1675 1.1 mrg 1676 1.1 mrg void 1677 1.1 mrg lto_input_variable_constructor (struct lto_file_decl_data *file_data, 1678 1.1 mrg struct varpool_node *node, const char *data) 1679 1.1 mrg { 1680 1.1 mrg lto_read_body_or_constructor (file_data, node, data, LTO_section_function_body); 1681 1.1 mrg } 1682 1.1 mrg 1683 1.1 mrg 1684 1.1 mrg /* Queue of acummulated decl -> DIE mappings. Similar to locations those 1685 1.1 mrg are only applied to prevailing tree nodes during tree merging. */ 1686 1.1 mrg vec<dref_entry> dref_queue; 1687 1.1 mrg 1688 1.1 mrg /* Read the physical representation of a tree node EXPR from 1689 1.1 mrg input block IB using the per-file context in DATA_IN. */ 1690 1.1 mrg 1691 1.1 mrg static void 1692 1.1 mrg lto_read_tree_1 (class lto_input_block *ib, class data_in *data_in, tree expr) 1693 1.1 mrg { 1694 1.1 mrg /* Read all the bitfield values in EXPR. Note that for LTO, we 1695 1.1 mrg only write language-independent bitfields, so no more unpacking is 1696 1.1 mrg needed. */ 1697 1.1 mrg streamer_read_tree_bitfields (ib, data_in, expr); 1698 1.1 mrg 1699 1.1 mrg /* Read all the pointer fields in EXPR. */ 1700 1.1 mrg streamer_read_tree_body (ib, data_in, expr); 1701 1.1 mrg 1702 1.1 mrg /* Read any LTO-specific data not read by the tree streamer. Do not use 1703 1.1 mrg stream_read_tree here since that flushes the dref_queue in mids of 1704 1.1 mrg SCC reading. */ 1705 1.1 mrg if (DECL_P (expr) 1706 1.1 mrg && TREE_CODE (expr) != FUNCTION_DECL 1707 1.1 mrg && TREE_CODE (expr) != TRANSLATION_UNIT_DECL) 1708 1.1 mrg DECL_INITIAL (expr) 1709 1.1 mrg = lto_input_tree_1 (ib, data_in, streamer_read_record_start (ib), 0); 1710 1.1 mrg 1711 1.1 mrg /* Stream references to early generated DIEs. Keep in sync with the 1712 1.1 mrg trees handled in dwarf2out_register_external_die. */ 1713 1.1 mrg if ((DECL_P (expr) 1714 1.1 mrg && TREE_CODE (expr) != FIELD_DECL 1715 1.1 mrg && TREE_CODE (expr) != DEBUG_EXPR_DECL 1716 1.1 mrg && TREE_CODE (expr) != TYPE_DECL) 1717 1.1 mrg || TREE_CODE (expr) == BLOCK) 1718 1.1 mrg { 1719 1.1 mrg const char *str = streamer_read_string (data_in, ib); 1720 1.1 mrg if (str) 1721 1.1 mrg { 1722 1.1 mrg unsigned HOST_WIDE_INT off = streamer_read_uhwi (ib); 1723 1.1 mrg dref_entry e = { expr, str, off }; 1724 1.1 mrg dref_queue.safe_push (e); 1725 1.1 mrg } 1726 1.1 mrg } 1727 1.1 mrg } 1728 1.1 mrg 1729 1.1 mrg /* Read the physical representation of a tree node with tag TAG from 1730 1.1 mrg input block IB using the per-file context in DATA_IN. */ 1731 1.1 mrg 1732 1.1 mrg static tree 1733 1.1 mrg lto_read_tree (class lto_input_block *ib, class data_in *data_in, 1734 1.1 mrg enum LTO_tags tag, hashval_t hash) 1735 1.1 mrg { 1736 1.1 mrg /* Instantiate a new tree node. */ 1737 1.1 mrg tree result = streamer_alloc_tree (ib, data_in, tag); 1738 1.1 mrg 1739 1.1 mrg /* Enter RESULT in the reader cache. This will make RESULT 1740 1.1 mrg available so that circular references in the rest of the tree 1741 1.1 mrg structure can be resolved in subsequent calls to stream_read_tree. */ 1742 1.1 mrg streamer_tree_cache_append (data_in->reader_cache, result, hash); 1743 1.1 mrg 1744 1.1 mrg lto_read_tree_1 (ib, data_in, result); 1745 1.1 mrg 1746 1.1 mrg return result; 1747 1.1 mrg } 1748 1.1 mrg 1749 1.1 mrg 1750 1.1 mrg /* Populate the reader cache with trees materialized from the SCC 1751 1.1 mrg following in the IB, DATA_IN stream. 1752 1.1 mrg If SHARED_SCC is true we input LTO_tree_scc. */ 1753 1.1 mrg 1754 1.1 mrg hashval_t 1755 1.1 mrg lto_input_scc (class lto_input_block *ib, class data_in *data_in, 1756 1.1 mrg unsigned *len, unsigned *entry_len, bool shared_scc) 1757 1.1 mrg { 1758 1.1 mrg unsigned size = streamer_read_uhwi (ib); 1759 1.1 mrg hashval_t scc_hash = 0; 1760 1.1 mrg unsigned scc_entry_len = 1; 1761 1.1 mrg 1762 1.1 mrg if (shared_scc) 1763 1.1 mrg { 1764 1.1 mrg if (size & 1) 1765 1.1 mrg scc_entry_len = streamer_read_uhwi (ib); 1766 1.1 mrg size /= 2; 1767 1.1 mrg scc_hash = streamer_read_uhwi (ib); 1768 1.1 mrg } 1769 1.1 mrg 1770 1.1 mrg if (size == 1) 1771 1.1 mrg { 1772 1.1 mrg enum LTO_tags tag = streamer_read_record_start (ib); 1773 1.1 mrg lto_input_tree_1 (ib, data_in, tag, scc_hash); 1774 1.1 mrg } 1775 1.1 mrg else 1776 1.1 mrg { 1777 1.1 mrg unsigned int first = data_in->reader_cache->nodes.length (); 1778 1.1 mrg tree result; 1779 1.1 mrg 1780 1.1 mrg /* Materialize size trees by reading their headers. */ 1781 1.1 mrg for (unsigned i = 0; i < size; ++i) 1782 1.1 mrg { 1783 1.1 mrg enum LTO_tags tag = streamer_read_record_start (ib); 1784 1.1 mrg if (tag == LTO_null 1785 1.1 mrg || tag == LTO_global_stream_ref 1786 1.1 mrg || tag == LTO_tree_pickle_reference 1787 1.1 mrg || tag == LTO_integer_cst 1788 1.1 mrg || tag == LTO_tree_scc 1789 1.1 mrg || tag == LTO_trees) 1790 1.1 mrg gcc_unreachable (); 1791 1.1 mrg 1792 1.1 mrg result = streamer_alloc_tree (ib, data_in, tag); 1793 1.1 mrg streamer_tree_cache_append (data_in->reader_cache, result, 0); 1794 1.1 mrg } 1795 1.1 mrg 1796 1.1 mrg /* Read the tree bitpacks and references. */ 1797 1.1 mrg for (unsigned i = 0; i < size; ++i) 1798 1.1 mrg { 1799 1.1 mrg result = streamer_tree_cache_get_tree (data_in->reader_cache, 1800 1.1 mrg first + i); 1801 1.1 mrg lto_read_tree_1 (ib, data_in, result); 1802 1.1 mrg } 1803 1.1 mrg } 1804 1.1 mrg 1805 1.1 mrg *len = size; 1806 1.1 mrg *entry_len = scc_entry_len; 1807 1.1 mrg return scc_hash; 1808 1.1 mrg } 1809 1.1 mrg 1810 1.1 mrg /* Read reference to tree from IB and DATA_IN. 1811 1.1 mrg This is used for streaming tree bodies where we know that 1812 1.1 mrg the tree is already in cache or is indexable and 1813 1.1 mrg must be matched with stream_write_tree_ref. */ 1814 1.1 mrg 1815 1.1 mrg tree 1816 1.1 mrg stream_read_tree_ref (lto_input_block *ib, data_in *data_in) 1817 1.1 mrg { 1818 1.1 mrg int ix = streamer_read_hwi (ib); 1819 1.1 mrg if (!ix) 1820 1.1 mrg return NULL_TREE; 1821 1.1 mrg if (ix > 0) 1822 1.1 mrg return streamer_tree_cache_get_tree (data_in->reader_cache, ix - 1); 1823 1.1 mrg 1824 1.1 mrg ix = -ix - 1; 1825 1.1 mrg int id = ix & 1; 1826 1.1 mrg ix /= 2; 1827 1.1 mrg 1828 1.1 mrg tree ret; 1829 1.1 mrg if (!id) 1830 1.1 mrg ret = (*data_in->file_data->current_decl_state 1831 1.1 mrg ->streams[LTO_DECL_STREAM])[ix]; 1832 1.1 mrg else 1833 1.1 mrg ret = (*SSANAMES (cfun))[ix]; 1834 1.1 mrg return ret; 1835 1.1 mrg } 1836 1.1 mrg 1837 1.1 mrg /* Read a tree from input block IB using the per-file context in 1838 1.1 mrg DATA_IN. This context is used, for example, to resolve references 1839 1.1 mrg to previously read nodes. */ 1840 1.1 mrg 1841 1.1 mrg tree 1842 1.1 mrg lto_input_tree_1 (class lto_input_block *ib, class data_in *data_in, 1843 1.1 mrg enum LTO_tags tag, hashval_t hash) 1844 1.1 mrg { 1845 1.1 mrg tree result; 1846 1.1 mrg 1847 1.1 mrg gcc_assert ((unsigned) tag < (unsigned) LTO_NUM_TAGS); 1848 1.1 mrg 1849 1.1 mrg if (tag == LTO_null) 1850 1.1 mrg result = NULL_TREE; 1851 1.1 mrg else if (tag == LTO_global_stream_ref || tag == LTO_ssa_name_ref) 1852 1.1 mrg { 1853 1.1 mrg /* If TAG is a reference to an indexable tree, the next value 1854 1.1 mrg in IB is the index into the table where we expect to find 1855 1.1 mrg that tree. */ 1856 1.1 mrg result = lto_input_tree_ref (ib, data_in, cfun, tag); 1857 1.1 mrg } 1858 1.1 mrg else if (tag == LTO_tree_pickle_reference) 1859 1.1 mrg { 1860 1.1 mrg /* If TAG is a reference to a previously read tree, look it up in 1861 1.1 mrg the reader cache. */ 1862 1.1 mrg result = streamer_get_pickled_tree (ib, data_in); 1863 1.1 mrg } 1864 1.1 mrg else if (tag == LTO_integer_cst) 1865 1.1 mrg { 1866 1.1 mrg /* For shared integer constants in singletons we can use the 1867 1.1 mrg existing tree integer constant merging code. */ 1868 1.1 mrg tree type = stream_read_tree_ref (ib, data_in); 1869 1.1 mrg unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib); 1870 1.1 mrg unsigned HOST_WIDE_INT i; 1871 1.1 mrg HOST_WIDE_INT a[WIDE_INT_MAX_ELTS]; 1872 1.1 mrg 1873 1.1 mrg for (i = 0; i < len; i++) 1874 1.1 mrg a[i] = streamer_read_hwi (ib); 1875 1.1 mrg gcc_assert (TYPE_PRECISION (type) <= MAX_BITSIZE_MODE_ANY_INT); 1876 1.1 mrg result = wide_int_to_tree (type, wide_int::from_array 1877 1.1 mrg (a, len, TYPE_PRECISION (type))); 1878 1.1 mrg streamer_tree_cache_append (data_in->reader_cache, result, hash); 1879 1.1 mrg } 1880 1.1 mrg else if (tag == LTO_tree_scc || tag == LTO_trees) 1881 1.1 mrg gcc_unreachable (); 1882 1.1 mrg else 1883 1.1 mrg { 1884 1.1 mrg /* Otherwise, materialize a new node from IB. */ 1885 1.1 mrg result = lto_read_tree (ib, data_in, tag, hash); 1886 1.1 mrg } 1887 1.1 mrg 1888 1.1 mrg return result; 1889 1.1 mrg } 1890 1.1 mrg 1891 1.1 mrg tree 1892 1.1 mrg lto_input_tree (class lto_input_block *ib, class data_in *data_in) 1893 1.1 mrg { 1894 1.1 mrg enum LTO_tags tag; 1895 1.1 mrg 1896 1.1 mrg /* Input pickled trees needed to stream in the reference. */ 1897 1.1 mrg while ((tag = streamer_read_record_start (ib)) == LTO_trees) 1898 1.1 mrg { 1899 1.1 mrg unsigned len, entry_len; 1900 1.1 mrg lto_input_scc (ib, data_in, &len, &entry_len, false); 1901 1.1 mrg 1902 1.1 mrg /* Register DECLs with the debuginfo machinery. */ 1903 1.1 mrg while (!dref_queue.is_empty ()) 1904 1.1 mrg { 1905 1.1 mrg dref_entry e = dref_queue.pop (); 1906 1.1 mrg debug_hooks->register_external_die (e.decl, e.sym, e.off); 1907 1.1 mrg } 1908 1.1 mrg } 1909 1.1 mrg tree t = lto_input_tree_1 (ib, data_in, tag, 0); 1910 1.1 mrg 1911 1.1 mrg if (!dref_queue.is_empty ()) 1912 1.1 mrg { 1913 1.1 mrg dref_entry e = dref_queue.pop (); 1914 1.1 mrg debug_hooks->register_external_die (e.decl, e.sym, e.off); 1915 1.1 mrg gcc_checking_assert (dref_queue.is_empty ()); 1916 1.1 mrg } 1917 1.1 mrg return t; 1918 1.1 mrg } 1919 1.1 mrg 1920 1.1 mrg 1921 1.1 mrg /* Input toplevel asms. */ 1922 1.1 mrg 1923 1.1 mrg void 1924 1.1 mrg lto_input_toplevel_asms (struct lto_file_decl_data *file_data, int order_base) 1925 1.1 mrg { 1926 1.1 mrg size_t len; 1927 1.1 mrg const char *data 1928 1.1 mrg = lto_get_summary_section_data (file_data, LTO_section_asm, &len); 1929 1.1 mrg const struct lto_simple_header_with_strings *header 1930 1.1 mrg = (const struct lto_simple_header_with_strings *) data; 1931 1.1 mrg int string_offset; 1932 1.1 mrg class data_in *data_in; 1933 1.1 mrg tree str; 1934 1.1 mrg 1935 1.1 mrg if (! data) 1936 1.1 mrg return; 1937 1.1 mrg 1938 1.1 mrg string_offset = sizeof (*header) + header->main_size; 1939 1.1 mrg 1940 1.1 mrg lto_input_block ib (data + sizeof (*header), header->main_size, 1941 1.1 mrg file_data->mode_table); 1942 1.1 mrg 1943 1.1 mrg data_in = lto_data_in_create (file_data, data + string_offset, 1944 1.1 mrg header->string_size, vNULL); 1945 1.1 mrg 1946 1.1 mrg while ((str = streamer_read_string_cst (data_in, &ib))) 1947 1.1 mrg { 1948 1.1 mrg asm_node *node = symtab->finalize_toplevel_asm (str); 1949 1.1 mrg node->order = streamer_read_hwi (&ib) + order_base; 1950 1.1 mrg if (node->order >= symtab->order) 1951 1.1 mrg symtab->order = node->order + 1; 1952 1.1 mrg } 1953 1.1 mrg 1954 1.1 mrg lto_data_in_delete (data_in); 1955 1.1 mrg 1956 1.1 mrg lto_free_section_data (file_data, LTO_section_asm, NULL, data, len); 1957 1.1 mrg } 1958 1.1 mrg 1959 1.1 mrg 1960 1.1 mrg /* Input mode table. */ 1961 1.1 mrg 1962 1.1 mrg void 1963 1.1 mrg lto_input_mode_table (struct lto_file_decl_data *file_data) 1964 1.1 mrg { 1965 1.1 mrg size_t len; 1966 1.1 mrg const char *data 1967 1.1 mrg = lto_get_summary_section_data (file_data, LTO_section_mode_table, &len); 1968 1.1 mrg if (! data) 1969 1.1 mrg internal_error ("cannot read LTO mode table from %s", 1970 1.1 mrg file_data->file_name); 1971 1.1 mrg 1972 1.1 mrg unsigned char *table = ggc_cleared_vec_alloc<unsigned char> (1 << 8); 1973 1.1 mrg file_data->mode_table = table; 1974 1.1 mrg const struct lto_simple_header_with_strings *header 1975 1.1 mrg = (const struct lto_simple_header_with_strings *) data; 1976 1.1 mrg int string_offset; 1977 1.1 mrg class data_in *data_in; 1978 1.1 mrg string_offset = sizeof (*header) + header->main_size; 1979 1.1 mrg 1980 1.1 mrg lto_input_block ib (data + sizeof (*header), header->main_size, NULL); 1981 1.1 mrg data_in = lto_data_in_create (file_data, data + string_offset, 1982 1.1 mrg header->string_size, vNULL); 1983 1.1 mrg bitpack_d bp = streamer_read_bitpack (&ib); 1984 1.1 mrg 1985 1.1 mrg table[VOIDmode] = VOIDmode; 1986 1.1 mrg table[BLKmode] = BLKmode; 1987 1.1 mrg unsigned int m; 1988 1.1 mrg while ((m = bp_unpack_value (&bp, 8)) != VOIDmode) 1989 1.1 mrg { 1990 1.1 mrg enum mode_class mclass 1991 1.1 mrg = bp_unpack_enum (&bp, mode_class, MAX_MODE_CLASS); 1992 1.1 mrg poly_uint16 size = bp_unpack_poly_value (&bp, 16); 1993 1.1 mrg poly_uint16 prec = bp_unpack_poly_value (&bp, 16); 1994 1.1 mrg machine_mode inner = (machine_mode) bp_unpack_value (&bp, 8); 1995 1.1 mrg poly_uint16 nunits = bp_unpack_poly_value (&bp, 16); 1996 1.1 mrg unsigned int ibit = 0, fbit = 0; 1997 1.1 mrg unsigned int real_fmt_len = 0; 1998 1.1 mrg const char *real_fmt_name = NULL; 1999 1.1 mrg switch (mclass) 2000 1.1 mrg { 2001 1.1 mrg case MODE_FRACT: 2002 1.1 mrg case MODE_UFRACT: 2003 1.1 mrg case MODE_ACCUM: 2004 1.1 mrg case MODE_UACCUM: 2005 1.1 mrg ibit = bp_unpack_value (&bp, 8); 2006 1.1 mrg fbit = bp_unpack_value (&bp, 8); 2007 1.1 mrg break; 2008 1.1 mrg case MODE_FLOAT: 2009 1.1 mrg case MODE_DECIMAL_FLOAT: 2010 1.1 mrg real_fmt_name = bp_unpack_indexed_string (data_in, &bp, 2011 1.1 mrg &real_fmt_len); 2012 1.1 mrg break; 2013 1.1 mrg default: 2014 1.1 mrg break; 2015 1.1 mrg } 2016 1.1 mrg /* First search just the GET_CLASS_NARROWEST_MODE to wider modes, 2017 1.1 mrg if not found, fallback to all modes. */ 2018 1.1 mrg int pass; 2019 1.1 mrg for (pass = 0; pass < 2; pass++) 2020 1.1 mrg for (machine_mode mr = pass ? VOIDmode 2021 1.1 mrg : GET_CLASS_NARROWEST_MODE (mclass); 2022 1.1 mrg pass ? mr < MAX_MACHINE_MODE : mr != VOIDmode; 2023 1.1 mrg pass ? mr = (machine_mode) (mr + 1) 2024 1.1 mrg : mr = GET_MODE_WIDER_MODE (mr).else_void ()) 2025 1.1 mrg if (GET_MODE_CLASS (mr) != mclass 2026 1.1 mrg || maybe_ne (GET_MODE_SIZE (mr), size) 2027 1.1 mrg || maybe_ne (GET_MODE_PRECISION (mr), prec) 2028 1.1 mrg || (inner == m 2029 1.1 mrg ? GET_MODE_INNER (mr) != mr 2030 1.1 mrg : GET_MODE_INNER (mr) != table[(int) inner]) 2031 1.1 mrg || GET_MODE_IBIT (mr) != ibit 2032 1.1 mrg || GET_MODE_FBIT (mr) != fbit 2033 1.1 mrg || maybe_ne (GET_MODE_NUNITS (mr), nunits)) 2034 1.1 mrg continue; 2035 1.1 mrg else if ((mclass == MODE_FLOAT || mclass == MODE_DECIMAL_FLOAT) 2036 1.1 mrg && strcmp (REAL_MODE_FORMAT (mr)->name, real_fmt_name) != 0) 2037 1.1 mrg continue; 2038 1.1 mrg else 2039 1.1 mrg { 2040 1.1 mrg table[m] = mr; 2041 1.1 mrg pass = 2; 2042 1.1 mrg break; 2043 1.1 mrg } 2044 1.1 mrg unsigned int mname_len; 2045 1.1 mrg const char *mname = bp_unpack_indexed_string (data_in, &bp, &mname_len); 2046 1.1 mrg if (pass == 2) 2047 1.1 mrg { 2048 1.1 mrg switch (mclass) 2049 1.1 mrg { 2050 1.1 mrg case MODE_VECTOR_BOOL: 2051 1.1 mrg case MODE_VECTOR_INT: 2052 1.1 mrg case MODE_VECTOR_FLOAT: 2053 1.1 mrg case MODE_VECTOR_FRACT: 2054 1.1 mrg case MODE_VECTOR_UFRACT: 2055 1.1 mrg case MODE_VECTOR_ACCUM: 2056 1.1 mrg case MODE_VECTOR_UACCUM: 2057 1.1 mrg /* For unsupported vector modes just use BLKmode, 2058 1.1 mrg if the scalar mode is supported. */ 2059 1.1 mrg if (table[(int) inner] != VOIDmode) 2060 1.1 mrg { 2061 1.1 mrg table[m] = BLKmode; 2062 1.1 mrg break; 2063 1.1 mrg } 2064 1.1 mrg /* FALLTHRU */ 2065 1.1 mrg default: 2066 1.1 mrg /* This is only used for offloading-target compilations and 2067 1.1 mrg is a user-facing error. Give a better error message for 2068 1.1 mrg the common modes; see also mode-classes.def. */ 2069 1.1 mrg if (mclass == MODE_FLOAT) 2070 1.1 mrg fatal_error (UNKNOWN_LOCATION, 2071 1.1 mrg "%s - %u-bit-precision floating-point numbers " 2072 1.1 mrg "unsupported (mode %qs)", TARGET_MACHINE, 2073 1.1 mrg prec.to_constant (), mname); 2074 1.1 mrg else if (mclass == MODE_DECIMAL_FLOAT) 2075 1.1 mrg fatal_error (UNKNOWN_LOCATION, 2076 1.1 mrg "%s - %u-bit-precision decimal floating-point " 2077 1.1 mrg "numbers unsupported (mode %qs)", TARGET_MACHINE, 2078 1.1 mrg prec.to_constant (), mname); 2079 1.1 mrg else if (mclass == MODE_COMPLEX_FLOAT) 2080 1.1 mrg fatal_error (UNKNOWN_LOCATION, 2081 1.1 mrg "%s - %u-bit-precision complex floating-point " 2082 1.1 mrg "numbers unsupported (mode %qs)", TARGET_MACHINE, 2083 1.1 mrg prec.to_constant (), mname); 2084 1.1 mrg else if (mclass == MODE_INT) 2085 1.1 mrg fatal_error (UNKNOWN_LOCATION, 2086 1.1 mrg "%s - %u-bit integer numbers unsupported (mode " 2087 1.1 mrg "%qs)", TARGET_MACHINE, prec.to_constant (), mname); 2088 1.1 mrg else 2089 1.1 mrg fatal_error (UNKNOWN_LOCATION, "%s - unsupported mode %qs", 2090 1.1 mrg TARGET_MACHINE, mname); 2091 1.1 mrg break; 2092 1.1 mrg } 2093 1.1 mrg } 2094 1.1 mrg } 2095 1.1 mrg lto_data_in_delete (data_in); 2096 1.1 mrg 2097 1.1 mrg lto_free_section_data (file_data, LTO_section_mode_table, NULL, data, len); 2098 1.1 mrg } 2099 1.1 mrg 2100 1.1 mrg 2101 1.1 mrg /* Initialization for the LTO reader. */ 2102 1.1 mrg 2103 1.1 mrg void 2104 1.1 mrg lto_reader_init (void) 2105 1.1 mrg { 2106 1.1 mrg lto_streamer_init (); 2107 1.1 mrg file_name_hash_table 2108 1.1 mrg = new hash_table<string_slot_hasher> (37); 2109 1.1 mrg string_slot_allocator = new object_allocator <struct string_slot> 2110 1.1 mrg ("line map file name hash"); 2111 1.1 mrg gcc_obstack_init (&file_name_obstack); 2112 1.1 mrg } 2113 1.1 mrg 2114 1.1 mrg /* Free hash table used to stream in location file names. */ 2115 1.1 mrg 2116 1.1 mrg void 2117 1.1 mrg lto_free_file_name_hash (void) 2118 1.1 mrg { 2119 1.1 mrg delete file_name_hash_table; 2120 1.1 mrg file_name_hash_table = NULL; 2121 1.1 mrg delete string_slot_allocator; 2122 1.1 mrg string_slot_allocator = NULL; 2123 1.1 mrg delete path_name_pair_hash_table; 2124 1.1 mrg path_name_pair_hash_table = NULL; 2125 1.1 mrg delete string_pair_map_allocator; 2126 1.1 mrg string_pair_map_allocator = NULL; 2127 1.1 mrg /* file_name_obstack must stay allocated since it is referred to by 2128 1.1 mrg line map table. */ 2129 1.1 mrg } 2130 1.1 mrg 2131 1.1 mrg 2132 1.1 mrg /* Create a new data_in object for FILE_DATA. STRINGS is the string 2133 1.1 mrg table to use with LEN strings. RESOLUTIONS is the vector of linker 2134 1.1 mrg resolutions (NULL if not using a linker plugin). */ 2135 1.1 mrg 2136 1.1 mrg class data_in * 2137 1.1 mrg lto_data_in_create (struct lto_file_decl_data *file_data, const char *strings, 2138 1.1 mrg unsigned len, 2139 1.1 mrg vec<ld_plugin_symbol_resolution_t> resolutions) 2140 1.1 mrg { 2141 1.1 mrg class data_in *data_in = new (class data_in); 2142 1.1 mrg data_in->file_data = file_data; 2143 1.1 mrg data_in->strings = strings; 2144 1.1 mrg data_in->strings_len = len; 2145 1.1 mrg data_in->globals_resolution = resolutions; 2146 1.1 mrg data_in->reader_cache = streamer_tree_cache_create (false, false, true); 2147 1.1 mrg return data_in; 2148 1.1 mrg } 2149 1.1 mrg 2150 1.1 mrg 2151 1.1 mrg /* Remove DATA_IN. */ 2152 1.1 mrg 2153 1.1 mrg void 2154 1.1 mrg lto_data_in_delete (class data_in *data_in) 2155 1.1 mrg { 2156 1.1 mrg data_in->globals_resolution.release (); 2157 1.1 mrg streamer_tree_cache_delete (data_in->reader_cache); 2158 1.1 mrg delete data_in; 2159 1.1 mrg } 2160