Skip to content

Commit c7a35f8

Browse files
pca006132RossComputerGuy
authored andcommitted
[BOLT] Enable standalone build
1 parent 0991bd7 commit c7a35f8

File tree

6 files changed

+215
-6
lines changed

6 files changed

+215
-6
lines changed

bolt/CMakeLists.txt

Lines changed: 145 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1+
cmake_minimum_required(VERSION 3.20.0)
2+
13
set(LLVM_SUBPROJECT_TITLE "BOLT")
24

3-
include(ExternalProject)
5+
if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
6+
set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
7+
endif()
8+
include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
9+
NO_POLICY_SCOPE)
10+
11+
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
12+
project(bolt)
13+
set(BOLT_BUILT_STANDALONE TRUE)
14+
endif()
415

516
set(BOLT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
617
set(BOLT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
@@ -9,6 +20,137 @@ set(CMAKE_CXX_STANDARD 17)
920
# Add path for custom modules.
1021
list(INSERT CMAKE_MODULE_PATH 0 "${BOLT_SOURCE_DIR}/cmake/modules")
1122

23+
# standalone build, copied from clang
24+
if(BOLT_BUILT_STANDALONE)
25+
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
26+
set(CMAKE_CXX_STANDARD_REQUIRED YES)
27+
set(CMAKE_CXX_EXTENSIONS NO)
28+
29+
if(NOT MSVC_IDE)
30+
set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
31+
CACHE BOOL "Enable assertions")
32+
# Assertions should follow llvm-config's.
33+
mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
34+
endif()
35+
36+
find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}")
37+
list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}")
38+
39+
# Turn into CACHE PATHs for overwritting
40+
41+
# We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets
42+
# LLVM_CONFIG.
43+
if (NOT LLVM_CONFIG_FOUND)
44+
# Pull values from LLVMConfig.cmake. We can drop this once the llvm-config
45+
# path is removed.
46+
set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS})
47+
set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}")
48+
# N.B. this is just a default value, the CACHE PATHs below can be overridden.
49+
set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm")
50+
else()
51+
set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}")
52+
endif()
53+
54+
set(LLVM_INCLUDE_DIRS ${INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed")
55+
set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree")
56+
set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree")
57+
58+
set(LLVM_TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin")
59+
set(LLVM_LIBRARY_DIR "${LLVM_LIBRARY_DIR}" CACHE PATH "Path to llvm/lib")
60+
61+
find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
62+
NO_DEFAULT_PATH)
63+
64+
# They are used as destination of target generators.
65+
set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
66+
set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
67+
if(WIN32 OR CYGWIN)
68+
# DLL platform -- put DLLs into bin.
69+
set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
70+
else()
71+
set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
72+
endif()
73+
74+
option(LLVM_INSTALL_TOOLCHAIN_ONLY
75+
"Only include toolchain files in the 'install' target." OFF)
76+
77+
option(LLVM_FORCE_USE_OLD_TOOLCHAIN
78+
"Set to ON to force using an old, unsupported host toolchain." OFF)
79+
option(CLANG_ENABLE_BOOTSTRAP "Generate the clang bootstrap target" OFF)
80+
option(LLVM_ENABLE_LIBXML2 "Use libxml2 if available." ON)
81+
82+
include(AddLLVM)
83+
include(TableGen)
84+
include(HandleLLVMOptions)
85+
include(CheckAtomic)
86+
include(GetErrcMessages)
87+
include(LLVMDistributionSupport)
88+
89+
if (NOT DEFINED LLVM_INCLUDE_TESTS)
90+
set(LLVM_INCLUDE_TESTS ON)
91+
endif()
92+
93+
include_directories(${LLVM_INCLUDE_DIRS})
94+
link_directories("${LLVM_LIBRARY_DIR}")
95+
96+
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
97+
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
98+
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
99+
100+
find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED
101+
COMPONENTS Interpreter)
102+
103+
if(LLVM_INCLUDE_TESTS)
104+
# Check prebuilt llvm/utils.
105+
if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX}
106+
AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/count${CMAKE_EXECUTABLE_SUFFIX}
107+
AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX})
108+
set(LLVM_UTILS_PROVIDED ON)
109+
endif()
110+
111+
# Seek installed Lit.
112+
find_program(LLVM_LIT
113+
NAMES llvm-lit lit.py lit
114+
PATHS "${LLVM_MAIN_SRC_DIR}/utils/lit"
115+
DOC "Path to lit.py")
116+
117+
if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
118+
# Note: path not really used, except for checking if lit was found
119+
if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/llvm-lit)
120+
add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit utils/llvm-lit)
121+
endif()
122+
if(NOT LLVM_UTILS_PROVIDED)
123+
add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck)
124+
add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/count utils/count)
125+
add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not)
126+
set(LLVM_UTILS_PROVIDED ON)
127+
set(CLANG_TEST_DEPS FileCheck count not)
128+
endif()
129+
endif()
130+
131+
if(LLVM_LIT)
132+
# Define the default arguments to use with 'lit', and an option for the user
133+
# to override.
134+
set(LIT_ARGS_DEFAULT "-sv")
135+
if (MSVC OR XCODE)
136+
set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
137+
endif()
138+
set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
139+
140+
get_errc_messages(LLVM_LIT_ERRC_MESSAGES)
141+
142+
# On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
143+
if( WIN32 AND NOT CYGWIN )
144+
set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
145+
endif()
146+
else()
147+
set(LLVM_INCLUDE_TESTS OFF)
148+
endif()
149+
150+
umbrella_lit_testsuite_begin(check-all)
151+
endif() # LLVM_INCLUDE_TESTS
152+
endif() # standalone
153+
12154
# Determine default set of targets to build -- the intersection of
13155
# those BOLT supports and those LLVM is targeting.
14156
set(BOLT_TARGETS_TO_BUILD_all "AArch64;X86;RISCV")
@@ -94,6 +236,8 @@ if (BOLT_ENABLE_RUNTIME)
94236
if(CMAKE_SYSROOT)
95237
list(APPEND extra_args -DCMAKE_SYSROOT=${CMAKE_SYSROOT})
96238
endif()
239+
240+
include(ExternalProject)
97241
ExternalProject_Add(bolt_rt
98242
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/runtime"
99243
STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-stamps

bolt/lib/Target/AArch64/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ set(LLVM_LINK_COMPONENTS
44
AArch64Desc
55
)
66

7+
if(BOLT_BUILT_STANDALONE)
8+
set(LLVM_TARGET_DEFINITIONS ${LLVM_MAIN_SRC_DIR}/lib/Target/AArch64/AArch64.td)
9+
list(APPEND LLVM_TABLEGEN_FLAGS -I ${LLVM_MAIN_SRC_DIR}/lib/Target/AArch64)
10+
tablegen(LLVM AArch64GenInstrInfo.inc -gen-instr-info)
11+
tablegen(LLVM AArch64GenRegisterInfo.inc -gen-register-info)
12+
tablegen(LLVM AArch64GenSystemOperands.inc -gen-searchable-tables)
13+
tablegen(LLVM AArch64GenSubtargetInfo.inc -gen-subtarget)
14+
15+
add_public_tablegen_target(AArch64CommonTableGen)
16+
include_directories(${CMAKE_CURRENT_BINARY_DIR})
17+
endif()
18+
719
add_llvm_library(LLVMBOLTTargetAArch64
820
AArch64MCPlusBuilder.cpp
921

bolt/lib/Target/RISCV/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@ set(LLVM_LINK_COMPONENTS
44
RISCVDesc
55
)
66

7+
if(BOLT_BUILT_STANDALONE)
8+
# tablegen, copied from llvm/lib/Target/RISCV/CMakeLists.txt
9+
set(LLVM_TARGET_DEFINITIONS ${LLVM_MAIN_SRC_DIR}/lib/Target/RISCV/RISCV.td)
10+
list(APPEND LLVM_TABLEGEN_FLAGS -I ${LLVM_MAIN_SRC_DIR}/lib/Target/RISCV)
11+
tablegen(LLVM RISCVGenInstrInfo.inc -gen-instr-info)
12+
tablegen(LLVM RISCVGenRegisterInfo.inc -gen-register-info)
13+
tablegen(LLVM RISCVGenSearchableTables.inc -gen-searchable-tables)
14+
tablegen(LLVM RISCVGenSubtargetInfo.inc -gen-subtarget)
15+
16+
add_public_tablegen_target(RISCVCommonTableGen)
17+
include_directories(${CMAKE_CURRENT_BINARY_DIR})
18+
endif()
19+
720
add_llvm_library(LLVMBOLTTargetRISCV
821
RISCVMCPlusBuilder.cpp
922

bolt/lib/Target/X86/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@ set(LLVM_LINK_COMPONENTS
55
X86Desc
66
)
77

8+
if(BOLT_BUILT_STANDALONE)
9+
set(LLVM_TARGET_DEFINITIONS ${LLVM_MAIN_SRC_DIR}/lib/Target/X86/X86.td)
10+
list(APPEND LLVM_TABLEGEN_FLAGS -I ${LLVM_MAIN_SRC_DIR}/lib/Target/X86)
11+
tablegen(LLVM X86GenInstrInfo.inc -gen-instr-info -instr-info-expand-mi-operand-info=0)
12+
tablegen(LLVM X86GenMnemonicTables.inc -gen-x86-mnemonic-tables -asmwriternum=1)
13+
tablegen(LLVM X86GenRegisterInfo.inc -gen-register-info)
14+
tablegen(LLVM X86GenSubtargetInfo.inc -gen-subtarget)
15+
16+
add_public_tablegen_target(X86CommonTableGen)
17+
include_directories(${CMAKE_CURRENT_BINARY_DIR})
18+
endif()
19+
820
add_llvm_library(LLVMBOLTTargetX86
921
X86MCPlusBuilder.cpp
1022
X86MCSymbolizer.cpp

bolt/lib/Utils/CMakeLists.txt

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,43 @@
1+
find_first_existing_vc_file("${LLVM_MAIN_SRC_DIR}" llvm_vc)
2+
find_first_existing_vc_file("${BOLT_SOURCE_DIR}" bolt_vc)
3+
4+
# The VC revision include that we want to generate.
5+
set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/VCSVersion.inc")
6+
7+
set(generate_vcs_version_script "${LLVM_CMAKE_DIR}/GenerateVersionFromVCS.cmake")
8+
9+
if(llvm_vc AND LLVM_APPEND_VC_REV)
10+
set(llvm_source_dir ${LLVM_MAIN_SRC_DIR})
11+
endif()
12+
13+
# Create custom target to generate the VC revision include.
14+
add_custom_command(OUTPUT "${version_inc}"
15+
DEPENDS "${llvm_vc}" "${bolt_vc}" "${generate_vcs_version_script}"
16+
COMMAND ${CMAKE_COMMAND} "-DNAMES=BOLT"
17+
"-DHEADER_FILE=${version_inc}"
18+
"-DBOLT_SOURCE_DIR=${BOLT_SOURCE_DIR}"
19+
"-DLLVM_VC_REPOSITORY=${llvm_vc_repository}"
20+
"-DLLVM_VC_REVISION=${llvm_vc_revision}"
21+
"-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
22+
"-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
23+
-P "${generate_vcs_version_script}")
24+
25+
# Mark the generated header as being generated.
26+
set_source_files_properties("${version_inc}"
27+
PROPERTIES GENERATED TRUE
28+
HEADER_FILE_ONLY TRUE)
29+
30+
include_directories(${CMAKE_CURRENT_BINARY_DIR})
31+
132
add_llvm_library(LLVMBOLTUtils
233
CommandLineOpts.cpp
334
Utils.cpp
4-
35+
${version_inc}
536
DISABLE_LLVM_LINK_LLVM_DYLIB
637

738
LINK_LIBS
839
${LLVM_PTHREAD_LIB}
940

10-
DEPENDS
11-
llvm_vcsrevision_h
12-
1341
LINK_COMPONENTS
1442
Support
1543
)

bolt/lib/Utils/CommandLineOpts.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "bolt/Utils/CommandLineOpts.h"
14-
#include "llvm/Support/VCSRevision.h"
14+
#include "VCSVersion.inc"
1515

1616
using namespace llvm;
1717

0 commit comments

Comments
 (0)