From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp48.i.mail.ru (smtp48.i.mail.ru [94.100.177.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id B57E9469710 for ; Mon, 25 May 2020 18:43:51 +0300 (MSK) Date: Mon, 25 May 2020 18:43:00 +0300 From: Sergey Bronnikov Message-ID: <20200525154300.GA41226@pony.bronevichok.ru> References: <20200312100549.31608-1-arkholga@tarantool.org> <20200414091803.GJ5713@tarantool.org> <20200525125827.GA20107@pony.bronevichok.ru> <10faaa66-3324-2931-0874-1edb26edb49f@tarantool.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <10faaa66-3324-2931-0874-1edb26edb49f@tarantool.org> Subject: Re: [Tarantool-patches] [PATCH] cmake: add LTO support for building luajit List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Olga Arkhangelskaia Cc: tarantool-patches@dev.tarantool.org I can confirm, formatting is fixed now. LGTM On 18:12 Mon 25 May , Olga Arkhangelskaia wrote: > New diff is below: > >              endif() > -                # XCode linker dynamically load libLTO.dylib to perform > -                # link-time optimization. > -                # > http://lists.llvm.org/pipermail/llvm-dev/2009-November/027103.html > +            # XCode linker dynamically load libLTO.dylib to perform > +            # link-time optimization. > +            # > http://lists.llvm.org/pipermail/llvm-dev/2009-November/027103.html >              if (NOT TARGET_OS_DARWIN) >                  # llvm-ar is just a wrapper over ar to pass --plugin= > option, >                  # so that ar can understand LTO objects. > @@ -248,7 +248,7 @@ macro(luajit_build) >                  set (CMAKE_AR llvm-ar) >              endif() >          else() > -        # GNU opts to support lto > +            # GNU opts to support lto >              # Due to some problems (bugs, slow work, etc) we support LTO >              # only for 5.0+. The same is for binutils prior to 2.27 >              # See comments in scripts/Makefile.lto in scope of > @@ -256,7 +256,7 @@ macro(luajit_build) >              if (NOT ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 5.0 >                  AND NOT ${linker_version} VERSION_LESS 2.27) >                  set (luajit_cflags ${luajit_cflags} -flto > -fuse-linker-plugin -fno-fat-lto-objects) > -             endif() > +            endif() > > 25.05.2020 15:58, Sergey Bronnikov пишет: > > Olya, > > > > I have reviewed patch in a branch and below my comments. > > > > formatting issues still exist: > > > > + if (CMAKE_COMPILER_IS_CLANG) > > + if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.9) > > + set (luajit_cflags ${luajit_cflags} -flto=full) > > + else() > > + # ThinLTO that is both scalable and incremental > > + # due to parallel IPO, available since 3.9 and above. > > + # See http://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html > > + set (luajit_cflags ${luajit_cflags} -flto=thin) > > + endif() > > + # XCode linker dynamically load libLTO.dylib to perform > > + # link-time optimization. > > + # http://lists.llvm.org/pipermail/llvm-dev/2009-November/027103.html > > ^^^^^^^^^^^^^^^^^^^^^^^^ > > > > + if (NOT TARGET_OS_DARWIN) > > + # llvm-ar is just a wrapper over ar to pass --plugin= option, > > + # so that ar can understand LTO objects. > > + # See https://lists.llvm.org/pipermail/llvm-dev/2018-March/122018.html > > + set (CMAKE_AR llvm-ar) > > + endif() > > + else() > > + # GNU opts to support lto > > ^^^^^^^^^^^^^^^^^^^^^^ > > > > + # Due to some problems (bugs, slow work, etc) we support LTO > > + # only for 5.0+. The same is for binutils prior to 2.27 > > + # See comments in scripts/Makefile.lto in scope of > > > > > > + # the patch: https://patchwork.kernel.org/patch/10078207/ > > + if (NOT ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 5.0 > > + AND NOT ${linker_version} VERSION_LESS 2.27) > > + set (luajit_cflags ${luajit_cflags} -flto -fuse-linker-plugin -fno-fat-lto-objects) > > + endif() > > ^^^^^^^^^^^^^^^^^^^^^^ > > + # gcc-ar is just a wrapper over ar to pass --plugin option > > > > Unfortunatlely I have no minimal required version of binutils on my system > > and I tested patch with ld gold (cmake -DCMAKE_LINKER=/usr/bin/ld.gold ..), > > as Timur Safin advised. > > > > How I tested: > > $ mkdir build; cd build > > $ make build_bundled_libs VERBOSE=1 2>&1 | tee log.txt > > > > with commands above output in log.txt doesn't contain LTO related options > > in compilation lines for luajit. > > > > gcc 8.3.1, clang 8.0.1, CentOS 8.1.1911 > > > > Sergey > > > > On 17:33 Tue 14 Apr , Olga Arkhangelskaia wrote: > > > Fixed tabs: > > > > > >  +            # Depending of compiler we need to set appropriate llvm/gcc-ar > > > lib > > >  +            # llvm/gcc -ar is just a wrapper over ar to pass --plugin= > > > option, > > >  +            # so that ar can understand LTO objects. > > > > > > 14.04.2020 12:18, Igor Munkin пишет: > > > > Olya, > > > > > > > > Thanks for the patch! I left several comments below, please consider > > > > them. > > > > > > > > On 12.03.20, Olga Arkhangelskaia wrote: > > > > > Tarantool has LTO support, however while building luajit this opt. was > > > > > omitted. Patch adds necessary flag to turn it on. > > > > > > > > > > Minimum compiler/linker versions: clang 3.4, gcc 5.0+, ld 2.27+. > > > > > > > > > > Closes #3743 > > > > > --- > > > > > Branch: OKriw/gh-3743-LuaJIT-does-not-use-LTO-with-DENABLE_LTO=ON-full-ci > > > > > cmake/lto.cmake | 3 ++- > > > > > cmake/luajit.cmake | 26 ++++++++++++++++++++++++++ > > > > > 2 files changed, 28 insertions(+), 1 deletion(-) > > > > > > > > > > diff --git a/cmake/lto.cmake b/cmake/lto.cmake > > > > > index 95ade75f4..9f29f3324 100644 > > > > > --- a/cmake/lto.cmake > > > > > +++ b/cmake/lto.cmake > > > > > @@ -78,7 +78,8 @@ if (NOT TARGET_OS_DARWIN) > > > > > if (linker_version VERSION_LESS "2.31") > > > > > message(FATAL_ERROR "ld.bfd >= 2.31 is needed for LTO") > > > > > endif() > > > > > - elseif(matched_gold) > > > > > + > > > > > + elseif(matched_gold) > > > > Typo: there is a mess with whitespace above. > > > > > > > > However this chunk provides no changes except whitespace and newline. > > > > Please drop it. > > > > > > > > > set(linker_version ${CMAKE_MATCH_1}) > > > > > message(STATUS "Found ld.gold version: ${linker_version}") > > > > > diff --git a/cmake/luajit.cmake b/cmake/luajit.cmake > > > > > index 072db8269..da1b4926d 100644 > > > > > --- a/cmake/luajit.cmake > > > > > +++ b/cmake/luajit.cmake > > > > > @@ -225,6 +225,32 @@ macro(luajit_build) > > > > > set(luajit_xcflags ${luajit_xcflags} -D${def}) > > > > > endforeach() > > > > > + # Add LTO option to luajit > > > > > + if (CMAKE_INTERPROCEDURAL_OPTIMIZATION) > > > > > + message("Setting LTO flags for building luajit") > > > > > + # Clang opt to support LTO > > > > > + if (CMAKE_COMPILER_IS_CLANG AND > > > > > + NOT ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.4) > > > > So, if clang toolchain is used but version is less than 3.4, then gcc > > > > toolchain settings are used. It's either totally wrong or definitely > > > > need to be clarified with a corresponding comment. > > > > > > > > Also, AFAICS LTO support for toolchain is checked via CheckIPOSupported > > > > CMake module. So additional check here looks to be excess or also need > > > > to be clarified. > > > > > > > > > + if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.9) > > > > > + set(luajit_cflags ${luajit_cflags} -flto=full) > > > > > + else() > > > > > + set(luajit_cflags ${luajit_cflags} -flto=full) > > > > > + endif() > > > > I see no difference in the branches above. > > > > > > > > > + if (NOT TARGET_OS_DARWIN) > > > > > + # Depending of compiler we need to set appropriate llvm/gcc-ar lib > > > > > + set (CMAKE_AR llvm-ar) > > > > What ar is used on systems different from Darwin based ones when clang > > > > toolchain is used? > > > > > > > > > + endif() > > > > > + # GNU opts to support lto > > > > > + else() > > > > > + #Due to some problems (bugs, slow work, etc) we support LTO only for 5.0+ > > > > > + #The same is for binutils prior 2.27 > > > > > + if (NOT ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 5.0 > > > > > + AND NOT ${linker_version} VERSION_LESS 2.27) > > > > > + set(luajit_cflags ${luajit_cflags} -flto -fuse-linker-plugin -fno-fat-lto-objects) > > > > > + endif() > > > > > + set (CMAKE_AR gcc-ar) > > > > Could you please clarify why ar is set explicitly here? > > > > > > > > > + endif() > > > > > + endif() > > > > Typo: there is a mess with indent above. Unfortunately I failed to find > > > > our CMake style guide, so please adjust your changes considering the > > > > code nearby. > > > > > > > > > # Pass the same toolchain that is used for building of > > > > > # tarantool itself, because tools from different toolchains > > > > > # can be incompatible. A compiler and a linker are already set > > > > > -- > > > > > 2.20.1 (Apple Git-117) > > > > > -- sergeyb@