Hi Guys,

  There is a problem with unit-at-a-time compilation and DWARF debug
  info generation.  Consider this small test case which has been
  derived from GDB's observer.c source file:

    int observer_test_first_observer = 0;
    int observer_test_second_observer = 0;
    int observer_test_third_observer = 0;

    void observer_test_first_notification_function (void)
    {
      observer_test_first_observer++;
    }

    void observer_test_second_notification_function (void)
    {
      observer_test_second_observer++;
    }

    void observer_test_third_notification_function (void)
    {
      observer_test_third_observer++;
    }

  When compiled with the current mainline gcc sources for an x86
  native target and with "-g -O2 -dA" on the command line the
  following debug info is produced:

            [snip]
        .long   .LASF0  # DW_AT_name: "observer_test_first_observer"
        .byte   0x1     # DW_AT_decl_file
        .byte   0x1     # DW_AT_decl_line
        .long   0x37    # DW_AT_type
        .byte   0x1     # DW_AT_external
        .byte   0x5     # DW_AT_location
        .byte   0x3     # DW_OP_addr
        .long   observer_test_first_observer
        .uleb128 0x3    # (DIE (0x37) DW_TAG_base_type)
        .ascii "int\0"  # DW_AT_name
        .byte   0x4     # DW_AT_byte_size
        .byte   0x5     # DW_AT_encoding
        .uleb128 0x4    # (DIE (0x3e) DW_TAG_variable)
        .long   .LASF1  # DW_AT_name: "observer_test_second_observer"
        .byte   0x1     # DW_AT_decl_file
        .byte   0x2     # DW_AT_decl_line
        .long   0x37    # DW_AT_type
        .byte   0x1     # DW_AT_external
        .byte   0x0     # DW_AT_const_value
            [snip]

  Note how observer_test_first_observer is correctly defined as having
  a DW_AT_location and a DW_OP_addr whereas
  observer_test_second_observer is incorrectly defined as having a
  DW_AT_const_value.  ie the debug info is saying that it is a
  variable without a location in memory.

  The reason for this behaviour is that the debug information is being
  written out before the variables have been fully resolved.  In
  particular DECL_SET() for the second and third observer functions is
  NULL when the debug info is generated, which is why they are being
  given the DW_AT_const_value attribute.
  
  In trying to solve this I found that switching the order of the
  calls to lang_hooks.decls.final_write_globals() and 
  cgraph_varpool_assemble_pending_decls() in compile_file() worked,
  and this seemed to be intuitively correct.  But when I reran the gcc
  testsuite I found that the change introduced a regression:
  gcc.dg/varpool-1.c now had the variable
  "unnecessary_static_initialized_variable" still defined at the end
  of compilation.

  I have investigated some more but not gotten much further, so I am
  asking for help.  Can anyone suggest where the conflict between
  generating the debug info and deciding if the variable is going to
  be emitted should really be resolved ?

Cheers
  Nick
  

Reply via email to