[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.
This commit is contained in:
parent
13de15c9c4
commit
e235fcb582
@ -202,3 +202,11 @@ endif()
|
|||||||
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc.in
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc.in
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc @ONLY)
|
${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)
|
||||||
|
23
bolt/include/bolt/Core/TargetConfig.def.in
Normal file
23
bolt/include/bolt/Core/TargetConfig.def.in
Normal file
@ -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
|
@ -1,5 +1,5 @@
|
|||||||
set(LLVM_LINK_COMPONENTS
|
set(LLVM_LINK_COMPONENTS
|
||||||
${LLVM_TARGETS_TO_BUILD}
|
${BOLT_TARGETS_TO_BUILD}
|
||||||
MC
|
MC
|
||||||
Object
|
Object
|
||||||
Support
|
Support
|
||||||
|
@ -88,13 +88,15 @@ int main(int argc, char **argv) {
|
|||||||
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
|
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
|
||||||
|
|
||||||
// Initialize targets and assembly printers/parsers.
|
// Initialize targets and assembly printers/parsers.
|
||||||
llvm::InitializeAllTargetInfos();
|
#define BOLT_TARGET(target) \
|
||||||
llvm::InitializeAllTargetMCs();
|
LLVMInitialize##target##TargetInfo(); \
|
||||||
llvm::InitializeAllAsmParsers();
|
LLVMInitialize##target##TargetMC(); \
|
||||||
llvm::InitializeAllDisassemblers();
|
LLVMInitialize##target##AsmParser(); \
|
||||||
|
LLVMInitialize##target##Disassembler(); \
|
||||||
|
LLVMInitialize##target##Target(); \
|
||||||
|
LLVMInitialize##target##AsmPrinter();
|
||||||
|
|
||||||
llvm::InitializeAllTargets();
|
#include "bolt/Core/TargetConfig.def"
|
||||||
llvm::InitializeAllAsmPrinters();
|
|
||||||
|
|
||||||
ParseCommandLine(argc, argv);
|
ParseCommandLine(argc, argv);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
set(LLVM_LINK_COMPONENTS
|
set(LLVM_LINK_COMPONENTS
|
||||||
${LLVM_TARGETS_TO_BUILD}
|
${BOLT_TARGETS_TO_BUILD}
|
||||||
MC
|
MC
|
||||||
Object
|
Object
|
||||||
Support
|
Support
|
||||||
|
@ -183,13 +183,15 @@ int main(int argc, char **argv) {
|
|||||||
std::string ToolPath = llvm::sys::fs::getMainExecutable(argv[0], nullptr);
|
std::string ToolPath = llvm::sys::fs::getMainExecutable(argv[0], nullptr);
|
||||||
|
|
||||||
// Initialize targets and assembly printers/parsers.
|
// Initialize targets and assembly printers/parsers.
|
||||||
llvm::InitializeAllTargetInfos();
|
#define BOLT_TARGET(target) \
|
||||||
llvm::InitializeAllTargetMCs();
|
LLVMInitialize##target##TargetInfo(); \
|
||||||
llvm::InitializeAllAsmParsers();
|
LLVMInitialize##target##TargetMC(); \
|
||||||
llvm::InitializeAllDisassemblers();
|
LLVMInitialize##target##AsmParser(); \
|
||||||
|
LLVMInitialize##target##Disassembler(); \
|
||||||
|
LLVMInitialize##target##Target(); \
|
||||||
|
LLVMInitialize##target##AsmPrinter();
|
||||||
|
|
||||||
llvm::InitializeAllTargets();
|
#include "bolt/Core/TargetConfig.def"
|
||||||
llvm::InitializeAllAsmPrinters();
|
|
||||||
|
|
||||||
ToolName = argv[0];
|
ToolName = argv[0];
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
set(LLVM_LINK_COMPONENTS
|
set(LLVM_LINK_COMPONENTS
|
||||||
${LLVM_TARGETS_TO_BUILD}
|
${BOLT_TARGETS_TO_BUILD}
|
||||||
MC
|
MC
|
||||||
Object
|
Object
|
||||||
Support
|
Support
|
||||||
|
@ -76,13 +76,15 @@ int main(int argc, char **argv) {
|
|||||||
opts::OutputFilename = "-";
|
opts::OutputFilename = "-";
|
||||||
|
|
||||||
// Initialize targets and assembly printers/parsers.
|
// Initialize targets and assembly printers/parsers.
|
||||||
llvm::InitializeAllTargetInfos();
|
#define BOLT_TARGET(target) \
|
||||||
llvm::InitializeAllTargetMCs();
|
LLVMInitialize##target##TargetInfo(); \
|
||||||
llvm::InitializeAllAsmParsers();
|
LLVMInitialize##target##TargetMC(); \
|
||||||
llvm::InitializeAllDisassemblers();
|
LLVMInitialize##target##AsmParser(); \
|
||||||
|
LLVMInitialize##target##Disassembler(); \
|
||||||
|
LLVMInitialize##target##Target(); \
|
||||||
|
LLVMInitialize##target##AsmPrinter();
|
||||||
|
|
||||||
llvm::InitializeAllTargets();
|
#include "bolt/Core/TargetConfig.def"
|
||||||
llvm::InitializeAllAsmPrinters();
|
|
||||||
|
|
||||||
ToolName = argv[0];
|
ToolName = argv[0];
|
||||||
std::string ToolPath = GetExecutablePath(argv[0]);
|
std::string ToolPath = GetExecutablePath(argv[0]);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
set(LLVM_LINK_COMPONENTS
|
set(LLVM_LINK_COMPONENTS
|
||||||
${LLVM_TARGETS_TO_BUILD}
|
${BOLT_TARGETS_TO_BUILD}
|
||||||
)
|
)
|
||||||
|
|
||||||
add_llvm_fuzzer(llvm-bolt-fuzzer
|
add_llvm_fuzzer(llvm-bolt-fuzzer
|
||||||
|
@ -58,13 +58,16 @@ extern "C" int LLVMFuzzerTestOneInput(const char *Data, size_t Size) {
|
|||||||
|
|
||||||
extern "C" LLVM_ATTRIBUTE_USED int LLVMFuzzerInitialize(int *argc,
|
extern "C" LLVM_ATTRIBUTE_USED int LLVMFuzzerInitialize(int *argc,
|
||||||
char ***argv) {
|
char ***argv) {
|
||||||
llvm::InitializeAllTargetInfos();
|
// Initialize targets and assembly printers/parsers.
|
||||||
llvm::InitializeAllTargetMCs();
|
#define BOLT_TARGET(target) \
|
||||||
llvm::InitializeAllAsmParsers();
|
LLVMInitialize##target##TargetInfo(); \
|
||||||
llvm::InitializeAllDisassemblers();
|
LLVMInitialize##target##TargetMC(); \
|
||||||
|
LLVMInitialize##target##AsmParser(); \
|
||||||
|
LLVMInitialize##target##Disassembler(); \
|
||||||
|
LLVMInitialize##target##Target(); \
|
||||||
|
LLVMInitialize##target##AsmPrinter();
|
||||||
|
|
||||||
llvm::InitializeAllTargets();
|
#include "bolt/Core/TargetConfig.def"
|
||||||
llvm::InitializeAllAsmPrinters();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -27,12 +27,15 @@ struct BinaryContextTester : public testing::TestWithParam<Triple::ArchType> {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initalizeLLVM() {
|
void initalizeLLVM() {
|
||||||
llvm::InitializeAllTargetInfos();
|
#define BOLT_TARGET(target) \
|
||||||
llvm::InitializeAllTargetMCs();
|
LLVMInitialize##target##TargetInfo(); \
|
||||||
llvm::InitializeAllAsmParsers();
|
LLVMInitialize##target##TargetMC(); \
|
||||||
llvm::InitializeAllDisassemblers();
|
LLVMInitialize##target##AsmParser(); \
|
||||||
llvm::InitializeAllTargets();
|
LLVMInitialize##target##Disassembler(); \
|
||||||
llvm::InitializeAllAsmPrinters();
|
LLVMInitialize##target##Target(); \
|
||||||
|
LLVMInitialize##target##AsmPrinter();
|
||||||
|
|
||||||
|
#include "bolt/Core/TargetConfig.def"
|
||||||
}
|
}
|
||||||
|
|
||||||
void prepareElf() {
|
void prepareElf() {
|
||||||
|
@ -2,7 +2,7 @@ set(LLVM_LINK_COMPONENTS
|
|||||||
DebugInfoDWARF
|
DebugInfoDWARF
|
||||||
Object
|
Object
|
||||||
MC
|
MC
|
||||||
${LLVM_TARGETS_TO_BUILD}
|
${BOLT_TARGETS_TO_BUILD}
|
||||||
)
|
)
|
||||||
|
|
||||||
add_bolt_unittest(CoreTests
|
add_bolt_unittest(CoreTests
|
||||||
|
@ -37,12 +37,15 @@ struct MCPlusBuilderTester : public testing::TestWithParam<Triple::ArchType> {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initalizeLLVM() {
|
void initalizeLLVM() {
|
||||||
llvm::InitializeAllTargetInfos();
|
#define BOLT_TARGET(target) \
|
||||||
llvm::InitializeAllTargetMCs();
|
LLVMInitialize##target##TargetInfo(); \
|
||||||
llvm::InitializeAllAsmParsers();
|
LLVMInitialize##target##TargetMC(); \
|
||||||
llvm::InitializeAllDisassemblers();
|
LLVMInitialize##target##AsmParser(); \
|
||||||
llvm::InitializeAllTargets();
|
LLVMInitialize##target##Disassembler(); \
|
||||||
llvm::InitializeAllAsmPrinters();
|
LLVMInitialize##target##Target(); \
|
||||||
|
LLVMInitialize##target##AsmPrinter();
|
||||||
|
|
||||||
|
#include "bolt/Core/TargetConfig.def"
|
||||||
}
|
}
|
||||||
|
|
||||||
void prepareElf() {
|
void prepareElf() {
|
||||||
|
@ -38,12 +38,15 @@ struct MemoryMapsTester : public testing::TestWithParam<Triple::ArchType> {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initalizeLLVM() {
|
void initalizeLLVM() {
|
||||||
llvm::InitializeAllTargetInfos();
|
#define BOLT_TARGET(target) \
|
||||||
llvm::InitializeAllTargetMCs();
|
LLVMInitialize##target##TargetInfo(); \
|
||||||
llvm::InitializeAllAsmParsers();
|
LLVMInitialize##target##TargetMC(); \
|
||||||
llvm::InitializeAllDisassemblers();
|
LLVMInitialize##target##AsmParser(); \
|
||||||
llvm::InitializeAllTargets();
|
LLVMInitialize##target##Disassembler(); \
|
||||||
llvm::InitializeAllAsmPrinters();
|
LLVMInitialize##target##Target(); \
|
||||||
|
LLVMInitialize##target##AsmPrinter();
|
||||||
|
|
||||||
|
#include "bolt/Core/TargetConfig.def"
|
||||||
}
|
}
|
||||||
|
|
||||||
void prepareElf() {
|
void prepareElf() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user