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.