https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61577

--- Comment #41 from The Written Word <bugzilla-gcc at thewrittenword dot com> 
---
(In reply to The Written Word from comment #39)
> (In reply to EML from comment #25)
> > I have applied the patch and tried your other suggestions, still the stage1
> > compiler has the same problems generating executables.
> > 
> > In analyzing the intermediate files between working (gcc 4.93) and not
> > (bootstrap 8.3), the intermediate files seem similar until the "mach" stage
> > 
> > The problem seems to be in out the compiler decides to reference a string in
> > the source.
> > 
> > My program is:
> > 
> > #include <stdio.h>
> > 
> > int main()
> > {
> >         printf("Hellos World\n");
> >         return 0;
> > }
> > 
> > The generated .s file for Working does this:
> > 
> > .LC0:
> >         stringz "Hellos World"
> > 
> > <edited for breivity>
> > 
> >         addl r36 = @ltoffx(.LC0), r1
> >         ;;
> >         ld8.mov r36 = [r36], .LC0
> > 
> > The non-working .s file does this:
> > 
> > .LC0:
> >         stringz "Hellos World"
> > 
> > <edited for breivity>
> > 
> >         movl r36 = @gprel(.LC0)
> >         ;;
> >         add r36 = r1, r36
> > 
> > 
> > If I replace those 3 lines and run the assembler+linker by hand - the
> > non-working foo.s will run correctly
> 
> I can now duplicate what you're seeing:
> $ diff -u gcc-4.9.4/hello.s gcc-8.3.0/hello.s
> --- gcc-4.9.3/hello.s        2019-07-05 04:55:49 +0000
> +++ gcc-8.3.0/hello.s     2019-07-05 04:55:44 +0000
> @@ -1,5 +1,6 @@
>         .file   "hello.c"
>         .pred.safe_across_calls p1-p5,p16-p63
> +       .section        .text,  "ax",   "progbits"
>         .section        .rodata,        "a",    "progbits"
>         .align 8
>  .LC0:
> @@ -19,9 +20,9 @@
>         mov r32 = b0
>         mov r35 = r1
>         .body
> -       addl r36 = @ltoffx(.LC0), r1
> +       movl r36 = @gprel(.LC0)
>         ;;
> -       ld8.mov r36 = [r36], .LC0
> +       add r36 = r1, r36
>         br.call.sptk.many b0 = puts#
>         mov r1 = r35
>         mov r14 = r0
> 
> $ grep LTOFF <objdir>/gcc/config.status
> D["HAVE_AS_LTOFFX_LDXMOV_RELOCS"]=" 1"

If I revert the patch for PR60465 (added as an attachment), then looking at the
difference between gcc-4.9.4/hello.s and gcc-8.3.0/hello.s gives:
--- gcc-4.9.4/hello.s        2019-07-05 04:55:49 +0000
+++ gcc-8.3.0/hello.s     2019-07-05 11:25:09 +0000
@@ -1,5 +1,6 @@
        .file   "hello.c"
        .pred.safe_across_calls p1-p5,p16-p63
+       .section        .text,  "ax",   "progbits"
        .section        .rodata,        "a",    "progbits"
        .align 8
 .LC0:

Reverting the patch doesn't bring us any closer to the segfault in libstdc++-v3
though.

Reply via email to