1. 30 Apr, 2012 9 commits
    • Fix PCH crash on GTYed pointer-to-scalar field of a struct · 163fa1eb
      When -ftrack-macro-expansion is activated, the PCH generation
      machinery can crash in gt_pch_save when it's about to relocate the
      pointer for the
      line_maps::info_macro::maps[i]::d.macro.macro_locations member.
      
      The call that crashes (in ggc-common.c) is:
      
          state.ptrs[i]->note_ptr_fn (state.ptrs[i]->obj,
      				state.ptrs[i]->note_ptr_cookie,
      				relocate_ptrs, &state);
      
      The ->note_ptr_fn called in this case is the gengtype-generated
      gt_pch_p_9line_maps function.  It crashes because the second argument
      passed to it is a pointer to struct line_map, instead of being a
      pointer to struct line_maps (extra 's') like what the function
      expects.
      
      You can see the crash for the test case:
      
          runtest --tool g++ --tool_opts="-ftrack-macro-expansion" pch.exp=system-1.C
      
      I believe it's because a part of the code of gt_pch_nx_line_maps
      (generated as part of gtype-desc.c by gengtype) is not correct.  Note
      that this gt_pch_nx_line_maps function is called from gt_pch_save in
      the snippet:
      
        for (rt = gt_ggc_rtab; *rt; rt++)
          for (rti = *rt; rti->base != NULL; rti++)
            for (i = 0; i < rti->nelt; i++)
      	(*rti->pchw)(*(void **)((char *)rti->base + rti->stride * i));
      
      So, in that gt_pch_nx_line_maps, in the branch that starts with the
      code:
      
            if ((*x).info_macro.maps != NULL) {
              size_t i3;
              for (i3 = 0; i3 != (size_t)(((*x).info_macro).used); i3++) {
                switch (((*x).info_macro.maps[i3]).reason == LC_ENTER_MACRO)
      
      we have the code:
      
          gt_pch_note_object ((*x).info_macro.maps[i3].d.macro.macro_locations,
      			(*x).info_macro.maps,
      			 gt_pch_p_9line_maps,
      			  gt_types_enum_last);
      
      This last snippet registers gt_pch_p_9line_maps to be called on the
      object pointed by (*x).info_macro.maps[i3].d.macro.macro_locations (as
      a first argument), with (*x).info_macro.maps as its second argument.
      
      Note that (*x).info_macro.maps is of type struct line_map*, while 'x'
      is of type struct line_maps* - beware, there is an 's' at the end of
      the latter.
      
      The problem is that gt_pch_p_9line_maps requires that its second
      argument be an instance of _struct line_maps_, not struct line_map.
      So later when gt_pch_p_9line_maps is called, it just crashes.
      
      More generally, these gt_pch_p_xxx functions seem to require that
      their second argument be an instance of the xxx in question.  And that
      invariant is violated by the snippet of code above.
      
      The invariant seems to be violated only for the case where a GTYed
      structure (possibly embedded in another GTYed structure) contains a
      pointer to a scalar (that is not a string) which memory is ggc/GTY
      managed, like the line_map_macro::macro_locations field.  And this
      only happens for PCH generation.
      
      Looking at gengtype.c, it seems like write_types_process_field can be
      fooled in that case.  It expects that the expression d->prev_val[3]
      contains the name of the second argument of the gt_pch_p_xxx (which is
      generically referenced by wtd->subfield_marker_routine there).  That
      expression can resolve to either "x", as we would like it to be, but
      can also resolve to another arbitrary name for e.g, the case of a
      pointer-to-struct used as a root).
      
      This patch simply forces the second argument of gt_pch_p_xxx to be 'x'
      even in the case of a member that is a pointer to a scalar.
      
      As a result, here is the the diff the new generated gtype-desc.c file:
      
      @@ -5234,7 +5234,7 @@ gt_pch_nx_line_maps (void *x_p)
                       size_t i2;
                       for (i2 = 0; i2 != (size_t)(2 * ((*x).info_ordinary.maps[i0].d.macro).n_tokens); i2++) {
                       }
      -                gt_pch_note_object ((*x).info_ordinary.maps[i0].d.macro.macro_locations, (*x).info_ordinary.maps, gt_pch_p_9line_maps, gt_types_enum_last);
      +                gt_pch_note_object ((*x).info_ordinary.maps[i0].d.macro.macro_locations, x, gt_pch_p_9line_maps, gt_types_enum_last);
                     }
                     break;
                   default:
      @@ -5261,7 +5261,7 @@ gt_pch_nx_line_maps (void *x_p)
                       size_t i5;
                       for (i5 = 0; i5 != (size_t)(2 * ((*x).info_macro.maps[i3].d.macro).n_tokens); i5++) {
                       }
      -                gt_pch_note_object ((*x).info_macro.maps[i3].d.macro.macro_locations, (*x).info_macro.maps, gt_pch_p_9line_maps, gt_types_enum_last);
      +                gt_pch_note_object ((*x).info_macro.maps[i3].d.macro.macro_locations, x, gt_pch_p_9line_maps, gt_types_enum_last);
                     }
                     break;
                   default:
      @@ -9366,7 +9366,7 @@ gt_pch_na_regno_reg_rtx (ATTRIBUTE_UNUSED void *x_p)
           for (i1 = 0; i1 != (size_t)(crtl->emit.x_reg_rtx_no); i1++) {
             gt_pch_n_7rtx_def (regno_reg_rtx[i1]);
           }
      -    gt_pch_note_object (regno_reg_rtx, &regno_reg_rtx, gt_pch_pa_regno_reg_rtx, gt_types_enum_last);
      +    gt_pch_note_object (regno_reg_rtx, x, gt_pch_pa_regno_reg_rtx, gt_types_enum_last);
         }
       }
      
      I think it's pretty much what I was willing to have.
      
      Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk.
      
      Note that the bootstrap with -ftrack-macro-expansion exhibits
      other separate issues that are addressed in subsequent patches.
      This patch just fixes one class of problems.
      
      The patch does pass bootstrap with -ftrack-macro-expansion turned
      off, though.
      
      gcc/
      
      	* gengtype.c (write_types_process_field):  Force second argument
      	of the call to the PCH object hierarchy walker to be 'x'.
      
      From-SVN: r186967
      Dodji Seketeli committed
    • Fix token pasting with -ftrack-macro-expansion · 0ff2b8a0
      This patch makes token pasting work with -ftrack-macro-expansion
      turned on.  It improves some pasting related tests of the gcc.dg/cpp
      subdirectory.
      
      Tested and bootstrapped on x86_64-unknown-linux-gnu against trunk.
      
      Note that the bootstrap with -ftrack-macro-expansion exhibits other
      separate issues that are addressed in subsequent patches.  This patch
      just fixes one class of problems.
      
      The patch does pass bootstrap with -ftrack-macro-expansion turned off,
      though.
      
      libcpp/
      
      	* macro.c (paste_all_tokens): Put the token resulting from pasting
      	into an extended token context with -ftrack-macro-location is in
      	effect.
      
      gcc/testsuite/
      
      	* gcc.dg/cpp/paste17.c: New test case for
      	-ftrack-macro-expansion=2 mode only.
      	* gcc.dg/cpp/macro-exp-tracking-5.c: Likewise.
      
      From-SVN: r186966
      Dodji Seketeli committed
    • Fix cpp_sys_macro_p with -ftrack-macro-expansion · 4e65a470
      cpp_sys_macro_p crashes when -ftrack-macro-expansion is on.  The issue
      can be reproduced by running the tests:
      
          runtest --tool gcc --tool_opts="-ftrack-macro-expansion" cpp.exp=sysmac1.c
          runtest --tool gcc --tool_opts="-ftrack-macro-expansion" cpp.exp=sysmac2.c
      
      This is because it just doesn't support that mode.  Fixed thus.
      Tested and bootstrapped on x86_64-unknown-linux-gnu against trunk.
      
      Note that the bootstrap with -ftrack-macro-expansion turned on
      exhibits other separate issues that are addressed in subsequent
      patches.  This patch just fixes one class of problems.
      
      The patch does pass bootstrap with -ftrack-macro-expansion turned off,
      though.
      
      libcpp/
      
      	* macro.c (cpp_sys_macro_p):  Support -ftrack-macro-expansion.
      
      From-SVN: r186965
      Dodji Seketeli committed
    • decl.c (gnat_to_gnu_entity): In type annotation mode... · b38086f0
      	* gcc-interface/decl.c (gnat_to_gnu_entity): In type annotation mode,
      	do not adjust the size of a tagged type if there is a representation
      	clause on it.  Otherwise, round the adjustment up to the alignment
      	of the first field and use the appropriate helper routine.
      	(maybe_pad_type): Do not warn in type annotation mode on a tagged type.
      	(gnat_to_gnu_field): Do not error out under the same circumstances.
      	(annotate_rep): In type annotation mode, do not adjust the offset of
      	components of a tagged type with representation clause.  Otherwise,
      	round the adjustment up to the alignment of the first field.
      
      From-SVN: r186961
      Eric Botcazou committed
    • i386.c (ix86_handle_struct_attribute): Use the proper predicate to discriminate types. · bb358f1c
      	* config/i386/i386.c (ix86_handle_struct_attribute): Use the proper
      	predicate to discriminate types.
      ada/
      	* gcc-interface/utils.c (finish_record_type): Force the traditional GCC
      	layout for bitfields on the type if it is packed or has a representation
      	clause and an alternate layout is available.
      
      From-SVN: r186958
      Eric Botcazou committed
    • c-common.c (check_function_arguments): Replace Wmissing-format-attribute with… · e6c69da0
      c-common.c (check_function_arguments): Replace Wmissing-format-attribute with Wsuggest-attribute=format.
      
      2012-04-30  Manuel López-Ibáñez  <manu@gcc.gnu.org>
      
              * c-common.c (check_function_arguments): Replace
              Wmissing-format-attribute with Wsuggest-attribute=format.
      
      From-SVN: r186957
      Manuel López-Ibáñez committed
    • gigi.h (mark_out_of_scope): Delete. · f04b8d69
      	* gcc-interface/gigi.h (mark_out_of_scope): Delete.
      	(destroy_gnat_to_gnu): Declare.
      	(destroy_dummy_type): Likewise.
      	* gcc-interface/decl.c (mark_out_of_scope): Delete.
      	* gcc-interface/utils.c (destroy_gnat_to_gnu): New function.
      	(destroy_dummy_type): Likewise.
      	* gcc-interface/trans.c (gnat_validate_uc_list): New variable.
      	(gigi): Call validate_unchecked_conversion on gnat_validate_uc_list
      	after the translation is completed.  Call destroy_gnat_to_gnu and
      	destroy_dummy_type at the end.
      	(Subprogram_Body_to_gnu): Do not call mark_out_of_scope.
      	(gnat_to_gnu) <N_Block_Statement>: Likewise.
      	<N_Validate_Unchecked_Conversion>: Do not process the node, only push
      	it onto gnat_validate_uc_list.
      	(validate_unchecked_conversion): New function.
      
      From-SVN: r186956
      Eric Botcazou committed
    • invoke.texi (Wmissing-format-attribute): Document as an alias of Wsuggest-attribute=format. · 90137d8f
      2012-04-30  Manuel López-Ibáñez  <manu@gcc.gnu.org>
      
      gcc/
      	* doc/invoke.texi (Wmissing-format-attribute): Document as an
      	alias of Wsuggest-attribute=format.
      c-family/
      	* c.opt (Wsuggest-attribute=format): New. Alias of
      	Wmissing-format-attribute.
      	* c-format.c (decode_format_type): Replace
      	Wmissing-format-attribute with Wsuggest-attribute=format.
      	(check_function_format): Likewise.
      cp/
      	* typeck.c (convert_for_assignment):  Replace
      	Wmissing-format-attribute with Wsuggest-attribute=format.
      	* call.c (convert_for_arg_passing): Likewise.
      gcc/
      	* c-typeck.c (convert_for_assignment): Replace
      	Wmissing-format-attribute with Wsuggest-attribute=format.
      	(digest_init): Likewise.
      
      From-SVN: r186955
      Manuel López-Ibáñez committed
    • Daily bump. · 70c33a85
      From-SVN: r186952
      GCC Administrator committed
  2. 29 Apr, 2012 10 commits
  3. 28 Apr, 2012 6 commits
  4. 27 Apr, 2012 15 commits