From e235fcb582eec5f58c905b66f96d0732d17b875e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 18 Feb 2025 09:17:51 +0100 Subject: [PATCH] [BOLT] Only link and initialize supported targets (#127509) Bolt currently links and initializes all LLVM targets. This substantially increases the binary size, and link time if LTO is used. Instead, only link the targets specified by BOLT_TARGETS_TO_BUILD. We also have to only initialize those targets, so generate a TargetConfig.def file with the necessary information. The way the initialization is done mirrors what llvm-exegesis does. This reduces llvm-bolt size from 137MB to 78MB for me. --- bolt/CMakeLists.txt | 8 +++++++ bolt/include/bolt/Core/TargetConfig.def.in | 23 +++++++++++++++++++ bolt/tools/binary-analysis/CMakeLists.txt | 2 +- .../tools/binary-analysis/binary-analysis.cpp | 14 ++++++----- bolt/tools/driver/CMakeLists.txt | 2 +- bolt/tools/driver/llvm-bolt.cpp | 14 ++++++----- bolt/tools/heatmap/CMakeLists.txt | 2 +- bolt/tools/heatmap/heatmap.cpp | 14 ++++++----- bolt/tools/llvm-bolt-fuzzer/CMakeLists.txt | 2 +- .../llvm-bolt-fuzzer/llvm-bolt-fuzzer.cpp | 15 +++++++----- bolt/unittests/Core/BinaryContext.cpp | 15 +++++++----- bolt/unittests/Core/CMakeLists.txt | 2 +- bolt/unittests/Core/MCPlusBuilder.cpp | 15 +++++++----- bolt/unittests/Core/MemoryMaps.cpp | 15 +++++++----- 14 files changed, 96 insertions(+), 47 deletions(-) create mode 100644 bolt/include/bolt/Core/TargetConfig.def.in diff --git a/bolt/CMakeLists.txt b/bolt/CMakeLists.txt index 04db160b64b0..f5ffa8122706 100644 --- a/bolt/CMakeLists.txt +++ b/bolt/CMakeLists.txt @@ -202,3 +202,11 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc.in ${CMAKE_CURRENT_BINARY_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc @ONLY) + +set(BOLT_ENUM_TARGETS "") +foreach(t ${BOLT_TARGETS_TO_BUILD}) + set(BOLT_ENUM_TARGETS "${BOLT_ENUM_TARGETS}BOLT_TARGET(${t})\n") +endforeach(t) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/bolt/Core/TargetConfig.def.in + ${CMAKE_CURRENT_BINARY_DIR}/include/bolt/Core/TargetConfig.def @ONLY) diff --git a/bolt/include/bolt/Core/TargetConfig.def.in b/bolt/include/bolt/Core/TargetConfig.def.in new file mode 100644 index 000000000000..a52ebd92b56f --- /dev/null +++ b/bolt/include/bolt/Core/TargetConfig.def.in @@ -0,0 +1,23 @@ +//===-- TargetConfig.def.in - Information about available targets ---------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is configured by the build system to define the available bolt +// targets. +// +// The variant of this file not ending with .in has been autogenerated by the +// LLVM build. Do not edit! +// +//===----------------------------------------------------------------------===// + +#ifndef BOLT_TARGET +# error Please define the macro BOLT_TARGET(TargetName) +#endif + +@BOLT_ENUM_TARGETS@ + +#undef BOLT_TARGET diff --git a/bolt/tools/binary-analysis/CMakeLists.txt b/bolt/tools/binary-analysis/CMakeLists.txt index 841fc5b37118..29f224e0f66f 100644 --- a/bolt/tools/binary-analysis/CMakeLists.txt +++ b/bolt/tools/binary-analysis/CMakeLists.txt @@ -1,5 +1,5 @@ set(LLVM_LINK_COMPONENTS - ${LLVM_TARGETS_TO_BUILD} + ${BOLT_TARGETS_TO_BUILD} MC Object Support diff --git a/bolt/tools/binary-analysis/binary-analysis.cpp b/bolt/tools/binary-analysis/binary-analysis.cpp index b03fee3e025a..0e3584eeedd1 100644 --- a/bolt/tools/binary-analysis/binary-analysis.cpp +++ b/bolt/tools/binary-analysis/binary-analysis.cpp @@ -88,13 +88,15 @@ int main(int argc, char **argv) { llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. // Initialize targets and assembly printers/parsers. - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllDisassemblers(); +#define BOLT_TARGET(target) \ + LLVMInitialize##target##TargetInfo(); \ + LLVMInitialize##target##TargetMC(); \ + LLVMInitialize##target##AsmParser(); \ + LLVMInitialize##target##Disassembler(); \ + LLVMInitialize##target##Target(); \ + LLVMInitialize##target##AsmPrinter(); - llvm::InitializeAllTargets(); - llvm::InitializeAllAsmPrinters(); +#include "bolt/Core/TargetConfig.def" ParseCommandLine(argc, argv); diff --git a/bolt/tools/driver/CMakeLists.txt b/bolt/tools/driver/CMakeLists.txt index 9bf9ff85edc7..4b3c7416de97 100644 --- a/bolt/tools/driver/CMakeLists.txt +++ b/bolt/tools/driver/CMakeLists.txt @@ -1,5 +1,5 @@ set(LLVM_LINK_COMPONENTS - ${LLVM_TARGETS_TO_BUILD} + ${BOLT_TARGETS_TO_BUILD} MC Object Support diff --git a/bolt/tools/driver/llvm-bolt.cpp b/bolt/tools/driver/llvm-bolt.cpp index f151cf5f63fc..6b6714723fa3 100644 --- a/bolt/tools/driver/llvm-bolt.cpp +++ b/bolt/tools/driver/llvm-bolt.cpp @@ -183,13 +183,15 @@ int main(int argc, char **argv) { std::string ToolPath = llvm::sys::fs::getMainExecutable(argv[0], nullptr); // Initialize targets and assembly printers/parsers. - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllDisassemblers(); +#define BOLT_TARGET(target) \ + LLVMInitialize##target##TargetInfo(); \ + LLVMInitialize##target##TargetMC(); \ + LLVMInitialize##target##AsmParser(); \ + LLVMInitialize##target##Disassembler(); \ + LLVMInitialize##target##Target(); \ + LLVMInitialize##target##AsmPrinter(); - llvm::InitializeAllTargets(); - llvm::InitializeAllAsmPrinters(); +#include "bolt/Core/TargetConfig.def" ToolName = argv[0]; diff --git a/bolt/tools/heatmap/CMakeLists.txt b/bolt/tools/heatmap/CMakeLists.txt index acddc7a50e8b..c5d3f6741392 100644 --- a/bolt/tools/heatmap/CMakeLists.txt +++ b/bolt/tools/heatmap/CMakeLists.txt @@ -1,5 +1,5 @@ set(LLVM_LINK_COMPONENTS - ${LLVM_TARGETS_TO_BUILD} + ${BOLT_TARGETS_TO_BUILD} MC Object Support diff --git a/bolt/tools/heatmap/heatmap.cpp b/bolt/tools/heatmap/heatmap.cpp index 3bb9f2ce7491..6add36cc6715 100644 --- a/bolt/tools/heatmap/heatmap.cpp +++ b/bolt/tools/heatmap/heatmap.cpp @@ -76,13 +76,15 @@ int main(int argc, char **argv) { opts::OutputFilename = "-"; // Initialize targets and assembly printers/parsers. - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllDisassemblers(); +#define BOLT_TARGET(target) \ + LLVMInitialize##target##TargetInfo(); \ + LLVMInitialize##target##TargetMC(); \ + LLVMInitialize##target##AsmParser(); \ + LLVMInitialize##target##Disassembler(); \ + LLVMInitialize##target##Target(); \ + LLVMInitialize##target##AsmPrinter(); - llvm::InitializeAllTargets(); - llvm::InitializeAllAsmPrinters(); +#include "bolt/Core/TargetConfig.def" ToolName = argv[0]; std::string ToolPath = GetExecutablePath(argv[0]); diff --git a/bolt/tools/llvm-bolt-fuzzer/CMakeLists.txt b/bolt/tools/llvm-bolt-fuzzer/CMakeLists.txt index f21285f634ba..7eaacb74a9da 100644 --- a/bolt/tools/llvm-bolt-fuzzer/CMakeLists.txt +++ b/bolt/tools/llvm-bolt-fuzzer/CMakeLists.txt @@ -1,5 +1,5 @@ set(LLVM_LINK_COMPONENTS - ${LLVM_TARGETS_TO_BUILD} + ${BOLT_TARGETS_TO_BUILD} ) add_llvm_fuzzer(llvm-bolt-fuzzer diff --git a/bolt/tools/llvm-bolt-fuzzer/llvm-bolt-fuzzer.cpp b/bolt/tools/llvm-bolt-fuzzer/llvm-bolt-fuzzer.cpp index bdb5768a91da..09049788aebe 100644 --- a/bolt/tools/llvm-bolt-fuzzer/llvm-bolt-fuzzer.cpp +++ b/bolt/tools/llvm-bolt-fuzzer/llvm-bolt-fuzzer.cpp @@ -58,13 +58,16 @@ extern "C" int LLVMFuzzerTestOneInput(const char *Data, size_t Size) { extern "C" LLVM_ATTRIBUTE_USED int LLVMFuzzerInitialize(int *argc, char ***argv) { - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllDisassemblers(); + // Initialize targets and assembly printers/parsers. +#define BOLT_TARGET(target) \ + LLVMInitialize##target##TargetInfo(); \ + LLVMInitialize##target##TargetMC(); \ + LLVMInitialize##target##AsmParser(); \ + LLVMInitialize##target##Disassembler(); \ + LLVMInitialize##target##Target(); \ + LLVMInitialize##target##AsmPrinter(); - llvm::InitializeAllTargets(); - llvm::InitializeAllAsmPrinters(); +#include "bolt/Core/TargetConfig.def" return 0; } diff --git a/bolt/unittests/Core/BinaryContext.cpp b/bolt/unittests/Core/BinaryContext.cpp index 0fefa1b83c3c..09d16966334d 100644 --- a/bolt/unittests/Core/BinaryContext.cpp +++ b/bolt/unittests/Core/BinaryContext.cpp @@ -27,12 +27,15 @@ struct BinaryContextTester : public testing::TestWithParam { protected: void initalizeLLVM() { - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllDisassemblers(); - llvm::InitializeAllTargets(); - llvm::InitializeAllAsmPrinters(); +#define BOLT_TARGET(target) \ + LLVMInitialize##target##TargetInfo(); \ + LLVMInitialize##target##TargetMC(); \ + LLVMInitialize##target##AsmParser(); \ + LLVMInitialize##target##Disassembler(); \ + LLVMInitialize##target##Target(); \ + LLVMInitialize##target##AsmPrinter(); + +#include "bolt/Core/TargetConfig.def" } void prepareElf() { diff --git a/bolt/unittests/Core/CMakeLists.txt b/bolt/unittests/Core/CMakeLists.txt index 208cf6ced735..8ac88b701ea0 100644 --- a/bolt/unittests/Core/CMakeLists.txt +++ b/bolt/unittests/Core/CMakeLists.txt @@ -2,7 +2,7 @@ set(LLVM_LINK_COMPONENTS DebugInfoDWARF Object MC - ${LLVM_TARGETS_TO_BUILD} + ${BOLT_TARGETS_TO_BUILD} ) add_bolt_unittest(CoreTests diff --git a/bolt/unittests/Core/MCPlusBuilder.cpp b/bolt/unittests/Core/MCPlusBuilder.cpp index 5488cae36628..d367eb07f776 100644 --- a/bolt/unittests/Core/MCPlusBuilder.cpp +++ b/bolt/unittests/Core/MCPlusBuilder.cpp @@ -37,12 +37,15 @@ struct MCPlusBuilderTester : public testing::TestWithParam { protected: void initalizeLLVM() { - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllDisassemblers(); - llvm::InitializeAllTargets(); - llvm::InitializeAllAsmPrinters(); +#define BOLT_TARGET(target) \ + LLVMInitialize##target##TargetInfo(); \ + LLVMInitialize##target##TargetMC(); \ + LLVMInitialize##target##AsmParser(); \ + LLVMInitialize##target##Disassembler(); \ + LLVMInitialize##target##Target(); \ + LLVMInitialize##target##AsmPrinter(); + +#include "bolt/Core/TargetConfig.def" } void prepareElf() { diff --git a/bolt/unittests/Core/MemoryMaps.cpp b/bolt/unittests/Core/MemoryMaps.cpp index 06073d0a82e1..2e1bc4d280ae 100644 --- a/bolt/unittests/Core/MemoryMaps.cpp +++ b/bolt/unittests/Core/MemoryMaps.cpp @@ -38,12 +38,15 @@ struct MemoryMapsTester : public testing::TestWithParam { protected: void initalizeLLVM() { - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllDisassemblers(); - llvm::InitializeAllTargets(); - llvm::InitializeAllAsmPrinters(); +#define BOLT_TARGET(target) \ + LLVMInitialize##target##TargetInfo(); \ + LLVMInitialize##target##TargetMC(); \ + LLVMInitialize##target##AsmParser(); \ + LLVMInitialize##target##Disassembler(); \ + LLVMInitialize##target##Target(); \ + LLVMInitialize##target##AsmPrinter(); + +#include "bolt/Core/TargetConfig.def" } void prepareElf() {