Currently, building DPDK with clang + LTO is unsupported, which is a showstopper for cross-language interprocedural optimizations. The root cause is that pmdinfogen expects to scan through the section headers of generated ELF object files, but clang's "-flto" flag generates LLVM bitcode instead. This patch enables LTO builds with clang, provided that the linker is set to lld.
The mechanism of action is clang's "-fembed-bitcode" flag, which acts similarly to gcc's "-ffat-lto-objects" - the compiler outputs a normal ELF object file that keeps pmdinfogen happy, but also embeds IR bitcode in a special section of the ELF that lld can then use to construct the final binary. Signed-off-by: Mahdi Rakhshandehroo <mahdi.rakhshandeh...@gmail.com> --- config/meson.build | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/config/meson.build b/config/meson.build index 7134e80..c109b38 100644 --- a/config/meson.build +++ b/config/meson.build @@ -406,16 +406,22 @@ if is_windows endif if get_option('b_lto') - if cc.has_argument('-ffat-lto-objects') + if cc.get_id() == 'gcc' and cc.has_argument('-ffat-lto-objects') add_project_arguments('-ffat-lto-objects', language: 'c') + + # workaround for gcc bug 81440 + if 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 + elif cc.get_id() == 'clang' and cc.has_argument('-fembed-bitcode') + if cc.get_linker_id() != 'ld.lld' + error('compiling with clang and LTO requires the lld linker') + add_project_arguments('-fno-lto', '-fembed-bitcode', language: 'c') + endif 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 if get_option('b_sanitize') == 'address' or get_option('b_sanitize') == 'address,undefined' -- 2.25.1