On Tue, Oct 22, 2019 at 01:54:03PM +0200, Andrzej Ostruszka wrote: > This patch adds an option to enable link time optimization. In addition > to LTO option itself (-flto) fat-lto-objects are being used. This is > because during the build pmdinfogen scans the generated ELF objects to > find this_pmd_name* symbol in symbol table. Without fat-lto-objects gcc > produces ELF only with extra symbols for internal use during linking. > > Signed-off-by: Andrzej Ostruszka <aostrus...@marvell.com> > --- > .travis.yml | 7 ++++ > config/common_base | 5 +++ > config/meson.build | 13 +++++++ > doc/guides/prog_guide/lto.rst | 36 ++++++++++++++++++++ > doc/guides/rel_notes/release_19_11.rst | 8 +++++ > lib/librte_distributor/rte_distributor.c | 18 +++++----- > lib/librte_distributor/rte_distributor_v20.c | 18 +++++----- > lib/librte_lpm/rte_lpm.c | 28 +++++++-------- > lib/librte_lpm/rte_lpm6.c | 16 ++++----- > lib/librte_timer/rte_timer.c | 20 +++++------ > mk/toolchain/gcc/rte.toolchain-compat.mk | 4 +++ > mk/toolchain/gcc/rte.vars.mk | 12 +++++++ > mk/toolchain/icc/rte.vars.mk | 8 +++++ > 13 files changed, 143 insertions(+), 50 deletions(-) > create mode 100644 doc/guides/prog_guide/lto.rst > > diff --git a/.travis.yml b/.travis.yml > index 781f9f666..70d221852 100644 > --- a/.travis.yml > +++ b/.travis.yml > @@ -31,6 +31,7 @@ env: > - DEF_LIB="static" OPTS="-Denable_kmods=false" > - DEF_LIB="shared" OPTS="-Denable_kmods=false" > - DEF_LIB="shared" RUN_TESTS=1 BUILD_DOCS=1 > + - DEF_LIB="shared" OPTS="-Db_lto=true" > > matrix: > include: > @@ -100,6 +101,12 @@ matrix: > apt: > packages: > - *extra_packages > + - env: DEF_LIB="shared" OPTS="-Db_lto=true" EXTRA_PACKAGES=1 > + compiler: gcc > + addons: > + apt: > + packages: > + - *extra_packages > > > script: ./.ci/${TRAVIS_OS_NAME}-build.sh > diff --git a/config/common_base b/config/common_base > index 8ef75c203..73a55fdec 100644 > --- a/config/common_base > +++ b/config/common_base > @@ -49,6 +49,11 @@ CONFIG_RTE_FORCE_INTRINSICS=n > # > CONFIG_RTE_ARCH_STRICT_ALIGN=n > > +# > +# Enable link time optimization > +# > +CONFIG_RTE_ENABLE_LTO=n > + > # > # Compile to share library > # > diff --git a/config/meson.build b/config/meson.build > index 2bafea530..1a5093118 100644 > --- a/config/meson.build > +++ b/config/meson.build > @@ -196,3 +196,16 @@ add_project_arguments('-D_GNU_SOURCE', language: 'c') > if is_freebsd > add_project_arguments('-D__BSD_VISIBLE', language: 'c') > endif > + > +if get_option('b_lto') > + if cc.has_argument('-ffat-lto-objects') > + add_project_arguments('-ffat-lto-objects', language: 'c') > + else > + error('compiler does not support fat LTO objects - please turn > LTO off') > + endif > + # workaround for gcc bug 81440 > + if cc.get_id() == 'gcc' and cc.version().version_compare('<8.0') > + add_project_arguments('-Wno-lto-type-mismatch', language: 'c') > + add_project_link_arguments('-Wno-lto-type-mismatch', language: > 'c') > + endif > +endif
This LGTM > diff --git a/doc/guides/prog_guide/lto.rst b/doc/guides/prog_guide/lto.rst > new file mode 100644 > index 000000000..b6daabc86 > --- /dev/null <snip> > diff --git a/mk/toolchain/gcc/rte.toolchain-compat.mk > b/mk/toolchain/gcc/rte.toolchain-compat.mk > index ea40a11c0..ad4fad83c 100644 > --- a/mk/toolchain/gcc/rte.toolchain-compat.mk > +++ b/mk/toolchain/gcc/rte.toolchain-compat.mk > @@ -88,6 +88,10 @@ else > MACHINE_CFLAGS := $(filter-out -march% -mtune% > -msse%,$(MACHINE_CFLAGS)) > endif > > + ifeq ($(shell test $(GCC_VERSION) -lt 45 && echo 1), 1) > + CONFIG_RTE_ENABLE_LTO=n > + endif > + I don't think we support GCC versions that far back any more, but this is fairly harmless, so probably ok to keep. Acked-by: Bruce Richardson <bruce.richar...@intel.com>