https://bugs.kde.org/show_bug.cgi?id=338252

--- Comment #14 from Дилян Палаузов <dilyan.palau...@aegee.org> ---
Autoconf users willing to compile everything with LTO just by calling
./configure put in /usr/local/etc/config.site:

CFLAGS="-O3 -fno-fat-lto-objects -flto" CXXFLAGS="-O3 -fno-fat-lto-objects
-flto" LDFLAGS="-Wl,-O1,-s -flto=4"

And then any ./configure implies LTO.  Just as other programs relying on
autoconf doing the right thing do not offer --enable-lto option in ./configure
--help, can be compiled with LTO, valgrind./configure --help shall not print
--enable-lto.  Programmer printing on --help "--enable-lto" don't understand
autoconf.  This applies also for artificially added -g or -O2 from configure.ac
or contained in Makefile*

ar, nm and ld from binutils can work with LTO, if they are compiled with plugin
support binutils-gdb.git/configure --enable-plugins).

When gcc calls ld, it passes the plugin path after -plugin, see.
https://sourceware.org/binutils/docs/ld/Options.html#Options (-plugin with one
dash).  Please note, that gcc's "make install" will not install the LTO plugins
on the place, where nm will look from it, if it thinks that plugins are needed.
 See https://sourceware.org/binutils/docs/binutils/nm.html -> --plugins .

If `nm --plugin`, `ar --plugin`, `ranlib --plugin` or `ld -plugin` (with one
dash) print 'Unknown option', then they are not compiled correctly.  The right
output of the above commands is "missing argument".  The approach for using LTO
is to compile ar/ld with plugin support, rather than using gcc-ld/gcc-ar.

When CFLAGS from config.site contains -flto, then valgrind can assume that
ar/nm/ld are compiled with plugin support.

LTO is more than -flto, there is also -fno-fat-lto-objects, and Clang has its
own LTO-world.

All that said, what is needed for LTO support is stripping the LTO flags when
building  coregrind/m_libcsetjmp.c, coregrind/m_main.c and 
VEX/auxprogs/genoffsets.c, assuming that the system is configured correctly
with the LTO plugins and ar/ld supporting plugins, or find out why LTO makes
problems with those files.

Compling everything with LTO produces:
In file included from m_syswrap/syswrap-main.c:46:
m_syswrap/syswrap-main.c: In function ‘putSyscallStatusIntoGuestState’:
m_syswrap/syswrap-main.c:1135:14: error: ‘OFFSET_amd64_RAX’ undeclared (first
use in this function)
              OFFSET_amd64_RAX, sizeof(UWord) );
              ^~~~~~~~~~~~~~~~

The diff between VEX/auxprogs/genoffsets.s generated from
VEX/auxprogs/genoffsets.c with and without LTO is:

--- VEX/auxprogs/genoffsets.s-2 2018-03-12 14:33:05.473476269 +0100
+++ ../valgrind/VEX/auxprogs/genoffsets.s-2     2018-03-12 14:33:14.025483351
+0100
@@ -1,1023 +1,26 @@
        .file   "genoffsets.c"
-       .text
-.Ltext0:
-       .globl  foo
-       .type   foo, @function
-foo:
-.LFB17:
-       .file 1 "./auxprogs/genoffsets.c"
-       .loc 1 84 1 view -0
-       .cfi_startproc
-       .loc 1 86 4 view .LVU1
-#APP
-# 86 "./auxprogs/genoffsets.c" 1
-       
-#define OFFSET_x86_EAX xyzzy$8
-
-# 0 "" 2
-       .loc 1 87 4 view .LVU2
-# 87 "./auxprogs/genoffsets.c" 1
-       
-#define OFFSET_x86_EBX xyzzy$20
-
-# 0 "" 2
(- and other OFFSET_ symbols removed)

To generate VEX/pub/libvex_guest_offsets.h this "gcc -O -S -o
auxprogs/genoffsets.s ./auxprogs/genoffsets.c" is called, and OFFSET_amd64_RAX
is in the output if -flto was not passed on this line.

This change resolves the mentioned problem with OFFSET_amd64_RAX:

diff --git a/Makefile.vex.am b/Makefile.vex.am
index 4ad5ffa..f36708c 100644
--- a/Makefile.vex.am
+++ b/Makefile.vex.am
@@ -63,9 +63,9 @@ BUILT_SOURCES = pub/libvex_guest_offsets.h
 CLEANFILES    = pub/libvex_guest_offsets.h

 if COMPILER_IS_CLANG
-CFLAGS_FOR_GENOFFSETS = $(CFLAGS) -no-integrated-as
+CFLAGS_FOR_GENOFFSETS = -no-integrated-as
 else
-CFLAGS_FOR_GENOFFSETS = $(CFLAGS)
+CFLAGS_FOR_GENOFFSETS =
 endif

 # This is very uggerly.  Need to sed out both "xyzzyN" and

Now I get:
make[3]: Entering directory '/git/valgrind/memcheck'
  GEN      memcheck-amd64-linux
m_translate.c: In function ‘vgPlain_translate’:
m_translate.c:1527:39: warning: ‘isWrap’ may be used uninitialized in this
function [-Wmaybe-uninitialized]
m_translate.c:1518:12: note: ‘isWrap’ was declared here
m_signals.c:2024: error: undefined reference to 'VG_MINIMAL_LONGJMP'
m_signals.c:2024: error: undefined reference to 'VG_MINIMAL_LONGJMP'
m_signals.c:2024: error: undefined reference to 'VG_MINIMAL_LONGJMP'
m_signals.c:2024: error: undefined reference to 'VG_MINIMAL_LONGJMP'
m_gdbserver/server.c:1175: error: undefined reference to 'VG_MINIMAL_SETJMP'
m_gdbserver/server.c:1193: error: undefined reference to 'VG_MINIMAL_SETJMP'
m_debuginfo/readdwarf3.c:5231: error: undefined reference to
'VG_MINIMAL_SETJMP'
m_scheduler/scheduler.c:1005: error: undefined reference to 'VG_MINIMAL_SETJMP'


Without -flto: 
nm  coregrind/libcoregrind_amd64_linux_a-m_libcsetjmp.o
0000000000000052 T VG_MINIMAL_LONGJMP
0000000000000000 T VG_MINIMAL_SETJMP
with lto:
nm coregrind/libcoregrind_amd64_linux_a-m_libcsetjmp.o
(nothing)

so the asm in coreconf/m_libcsetjmp.c shall be tweeked, in a way that on LTO
VG_MINIMAL_LONGJMP and VG_MINIMAL_SETJMP are not optimized out.  I don't speak
assembler.

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to