diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 76569f101bd..44eae081011 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2011-08-28 Dodji Seketeli + + * c-pch.c (c_common_read_pch): Call linemap_add with LC_ENTER as + it's the first time it's being called on this main TU. + 2011-08-24 Richard Guenther PR c/49396 diff --git a/gcc/c-family/c-pch.c b/gcc/c-family/c-pch.c index 3c2fd18f063..7a289d622a8 100644 --- a/gcc/c-family/c-pch.c +++ b/gcc/c-family/c-pch.c @@ -446,7 +446,7 @@ c_common_read_pch (cpp_reader *pfile, const char *name, fclose (f); line_table->trace_includes = saved_trace_includes; - linemap_add (line_table, LC_RENAME, 0, saved_loc.file, saved_loc.line); + linemap_add (line_table, LC_ENTER, 0, saved_loc.file, saved_loc.line); /* Give the front end a chance to take action after a PCH file has been loaded. */ diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 08c68ada97e..a9b85b29bd9 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2011-08-28 Dodji Seketeli + + * scanner.c (load_file): Don't abuse LC_RENAME reason while + (indirectly) calling linemap_add. + 2011-08-26 Jakub Jelinek * trans-decl.c (get_proc_pointer_decl): Set DECL_TLS_MODEL diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index 0c127d49e02..120d55022b8 100644 --- a/gcc/fortran/scanner.c +++ b/gcc/fortran/scanner.c @@ -1887,6 +1887,11 @@ load_file (const char *realfilename, const char *displayedname, bool initial) int len, line_len; bool first_line; const char *filename; + /* If realfilename and displayedname are different and non-null then + surely realfilename is the preprocessed form of + displayedname. */ + bool preprocessed_p = (realfilename && displayedname + && strcmp (realfilename, displayedname)); filename = displayedname ? displayedname : realfilename; @@ -1925,9 +1930,24 @@ load_file (const char *realfilename, const char *displayedname, bool initial) } } - /* Load the file. */ + /* Load the file. - f = get_file (filename, initial ? LC_RENAME : LC_ENTER); + A "non-initial" file means a file that is being included. In + that case we are creating an LC_ENTER map. + + An "initial" file means a main file; one that is not included. + That file has already got at least one (surely more) line map(s) + created by gfc_init. So the subsequent map created in that case + must have LC_RENAME reason. + + This latter case is not true for a preprocessed file. In that + case, although the file is "initial", the line maps created by + gfc_init was used during the preprocessing of the file. Now that + the preprocessing is over and we are being fed the result of that + preprocessing, we need to create a brand new line map for the + preprocessed file, so the reason is going to be LC_ENTER. */ + + f = get_file (filename, (initial && !preprocessed_p) ? LC_RENAME : LC_ENTER); if (!initial) add_file_change (f->filename, f->inclusion_line); current_file = f; diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 48903907e00..6e1e187e0c4 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,8 @@ +2011-08-28 Dodji Seketeli + + * lto-lang.c (lto_init): Likewise. Also, avoid calling + linemap_add twice. + 2011-08-11 Martin Jambor * lto.c (uniquify_nodes): Use main variant's BINFO too. diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c index 83c41e6c1aa..d469fb93b6a 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -1081,8 +1081,7 @@ lto_init (void) flag_generate_lto = flag_wpa; /* Initialize libcpp line maps for gcc_assert to work. */ - linemap_add (line_table, LC_RENAME, 0, NULL, 0); - linemap_add (line_table, LC_RENAME, 0, NULL, 0); + linemap_add (line_table, LC_ENTER, 0, NULL, 0); /* Create the basic integer types. */ build_common_tree_nodes (flag_signed_char, /*short_double=*/false); diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 8a5e89921a0..4ecda03cfec 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,8 @@ +2011-08-28 Dodji Seketeli + + * line-map.c (linemap_add): Assert that reason must not be + LC_RENAME when called for the first time on a "main input file". + 2011-08-22 Gabriel Charette * init.c (cpp_create_reader): Inititalize forced_token_location_p. diff --git a/libcpp/line-map.c b/libcpp/line-map.c index dd3f11cd660..2a0749aad2e 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -114,11 +114,10 @@ linemap_add (struct line_maps *set, enum lc_reason reason, if (reason == LC_RENAME_VERBATIM) reason = LC_RENAME; - /* If we don't keep our line maps consistent, we can easily - segfault. Don't rely on the client to do it for us. */ - if (set->depth == 0) - reason = LC_ENTER; - else if (reason == LC_LEAVE) + if (set->depth == 0 && reason == LC_RENAME) + abort (); + + if (reason == LC_LEAVE) { struct line_map *from; bool error;