Skip to content

Commit 71b1915

Browse files
mrexodiakyle-elliott-tob
authored andcommitted
Add REMILL_FETCH_SLEIGH option to allow find_package(sleigh)
1 parent 7055a0c commit 71b1915

21 files changed

Lines changed: 154 additions & 47 deletions

.github/workflows/build.yml

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ jobs:
5858

5959
- name: Build dependencies
6060
run: |
61-
cmake -G Ninja -S dependencies -B dependencies/build -DUSE_EXTERNAL_LLVM=ON "-DCMAKE_PREFIX_PATH:PATH=$LLVM_PREFIX"
61+
cmake -G Ninja -S dependencies -B dependencies/build \
62+
-DUSE_EXTERNAL_LLVM=ON \
63+
-DENABLE_SLEIGH=ON \
64+
"-DCMAKE_PREFIX_PATH:PATH=$LLVM_PREFIX"
6265
cmake --build dependencies/build
6366
6467
- name: Python venv for tests
@@ -69,7 +72,10 @@ jobs:
6972
- name: Build remill
7073
run: |
7174
. .venv/bin/activate
72-
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH:PATH=$PWD/dependencies/install" "-DCMAKE_INSTALL_PREFIX=$PWD/install"
75+
cmake -G Ninja -B build \
76+
-DREMILL_FETCH_SLEIGH=OFF \
77+
"-DCMAKE_PREFIX_PATH:PATH=$PWD/dependencies/install" \
78+
"-DCMAKE_INSTALL_PREFIX=$PWD/install"
7379
cmake --build build
7480
7581
- name: Install remill
@@ -147,7 +153,10 @@ jobs:
147153

148154
- name: Build dependencies
149155
run: |
150-
cmake -G Ninja -S dependencies -B dependencies/build -DUSE_EXTERNAL_LLVM=ON "-DCMAKE_PREFIX_PATH:PATH=$LLVM_PREFIX"
156+
cmake -G Ninja -S dependencies -B dependencies/build \
157+
-DUSE_EXTERNAL_LLVM=ON \
158+
-DENABLE_SLEIGH=ON \
159+
"-DCMAKE_PREFIX_PATH:PATH=$LLVM_PREFIX"
151160
cmake --build dependencies/build
152161
153162
- name: Python venv for tests
@@ -158,7 +167,10 @@ jobs:
158167
- name: Build remill
159168
run: |
160169
. .venv/bin/activate
161-
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH:PATH=$PWD/dependencies/install" "-DCMAKE_INSTALL_PREFIX=$PWD/install"
170+
cmake -G Ninja -B build \
171+
-DREMILL_FETCH_SLEIGH=OFF \
172+
"-DCMAKE_PREFIX_PATH:PATH=$PWD/dependencies/install" \
173+
"-DCMAKE_INSTALL_PREFIX=$PWD/install"
162174
cmake --build build
163175
164176
- name: Install remill

CMakeLists.txt

Lines changed: 53 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -88,29 +88,35 @@ find_package(glog CONFIG REQUIRED)
8888
set(GFLAGS_USE_TARGET_NAMESPACE ON)
8989
find_package(gflags CONFIG REQUIRED)
9090

91+
option(REMILL_FETCH_SLEIGH "Fetch and build sleigh as part of remill" ON)
92+
9193
# Sleigh
92-
file(GLOB sleigh_patches "${CMAKE_CURRENT_SOURCE_DIR}/patches/sleigh/*.patch")
93-
set(sleigh_ADDITIONAL_PATCHES "${sleigh_patches}" CACHE STRING "" FORCE)
94-
set(sleigh_ENABLE_TESTS OFF CACHE BOOL "" FORCE)
95-
set(sleigh_RELEASE_TYPE "HEAD" CACHE STRING "" FORCE)
96-
set(sleigh_BUILD_SUPPORT ON CACHE BOOL "" FORCE)
97-
set(sleigh_BUILD_SLEIGHSPECS ON CACHE BOOL "" FORCE)
98-
99-
# Verbose fetch content updates
100-
set(FETCHCONTENT_QUIET OFF)
101-
102-
# This version of sleigh (HEAD) pins Ghidra somewhere between Ghidra v10.2.3 and v10.3
103-
# https://github.com/lifting-bits/sleigh/blob/7c6b742/src/setup-ghidra-source.cmake#L55-L66
104-
FetchContent_Declare(sleigh
105-
GIT_REPOSITORY https://github.com/lifting-bits/sleigh.git
106-
GIT_TAG 7c6b742
107-
)
108-
FetchContent_MakeAvailable(sleigh)
94+
if(REMILL_FETCH_SLEIGH)
95+
file(GLOB sleigh_patches "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/sleigh_patches/*.patch")
96+
set(sleigh_ADDITIONAL_PATCHES "${sleigh_patches}" CACHE STRING "" FORCE)
97+
set(sleigh_ENABLE_TESTS OFF CACHE BOOL "" FORCE)
98+
set(sleigh_RELEASE_TYPE "HEAD" CACHE STRING "" FORCE)
99+
set(sleigh_BUILD_SUPPORT ON CACHE BOOL "" FORCE)
100+
set(sleigh_BUILD_SLEIGHSPECS ON CACHE BOOL "" FORCE)
101+
102+
# Verbose fetch content updates
103+
set(FETCHCONTENT_QUIET OFF)
104+
105+
# This version of sleigh (HEAD) pins Ghidra somewhere between Ghidra v10.2.3 and v10.3
106+
# https://github.com/lifting-bits/sleigh/blob/7c6b742/src/setup-ghidra-source.cmake#L55-L66
107+
FetchContent_Declare(sleigh
108+
GIT_REPOSITORY https://github.com/lifting-bits/sleigh.git
109+
GIT_TAG 7c6b742
110+
)
111+
FetchContent_MakeAvailable(sleigh)
109112

110-
# Get the Ghidra source directory from FetchContent's internal tracking
111-
FetchContent_GetProperties(GhidraSource)
112-
if(NOT ghidrasource_POPULATED)
113-
message(FATAL_ERROR "Expected sleigh to populate GhidraSource")
113+
# Get the Ghidra source directory from FetchContent's internal tracking
114+
FetchContent_GetProperties(GhidraSource)
115+
if(NOT ghidrasource_POPULATED)
116+
message(FATAL_ERROR "Expected sleigh to populate GhidraSource")
117+
endif()
118+
else()
119+
find_package(sleigh CONFIG REQUIRED COMPONENTS Support Specs)
114120
endif()
115121

116122
# For Linux builds, group LLVM libraries into a single group
@@ -219,22 +225,34 @@ target_compile_definitions(remill_settings INTERFACE
219225
"REMILL_BUILD_SEMANTICS_DIR_PPC64_32ADDR=\"${REMILL_BUILD_SEMANTICS_DIR_PPC64_32ADDR}\""
220226
)
221227

222-
if(SLEIGH_EXECUTABLE)
223-
set(sleigh_compiler "${SLEIGH_EXECUTABLE}")
224-
else()
225-
set(sleigh_compiler "$<TARGET_FILE:sleigh::sleigh>")
226-
endif()
228+
if(REMILL_FETCH_SLEIGH)
229+
if(SLEIGH_EXECUTABLE)
230+
set(sleigh_compiler "${SLEIGH_EXECUTABLE}")
231+
else()
232+
set(sleigh_compiler "$<TARGET_FILE:sleigh::sleigh>")
233+
endif()
227234

228-
sleigh_compile(
229-
TARGET ppc_e200_spec
230-
COMPILER "${sleigh_compiler}"
231-
SLASPEC "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.slaspec"
232-
LOG_FILE "${sleigh_BINARY_DIR}/sleighspecs/spec_build_logs/ppc_32_e200_be.sla.log"
233-
OUT_FILE "${sleigh_BINARY_DIR}/specfiles/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla"
234-
)
235+
sleigh_compile(
236+
TARGET ppc_e200_spec
237+
COMPILER "${sleigh_compiler}"
238+
SLASPEC "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.slaspec"
239+
LOG_FILE "${sleigh_BINARY_DIR}/sleighspecs/spec_build_logs/ppc_32_e200_be.sla.log"
240+
OUT_FILE "${sleigh_BINARY_DIR}/specfiles/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla"
241+
)
235242

236-
add_custom_target(sleigh_custom_specs)
237-
add_dependencies(sleigh_custom_specs ppc_e200_spec)
243+
add_custom_target(sleigh_custom_specs)
244+
add_dependencies(sleigh_custom_specs ppc_e200_spec)
245+
246+
if(REMILL_ENABLE_INSTALL_TARGET)
247+
install(FILES "${sleigh_BINARY_DIR}/specfiles/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla"
248+
DESTINATION "${CMAKE_INSTALL_DATADIR}/sleigh/specfiles/Ghidra/Processors/PowerPC/data/languages/")
249+
endif()
250+
else()
251+
if(NOT EXISTS "${sleigh_INSTALL_SPECDIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla")
252+
message(FATAL_ERROR "Installed sleigh spec not found: ${sleigh_INSTALL_SPECDIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla")
253+
endif()
254+
add_custom_target(sleigh_custom_specs)
255+
endif()
238256

239257
target_link_libraries(remill_settings INTERFACE
240258
${llvm_libs}
@@ -295,8 +313,6 @@ if(REMILL_ENABLE_INSTALL_TARGET)
295313
EXPORT remillTargets
296314
)
297315

298-
install(FILES "${sleigh_BINARY_DIR}/specfiles/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla" DESTINATION "${CMAKE_INSTALL_DATADIR}/sleigh/specfiles/Ghidra/Processors/PowerPC/data/languages/")
299-
300316
configure_file(
301317
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/remillConfig.cmake.in"
302318
"${CMAKE_CURRENT_BINARY_DIR}/remillConfig.cmake"

dependencies/CMakeLists.txt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ project(dependencies)
1111

1212
option(USE_EXTERNAL_LLVM "Do not compile LLVM as part of the superbuild, use an external one instead" OFF)
1313
option(USE_SANITIZERS "Use ASan and UBSan" OFF)
14+
option(ENABLE_SLEIGH "Build and install sleigh into the dependencies prefix" OFF)
1415

1516
if(USE_EXTERNAL_LLVM)
1617
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin" AND NOT CMAKE_PREFIX_PATH)
@@ -70,3 +71,33 @@ else()
7071
file(REMOVE "${LLVM_CONFIG}")
7172
include(llvm.cmake)
7273
endif()
74+
75+
if(ENABLE_SLEIGH)
76+
file(GLOB sleigh_patches LIST_DIRECTORIES FALSE
77+
"${CMAKE_CURRENT_LIST_DIR}/sleigh_patches/*.patch"
78+
)
79+
list(SORT sleigh_patches)
80+
81+
if(NOT sleigh_patches)
82+
message(FATAL_ERROR "ENABLE_SLEIGH did not find any patches in sleigh_patches")
83+
endif()
84+
85+
string(REPLACE ";" "\\;" sleigh_patches_arg "${sleigh_patches}")
86+
87+
simple_git(https://github.com/lifting-bits/sleigh 7c6b742
88+
"-Dsleigh_ADDITIONAL_PATCHES:STRING=${sleigh_patches_arg}"
89+
"-Dsleigh_ENABLE_TESTS:BOOL=OFF"
90+
"-Dsleigh_RELEASE_TYPE:STRING=HEAD"
91+
"-Dsleigh_BUILD_SUPPORT:BOOL=ON"
92+
"-Dsleigh_BUILD_SLEIGHSPECS:BOOL=ON"
93+
)
94+
95+
ExternalProject_Add_Step(sleigh ppc_e200_spec_install
96+
COMMAND
97+
"${CMAKE_COMMAND}"
98+
"-Dinstall_prefix:PATH=${CMAKE_INSTALL_PREFIX}"
99+
"-Dbinary_dir:PATH=<BINARY_DIR>"
100+
-P "${CMAKE_CURRENT_LIST_DIR}/build_ppc_e200_sla.cmake"
101+
DEPENDEES install
102+
)
103+
endif()

dependencies/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,15 @@ cmake --build build
1010
```
1111

1212
This will create a [CMake prefix](https://cmake.org/cmake/help/latest/command/find_package.html#search-procedure), which you pass to your project with `-DCMAKE_PREFIX_PATH:FILEPATH=/path/to/dependencies/install`. See [presentation.md](https://github.com/LLVMParty/packages/blob/main/presentation.md) and [dependencies.md](https://github.com/LLVMParty/packages/blob/main/dependencies.md) for more information.
13+
14+
## Optional sleigh install
15+
16+
To also build and install `sleigh` into the same prefix, enable `ENABLE_SLEIGH`.
17+
By default it uses Remill's local patch set from `./sleigh_patches`.
18+
19+
```sh
20+
cmake -B build -DCMAKE_BUILD_TYPE=Release -DENABLE_SLEIGH=ON
21+
cmake --build build
22+
```
23+
24+
For the Docker image, pass `--build-arg ENABLE_SLEIGH=ON` to build and install sleigh there as well.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
set(install_prefix "${install_prefix}")
2+
set(binary_dir "${binary_dir}")
3+
4+
set(spec_file
5+
"${binary_dir}/_deps/ghidrasource-src/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.slaspec")
6+
set(out_dir
7+
"${install_prefix}/share/sleigh/specfiles/Ghidra/Processors/PowerPC/data/languages")
8+
set(out_file "${out_dir}/ppc_32_e200_be.sla")
9+
set(log_dir "${binary_dir}/sleighspecs/spec_build_logs")
10+
set(log_file "${log_dir}/ppc_32_e200_be.sla.log")
11+
12+
if(NOT EXISTS "${spec_file}")
13+
message(FATAL_ERROR "Missing ppc_32_e200_be.slaspec: ${spec_file}")
14+
endif()
15+
16+
find_program(sleigh_compiler NAMES sleigh sleigh.exe
17+
PATHS "${install_prefix}/bin"
18+
NO_DEFAULT_PATH
19+
REQUIRED)
20+
21+
get_filename_component(spec_dir "${spec_file}" DIRECTORY)
22+
file(MAKE_DIRECTORY "${out_dir}")
23+
file(MAKE_DIRECTORY "${log_dir}")
24+
25+
execute_process(
26+
COMMAND "${sleigh_compiler}" "${spec_file}" "${out_file}"
27+
WORKING_DIRECTORY "${spec_dir}"
28+
RESULT_VARIABLE sleigh_result
29+
OUTPUT_FILE "${log_file}"
30+
ERROR_FILE "${log_file}"
31+
)
32+
33+
if(NOT sleigh_result EQUAL 0)
34+
message(FATAL_ERROR
35+
"Failed to compile ppc_32_e200_be.sla with ${sleigh_compiler}. See ${log_file}")
36+
endif()

patches/sleigh/0001-Fix-narrowing-conversion-warning.patch renamed to dependencies/sleigh_patches/0001-Fix-narrowing-conversion-warning.patch

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)