On Mon, Apr 18, 2011 at 11:45 PM, Eric Botcazou <ebotca...@adacore.com> wrote:
> Hi,
>
> this is the assembler error during an LTO bootstrap:
>
> cc1.ltrans8.s: Assembler messages:
> cc1.ltrans8.s:249143: Error: symbol `.Ldebug_info0' is already defined
>
> In the assembly file:
>
> .Letext0:
>        .file 93 "/home/eric/svn/gcc/gcc/c-parser.c"
>        .section        .debug_info,"",@progbits
> .Ldebug_info0:
> [...]
>        .file 225 "/usr/include/mpc.h"
>        .file 226 "/usr/include/mpfr.h"
> .Ldebug_info0:
>
>
> output_comp_unit is passed a completely bogus DIE:
>
> DIE   11: DW_TAG_enumeration_type (0x7ffff2024a50)
>  abbrev id: 1 offset: 11 mark: 1
>  DW_AT_name: "prec"
>  DW_AT_byte_size: 4
>  DW_AT_decl_file: "/home/eric/svn/gcc/gcc/c-parser.c" (93)
>  DW_AT_decl_line: 5459
>
> created by the call to resolve_addr at line 23613 of dwarf2out.c:
>
>  limbo_die_list = NULL;
>
>  resolve_addr (comp_unit_die ());
>
>
> #20 0x00000000005941a6 in gen_formal_parameter_die (node=0x7ffff5dc6000,
>    origin=0x0, emit_name_p=1 '\001', context_die=0x7ffff4b28780)
>    at /home/eric/svn/gcc/gcc/dwarf2out.c:18682
> #21 0x0000000000594303 in gen_formal_types_die (
>    function_or_method_type=0x7ffff5dcba80, context_die=0x7ffff4b28780)
>    at /home/eric/svn/gcc/gcc/dwarf2out.c:18776
> #22 0x0000000000592187 in gen_subprogram_die (decl=0x7ffff5dce300,
>    context_die=0x7ffff2c13f00) at /home/eric/svn/gcc/gcc/dwarf2out.c:19388
> #23 0x000000000059b632 in force_decl_die (decl=0x7ffff5dce300)
>    at /home/eric/svn/gcc/gcc/dwarf2out.c:21025
> #24 0x000000000059bb25 in resolve_addr (die=0x7ffff3d747d0)
>    at /home/eric/svn/gcc/gcc/dwarf2out.c:23115
> 23115                   force_decl_die (tdecl);
> (gdb) p debug_dwarf_die(die)
> DIE    0: DW_TAG_GNU_call_site (0x7ffff3d747d0)
>  abbrev id: 0 offset: 0 mark: 0
>  DW_AT_low_pc: label: *.LVL13657
>  DW_AT_abstract_origin: address
>
>        if (die->die_tag == DW_TAG_GNU_call_site
>            && a->dw_attr == DW_AT_abstract_origin)
>          {
>            tree tdecl = SYMBOL_REF_DECL (a->dw_attr_val.v.val_addr);
>            dw_die_ref tdie = lookup_decl_die (tdecl);
>            if (tdie == NULL
>                && DECL_EXTERNAL (tdecl)
>                && DECL_ABSTRACT_ORIGIN (tdecl) == NULL_TREE)
>              {
>                force_decl_die (tdecl);
>
>
> The DW_TAG_enumeration_type DIE is for an unrelated type of c-parser.c:
>
> static struct c_expr
> c_parser_binary_expression (c_parser *parser, struct c_expr *after)
> {
>  enum prec {
>    PREC_NONE,
>    PREC_LOGOR,
>    PREC_LOGAND,
>    PREC_BITOR,
>    PREC_BITXOR,
>    PREC_BITAND,
>    PREC_EQ,
>    PREC_REL,
>    PREC_SHIFT,
>    PREC_ADD,
>    PREC_MULT,
>    NUM_PRECS
>  };
>
> which happens to be merged with a type at top-level in cpplib.h:
>
> /* C language kind, used when calling cpp_create_reader.  */
> enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_GNUC1X,
>             CLK_STDC89, CLK_STDC94, CLK_STDC99, CLK_STDC1X,
>             CLK_GNUCXX, CLK_CXX98, CLK_GNUCXX0X, CLK_CXX0X, CLK_ASM};
>
> so the LANG field of:
>
> struct cpp_options
> {
>  /* Characters between tab stops.  */
>  unsigned int tabstop;
>
>  /* The language we're preprocessing.  */
>  enum c_lang lang;
>
> gets enum prec as type and things go downhill from there.
>
>
> I don't think the two enum types should be merged: fields of structures are
> merged only if they have the same identifier, this should apply here as well.
> Hence the attached patch.  LTO bootstrapped on x86_64-suse-linux, OK for the
> mainline?

That has been on my todo for quite a while now ... I didn't think it was
that simple though ;)

Ok for trunk and also ok for the 4.6 branch if you manage to schedule
testing there.

Thanks,
Richard.

>
> 2011-04-18  Eric Botcazou  <ebotca...@adacore.com>
>
>        PR lto/48148
>        * gimple.c (gimple_types_compatible_p_1) <ENUMERAL_TYPE>: Do not
>        merge the types if they have different enumeration identifiers.
>
>
> --
> Eric Botcazou
>

Reply via email to