aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2018-03-08 20:35:20 -0600
committerEric Sandeen <sandeen@redhat.com>2018-03-08 20:35:20 -0600
commite61f1552aae4819194ad603222eedef4b08710a2 (patch)
treee485b289b77d405f9b8ebe1bc9350bf681838f57
parent1b0adc71229ba8611b06abc2bffa03babba5157d (diff)
downloadxfsprogs-dev-e61f1552aae4819194ad603222eedef4b08710a2.tar.gz
misc: enable link time optimization, if requested
Enable link time optimization (LTO) if the builder requests it. The extra link optimization results in smaller binaries. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
-rw-r--r--configure.ac12
-rwxr-xr-xdebian/rules4
-rw-r--r--include/builddefs.in9
-rw-r--r--m4/package_libcdev.m426
4 files changed, 49 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index b0d26016dd..686bf789bd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -90,6 +90,11 @@ AC_ARG_ENABLE(threadsan,
enable_threadsan=no)
AC_SUBST(enable_threadsan)
+AC_ARG_ENABLE(lto,
+[ --enable-lto=[yes/no] Enable link time optimization (LTO) [default=probe]],,
+ enable_lto=probe)
+AC_SUBST(enable_lto)
+
#
# If the user specified a libdir ending in lib64 do not append another
# 64 to the library names.
@@ -206,6 +211,13 @@ if test "$have_threadsan" = "yes" && test "$have_addrsan" = "yes"; then
AC_MSG_WARN([ADDRSAN and THREADSAN are not known to work together.])
fi
+if test "$enable_lto" = "yes" || test "$enable_lto" = "probe"; then
+ AC_PACKAGE_CHECK_LTO
+fi
+if test "$enable_lto" = "yes" && test "$have_lto" != "yes"; then
+ AC_MSG_ERROR([LTO not supported by compiler.])
+fi
+
AC_PACKAGE_CHECK_RETPOLINE
AC_CHECK_SIZEOF([long])
AC_CHECK_SIZEOF([char *])
diff --git a/debian/rules b/debian/rules
index 4cba165b70..cb4fa22c15 100755
--- a/debian/rules
+++ b/debian/rules
@@ -20,9 +20,9 @@ stdenv = @GZIP=-q; export GZIP;
options = export DEBUG=-DNDEBUG DISTRIBUTION=debian \
INSTALL_USER=root INSTALL_GROUP=root \
- LOCAL_CONFIGURE_OPTIONS="--enable-readline=yes --enable-blkid=yes --disable-ubsan --disable-addrsan --disable-threadsan" ;
+ LOCAL_CONFIGURE_OPTIONS="--enable-readline=yes --enable-blkid=yes --disable-ubsan --disable-addrsan --disable-threadsan --enable-lto" ;
diopts = $(options) \
- export OPTIMIZER=-Os LOCAL_CONFIGURE_OPTIONS="--enable-gettext=no --disable-ubsan --disable-addrsan --disable-threadsan" ;
+ export OPTIMIZER=-Os LOCAL_CONFIGURE_OPTIONS="--enable-gettext=no --disable-ubsan --disable-addrsan --disable-threadsan --enable-lto" ;
checkdir = test -f debian/rules
build: build-arch build-indep
diff --git a/include/builddefs.in b/include/builddefs.in
index fe05dc376c..7a2a626867 100644
--- a/include/builddefs.in
+++ b/include/builddefs.in
@@ -183,6 +183,15 @@ OPTIMIZER += @retpoline_cflags@
LOADERFLAGS += @retpoline_ldflags@
endif
+# Use special ar/ranlib wrappers if we have lto
+HAVE_LTO = @have_lto@
+ifeq ($(HAVE_LTO),yes)
+OPTIMIZER += @lto_cflags@
+LOADERFLAGS += @lto_ldflags@
+AR = @gcc_ar@
+RANLIB = @gcc_ranlib@
+endif
+
GCFLAGS = $(DEBUG) \
-DVERSION=\"$(PKG_VERSION)\" -DLOCALEDIR=\"$(PKG_LOCALE_DIR)\" \
-DPACKAGE=\"$(PKG_NAME)\" -I$(TOPDIR)/include -I$(TOPDIR)/libxfs
diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4
index 5a7baa1e53..0a6b514437 100644
--- a/m4/package_libcdev.m4
+++ b/m4/package_libcdev.m4
@@ -421,6 +421,32 @@ AC_DEFUN([AC_HAVE_HDIO_GETGEO],
AC_SUBST(have_hdio_getgeo)
])
+AC_DEFUN([AC_PACKAGE_CHECK_LTO],
+ [ AC_MSG_CHECKING([if C compiler supports LTO])
+ OLD_CFLAGS="$CFLAGS"
+ OLD_LDFLAGS="$LDFLAGS"
+ LTO_FLAGS="-flto -ffat-lto-objects"
+ CFLAGS="$CFLAGS $LTO_FLAGS"
+ LDFLAGS="$LDFLAGS $LTO_FLAGS"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
+ [AC_MSG_RESULT([yes])]
+ [lto_cflags=$LTO_FLAGS]
+ [lto_ldflags=$LTO_FLAGS]
+ [AC_PATH_PROG(gcc_ar, gcc-ar,,)]
+ [AC_PATH_PROG(gcc_ranlib, gcc-ranlib,,)],
+ [AC_MSG_RESULT([no])])
+ if test -x "$gcc_ar" && test -x "$gcc_ranlib"; then
+ have_lto=yes
+ fi
+ CFLAGS="${OLD_CFLAGS}"
+ LDFLAGS="${OLD_LDFLAGS}"
+ AC_SUBST(gcc_ar)
+ AC_SUBST(gcc_ranlib)
+ AC_SUBST(have_lto)
+ AC_SUBST(lto_cflags)
+ AC_SUBST(lto_ldflags)
+ ])
+
AC_DEFUN([AC_PACKAGE_CHECK_RETPOLINE],
[ AC_MSG_CHECKING([if C compiler supports retpoline])
OLD_CFLAGS="$CFLAGS"