On 8/26/24 10:31, Richard Biener wrote:
> On Mon, 26 Aug 2024, Bernd Edlinger wrote:
> 
>> This recent change triggered various bootsteap-errors, mostly on
>> x86 targets because line info advance address entries were output
>> in the wrong section table.
>> The switch to the wrong line table happened in dwarfout_set_ignored_loc.
>> It must use the same section as the earlier called
>> dwarf2out_switch_text_section.
>>
>> But also ft32-elf was affected, because the assembler choked on
>> something simple as ".2byte .LM2-.LM1", but fortunately it is
>> able to use native location views, the configure test was just
>> not executed because the ft32 "nop" instruction was missing.
> 
> OK for the configure part, I don't understand how using
> current_function_section is correct or how it even makes a
> differnce to function_section.
> 
> It seems both would rely on the fact that fde->decl should be
> the same as cfun->decl and both eventually resort to how
> first_function_block_is_cold is set.
> 
> Is this from final_scan_insn_1 where we seem to switch
> in_cold_section_p?
> 
> The [current_]function_section API might be just confusing to me
> of course.  I note that dwarf2out mixes both uses and
> current_function_section seems newer than function_section.  Huh.
> 
Well, this is how I debugged it:
I use the successfully bootstrapped x86_64-pc-linux-gnu-gcc as host compiler
and build this:
 ../gcc-trunk/configure --target=i386-linux-gnu CC="gcc -m32 
-gno-as-loc-support" CXX="g++ -m32 -gno-as-loc-support"

make stops here:

g++ -m32 -gno-as-loc-support  -fno-PIE -c   -g -O2     -DIN_GCC 
-DCROSS_DIRECTORY_STRUCTURE   -fno-exceptions -fno-rtti 
-fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings 
-Wcast-qual -Wmissing-format-attribute -Wconditionally-supported 
-Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros 
-Wno-overlength-strings  -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../../gcc-trunk/gcc 
-I../../gcc-trunk/gcc/. -I../../gcc-trunk/gcc/../include  
-I../../gcc-trunk/gcc/../libcpp/include -I../../gcc-trunk/gcc/../libcody 
-I/home/ed/gnu/gcc-build-x/./gmp -I/home/ed/gnu/gcc-trunk/gmp 
-I/home/ed/gnu/gcc-build-x/./mpfr/src -I/home/ed/gnu/gcc-trunk/mpfr/src 
-I/home/ed/gnu/gcc-trunk/mpc/src  -I../../gcc-trunk/gcc/../libdecnumber 
-I../../gcc-trunk/gcc/../libdecnumber/bid -I../libdecnumber 
-I../../gcc-trunk/gcc/../libbacktrace -I/home/ed/gnu/gcc-build-x/./isl/include 
-I/home/ed/gnu/gcc-trunk/isl/include  -o gtype-desc.o -MT gtype-desc.o -MMD -MP 
-MF ./.deps/gtype-desc.TPo gtype-desc.cc
/tmp/ccB94xhL.s: Assembler messages:
/tmp/ccB94xhL.s:563836: Error: can't resolve .text.unlikely - .LM4229
/tmp/ccB94xhL.s:563841: Error: can't resolve .text - .LM4230
/tmp/ccB94xhL.s:564103: Error: can't resolve .text.unlikely - .LM4282
/tmp/ccB94xhL.s:564108: Error: can't resolve .text - .LM4283
/tmp/ccB94xhL.s:564115: Error: can't resolve .text.unlikely - .LM4284
make[2]: *** [Makefile:1194: gtype-desc.o] Error 1

I took the original g++ command, and replace "-c" with "-S" and
"-o gtype-desc.o" with "-o /proc/self/fd/1" and add "-wrapper gdb,--args":

$ g++ -m32 -gno-as-loc-support  -fno-PIE -g -O2 -DIN_GCC 
-DCROSS_DIRECTORY_STRUCTURE -fno-exceptions -fno-rtti 
-fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings 
-Wcast-qual -Wmissing-format-attribute -Wconditionally-supported 
-Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros 
-Wno-overlength-strings  -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../../gcc-trunk/gcc 
-I../../gcc-trunk/gcc/. -I../../gcc-trunk/gcc/../include  
-I../../gcc-trunk/gcc/../libcpp/include -I../../gcc-trunk/gcc/../libcody 
-I/home/ed/gnu/gcc-build-x/./gmp -I/home/ed/gnu/gcc-trunk/gmp 
-I/home/ed/gnu/gcc-build-x/./mpfr/src -I/home/ed/gnu/gcc-trunk/mpfr/src 
-I/home/ed/gnu/gcc-trunk/mpc/src  -I../../gcc-trunk/gcc/../libdecnumber 
-I../../gcc-trunk/gcc/../libdecnumber/bid -I../libdecnumber 
-I../../gcc-trunk/gcc/../libbacktrace -I/home/ed/gnu/gcc-build-x/./isl/include 
-I/home/ed/gnu/gcc-trunk/isl/include -MT gtype-desc.o -MMD -MP -MF 
./.deps/gtype-desc.TPo gtype-desc.cc -S -o /proc/self/fd/1 -wrapper gdb,--args
(gdb) b dwarf2out_set_ignored_loc
(gdb) display in_cold_section_p
(gdb) display first_function_block_is_cold
(gdb) r
The first breakpoint is uninteresting:
[...]
        .size   _Z22gt_pch_p_11eh_region_dPvS_PFvS_S_S_ES_, 
.-_Z22gt_pch_p_11eh_region_dPvS_PFvS_S_S_ES_
        .p2align 4
        .globl  _Z21gt_pch_p_10eh_catch_dPvS_PFvS_S_S_ES_
        .type   _Z21gt_pch_p_10eh_catch_dPvS_PFvS_S_S_ES_, @function
_Z21gt_pch_p_10eh_catch_dPvS_PFvS_S_S_ES_:
.LFB8506:
        .cfi_startproc

Breakpoint 1, dwarf2out_set_ignored_loc (line=12009, column=1, 
filename=0x391bd90 "gtype-desc.cc")
    at ../../gcc-trunk/gcc/dwarf2out.cc:28976
28976     dw_fde_ref fde = cfun->fde;
1: in_cold_section_p = false
2: first_function_block_is_cold = false
(gdb) 
The next breakpoint is where the problem starts:
(gdb) c
[...]
        .size   
_Z27hashtab_entry_note_pointersIN8hash_mapIP6gimplei21simple_hashmap_traitsI19default_hash_traitsIS2_EiEE10hash_entryEEvPvS9_PFvS9_S9_S9_ES9_,
 
.-_Z27hashtab_entry_note_pointersIN8hash_mapIP6gimplei21simple_hashmap_traitsI19default_hash_traitsIS2_EiEE10hash_entryEEvPvS9_PFvS9_S9_S9_ES9_
        .section        .text.unlikely
.LCOLDB30:
        .text
.LHOTB30:
        .p2align 4
        .globl  
_Z49gt_pch_p_38function_summary_ipcp_transformation__PvS_PFvS_S_S_ES_
        .type   
_Z49gt_pch_p_38function_summary_ipcp_transformation__PvS_PFvS_S_S_ES_, @function
_Z49gt_pch_p_38function_summary_ipcp_transformation__PvS_PFvS_S_S_ES_:
.LFB8556:
        .cfi_startproc

Breakpoint 1, dwarf2out_set_ignored_loc (line=12341, column=1, 
filename=0x391bd90 "gtype-desc.cc")
    at ../../gcc-trunk/gcc/dwarf2out.cc:28976
28976     dw_fde_ref fde = cfun->fde;
1: in_cold_section_p = false
2: first_function_block_is_cold = false
(gdb) c
Continuing.
.LM4229:
        subl    $12, %esp
        .cfi_def_cfa_offset 16
        movl    20(%esp), %eax
        cmpl    %eax, 16(%esp)
        je      .L1179
        addl    $12, %esp
        .cfi_def_cfa_offset 4
        ret
        .cfi_endproc
        .section        .text.unlikely
        .cfi_startproc

Breakpoint 1, dwarf2out_set_ignored_loc (line=12341, column=1, 
filename=0x391bd90 "gtype-desc.cc")
    at ../../gcc-trunk/gcc/dwarf2out.cc:28976
28976     dw_fde_ref fde = cfun->fde;
1: in_cold_section_p = true
2: first_function_block_is_cold = false
(gdb) 
Remember, the .LM4229 was the first one complained about,


The nice thing, is I can repeat that to the point immediately before the error:
(gdb) r
[...]
(gdb) c
[...]
        .size   
_Z27hashtab_entry_note_pointersIN8hash_mapIP6gimplei21simple_hashmap_traitsI19default_hash_traitsIS2_EiEE10hash_entryEEvPvS9_PFvS9_S9_S9_ES9_,
 
.-_Z27hashtab_entry_note_pointersIN8hash_mapIP6gimplei21simple_hashmap_traitsI19default_hash_traitsIS2_EiEE10hash_entryEEvPvS9_PFvS9_S9_S9_ES9_
        .section        .text.unlikely
.LCOLDB30:
        .text
.LHOTB30:
        .p2align 4
        .globl  
_Z49gt_pch_p_38function_summary_ipcp_transformation__PvS_PFvS_S_S_ES_
        .type   
_Z49gt_pch_p_38function_summary_ipcp_transformation__PvS_PFvS_S_S_ES_, @function
_Z49gt_pch_p_38function_summary_ipcp_transformation__PvS_PFvS_S_S_ES_:
.LFB8556:
        .cfi_startproc

Breakpoint 1, dwarf2out_set_ignored_loc (line=12341, column=1, 
filename=0x391bd90 "gtype-desc.cc")
    at ../../gcc-trunk/gcc/dwarf2out.cc:28976
28976     dw_fde_ref fde = cfun->fde;
28976     dw_fde_ref fde = cfun->fde;
1: in_cold_section_p = false
2: first_function_block_is_cold = false
(gdb) n
28978     fde->ignored_debug = false;
1: in_cold_section_p = false
2: first_function_block_is_cold = false
(gdb) n
28979     set_cur_line_info_table (function_section (fde->decl));
1: in_cold_section_p = false
2: first_function_block_is_cold = false
(gdb) n
28981     dwarf2out_source_line (line, column, filename, 0, true);
1: in_cold_section_p = false
2: first_function_block_is_cold = false
(gdb) b set_cur_line_info_table
Breakpoint 2 at 0xf25700: file ../../gcc-trunk/gcc/dwarf2out.cc, line 28594.
(gdb) c
Continuing.
.LM4229:
        subl    $12, %esp
        .cfi_def_cfa_offset 16
        movl    20(%esp), %eax
        cmpl    %eax, 16(%esp)
        je      .L1179
        addl    $12, %esp
        .cfi_def_cfa_offset 4
        ret
        .cfi_endproc
        .section        .text.unlikely
        .cfi_startproc

Breakpoint 2, set_cur_line_info_table (sec=sec@entry=0x7ffff3e643a0) at 
../../gcc-trunk/gcc/dwarf2out.cc:28594
28594     if (sec == text_section)
1: in_cold_section_p = true
2: first_function_block_is_cold = false
Here, you see in_cold_section_p is truth.
(gdb) bt
#0  set_cur_line_info_table (sec=sec@entry=0x7ffff3e643a0) at 
../../gcc-trunk/gcc/dwarf2out.cc:28594
#1  0x0000000000f3fa3d in dwarf2out_switch_text_section () at 
../../gcc-trunk/gcc/dwarf2out.cc:1339
#2  0x0000000000fd9297 in final_scan_insn_1 (insn=0x7fffed8a1e70, 
file=0x38ee590, seen=0x7fffffffd06c, nopeepholes=0, 
    optimize_p=2) at ../../gcc-trunk/gcc/final.cc:2182
#3  0x0000000000fda26c in final_scan_insn (insn=insn@entry=0x7fffed8a1e70, 
file=file@entry=0x38ee590, 
    optimize_p=optimize_p@entry=2, nopeepholes=nopeepholes@entry=0, 
seen=<optimized out>, seen@entry=0x7fffffffd06c)
    at ../../gcc-trunk/gcc/final.cc:2886
#4  0x0000000000fda493 in final_1 (first=0x7fffed8a18c0, file=0x38ee590, 
seen=<optimized out>, optimize_p=2)
    at ../../gcc-trunk/gcc/final.cc:1977
#5  0x0000000000fdaf80 in rest_of_handle_final () at 
../../gcc-trunk/gcc/final.cc:4239
#6  (anonymous namespace)::pass_final::execute (this=<optimized out>) at 
../../gcc-trunk/gcc/final.cc:4317
#7  0x00000000012cef3f in execute_one_pass (pass=pass@entry=0x38e95c0) at 
../../gcc-trunk/gcc/passes.cc:2647
#8  0x00000000012cf870 in execute_pass_list_1 (pass=0x38e95c0) at 
../../gcc-trunk/gcc/passes.cc:2756
#9  0x00000000012cf882 in execute_pass_list_1 (pass=0x38e9010) at 
../../gcc-trunk/gcc/passes.cc:2757
#10 0x00000000012cf882 in execute_pass_list_1 (pass=0x38e7130) at 
../../gcc-trunk/gcc/passes.cc:2757
#11 0x00000000012cf8a9 in execute_pass_list (fn=0x7fffed8b4b40, pass=<optimized 
out>)
    at ../../gcc-trunk/gcc/passes.cc:2767
#12 0x0000000000ecb9d7 in cgraph_node::expand (this=0x7fffee381ee0) at 
../../gcc-trunk/gcc/cgraphunit.cc:1845
#13 cgraph_node::expand (this=0x7fffee381ee0) at 
../../gcc-trunk/gcc/cgraphunit.cc:1798
#14 0x0000000000ecd7fb in expand_all_functions () at 
../../gcc-trunk/gcc/cgraphunit.cc:2028
#15 symbol_table::compile (this=0x7ffff77e5000) at 
../../gcc-trunk/gcc/cgraphunit.cc:2404
#16 0x0000000000ecfeb8 in symbol_table::compile (this=0x7ffff77e5000) at 
../../gcc-trunk/gcc/cgraphunit.cc:2315
#17 symbol_table::finalize_compilation_unit (this=0x7ffff77e5000) at 
../../gcc-trunk/gcc/cgraphunit.cc:2589
#18 0x00000000013fe602 in compile_file () at ../../gcc-trunk/gcc/toplev.cc:478
#19 0x0000000000a9bf90 in do_compile () at ../../gcc-trunk/gcc/toplev.cc:2209
#20 toplev::main (this=this@entry=0x7fffffffd34e, argc=<optimized out>, 
argc@entry=88, argv=<optimized out>, 
    argv@entry=0x7fffffffd478) at ../../gcc-trunk/gcc/toplev.cc:2369
#21 0x0000000000a9d7ee in main (argc=88, argv=0x7fffffffd478) at 
../../gcc-trunk/gcc/main.cc:39
(gdb) c
Continuing.

Breakpoint 1, dwarf2out_set_ignored_loc (line=12341, column=1, 
filename=0x391bd90 "gtype-desc.cc")
    at ../../gcc-trunk/gcc/dwarf2out.cc:28976
28976     dw_fde_ref fde = cfun->fde;
1: in_cold_section_p = true
2: first_function_block_is_cold = false
(gdb) bt
#0  dwarf2out_set_ignored_loc (line=12341, column=1, filename=0x391bd90 
"gtype-desc.cc")
    at ../../gcc-trunk/gcc/dwarf2out.cc:28976
#1  0x0000000000fd9f30 in final_scan_insn_1 (insn=0x7fffed8a1e70, 
file=0x38ee590, seen=0x7fffffffd06c, nopeepholes=0, 
    optimize_p=2) at ../../gcc-trunk/gcc/final.cc:2191
#2  0x0000000000fda26c in final_scan_insn (insn=insn@entry=0x7fffed8a1e70, 
file=file@entry=0x38ee590, 
    optimize_p=optimize_p@entry=2, nopeepholes=nopeepholes@entry=0, 
seen=<optimized out>, seen@entry=0x7fffffffd06c)
    at ../../gcc-trunk/gcc/final.cc:2886
#3  0x0000000000fda493 in final_1 (first=0x7fffed8a18c0, file=0x38ee590, 
seen=<optimized out>, optimize_p=2)
    at ../../gcc-trunk/gcc/final.cc:1977
#4  0x0000000000fdaf80 in rest_of_handle_final () at 
../../gcc-trunk/gcc/final.cc:4239
#5  (anonymous namespace)::pass_final::execute (this=<optimized out>) at 
../../gcc-trunk/gcc/final.cc:4317
#6  0x00000000012cef3f in execute_one_pass (pass=pass@entry=0x38e95c0) at 
../../gcc-trunk/gcc/passes.cc:2647
#7  0x00000000012cf870 in execute_pass_list_1 (pass=0x38e95c0) at 
../../gcc-trunk/gcc/passes.cc:2756
#8  0x00000000012cf882 in execute_pass_list_1 (pass=0x38e9010) at 
../../gcc-trunk/gcc/passes.cc:2757
#9  0x00000000012cf882 in execute_pass_list_1 (pass=0x38e7130) at 
../../gcc-trunk/gcc/passes.cc:2757
#10 0x00000000012cf8a9 in execute_pass_list (fn=0x7fffed8b4b40, pass=<optimized 
out>)
    at ../../gcc-trunk/gcc/passes.cc:2767
#11 0x0000000000ecb9d7 in cgraph_node::expand (this=0x7fffee381ee0) at 
../../gcc-trunk/gcc/cgraphunit.cc:1845
#12 cgraph_node::expand (this=0x7fffee381ee0) at 
../../gcc-trunk/gcc/cgraphunit.cc:1798
#13 0x0000000000ecd7fb in expand_all_functions () at 
../../gcc-trunk/gcc/cgraphunit.cc:2028
#14 symbol_table::compile (this=0x7ffff77e5000) at 
../../gcc-trunk/gcc/cgraphunit.cc:2404
#15 0x0000000000ecfeb8 in symbol_table::compile (this=0x7ffff77e5000) at 
../../gcc-trunk/gcc/cgraphunit.cc:2315
#16 symbol_table::finalize_compilation_unit (this=0x7ffff77e5000) at 
../../gcc-trunk/gcc/cgraphunit.cc:2589
#17 0x00000000013fe602 in compile_file () at ../../gcc-trunk/gcc/toplev.cc:478
#18 0x0000000000a9bf90 in do_compile () at ../../gcc-trunk/gcc/toplev.cc:2209
#19 toplev::main (this=this@entry=0x7fffffffd34e, argc=<optimized out>, 
argc@entry=88, argv=<optimized out>, 
    argv@entry=0x7fffffffd478) at ../../gcc-trunk/gcc/toplev.cc:2369
#20 0x0000000000a9d7ee in main (argc=88, argv=0x7fffffffd478) at 
../../gcc-trunk/gcc/main.cc:39

now since dwarf2out_set_ignored_loc() uses function_section()
and function section() uses first_function_block_is_cold which is false
this is now the wrong table, but there is no output of any assembler
code in between those two calls of set_cur_line_info_table()
however the function dwarf2out_switch_text_section() uses 
current_function_section () which uses in_cold_section_p, and only here
they disagree, but I think current_function_section() is more appropriate for
determining the section where the code is currently being output to,
while function_section() is telling you in which section the function entry
point will be output to.  Since lables are usually outout together with code,
the change I've propsed seems right.


WDYT?

Thanks
Bernd.

Reply via email to