diff mbox series

Fix bootstap-errors due to enabling -gvariable-location-views

Message ID AS1PR01MB946587924CF9EFA4950ECBAFE48B2@AS1PR01MB9465.eurprd01.prod.exchangelabs.com
State New
Headers show
Series Fix bootstap-errors due to enabling -gvariable-location-views | expand

Commit Message

Bernd Edlinger Aug. 26, 2024, 3:46 a.m. UTC
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.

gcc/ChangeLog:

	PR debug/116470
	* configure.ac: Add the "nop" instruction for cpu type ft32.
	* configure: Regenerate.
	* dwarf2out.cc (dwarf2out_set_ignored_loc): Use the correct
	line info section.
---
 gcc/configure    | 2 +-
 gcc/configure.ac | 2 +-
 gcc/dwarf2out.cc | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

Comments

Richard Biener Aug. 26, 2024, 8:31 a.m. UTC | #1
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.

Richard.

> gcc/ChangeLog:
> 
> 	PR debug/116470
> 	* configure.ac: Add the "nop" instruction for cpu type ft32.
> 	* configure: Regenerate.
> 	* dwarf2out.cc (dwarf2out_set_ignored_loc): Use the correct
> 	line info section.
> ---
>  gcc/configure    | 2 +-
>  gcc/configure.ac | 2 +-
>  gcc/dwarf2out.cc | 2 +-
>  3 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/gcc/configure b/gcc/configure
> index 557ea5fa3ac..3d301b6ecd3 100755
> --- a/gcc/configure
> +++ b/gcc/configure
> @@ -31398,7 +31398,7 @@ esac
>  case "$cpu_type" in
>    aarch64 | alpha | arc | arm | avr | bfin | cris | csky | i386 | loongarch | m32c \
>    | m68k | microblaze | mips | nds32 | nios2 | pa | riscv | rs6000 | score | sparc \
> -  | visium | xstormy16 | xtensa)
> +  | visium | xstormy16 | xtensa | ft32)
>      insn="nop"
>      ;;
>    ia64 | s390)
> diff --git a/gcc/configure.ac b/gcc/configure.ac
> index eaa01d0d7e5..8a2d2b0438e 100644
> --- a/gcc/configure.ac
> +++ b/gcc/configure.ac
> @@ -5610,7 +5610,7 @@ esac
>  case "$cpu_type" in
>    aarch64 | alpha | arc | arm | avr | bfin | cris | csky | i386 | loongarch | m32c \
>    | m68k | microblaze | mips | nds32 | nios2 | pa | riscv | rs6000 | score | sparc \
> -  | visium | xstormy16 | xtensa)
> +  | visium | xstormy16 | xtensa | ft32)
>      insn="nop"
>      ;;
>    ia64 | s390)
> diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
> index a26a07e3424..1187d32352b 100644
> --- a/gcc/dwarf2out.cc
> +++ b/gcc/dwarf2out.cc
> @@ -28976,7 +28976,7 @@ dwarf2out_set_ignored_loc (unsigned int line, unsigned int column,
>    dw_fde_ref fde = cfun->fde;
>  
>    fde->ignored_debug = false;
> -  set_cur_line_info_table (function_section (fde->decl));
> +  set_cur_line_info_table (current_function_section ());
>  
>    dwarf2out_source_line (line, column, filename, 0, true);
>  }
>
Bernd Edlinger Aug. 26, 2024, 12:51 p.m. UTC | #2
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.
Richard Biener Aug. 26, 2024, 1:24 p.m. UTC | #3
On Mon, 26 Aug 2024, Bernd Edlinger wrote:

> 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.c
 c
> /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 -w
 rapper 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?

That was my conclusion as well, the strange difference between the APIs
remain.

Thus, OK.

Thanks,
Richard.
 
> Thanks
> Bernd.
>
diff mbox series

Patch

diff --git a/gcc/configure b/gcc/configure
index 557ea5fa3ac..3d301b6ecd3 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -31398,7 +31398,7 @@  esac
 case "$cpu_type" in
   aarch64 | alpha | arc | arm | avr | bfin | cris | csky | i386 | loongarch | m32c \
   | m68k | microblaze | mips | nds32 | nios2 | pa | riscv | rs6000 | score | sparc \
-  | visium | xstormy16 | xtensa)
+  | visium | xstormy16 | xtensa | ft32)
     insn="nop"
     ;;
   ia64 | s390)
diff --git a/gcc/configure.ac b/gcc/configure.ac
index eaa01d0d7e5..8a2d2b0438e 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -5610,7 +5610,7 @@  esac
 case "$cpu_type" in
   aarch64 | alpha | arc | arm | avr | bfin | cris | csky | i386 | loongarch | m32c \
   | m68k | microblaze | mips | nds32 | nios2 | pa | riscv | rs6000 | score | sparc \
-  | visium | xstormy16 | xtensa)
+  | visium | xstormy16 | xtensa | ft32)
     insn="nop"
     ;;
   ia64 | s390)
diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index a26a07e3424..1187d32352b 100644
--- a/gcc/dwarf2out.cc
+++ b/gcc/dwarf2out.cc
@@ -28976,7 +28976,7 @@  dwarf2out_set_ignored_loc (unsigned int line, unsigned int column,
   dw_fde_ref fde = cfun->fde;
 
   fde->ignored_debug = false;
-  set_cur_line_info_table (function_section (fde->decl));
+  set_cur_line_info_table (current_function_section ());
 
   dwarf2out_source_line (line, column, filename, 0, true);
 }