Skip to content

Commit e235fcb

Browse files
authored
[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.
1 parent 13de15c commit e235fcb

File tree

14 files changed

+99
-50
lines changed

14 files changed

+99
-50
lines changed

bolt/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,3 +202,11 @@ endif()
202202

203203
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc.in
204204
${CMAKE_CURRENT_BINARY_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc @ONLY)
205+
206+
set(BOLT_ENUM_TARGETS "")
207+
foreach(t ${BOLT_TARGETS_TO_BUILD})
208+
set(BOLT_ENUM_TARGETS "${BOLT_ENUM_TARGETS}BOLT_TARGET(${t})\n")
209+
endforeach(t)
210+
211+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/bolt/Core/TargetConfig.def.in
212+
${CMAKE_CURRENT_BINARY_DIR}/include/bolt/Core/TargetConfig.def @ONLY)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//===-- TargetConfig.def.in - Information about available targets ---------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file is configured by the build system to define the available bolt
10+
// targets.
11+
//
12+
// The variant of this file not ending with .in has been autogenerated by the
13+
// LLVM build. Do not edit!
14+
//
15+
//===----------------------------------------------------------------------===//
16+
17+
#ifndef BOLT_TARGET
18+
# error Please define the macro BOLT_TARGET(TargetName)
19+
#endif
20+
21+
@BOLT_ENUM_TARGETS@
22+
23+
#undef BOLT_TARGET

bolt/tools/binary-analysis/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set(LLVM_LINK_COMPONENTS
2-
${LLVM_TARGETS_TO_BUILD}
2+
${BOLT_TARGETS_TO_BUILD}
33
MC
44
Object
55
Support

bolt/tools/binary-analysis/binary-analysis.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,15 @@ int main(int argc, char **argv) {
8888
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
8989

9090
// Initialize targets and assembly printers/parsers.
91-
llvm::InitializeAllTargetInfos();
92-
llvm::InitializeAllTargetMCs();
93-
llvm::InitializeAllAsmParsers();
94-
llvm::InitializeAllDisassemblers();
95-
96-
llvm::InitializeAllTargets();
97-
llvm::InitializeAllAsmPrinters();
91+
#define BOLT_TARGET(target) \
92+
LLVMInitialize##target##TargetInfo(); \
93+
LLVMInitialize##target##TargetMC(); \
94+
LLVMInitialize##target##AsmParser(); \
95+
LLVMInitialize##target##Disassembler(); \
96+
LLVMInitialize##target##Target(); \
97+
LLVMInitialize##target##AsmPrinter();
98+
99+
#include "bolt/Core/TargetConfig.def"
98100

99101
ParseCommandLine(argc, argv);
100102

bolt/tools/driver/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set(LLVM_LINK_COMPONENTS
2-
${LLVM_TARGETS_TO_BUILD}
2+
${BOLT_TARGETS_TO_BUILD}
33
MC
44
Object
55
Support

bolt/tools/driver/llvm-bolt.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,13 +183,15 @@ int main(int argc, char **argv) {
183183
std::string ToolPath = llvm::sys::fs::getMainExecutable(argv[0], nullptr);
184184

185185
// Initialize targets and assembly printers/parsers.
186-
llvm::InitializeAllTargetInfos();
187-
llvm::InitializeAllTargetMCs();
188-
llvm::InitializeAllAsmParsers();
189-
llvm::InitializeAllDisassemblers();
190-
191-
llvm::InitializeAllTargets();
192-
llvm::InitializeAllAsmPrinters();
186+
#define BOLT_TARGET(target) \
187+
LLVMInitialize##target##TargetInfo(); \
188+
LLVMInitialize##target##TargetMC(); \
189+
LLVMInitialize##target##AsmParser(); \
190+
LLVMInitialize##target##Disassembler(); \
191+
LLVMInitialize##target##Target(); \
192+
LLVMInitialize##target##AsmPrinter();
193+
194+
#include "bolt/Core/TargetConfig.def"
193195

194196
ToolName = argv[0];
195197

bolt/tools/heatmap/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set(LLVM_LINK_COMPONENTS
2-
${LLVM_TARGETS_TO_BUILD}
2+
${BOLT_TARGETS_TO_BUILD}
33
MC
44
Object
55
Support

bolt/tools/heatmap/heatmap.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@ int main(int argc, char **argv) {
7676
opts::OutputFilename = "-";
7777

7878
// Initialize targets and assembly printers/parsers.
79-
llvm::InitializeAllTargetInfos();
80-
llvm::InitializeAllTargetMCs();
81-
llvm::InitializeAllAsmParsers();
82-
llvm::InitializeAllDisassemblers();
83-
84-
llvm::InitializeAllTargets();
85-
llvm::InitializeAllAsmPrinters();
79+
#define BOLT_TARGET(target) \
80+
LLVMInitialize##target##TargetInfo(); \
81+
LLVMInitialize##target##TargetMC(); \
82+
LLVMInitialize##target##AsmParser(); \
83+
LLVMInitialize##target##Disassembler(); \
84+
LLVMInitialize##target##Target(); \
85+
LLVMInitialize##target##AsmPrinter();
86+
87+
#include "bolt/Core/TargetConfig.def"
8688

8789
ToolName = argv[0];
8890
std::string ToolPath = GetExecutablePath(argv[0]);

bolt/tools/llvm-bolt-fuzzer/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set(LLVM_LINK_COMPONENTS
2-
${LLVM_TARGETS_TO_BUILD}
2+
${BOLT_TARGETS_TO_BUILD}
33
)
44

55
add_llvm_fuzzer(llvm-bolt-fuzzer

bolt/tools/llvm-bolt-fuzzer/llvm-bolt-fuzzer.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,16 @@ extern "C" int LLVMFuzzerTestOneInput(const char *Data, size_t Size) {
5858

5959
extern "C" LLVM_ATTRIBUTE_USED int LLVMFuzzerInitialize(int *argc,
6060
char ***argv) {
61-
llvm::InitializeAllTargetInfos();
62-
llvm::InitializeAllTargetMCs();
63-
llvm::InitializeAllAsmParsers();
64-
llvm::InitializeAllDisassemblers();
61+
// Initialize targets and assembly printers/parsers.
62+
#define BOLT_TARGET(target) \
63+
LLVMInitialize##target##TargetInfo(); \
64+
LLVMInitialize##target##TargetMC(); \
65+
LLVMInitialize##target##AsmParser(); \
66+
LLVMInitialize##target##Disassembler(); \
67+
LLVMInitialize##target##Target(); \
68+
LLVMInitialize##target##AsmPrinter();
6569

66-
llvm::InitializeAllTargets();
67-
llvm::InitializeAllAsmPrinters();
70+
#include "bolt/Core/TargetConfig.def"
6871

6972
return 0;
7073
}

0 commit comments

Comments
 (0)