This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/85994] New: Comparison failure in 64-bit libgcc *_{sav,res}ms64*.o on Solaris/x86
- From: "ro at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 30 May 2018 08:20:52 +0000
- Subject: [Bug target/85994] New: Comparison failure in 64-bit libgcc *_{sav,res}ms64*.o on Solaris/x86
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85994
Bug ID: 85994
Summary: Comparison failure in 64-bit libgcc *_{sav,res}ms64*.o
on Solaris/x86
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: ro at gcc dot gnu.org
CC: daniel.santos at pobox dot com, jakub at gcc dot gnu.org
Target Milestone: ---
Target: i?86-pc-solaris2.*, amd64-pc-solaris2.*
It has been brought to my attention that there are comparion failures in the
64-bit libgcc on Solaris/x86 when using gas:
i386-pc-solaris2.11/amd64/libgcc/avx_savms64f.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_resms64.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_resms64f_s.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_resms64fx.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_resms64fx_s.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_resms64fx.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_resms64.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_savms64f_s.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_savms64_s.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_savms64f.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_resms64x_s.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_savms64_s.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_resms64x.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_resms64x_s.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_savms64f_s.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_resms64x_s.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_savms64f_s.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_savms64.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_resms64f.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_resms64_s.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_resms64_s.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_resms64f.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_resms64f_s.o differs
i386-pc-solaris2.11/amd64/libgcc/sse_resms64fx_s.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_savms64.o differs
i386-pc-solaris2.11/amd64/libgcc/avx_resms64x.o differs
This happens both on the gcc-8 branch and on mainline.
It turns out that the objects already differ when running the exact same
compilation twice. With readelf --debug-dump, one sees that the difference
lies in two .debug_* sections where temp filenames are embedded in the output:
Contents of section .debug_line:
0000 4d000000 02002b00 00000101 fb0e0d00 M.....+.........
0010 01010101 00000001 0000012f 7661722f .........../var/
0020 746d702f 00006363 76395749 4e632e73 tmp/..ccv9WINc.s
0030 00010000 00000902 00000000 00000000 ................
0040 144c4c4c 4c4c4c4b 022f134b 02010001 .LLLLLLK./.K....
0050 01
Contents of section .debug_str:
0000 2f766172 2f746d70 2f2f6363 76395749 /var/tmp//ccv9WI
0010 4e632e73 002f7661 722f6763 632f7265 Nc.s./var/gcc/re
0020 67726573 73696f6e 2f747275 6e6b2f31 gression/trunk/1
0030 312e342d 6763632d 6761732f 6275696c 1.4-gcc-gas/buil
0040 642f6933 38362d70 632d736f 6c617269 d/i386-pc-solari
0050 73322e31 312f616d 6436342f 6c696267 s2.11/amd64/libg
0060 63630047 4e552041 5320322e 333000 cc.GNU AS 2.30.
This doesn't happen on Linux, though. I found that this is caused because on
Solaris, cpp is invoked with -P to work around an as limitation in early
Solaris 10 versions (cf. config/i386/sol2.h (CPP_SPEC); the comment is
misleading,
though: the limitation is only gone in patch 119961-03, released almost exactly
10 years ago).
With -P (and thus without the # <line> lines in the gas input), gas emits
The Directory Table (offset 0x1b):
1 /var/tmp/
The File Name Table (offset 0x26):
Entry Dir Time Size Name
1 1 0 0 cc3DRYva.s
while without -P, we get
The Directory Table (offset 0x1b):
1 /vol/gcc/src/hg/trunk/local/libgcc/config/i386
The File Name Table (offset 0x4b):
Entry Dir Time Size Name
1 1 0 0 resms64.h
I see several possible fixes:
* Just compile those files with -g0: there's probably no point in gas adding
debug info anyway.
* Restrict the cpp -P workaround to non-gas.
* Autoconf assembler # <line> support and only pass -P to cpp if really needed.
Suggestions?
Rainer