diff --git a/.github/llvm-trunk.env b/.github/llvm-trunk.env index 05a184c0..af76c08c 100644 --- a/.github/llvm-trunk.env +++ b/.github/llvm-trunk.env @@ -1,9 +1,10 @@ # Pinned upstream LLVM trunk commit that Morok is built against. # # Morok targets the New-PM plugin API at with -# LLVM_PLUGIN_API_VERSION 2 (introduced upstream by llvm/llvm-project#173279, -# commit f54df0d09e19, 2025-12-22). Any trunk commit at or after that works; this -# is plain upstream trunk, not a fork. +# LLVM_PLUGIN_API_VERSION 2 or 3. The plugin uses the API version declared by +# its build headers; clang/opt must use that same LLVM installation. Morok also +# uses trunk-only IR/pass APIs, so each updated pin must pass the full suite. +# This is plain upstream trunk, not a fork. # # We build LLVM from source (the LLVM.org prebuilt release toolchains cannot be # linked against on macOS — their libc++ has diverged from Apple's — and Morok @@ -11,4 +12,4 @@ # and then cached by SHA, so day-to-day runs are minutes. # # Bumped by .github/workflows/llvm-bump.yml as trunk advances. -LLVM_REF=cf08d4bc700245f85ce528f6c9f4d9a3fdd316a0 +LLVM_REF=201b446bf71c7c6d37a9bb195ed5e448c5231070 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66309937..5b93b8dc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,6 +118,8 @@ jobs: args=( -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo + -DMOROK_BUILD_PLUGIN=ON + -DMOROK_BUILD_TESTS=ON -DCMAKE_C_COMPILER="${{ steps.llvm.outputs.clang }}" -DCMAKE_CXX_COMPILER="${{ steps.llvm.outputs.clangxx }}" -DLLVM_DIR="${{ steps.llvm.outputs.llvm-dir }}" @@ -181,7 +183,9 @@ jobs: env: CMAKE_C_COMPILER_LAUNCHER: sccache CMAKE_CXX_COMPILER_LAUNCHER: sccache - run: cmake --build build --parallel + run: | + cmake --build build --target morok_plugin morok_ir_tests --parallel + cmake --build build --parallel # Explicit save after all compilation so the object cache is uploaded even # if the tests below fail. @@ -209,7 +213,7 @@ jobs: shell: bash run: | set -euo pipefail - ctest --test-dir build -L ir --output-on-failure --timeout 300 + ctest --test-dir build -L ir --no-tests=error --output-on-failure --timeout 300 - name: Run tests shell: bash diff --git a/CMakeLists.txt b/CMakeLists.txt index 840aa10a..18d8f9ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,6 +99,12 @@ if(MOROK_BUILD_PLUGIN OR MOROK_BUILD_TESTS) morok_add_layer(src/passes) morok_add_layer(src/pipeline) else() + if(MOROK_BUILD_PLUGIN) + message(FATAL_ERROR + "MOROK_BUILD_PLUGIN=ON requires a usable LLVM trunk installation.\n" + "Point LLVM_DIR at the LLVM build used by clang/opt, or explicitly set\n" + "MOROK_BUILD_PLUGIN=OFF to build only the available layers.") + endif() message(WARNING "LLVM not usable for plugin/IR layers — building pure layers only.") endif() diff --git a/README.md b/README.md index b94cb5c1..1ff73b03 100644 --- a/README.md +++ b/README.md @@ -106,12 +106,12 @@ morok-native-pack Host executable used by the Linux native-pack build stage. - Ninja. - A C11 and C++23 capable toolchain. - LLVM 18 or newer with the New-PM plugin API Morok targets. The current CI and - development toolchains use the API-v2 plugin header at + development toolchains use the API-v2/v3 plugin header at ``. Morok requires the LLVM headers and the `clang`/`opt` binaries used at runtime to agree on the same New-PM pass plugin ABI. The build currently checks for -`` with `LLVM_PLUGIN_API_VERSION == 2`; older LLVM +`` with `LLVM_PLUGIN_API_VERSION` 2 or 3; older LLVM installs that expose only `` with API version 1 are a different plugin ABI and are rejected by [`cmake/MorokLLVM.cmake`](cmake/MorokLLVM.cmake) instead of failing later with a @@ -134,7 +134,7 @@ Useful CMake options: ```text MOROK_BUILD_TESTS=ON build tests -MOROK_BUILD_PLUGIN=ON build libMorok +MOROK_BUILD_PLUGIN=ON build libMorok; fail configuration if LLVM is unusable MOROK_WERROR=OFF treat warnings as errors when ON MOROK_SANITIZE=OFF ASan/UBSan for pure layers/tests when ON ``` @@ -1230,7 +1230,7 @@ self-check data region. | Symptom | Likely cause | Fix | |---|---|---| -| CMake cannot find `llvm/Plugins/PassPlugin.h` | Host LLVM is missing the API-v2 New-PM plugin header | Point `LLVM_DIR` at the same API-v2 LLVM install used by `clang`/`opt`. | +| CMake cannot find `llvm/Plugins/PassPlugin.h` | Host LLVM is missing the API-v2/v3 New-PM plugin header | Point `LLVM_DIR` at the same API-v2/v3 LLVM install used by `clang`/`opt`. | | Plugin load reports API/version mismatch | `clang`/`opt` and Morok were built against different LLVM plugin ABIs | Rebuild Morok with the same LLVM used by the host driver. | | `-mllvm -morok` is unknown on Windows | Windows plugin cl::opts are not parsed by host clang the same way | Use `MOROK_ENABLE=1` plus `MOROK_CONFIG`, `MOROK_PRESET`, and `MOROK_SEED`. | | Static Linux binary crashes around import indirection | FCO was left enabled in a static link | Use `cross_build.sh` or force `[passes.function_call_obfuscate].enabled = false` and `[passes.platform_runtime].static_link_expected = true`. | diff --git a/cmake/MorokLLVM.cmake b/cmake/MorokLLVM.cmake index 469bc0d2..9082038d 100644 --- a/cmake/MorokLLVM.cmake +++ b/cmake/MorokLLVM.cmake @@ -2,11 +2,9 @@ # MorokLLVM.cmake # # Locates LLVM and validates that it exposes the New-PM plugin API this project -# targets. This environment ships a *customised* LLVM where the plugin header -# was moved to and the API version is 2 (upstream -# uses , version 1). We fail loudly if the header / -# version we depend on is not present, rather than producing a plugin that the -# host `opt`/`clang` will reject at load time with a cryptic version error. +# targets. Upstream trunk exposes with API version +# 2 or 3. The plugin advertises the version from the headers it compiles against; +# its host `opt`/`clang` must come from the same LLVM build. # # Produces: # Morok_LLVM_FOUND BOOL — set when everything validated @@ -35,24 +33,27 @@ if(LLVM_VERSION_MAJOR VERSION_LESS 18) endif() # --- Validate the New-PM plugin API we compile against ---------------------- +# Do not reuse a header from a previously configured LLVM_DIR. +unset(MOROK_PASSPLUGIN_HEADER CACHE) find_file(MOROK_PASSPLUGIN_HEADER NAMES llvm/Plugins/PassPlugin.h PATHS ${LLVM_INCLUDE_DIRS} - NO_DEFAULT_PATH) + NO_DEFAULT_PATH + NO_CACHE) if(NOT MOROK_PASSPLUGIN_HEADER) message(WARNING "MorokLLVM: not found under ${LLVM_INCLUDE_DIRS}.\n" - "This build targets a forked LLVM that moved the plugin header there.") + "This build requires the upstream trunk plugin header.") return() endif() file(STRINGS "${MOROK_PASSPLUGIN_HEADER}" _api_line REGEX "define[ \t]+LLVM_PLUGIN_API_VERSION") string(REGEX MATCH "[0-9]+" MOROK_PLUGIN_API_VERSION "${_api_line}") -if(NOT MOROK_PLUGIN_API_VERSION STREQUAL "2") +if(NOT MOROK_PLUGIN_API_VERSION MATCHES "^(2|3)$") message(WARNING - "MorokLLVM: expected LLVM_PLUGIN_API_VERSION 2, got '${MOROK_PLUGIN_API_VERSION}'.") + "MorokLLVM: expected LLVM_PLUGIN_API_VERSION 2 or 3, got '${MOROK_PLUGIN_API_VERSION}'.") return() endif() diff --git a/include/morok/passes/AdversarialFunctionMerging.hpp b/include/morok/passes/AdversarialFunctionMerging.hpp index 40b2798e..f1f68b6b 100644 --- a/include/morok/passes/AdversarialFunctionMerging.hpp +++ b/include/morok/passes/AdversarialFunctionMerging.hpp @@ -38,7 +38,7 @@ bool adversarialFunctionMergingModule(llvm::Module &M, /// New-PM module-pass wrapper for standalone use (`-passes=morok-afm`). class AdversarialFunctionMergingPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit AdversarialFunctionMergingPass(AdversarialMergeParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class AdversarialFunctionMergingPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: AdversarialMergeParams params_; diff --git a/include/morok/passes/AdversarialSelfTuning.hpp b/include/morok/passes/AdversarialSelfTuning.hpp index be8e19b8..7ec71109 100644 --- a/include/morok/passes/AdversarialSelfTuning.hpp +++ b/include/morok/passes/AdversarialSelfTuning.hpp @@ -47,7 +47,7 @@ bool adversarialSelfTuneModule(llvm::Module &M, /// New-PM module-pass wrapper for standalone use (`-passes=morok-selftune`). class AdversarialSelfTuningPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit AdversarialSelfTuningPass(AdversarialTuningParams params = {}, std::uint64_t seed = 0x1337) @@ -55,7 +55,6 @@ class AdversarialSelfTuningPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: AdversarialTuningParams params_; diff --git a/include/morok/passes/AliasOpaquePredicates.hpp b/include/morok/passes/AliasOpaquePredicates.hpp index 677aef37..e6fd25f8 100644 --- a/include/morok/passes/AliasOpaquePredicates.hpp +++ b/include/morok/passes/AliasOpaquePredicates.hpp @@ -38,7 +38,7 @@ bool aliasOpaquePredicatesFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-aliasop`). class AliasOpaquePredicatesPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit AliasOpaquePredicatesPass(AliasOpParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class AliasOpaquePredicatesPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: AliasOpParams params_; diff --git a/include/morok/passes/AntiAnalysis.hpp b/include/morok/passes/AntiAnalysis.hpp index ed431179..ba5ab7ee 100644 --- a/include/morok/passes/AntiAnalysis.hpp +++ b/include/morok/passes/AntiAnalysis.hpp @@ -182,248 +182,228 @@ bool cacheTimingOracleModule(llvm::Module &M, morok::ir::IRRandom &rng); bool microarchitecturalCanaryModule(llvm::Module &M, morok::ir::IRRandom &rng); -class AntiDebuggingPass : public llvm::PassInfoMixin { +class AntiDebuggingPass : public llvm::RequiredPassInfoMixin { public: explicit AntiDebuggingPass(std::uint64_t seed = 0xA17D3B9u) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; -class AntiHookingPass : public llvm::PassInfoMixin { +class AntiHookingPass : public llvm::RequiredPassInfoMixin { public: explicit AntiHookingPass(std::uint64_t seed = 0x1337) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; -class AntiClassDumpPass : public llvm::PassInfoMixin { +class AntiClassDumpPass : public llvm::RequiredPassInfoMixin { public: llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } }; class WindowsPEFoundationPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit WindowsPEFoundationPass(std::uint64_t seed = 0x51D0BEEF) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class WindowsPebHeapDebugPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit WindowsPebHeapDebugPass(std::uint64_t seed = 0x5EA1B0A7u) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class WindowsDebugObjectPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit WindowsDebugObjectPass(std::uint64_t seed = 0xD3B60B1Eu) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class WindowsThreadHidePass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit WindowsThreadHidePass(std::uint64_t seed = 0x71D1E11Du) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class WindowsAntiAttachPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit WindowsAntiAttachPass(std::uint64_t seed = 0xA77A11CEu) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class WindowsKernelDebuggerPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit WindowsKernelDebuggerPass(std::uint64_t seed = 0x1EADBEEFu) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; -class WindowsSyscallsPass : public llvm::PassInfoMixin { +class WindowsSyscallsPass : public llvm::RequiredPassInfoMixin { public: explicit WindowsSyscallsPass(std::uint64_t seed = 0x5C411C5u) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class WindowsProcessModulesPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit WindowsProcessModulesPass(std::uint64_t seed = 0xC011EC75u) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; -class WindowsUnhookPass : public llvm::PassInfoMixin { +class WindowsUnhookPass : public llvm::RequiredPassInfoMixin { public: explicit WindowsUnhookPass(std::uint64_t seed = 0xC1EAD11Du) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class WindowsVehAuditPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit WindowsVehAuditPass(std::uint64_t seed = 0x5EA11D17u) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class WindowsProcessMitigationsPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit WindowsProcessMitigationsPass(std::uint64_t seed = 0xAC6C161Du) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; -class TimingOraclePass : public llvm::PassInfoMixin { +class TimingOraclePass : public llvm::RequiredPassInfoMixin { public: explicit TimingOraclePass(std::uint64_t seed = 0x710C10C5u) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class SchedulerStepOraclePass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit SchedulerStepOraclePass(std::uint64_t seed = 0x57E0A11Cu) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; -class TrapOraclePass : public llvm::PassInfoMixin { +class TrapOraclePass : public llvm::RequiredPassInfoMixin { public: explicit TrapOraclePass(std::uint64_t seed = 0x7A9A7A9Au) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class PageFaultTlbOraclePass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit PageFaultTlbOraclePass(std::uint64_t seed = 0x9A6EF17Du) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class CacheTimingOraclePass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit CacheTimingOraclePass(std::uint64_t seed = 0xCACE710Cu) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; }; class MicroarchitecturalCanaryPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit MicroarchitecturalCanaryPass(std::uint64_t seed = 0xC411A9E5u) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; diff --git a/include/morok/passes/ArithmeticTables.hpp b/include/morok/passes/ArithmeticTables.hpp index c0c87fb1..ff1562d2 100644 --- a/include/morok/passes/ArithmeticTables.hpp +++ b/include/morok/passes/ArithmeticTables.hpp @@ -38,7 +38,7 @@ bool tableArithmeticFunction(llvm::Function &F, const TableArithParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-tablearith`). -class ArithmeticTablesPass : public llvm::PassInfoMixin { +class ArithmeticTablesPass : public llvm::RequiredPassInfoMixin { public: explicit ArithmeticTablesPass(TableArithParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class ArithmeticTablesPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: TableArithParams params_; diff --git a/include/morok/passes/BogusControlFlow.hpp b/include/morok/passes/BogusControlFlow.hpp index cd9e272f..24fcc4b4 100644 --- a/include/morok/passes/BogusControlFlow.hpp +++ b/include/morok/passes/BogusControlFlow.hpp @@ -47,7 +47,7 @@ bool bogusControlFlowFunction(llvm::Function &F, const BcfParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-bcf`). -class BogusControlFlowPass : public llvm::PassInfoMixin { +class BogusControlFlowPass : public llvm::RequiredPassInfoMixin { public: explicit BogusControlFlowPass(BcfParams params = {}, std::uint64_t seed = 0x1337) @@ -55,7 +55,6 @@ class BogusControlFlowPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: BcfParams params_; diff --git a/include/morok/passes/CallerKeyedDispatch.hpp b/include/morok/passes/CallerKeyedDispatch.hpp index 8da6dc29..6bf38e35 100644 --- a/include/morok/passes/CallerKeyedDispatch.hpp +++ b/include/morok/passes/CallerKeyedDispatch.hpp @@ -51,7 +51,7 @@ bool callerKeyedDispatchModule(llvm::Module &M, /// New-PM module-pass wrapper for standalone use (`-passes=morok-ckd`). class CallerKeyedDispatchPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit CallerKeyedDispatchPass(CallerKeyedDispatchParams params = {}, std::uint64_t seed = 0x1337) @@ -59,7 +59,6 @@ class CallerKeyedDispatchPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: CallerKeyedDispatchParams params_; diff --git a/include/morok/passes/ChaosStateMachine.hpp b/include/morok/passes/ChaosStateMachine.hpp index 5c508098..eab721c7 100644 --- a/include/morok/passes/ChaosStateMachine.hpp +++ b/include/morok/passes/ChaosStateMachine.hpp @@ -51,7 +51,7 @@ bool chaosStateMachineFunction(llvm::Function &F, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-csm`). class ChaosStateMachinePass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit ChaosStateMachinePass(CsmParams params = {}, std::uint64_t seed = 0x1337) @@ -59,7 +59,6 @@ class ChaosStateMachinePass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: CsmParams params_; diff --git a/include/morok/passes/CoherentDecoys.hpp b/include/morok/passes/CoherentDecoys.hpp index b109a617..8581a505 100644 --- a/include/morok/passes/CoherentDecoys.hpp +++ b/include/morok/passes/CoherentDecoys.hpp @@ -37,7 +37,7 @@ bool coherentDecoysFunction(llvm::Function &F, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-decoy`). -class CoherentDecoysPass : public llvm::PassInfoMixin { +class CoherentDecoysPass : public llvm::RequiredPassInfoMixin { public: explicit CoherentDecoysPass(CoherentDecoyParams params = {}, std::uint64_t seed = 0x1337) @@ -45,7 +45,6 @@ class CoherentDecoysPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: CoherentDecoyParams params_; diff --git a/include/morok/passes/ConstantEncryption.hpp b/include/morok/passes/ConstantEncryption.hpp index 47fd3ea8..a8f0e581 100644 --- a/include/morok/passes/ConstantEncryption.hpp +++ b/include/morok/passes/ConstantEncryption.hpp @@ -69,7 +69,7 @@ bool deSwitchGateConstantsFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-constenc`). class ConstantEncryptionPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit ConstantEncryptionPass(ConstEncParams params = {}, std::uint64_t seed = 0x1337) @@ -77,7 +77,6 @@ class ConstantEncryptionPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: ConstEncParams params_; diff --git a/include/morok/passes/DataEntangledFlattening.hpp b/include/morok/passes/DataEntangledFlattening.hpp index ce201089..19a323b4 100644 --- a/include/morok/passes/DataEntangledFlattening.hpp +++ b/include/morok/passes/DataEntangledFlattening.hpp @@ -36,7 +36,7 @@ bool dataEntangledFlattenFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-entfla`). class DataEntangledFlatteningPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit DataEntangledFlatteningPass(DataEntangledFlattenParams params = {}, std::uint64_t seed = 0x1337) @@ -44,7 +44,6 @@ class DataEntangledFlatteningPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: DataEntangledFlattenParams params_; diff --git a/include/morok/passes/DataFlowIntegrity.hpp b/include/morok/passes/DataFlowIntegrity.hpp index fabea88c..fe58bfb8 100644 --- a/include/morok/passes/DataFlowIntegrity.hpp +++ b/include/morok/passes/DataFlowIntegrity.hpp @@ -41,7 +41,7 @@ bool dataFlowIntegrityFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-dfi`). class DataFlowIntegrityPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit DataFlowIntegrityPass(DataFlowIntegrityParams params = {}, std::uint64_t seed = 0x1337) @@ -49,7 +49,6 @@ class DataFlowIntegrityPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: DataFlowIntegrityParams params_; diff --git a/include/morok/passes/DecoyStrings.hpp b/include/morok/passes/DecoyStrings.hpp index a47ba30d..88a02b50 100644 --- a/include/morok/passes/DecoyStrings.hpp +++ b/include/morok/passes/DecoyStrings.hpp @@ -32,14 +32,13 @@ namespace morok::passes { bool decoyStringsModule(llvm::Module &M, morok::ir::IRRandom &rng); /// New-PM module-pass wrapper for standalone use (`-passes=morok-decoystr`). -class DecoyStringsPass : public llvm::PassInfoMixin { +class DecoyStringsPass : public llvm::RequiredPassInfoMixin { public: explicit DecoyStringsPass(std::uint64_t seed = 0xDE001337u) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; diff --git a/include/morok/passes/DispatcherlessRouting.hpp b/include/morok/passes/DispatcherlessRouting.hpp index d997aa51..6e52145e 100644 --- a/include/morok/passes/DispatcherlessRouting.hpp +++ b/include/morok/passes/DispatcherlessRouting.hpp @@ -38,7 +38,7 @@ bool dispatcherlessRoutingFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-dispatchless`). class DispatcherlessRoutingPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit DispatcherlessRoutingPass(DispatcherlessRoutingParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class DispatcherlessRoutingPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: DispatcherlessRoutingParams params_; diff --git a/include/morok/passes/EnvBindingKdf.hpp b/include/morok/passes/EnvBindingKdf.hpp index bca27694..0523d7be 100644 --- a/include/morok/passes/EnvBindingKdf.hpp +++ b/include/morok/passes/EnvBindingKdf.hpp @@ -41,7 +41,7 @@ bool envBindingKdfModule(llvm::Module &M, const EnvBindingKdfParams ¶ms, morok::ir::IRRandom &rng); /// New-PM module-pass wrapper for standalone use (`-passes=morok-envbind`). -class EnvBindingKdfPass : public llvm::PassInfoMixin { +class EnvBindingKdfPass : public llvm::RequiredPassInfoMixin { public: explicit EnvBindingKdfPass(EnvBindingKdfParams params = {}, std::uint64_t seed = 0xE1B17D1EULL) @@ -50,7 +50,6 @@ class EnvBindingKdfPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: EnvBindingKdfParams params_; diff --git a/include/morok/passes/ExternalOpaquePredicates.hpp b/include/morok/passes/ExternalOpaquePredicates.hpp index 71e44959..128216e8 100644 --- a/include/morok/passes/ExternalOpaquePredicates.hpp +++ b/include/morok/passes/ExternalOpaquePredicates.hpp @@ -43,7 +43,7 @@ bool externalOpaquePredicatesFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-extop`). class ExternalOpaquePredicatesPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit ExternalOpaquePredicatesPass(ExternalOpaqueParams params = {}, std::uint64_t seed = 0x1337) @@ -51,7 +51,6 @@ class ExternalOpaquePredicatesPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: ExternalOpaqueParams params_; diff --git a/include/morok/passes/ExternalSecretBinding.hpp b/include/morok/passes/ExternalSecretBinding.hpp index 3d660f7d..6c543422 100644 --- a/include/morok/passes/ExternalSecretBinding.hpp +++ b/include/morok/passes/ExternalSecretBinding.hpp @@ -46,7 +46,7 @@ bool externalSecretBindingModule(llvm::Module &M, /// New-PM module-pass wrapper for standalone use (`-passes=morok-proofbind`). class ExternalSecretBindingPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit ExternalSecretBindingPass(ExternalSecretBindingParams params = {}, std::uint64_t seed = 0x1337) @@ -55,7 +55,6 @@ class ExternalSecretBindingPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: ExternalSecretBindingParams params_; diff --git a/include/morok/passes/FaultPagedPayload.hpp b/include/morok/passes/FaultPagedPayload.hpp index 2012e2ee..5a78f207 100644 --- a/include/morok/passes/FaultPagedPayload.hpp +++ b/include/morok/passes/FaultPagedPayload.hpp @@ -46,7 +46,7 @@ bool faultPagedPayloadModule(llvm::Module &M, /// New-PM module-pass wrapper for standalone use (`-passes=morok-fpp`). class FaultPagedPayloadPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit FaultPagedPayloadPass(FaultPagedPayloadParams params = {}, std::uint64_t seed = 0xF00D5EEDu) @@ -55,7 +55,6 @@ class FaultPagedPayloadPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: FaultPagedPayloadParams params_; diff --git a/include/morok/passes/Flattening.hpp b/include/morok/passes/Flattening.hpp index 4634bb96..e68c69c2 100644 --- a/include/morok/passes/Flattening.hpp +++ b/include/morok/passes/Flattening.hpp @@ -32,14 +32,13 @@ namespace morok::passes { bool flattenFunction(llvm::Function &F, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-flatten`). -class FlatteningPass : public llvm::PassInfoMixin { +class FlatteningPass : public llvm::RequiredPassInfoMixin { public: explicit FlatteningPass(std::uint64_t seed = 0x1337) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; diff --git a/include/morok/passes/FunctionCallObfuscate.hpp b/include/morok/passes/FunctionCallObfuscate.hpp index 804d7e6b..191d6e33 100644 --- a/include/morok/passes/FunctionCallObfuscate.hpp +++ b/include/morok/passes/FunctionCallObfuscate.hpp @@ -38,7 +38,7 @@ bool functionCallObfuscateModule(llvm::Module &M, const FcoParams ¶ms, /// New-PM module-pass wrapper for standalone use (`-passes=morok-fco`). class FunctionCallObfuscatePass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit FunctionCallObfuscatePass(FcoParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class FunctionCallObfuscatePass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: FcoParams params_; diff --git a/include/morok/passes/FunctionFission.hpp b/include/morok/passes/FunctionFission.hpp index 8c214751..20372e60 100644 --- a/include/morok/passes/FunctionFission.hpp +++ b/include/morok/passes/FunctionFission.hpp @@ -50,7 +50,7 @@ bool functionFissionModule(llvm::Module &M, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-fission`). -class FunctionFissionPass : public llvm::PassInfoMixin { +class FunctionFissionPass : public llvm::RequiredPassInfoMixin { public: explicit FunctionFissionPass(FunctionFissionParams params = {}, std::uint64_t seed = 0x1337) @@ -58,7 +58,6 @@ class FunctionFissionPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: FunctionFissionParams params_; diff --git a/include/morok/passes/FunctionWrapper.hpp b/include/morok/passes/FunctionWrapper.hpp index 68f5cc13..361b8b79 100644 --- a/include/morok/passes/FunctionWrapper.hpp +++ b/include/morok/passes/FunctionWrapper.hpp @@ -40,7 +40,7 @@ bool functionWrapModule(llvm::Module &M, const FuncWrapParams ¶ms, morok::ir::IRRandom &rng); /// New-PM module-pass wrapper for standalone use (`-passes=morok-funcwrap`). -class FunctionWrapperPass : public llvm::PassInfoMixin { +class FunctionWrapperPass : public llvm::RequiredPassInfoMixin { public: explicit FunctionWrapperPass(FuncWrapParams params = {}, std::uint64_t seed = 0x1337) @@ -48,7 +48,6 @@ class FunctionWrapperPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: FuncWrapParams params_; diff --git a/include/morok/passes/HashGatedSelfDecrypt.hpp b/include/morok/passes/HashGatedSelfDecrypt.hpp index 5269a626..4306b63c 100644 --- a/include/morok/passes/HashGatedSelfDecrypt.hpp +++ b/include/morok/passes/HashGatedSelfDecrypt.hpp @@ -35,7 +35,7 @@ bool hashGatedSelfDecryptModule(llvm::Module &M, /// New-PM module-pass wrapper for standalone use (`-passes=morok-selfdecrypt`). class HashGatedSelfDecryptPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit HashGatedSelfDecryptPass(HashGatedSelfDecryptParams params = {}, std::uint64_t seed = 0x1337) @@ -43,7 +43,6 @@ class HashGatedSelfDecryptPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: HashGatedSelfDecryptParams params_; diff --git a/include/morok/passes/IndirectBranch.hpp b/include/morok/passes/IndirectBranch.hpp index e4533402..e1921159 100644 --- a/include/morok/passes/IndirectBranch.hpp +++ b/include/morok/passes/IndirectBranch.hpp @@ -40,7 +40,7 @@ bool indirectBranchFunction(llvm::Function &F, const IndirParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-indbr`). -class IndirectBranchPass : public llvm::PassInfoMixin { +class IndirectBranchPass : public llvm::RequiredPassInfoMixin { public: explicit IndirectBranchPass(IndirParams params = {}, std::uint64_t seed = 0x1337) @@ -48,7 +48,6 @@ class IndirectBranchPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: IndirParams params_; diff --git a/include/morok/passes/InterproceduralFsm.hpp b/include/morok/passes/InterproceduralFsm.hpp index ae3d3006..fc313350 100644 --- a/include/morok/passes/InterproceduralFsm.hpp +++ b/include/morok/passes/InterproceduralFsm.hpp @@ -46,7 +46,7 @@ bool interproceduralFsmSplitModule(llvm::Module &M, /// New-PM module-pass wrapper for standalone use (`-passes=morok-ifsm`). class InterproceduralFsmPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit InterproceduralFsmPass(InterproceduralFsmParams params = {}, std::uint64_t seed = 0x1337) @@ -54,7 +54,6 @@ class InterproceduralFsmPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: InterproceduralFsmParams params_; diff --git a/include/morok/passes/Mba.hpp b/include/morok/passes/Mba.hpp index 95d70f19..ce5f686b 100644 --- a/include/morok/passes/Mba.hpp +++ b/include/morok/passes/Mba.hpp @@ -36,14 +36,13 @@ bool mbaFunction(llvm::Function &F, const MbaParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-mba`). -class MbaPass : public llvm::PassInfoMixin { +class MbaPass : public llvm::RequiredPassInfoMixin { public: explicit MbaPass(MbaParams params = {}, std::uint64_t seed = 0x1337) : params_(params), engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: MbaParams params_; diff --git a/include/morok/passes/MicrocodeStress.hpp b/include/morok/passes/MicrocodeStress.hpp index c8a96342..457b42a5 100644 --- a/include/morok/passes/MicrocodeStress.hpp +++ b/include/morok/passes/MicrocodeStress.hpp @@ -38,7 +38,7 @@ bool microcodeStressFunction(llvm::Function &F, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-microstress`). -class MicrocodeStressPass : public llvm::PassInfoMixin { +class MicrocodeStressPass : public llvm::RequiredPassInfoMixin { public: explicit MicrocodeStressPass(MicrocodeStressParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class MicrocodeStressPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: MicrocodeStressParams params_; diff --git a/include/morok/passes/Mirage.hpp b/include/morok/passes/Mirage.hpp index cb5224b8..a6c43acd 100644 --- a/include/morok/passes/Mirage.hpp +++ b/include/morok/passes/Mirage.hpp @@ -85,13 +85,12 @@ bool mirageModule(llvm::Module &M, const MirageParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-mirage`). -class MiragePass : public llvm::PassInfoMixin { +class MiragePass : public llvm::RequiredPassInfoMixin { public: explicit MiragePass(MirageParams params = {}, std::uint64_t seed = 0x1337) : params_(params), engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: MirageParams params_; diff --git a/include/morok/passes/MisleadingMetadata.hpp b/include/morok/passes/MisleadingMetadata.hpp index 9e221d8f..8ec93d36 100644 --- a/include/morok/passes/MisleadingMetadata.hpp +++ b/include/morok/passes/MisleadingMetadata.hpp @@ -25,13 +25,12 @@ namespace morok::passes { bool misleadingMetadataModule(llvm::Module &M, morok::ir::IRRandom &rng); class MisleadingMetadataPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit MisleadingMetadataPass(std::uint64_t seed = 0x51A7E5u) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; diff --git a/include/morok/passes/MqGate.hpp b/include/morok/passes/MqGate.hpp index b2ebcc1f..0c7b5cbf 100644 --- a/include/morok/passes/MqGate.hpp +++ b/include/morok/passes/MqGate.hpp @@ -35,14 +35,13 @@ bool mqGateFunction(llvm::Function &F, const MqGateParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-mq`). -class MqGatePass : public llvm::PassInfoMixin { +class MqGatePass : public llvm::RequiredPassInfoMixin { public: explicit MqGatePass(MqGateParams params = {}, std::uint64_t seed = 0x1337) : params_(params), engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: MqGateParams params_; diff --git a/include/morok/passes/MutualGuardGraph.hpp b/include/morok/passes/MutualGuardGraph.hpp index 47e198f6..beb35926 100644 --- a/include/morok/passes/MutualGuardGraph.hpp +++ b/include/morok/passes/MutualGuardGraph.hpp @@ -38,7 +38,7 @@ bool mutualGuardGraphFunction(llvm::Function &F, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-mutualguard`). -class MutualGuardGraphPass : public llvm::PassInfoMixin { +class MutualGuardGraphPass : public llvm::RequiredPassInfoMixin { public: explicit MutualGuardGraphPass(MutualGuardGraphParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class MutualGuardGraphPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: MutualGuardGraphParams params_; diff --git a/include/morok/passes/Nanomites.hpp b/include/morok/passes/Nanomites.hpp index e5ef5aa5..d1a43de1 100644 --- a/include/morok/passes/Nanomites.hpp +++ b/include/morok/passes/Nanomites.hpp @@ -30,13 +30,12 @@ struct NanomiteParams { bool nanomitesModule(llvm::Module &M, const NanomiteParams &Params, morok::ir::IRRandom &Rng); -class NanomitesPass : public llvm::PassInfoMixin { +class NanomitesPass : public llvm::RequiredPassInfoMixin { public: explicit NanomitesPass(std::uint64_t seed = 0x4E414E4Fu) : engine_(core::Xoshiro256pp::fromSeed(seed)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } private: core::Xoshiro256pp engine_; diff --git a/include/morok/passes/NativeCodePack.hpp b/include/morok/passes/NativeCodePack.hpp index c356e885..ce07b4a4 100644 --- a/include/morok/passes/NativeCodePack.hpp +++ b/include/morok/passes/NativeCodePack.hpp @@ -37,7 +37,7 @@ bool nativeCodePackModule(llvm::Module &M, const NativeCodePackParams ¶ms, morok::ir::IRRandom &rng); -class NativeCodePackPass : public llvm::PassInfoMixin { +class NativeCodePackPass : public llvm::RequiredPassInfoMixin { public: explicit NativeCodePackPass(NativeCodePackParams params = {}, std::uint64_t seed = 0x4E5041434BULL) @@ -46,7 +46,6 @@ class NativeCodePackPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: NativeCodePackParams params_; diff --git a/include/morok/passes/NonInvertibleState.hpp b/include/morok/passes/NonInvertibleState.hpp index 755cb86c..6aefc05d 100644 --- a/include/morok/passes/NonInvertibleState.hpp +++ b/include/morok/passes/NonInvertibleState.hpp @@ -38,7 +38,7 @@ bool nonInvertibleStateFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-nistate`). class NonInvertibleStatePass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit NonInvertibleStatePass(NonInvertibleStateParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class NonInvertibleStatePass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: NonInvertibleStateParams params_; diff --git a/include/morok/passes/OptimizerAmplification.hpp b/include/morok/passes/OptimizerAmplification.hpp index 925b0531..6fa8f201 100644 --- a/include/morok/passes/OptimizerAmplification.hpp +++ b/include/morok/passes/OptimizerAmplification.hpp @@ -37,7 +37,7 @@ bool optimizerAmplifyFunction(llvm::Function &F, const OptAmpParams ¶ms, /// New-PM wrapper for standalone use (`-passes=morok-optamp`). class OptimizerAmplificationPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit OptimizerAmplificationPass(OptAmpParams params = {}, std::uint64_t seed = 0x1337) @@ -45,7 +45,6 @@ class OptimizerAmplificationPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: OptAmpParams params_; diff --git a/include/morok/passes/PathExplosion.hpp b/include/morok/passes/PathExplosion.hpp index e7097e66..132f67ed 100644 --- a/include/morok/passes/PathExplosion.hpp +++ b/include/morok/passes/PathExplosion.hpp @@ -37,7 +37,7 @@ bool pathExplosionFunction(llvm::Function &F, const PathExplosionParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-pathexplode`). -class PathExplosionPass : public llvm::PassInfoMixin { +class PathExplosionPass : public llvm::RequiredPassInfoMixin { public: explicit PathExplosionPass(PathExplosionParams params = {}, std::uint64_t seed = 0x1337) @@ -45,7 +45,6 @@ class PathExplosionPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: PathExplosionParams params_; diff --git a/include/morok/passes/PerBuildPolymorphism.hpp b/include/morok/passes/PerBuildPolymorphism.hpp index 1b539033..7f48ab82 100644 --- a/include/morok/passes/PerBuildPolymorphism.hpp +++ b/include/morok/passes/PerBuildPolymorphism.hpp @@ -35,7 +35,7 @@ bool perBuildPolymorphismModule(llvm::Module &M, /// New-PM module-pass wrapper for standalone use (`-passes=morok-polymorph`). class PerBuildPolymorphismPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit PerBuildPolymorphismPass(PerBuildPolymorphismParams params = {}, std::uint64_t seed = 0x1337) @@ -43,7 +43,6 @@ class PerBuildPolymorphismPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: PerBuildPolymorphismParams params_; diff --git a/include/morok/passes/PhiTangling.hpp b/include/morok/passes/PhiTangling.hpp index daed8673..1225d836 100644 --- a/include/morok/passes/PhiTangling.hpp +++ b/include/morok/passes/PhiTangling.hpp @@ -36,7 +36,7 @@ bool phiTangleFunction(llvm::Function &F, const PhiTangleParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-phitangle`). -class PhiTanglingPass : public llvm::PassInfoMixin { +class PhiTanglingPass : public llvm::RequiredPassInfoMixin { public: explicit PhiTanglingPass(PhiTangleParams params = {}, std::uint64_t seed = 0x1337) @@ -44,7 +44,6 @@ class PhiTanglingPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: PhiTangleParams params_; diff --git a/include/morok/passes/PointerLaundering.hpp b/include/morok/passes/PointerLaundering.hpp index 3d865654..526c696b 100644 --- a/include/morok/passes/PointerLaundering.hpp +++ b/include/morok/passes/PointerLaundering.hpp @@ -39,7 +39,7 @@ bool pointerLaunderFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-ptrlaunder`). class PointerLaunderingPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit PointerLaunderingPass(PointerLaunderParams params = {}, std::uint64_t seed = 0x1337) @@ -47,7 +47,6 @@ class PointerLaunderingPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: PointerLaunderParams params_; diff --git a/include/morok/passes/ReturnlessDispatch.hpp b/include/morok/passes/ReturnlessDispatch.hpp index 33de8f02..87fbe854 100644 --- a/include/morok/passes/ReturnlessDispatch.hpp +++ b/include/morok/passes/ReturnlessDispatch.hpp @@ -57,7 +57,7 @@ bool returnlessDispatchModule(llvm::Module &M, const ReturnlessParams ¶ms, /// New-PM wrapper for standalone use (`-passes=morok-returnless`). class ReturnlessDispatchPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit ReturnlessDispatchPass(ReturnlessParams params = {}, std::uint64_t seed = 0x1337) @@ -65,7 +65,6 @@ class ReturnlessDispatchPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: ReturnlessParams params_; diff --git a/include/morok/passes/SealedBlob.hpp b/include/morok/passes/SealedBlob.hpp index 4396a98f..74e9cd23 100644 --- a/include/morok/passes/SealedBlob.hpp +++ b/include/morok/passes/SealedBlob.hpp @@ -41,7 +41,7 @@ bool sealedBlobModule(llvm::Module &M, const SealedBlobParams ¶ms, morok::ir::IRRandom &rng); /// New-PM module-pass wrapper for standalone use (`-passes=morok-sealedblob`). -class SealedBlobPass : public llvm::PassInfoMixin { +class SealedBlobPass : public llvm::RequiredPassInfoMixin { public: explicit SealedBlobPass(SealedBlobParams params = {}, std::uint64_t seed = 0x1337) @@ -50,7 +50,6 @@ class SealedBlobPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: SealedBlobParams params_; diff --git a/include/morok/passes/SelfChecksumConstants.hpp b/include/morok/passes/SelfChecksumConstants.hpp index 1ecfcd0e..d7e9e049 100644 --- a/include/morok/passes/SelfChecksumConstants.hpp +++ b/include/morok/passes/SelfChecksumConstants.hpp @@ -57,7 +57,7 @@ bool bindLeafHelpersToSeal(llvm::Module &M, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-selfcheck`). class SelfChecksumConstantsPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit SelfChecksumConstantsPass(SelfChecksumParams params = {}, std::uint64_t seed = 0x1337) @@ -65,7 +65,6 @@ class SelfChecksumConstantsPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: SelfChecksumParams params_; diff --git a/include/morok/passes/ShamirShare.hpp b/include/morok/passes/ShamirShare.hpp index 13667b10..10580d30 100644 --- a/include/morok/passes/ShamirShare.hpp +++ b/include/morok/passes/ShamirShare.hpp @@ -34,7 +34,7 @@ bool shamirShareFunction(llvm::Function &F, const ShamirShareParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-shamir`). -class ShamirSharePass : public llvm::PassInfoMixin { +class ShamirSharePass : public llvm::RequiredPassInfoMixin { public: explicit ShamirSharePass(ShamirShareParams params = {}, std::uint64_t seed = 0x1337) @@ -42,7 +42,6 @@ class ShamirSharePass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: ShamirShareParams params_; diff --git a/include/morok/passes/SplitBasicBlocks.hpp b/include/morok/passes/SplitBasicBlocks.hpp index 46490f69..ded3b6f2 100644 --- a/include/morok/passes/SplitBasicBlocks.hpp +++ b/include/morok/passes/SplitBasicBlocks.hpp @@ -39,7 +39,7 @@ bool splitBlocksFunction(llvm::Function &F, const SplitParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-split`). -class SplitBasicBlocksPass : public llvm::PassInfoMixin { +class SplitBasicBlocksPass : public llvm::RequiredPassInfoMixin { public: explicit SplitBasicBlocksPass(SplitParams params = {}, std::uint64_t seed = 0x1337) @@ -47,7 +47,6 @@ class SplitBasicBlocksPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: SplitParams params_; diff --git a/include/morok/passes/StackCoalescing.hpp b/include/morok/passes/StackCoalescing.hpp index 0a9a4d03..33ab61f0 100644 --- a/include/morok/passes/StackCoalescing.hpp +++ b/include/morok/passes/StackCoalescing.hpp @@ -36,7 +36,7 @@ bool stackCoalesceFunction(llvm::Function &F, const StackCoalesceParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-stackcoalesce`). -class StackCoalescingPass : public llvm::PassInfoMixin { +class StackCoalescingPass : public llvm::RequiredPassInfoMixin { public: explicit StackCoalescingPass(StackCoalesceParams params = {}, std::uint64_t seed = 0x1337) @@ -44,7 +44,6 @@ class StackCoalescingPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: StackCoalesceParams params_; diff --git a/include/morok/passes/StackDeltaGames.hpp b/include/morok/passes/StackDeltaGames.hpp index e4b46ef4..54a52f9b 100644 --- a/include/morok/passes/StackDeltaGames.hpp +++ b/include/morok/passes/StackDeltaGames.hpp @@ -38,7 +38,7 @@ bool stackDeltaGamesFunction(llvm::Function &F, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-stackdelta`). -class StackDeltaGamesPass : public llvm::PassInfoMixin { +class StackDeltaGamesPass : public llvm::RequiredPassInfoMixin { public: explicit StackDeltaGamesPass(StackDeltaParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class StackDeltaGamesPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: StackDeltaParams params_; diff --git a/include/morok/passes/StackRebase.hpp b/include/morok/passes/StackRebase.hpp index d1c43802..83d896a4 100644 --- a/include/morok/passes/StackRebase.hpp +++ b/include/morok/passes/StackRebase.hpp @@ -36,7 +36,7 @@ bool stackRebaseFunction(llvm::Function &F, const StackRebaseParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-stackrebase`). -class StackRebasePass : public llvm::PassInfoMixin { +class StackRebasePass : public llvm::RequiredPassInfoMixin { public: explicit StackRebasePass(StackRebaseParams params = {}, std::uint64_t seed = 0x1337) @@ -44,7 +44,6 @@ class StackRebasePass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: StackRebaseParams params_; diff --git a/include/morok/passes/StateOpaquePredicates.hpp b/include/morok/passes/StateOpaquePredicates.hpp index 34b917c5..84863a4b 100644 --- a/include/morok/passes/StateOpaquePredicates.hpp +++ b/include/morok/passes/StateOpaquePredicates.hpp @@ -40,7 +40,7 @@ bool stateOpaquePredicatesFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-stateop`). class StateOpaquePredicatesPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit StateOpaquePredicatesPass(StateOpParams params = {}, std::uint64_t seed = 0x1337) @@ -48,7 +48,6 @@ class StateOpaquePredicatesPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: StateOpParams params_; diff --git a/include/morok/passes/StringEncryption.hpp b/include/morok/passes/StringEncryption.hpp index c8370702..cd55a59c 100644 --- a/include/morok/passes/StringEncryption.hpp +++ b/include/morok/passes/StringEncryption.hpp @@ -55,7 +55,7 @@ bool bindStringSeedToSeal(llvm::Module &M, morok::ir::IRRandom &rng); bool inlineConstantFormatCalls(llvm::Module &M); /// New-PM module-pass wrapper for standalone use (`-passes=morok-strenc`). -class StringEncryptionPass : public llvm::PassInfoMixin { +class StringEncryptionPass : public llvm::RequiredPassInfoMixin { public: explicit StringEncryptionPass(StrEncParams params = {}, std::uint64_t seed = 0x1337) @@ -63,7 +63,6 @@ class StringEncryptionPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: StrEncParams params_; diff --git a/include/morok/passes/SubThresholdPersistence.hpp b/include/morok/passes/SubThresholdPersistence.hpp index 0557f295..58a861f4 100644 --- a/include/morok/passes/SubThresholdPersistence.hpp +++ b/include/morok/passes/SubThresholdPersistence.hpp @@ -38,7 +38,7 @@ bool subThresholdPersistFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-threshold`). class SubThresholdPersistencePass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit SubThresholdPersistencePass(SubThresholdParams params = {}, std::uint64_t seed = 0x1337) @@ -46,7 +46,6 @@ class SubThresholdPersistencePass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: SubThresholdParams params_; diff --git a/include/morok/passes/Substitution.hpp b/include/morok/passes/Substitution.hpp index e02dfcb0..097d7974 100644 --- a/include/morok/passes/Substitution.hpp +++ b/include/morok/passes/Substitution.hpp @@ -37,7 +37,7 @@ bool substituteFunction(llvm::Function &F, const SubstitutionParams ¶ms, /// New-PM wrapper for standalone use (`-passes=morok-substitution`). /// Owns a private engine seeded from the given seed for reproducibility. -class SubstitutionPass : public llvm::PassInfoMixin { +class SubstitutionPass : public llvm::RequiredPassInfoMixin { public: explicit SubstitutionPass(SubstitutionParams params = {}, std::uint64_t seed = 0x1337) @@ -45,7 +45,6 @@ class SubstitutionPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: SubstitutionParams params_; diff --git a/include/morok/passes/TraceKeying.hpp b/include/morok/passes/TraceKeying.hpp index 4fe41a20..13a435ef 100644 --- a/include/morok/passes/TraceKeying.hpp +++ b/include/morok/passes/TraceKeying.hpp @@ -30,7 +30,7 @@ bool traceKeyFunction(llvm::Function &F, const TraceKeyParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-tracekey`). -class TraceKeyingPass : public llvm::PassInfoMixin { +class TraceKeyingPass : public llvm::RequiredPassInfoMixin { public: explicit TraceKeyingPass(TraceKeyParams params = {}, std::uint64_t seed = 0x1337) @@ -38,7 +38,6 @@ class TraceKeyingPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: TraceKeyParams params_; diff --git a/include/morok/passes/TracerAttestation.hpp b/include/morok/passes/TracerAttestation.hpp index 923f2be7..746ac637 100644 --- a/include/morok/passes/TracerAttestation.hpp +++ b/include/morok/passes/TracerAttestation.hpp @@ -40,7 +40,7 @@ bool tracerAttestationModule(llvm::Module &M, /// New-PM module-pass wrapper for standalone use (`-passes=morok-tracer`). class TracerAttestationPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit TracerAttestationPass(TracerAttestationParams params = {}, std::uint64_t seed = 0x7AACEu) @@ -49,7 +49,6 @@ class TracerAttestationPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: TracerAttestationParams params_; diff --git a/include/morok/passes/TypePunning.hpp b/include/morok/passes/TypePunning.hpp index 935bd518..2830002f 100644 --- a/include/morok/passes/TypePunning.hpp +++ b/include/morok/passes/TypePunning.hpp @@ -37,7 +37,7 @@ bool typePunFunction(llvm::Function &F, const TypePunParams ¶ms, morok::ir::IRRandom &rng); /// New-PM wrapper for standalone use (`-passes=morok-typepun`). -class TypePunningPass : public llvm::PassInfoMixin { +class TypePunningPass : public llvm::RequiredPassInfoMixin { public: explicit TypePunningPass(TypePunParams params = {}, std::uint64_t seed = 0x1337) @@ -45,7 +45,6 @@ class TypePunningPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: TypePunParams params_; diff --git a/include/morok/passes/UniformPrimitiveLowering.hpp b/include/morok/passes/UniformPrimitiveLowering.hpp index 002a5580..eaba9734 100644 --- a/include/morok/passes/UniformPrimitiveLowering.hpp +++ b/include/morok/passes/UniformPrimitiveLowering.hpp @@ -40,7 +40,7 @@ bool uniformPrimitiveLowerFunction(llvm::Function &F, /// New-PM wrapper for standalone use (`-passes=morok-uniform`). class UniformPrimitiveLoweringPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit UniformPrimitiveLoweringPass(UniformLowerParams params = {}, std::uint64_t seed = 0x1337) @@ -48,7 +48,6 @@ class UniformPrimitiveLoweringPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: UniformLowerParams params_; diff --git a/include/morok/passes/VTableIntegrity.hpp b/include/morok/passes/VTableIntegrity.hpp index e936c0e9..97ca8d35 100644 --- a/include/morok/passes/VTableIntegrity.hpp +++ b/include/morok/passes/VTableIntegrity.hpp @@ -20,10 +20,9 @@ namespace morok::passes { bool vtableIntegrityModule(llvm::Module &M); /// New-PM module-pass wrapper for standalone use (`-passes=morok-vtable`). -class VTableIntegrityPass : public llvm::PassInfoMixin { +class VTableIntegrityPass : public llvm::RequiredPassInfoMixin { public: llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); - static bool isRequired() { return true; } }; } // namespace morok::passes diff --git a/include/morok/passes/VectorObfuscation.hpp b/include/morok/passes/VectorObfuscation.hpp index e53d8513..fa826d6a 100644 --- a/include/morok/passes/VectorObfuscation.hpp +++ b/include/morok/passes/VectorObfuscation.hpp @@ -40,7 +40,7 @@ bool vectorObfuscateFunction(llvm::Function &F, const VecParams ¶ms, /// New-PM wrapper for standalone use (`-passes=morok-vec`). class VectorObfuscationPass - : public llvm::PassInfoMixin { + : public llvm::RequiredPassInfoMixin { public: explicit VectorObfuscationPass(VecParams params = {}, std::uint64_t seed = 0x1337) @@ -48,7 +48,6 @@ class VectorObfuscationPass llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM); - static bool isRequired() { return true; } private: VecParams params_; diff --git a/include/morok/passes/Virtualization.hpp b/include/morok/passes/Virtualization.hpp index 8abaa8f5..16493f22 100644 --- a/include/morok/passes/Virtualization.hpp +++ b/include/morok/passes/Virtualization.hpp @@ -56,7 +56,7 @@ bool virtualizationWillLift(llvm::Function &F, const VirtualizationParams ¶ms); /// New-PM module-pass wrapper for standalone use (`-passes=morok-vm`). -class VirtualizationPass : public llvm::PassInfoMixin { +class VirtualizationPass : public llvm::RequiredPassInfoMixin { public: explicit VirtualizationPass(VirtualizationParams params = {}, std::uint64_t seed = 0x1337) @@ -64,7 +64,6 @@ class VirtualizationPass : public llvm::PassInfoMixin { llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: VirtualizationParams params_; diff --git a/include/morok/pipeline/Scheduler.hpp b/include/morok/pipeline/Scheduler.hpp index 94e2972c..fedb759b 100644 --- a/include/morok/pipeline/Scheduler.hpp +++ b/include/morok/pipeline/Scheduler.hpp @@ -19,13 +19,12 @@ namespace morok::pipeline { /// Module pass that applies the whole Morok obfuscation pipeline. -class MorokPass : public llvm::PassInfoMixin { +class MorokPass : public llvm::RequiredPassInfoMixin { public: explicit MorokPass(config::Config config) : config_(std::move(config)) {} llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); - static bool isRequired() { return true; } private: config::Config config_; diff --git a/run_tests.sh b/run_tests.sh index dc8b60fa..b32aca0d 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -71,4 +71,4 @@ cmake --build "$BUILD" -j "$JOBS" echo ">> running full test suite (ctest -j $JOBS)" set -x -ctest --test-dir "$BUILD" -j "$JOBS" --output-on-failure "${CTEST_ARGS[@]}" +ctest --test-dir "$BUILD" -j "$JOBS" --no-tests=error --output-on-failure "${CTEST_ARGS[@]}" diff --git a/src/passes/PhiTangling.cpp b/src/passes/PhiTangling.cpp index 1d41f938..19a8da29 100644 --- a/src/passes/PhiTangling.cpp +++ b/src/passes/PhiTangling.cpp @@ -119,7 +119,7 @@ Value *edgeCopy(PHINode &PN, unsigned incoming, IntegerType *CarrierTy, PHINode *cloneDirectPhi(PHINode &PN) { auto *Copy = PHINode::Create(PN.getType(), PN.getNumIncomingValues(), - "morok.phi.direct", &PN); + "morok.phi.direct", PN.getIterator()); for (unsigned i = 0; i < PN.getNumIncomingValues(); ++i) Copy->addIncoming(PN.getIncomingValue(i), PN.getIncomingBlock(i)); return Copy; @@ -128,7 +128,7 @@ PHINode *cloneDirectPhi(PHINode &PN) { PHINode *cloneEdgePhi(PHINode &PN, IntegerType *CarrierTy, ir::IRRandom &rng, std::vector &generated) { auto *Copy = PHINode::Create(PN.getType(), PN.getNumIncomingValues(), - "morok.phi.edge", &PN); + "morok.phi.edge", PN.getIterator()); // A predecessor can appear at more than one incoming index (callbr/asm-goto // with duplicate targets, or `br` with both arms to one block). Every // entry for the same block must carry an identical value, so compute the diff --git a/src/passes/SealedBlob.cpp b/src/passes/SealedBlob.cpp index 25a39f14..9a1c96c6 100644 --- a/src/passes/SealedBlob.cpp +++ b/src/passes/SealedBlob.cpp @@ -237,7 +237,7 @@ Value *materialize(Value *V, Instruction *Before, GlobalVariable *GV, return V; Instruction *I = CE->getAsInstruction(); - I->insertBefore(Before); + I->insertBefore(Before->getIterator()); for (unsigned OpNo = 0; OpNo != I->getNumOperands(); ++OpNo) { Value *Op = I->getOperand(OpNo); if (containsBlob(Op, GV)) diff --git a/src/passes/TraceKeying.cpp b/src/passes/TraceKeying.cpp index b9b796c5..db2903ee 100644 --- a/src/passes/TraceKeying.cpp +++ b/src/passes/TraceKeying.cpp @@ -374,7 +374,7 @@ GuardedBlock splitWithGuard(BasicBlock *BB, AllocaInst *State, auto *I64 = Type::getInt64Ty(Ctx); Instruction *SplitPt = traceSplitPoint(*BB); auto *Expected = - PHINode::Create(I64, 0, "morok.trace.expected", SplitPt); + PHINode::Create(I64, 0, "morok.trace.expected", SplitPt->getIterator()); BasicBlock *Body = SplitBlock(BB, SplitPt); Body->setName("morok.trace.body"); diff --git a/src/pipeline/CMakeLists.txt b/src/pipeline/CMakeLists.txt index 326e7e8c..7cd85981 100644 --- a/src/pipeline/CMakeLists.txt +++ b/src/pipeline/CMakeLists.txt @@ -4,7 +4,7 @@ # On Unix the plugin is a MODULE that does NOT link LLVM: the host process # (opt / clang) provides the LLVM symbols at dlopen time, so we allow undefined # symbols (Mach-O resolves them by default; Linux clang/opt are built with -# --export-dynamic). Targets plugin API v2 via . +# --export-dynamic). Uses plugin API v2/v3 via . # # On Windows there is no load-time undefined-symbol resolution (PE/COFF has no # -Wl,-undefined,dynamic_lookup / --allow-shlib-undefined), and the single diff --git a/src/pipeline/Plugin.cpp b/src/pipeline/Plugin.cpp index 374ee4cc..291694e6 100644 --- a/src/pipeline/Plugin.cpp +++ b/src/pipeline/Plugin.cpp @@ -4,7 +4,7 @@ // // morok/pipeline/Plugin.cpp — New-PM pass-plugin entry point. // -// Targets this environment's plugin API v2 (). +// Uses the build LLVM's plugin API v2/v3 (). // Registers: // • the module pipeline name "morok" (full scheduler) // • standalone module/function pipeline names for individual passes @@ -214,7 +214,7 @@ morok::config::Config loadConfig() { } class EarlyOptimizerAmplificationPass - : public PassInfoMixin { + : public RequiredPassInfoMixin { public: explicit EarlyOptimizerAmplificationPass(morok::config::Config config) : config_(std::move(config)), @@ -266,8 +266,6 @@ class EarlyOptimizerAmplificationPass : PreservedAnalyses::all(); } - static bool isRequired() { return true; } - private: morok::config::Config config_; morok::core::Xoshiro256pp engine_; @@ -289,7 +287,7 @@ class EarlyOptimizerAmplificationPass // and it is gated on virtualization being enabled, so non-VM builds (and the // VM-disabled x86/portable configurations) are completely unaffected. class VmCandidatePreserverPass - : public PassInfoMixin { + : public RequiredPassInfoMixin { public: explicit VmCandidatePreserverPass(morok::config::Config config) : config_(std::move(config)) {} @@ -307,8 +305,6 @@ class VmCandidatePreserverPass return changed ? PreservedAnalyses::none() : PreservedAnalyses::all(); } - static bool isRequired() { return true; } - private: static bool vmScalarType(Type *T) { if (auto *I = dyn_cast(T)) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1f5ac8e2..be39a654 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -13,6 +13,17 @@ endfunction() morok_add_test_group(unit/core) morok_add_test_group(unit/config) +# Configure-time regressions must run even when only pure layers are available. +find_package(Python3 COMPONENTS Interpreter QUIET) +if(Python3_Interpreter_FOUND) + add_test(NAME "cmake/llvm_discovery" + COMMAND "${Python3_EXECUTABLE}" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/llvm_discovery.py" + "${CMAKE_COMMAND}" "${PROJECT_SOURCE_DIR}" + "${CMAKE_C_COMPILER}" "${CMAKE_CXX_COMPILER}") + set_tests_properties("cmake/llvm_discovery" PROPERTIES LABELS "cmake" TIMEOUT 120) +endif() + # LLVM-backed tests (IR construction) and end-to-end differential tests. if(Morok_LLVM_FOUND) morok_add_test_group(ir) diff --git a/tests/cmake/llvm_discovery.py b/tests/cmake/llvm_discovery.py new file mode 100644 index 00000000..bb85ed4b --- /dev/null +++ b/tests/cmake/llvm_discovery.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: MIT +"""Exercise LLVM discovery with isolated packages, without building LLVM.""" + +import pathlib +import subprocess +import sys +import tempfile + + +def main(): + cmake, root, cc, cxx = sys.argv[1:] + root = pathlib.Path(root).resolve() + with tempfile.TemporaryDirectory(prefix="morok-llvm-discovery-") as temporary: + work = pathlib.Path(temporary) + harness = work / "harness" + harness.mkdir() + (harness / "CMakeLists.txt").write_text( + 'cmake_minimum_required(VERSION 3.28)\n' + 'project(LLVMDiscovery NONE)\n' + f'include("{root.as_posix()}/cmake/MorokLLVM.cmake")\n' + 'if(NOT "${Morok_LLVM_FOUND}" STREQUAL "${EXPECT_FOUND}")\n' + ' message(FATAL_ERROR "Unexpected LLVM discovery result")\n' + 'endif()\n' + 'if(Morok_LLVM_FOUND AND NOT TARGET morok::llvm)\n' + ' message(FATAL_ERROR "Missing LLVM interface target")\n' + 'endif()\n' + 'if(Morok_LLVM_FOUND AND NOT MOROK_PLUGIN_API_VERSION STREQUAL EXPECT_API)\n' + ' message(FATAL_ERROR "Wrong LLVM plugin API selected")\n' + 'endif()\n' + ) + + def package(name, api, major=24): + prefix = work / name + headers = prefix / "include/llvm/Plugins" + headers.mkdir(parents=True) + if api is not None: + (headers / "PassPlugin.h").write_text( + f"#define LLVM_PLUGIN_API_VERSION {api}\n" + ) + config = prefix / "lib/cmake/llvm" + config.mkdir(parents=True) + (config / "LLVMConfig.cmake").write_text( + f'set(LLVM_VERSION_MAJOR {major})\n' + f'set(LLVM_PACKAGE_VERSION "{major}.0.0-test")\n' + f'set(LLVM_INCLUDE_DIRS "{prefix.as_posix()}/include")\n' + 'set(LLVM_DEFINITIONS "")\n' + ) + return config + + packages = { + "v2": package("v2", 2), + "v3": package("v3", 3), + "legacy": package("legacy", 1), + "future": package("future", 99), + "missing": package("missing", None), + "old": package("old", 2, major=17), + } + + def configure(source, build, extra, success=True, diagnostic=None): + result = subprocess.run( + [cmake, "-S", str(source), "-B", str(build), *extra], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, + check=False, + ) + if (result.returncode == 0) != success: + raise AssertionError(result.stdout) + if diagnostic and diagnostic not in result.stdout: + raise AssertionError(result.stdout) + + # Reconfigure one cache across API versions, including a legacy cached + # find_file result. The new LLVM_DIR must determine header selection. + for name in ("v2", "v3", "legacy", "future", "missing", "old"): + configure(harness, work / "discovery", [ + f"-DLLVM_DIR={packages[name]}", + f"-DEXPECT_FOUND={'TRUE' if name in ('v2', 'v3') else 'FALSE'}", + f"-DEXPECT_API={2 if name == 'v2' else 3}", + f"-DMOROK_PASSPLUGIN_HEADER:FILEPATH={work}/v2/include/llvm/Plugins/PassPlugin.h", + ]) + + # A requested plugin must fail at configure time, rather than allowing + # a pure-layer build whose IR test selection is empty. + for name in ("legacy", "future", "missing"): + configure(root, work / f"plugin-{name}", [ + f"-DLLVM_DIR={packages[name]}", + f"-DCMAKE_C_COMPILER={cc}", f"-DCMAKE_CXX_COMPILER={cxx}", + "-DMOROK_BUILD_PLUGIN=ON", "-DMOROK_BUILD_TESTS=OFF", + ], success=False, + diagnostic="MOROK_BUILD_PLUGIN=ON requires a usable LLVM") + + # Explicit pure-layer builds remain available without a usable LLVM. + configure(root, work / "pure", [ + f"-DLLVM_DIR={packages['legacy']}", + f"-DCMAKE_C_COMPILER={cc}", f"-DCMAKE_CXX_COMPILER={cxx}", + "-DMOROK_BUILD_PLUGIN=OFF", "-DMOROK_BUILD_TESTS=ON", + ], diagnostic="LLVM not usable for plugin/IR layers") + print("PASS: LLVM API selection, cache changes, and required-plugin failures") + + +if __name__ == "__main__": + main() diff --git a/tests/ir/test_annotations.cpp b/tests/ir/test_annotations.cpp index a3079eb4..7a94f268 100644 --- a/tests/ir/test_annotations.cpp +++ b/tests/ir/test_annotations.cpp @@ -42,7 +42,7 @@ TEST_CASE("materializeAnnotations copies annotations to metadata") { *M, AnnoStr->getType(), true, GlobalValue::PrivateLinkage, AnnoStr, ".str"); - auto *Int8PtrTy = PointerType::getUnqual(Type::getInt8Ty(ctx)); + auto *Int8PtrTy = PointerType::getUnqual(ctx); auto *CastExpr = ConstantExpr::getBitCast(AnnoGV, Int8PtrTy); auto *FnCast = ConstantExpr::getBitCast(F, Int8PtrTy); diff --git a/tests/ir/test_passes.cpp b/tests/ir/test_passes.cpp index 897c6115..ad918219 100644 --- a/tests/ir/test_passes.cpp +++ b/tests/ir/test_passes.cpp @@ -948,7 +948,7 @@ void checkWindowsTlsCallbacks(Module &M, StringRef Stem, StringRef CtorName, GlobalVariable *Once = M.getGlobalVariable(Prefix + ".once", true); REQUIRE(Once != nullptr); CHECK(Once->getValueType()->isIntegerTy(32)); - CHECK(Once->getAlignment() == 4u); + CHECK(Once->getAlign() == MaybeAlign(4)); GlobalVariable *CompilerUsed = M.getGlobalVariable("llvm.compiler.used"); REQUIRE(CompilerUsed != nullptr); REQUIRE(CompilerUsed->hasInitializer());