[Tarantool-patches] [PATCH] cmake: add LTO support for building luajit

Sergey Bronnikov sergeyb at tarantool.org
Mon May 25 15:58:27 MSK 2020


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)
> > > 


More information about the Tarantool-patches mailing list