From fe1c3484bc73131e769ae7f08fa3eb23917c26da Mon Sep 17 00:00:00 2001 From: 19h <280212+19h@users.noreply.github.com> Date: Mon, 5 Oct 2026 13:57:15 +0000 Subject: [PATCH 1/2] ci: bump LLVM trunk pin to 201b446bf71c7c6d37a9bb195ed5e448c5231070 --- .github/llvm-trunk.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/llvm-trunk.env b/.github/llvm-trunk.env index 05a184c..ad6ef79 100644 --- a/.github/llvm-trunk.env +++ b/.github/llvm-trunk.env @@ -11,4 +11,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 From 2e9928bd892fbc8c2c3915d70c921780db9f8d58 Mon Sep 17 00:00:00 2001 From: Kenan Sulayman Date: Mon, 5 Oct 2026 22:21:58 +0200 Subject: [PATCH 2/2] Adapt to LLVM trunk plugin API v3 and pass manager changes Bump the pinned LLVM trunk commit to 201b446bf71c7c6d37a9bb195ed5e448c5231070 and update Morok to support both plugin API v2 and v3. Key changes: - cmake: Accept LLVM_PLUGIN_API_VERSION 2 or 3 in MorokLLVM.cmake, clear MOROK_PASSPLUGIN_HEADER cache across LLVM_DIR changes, and fail CMake configuration if MOROK_BUILD_PLUGIN=ON cannot find a usable LLVM. - passes: Migrate pass classes from PassInfoMixin to RequiredPassInfoMixin and drop redundant isRequired() definitions. - ir: Update instruction insertion and PHINode creation calls to use iterators, migrate opaque PointerType creation, and use getAlign() instead of getAlignment() in IR tests. - ci & test: Add tests/cmake/llvm_discovery.py to validate LLVM discovery, build morok_plugin and morok_ir_tests explicitly in CI, and enforce --no-tests=error in ctest invocations. --- .github/llvm-trunk.env | 7 +- .github/workflows/ci.yml | 8 +- CMakeLists.txt | 6 ++ README.md | 8 +- cmake/MorokLLVM.cmake | 19 ++-- .../passes/AdversarialFunctionMerging.hpp | 3 +- .../morok/passes/AdversarialSelfTuning.hpp | 3 +- .../morok/passes/AliasOpaquePredicates.hpp | 3 +- include/morok/passes/AntiAnalysis.hpp | 60 ++++------- include/morok/passes/ArithmeticTables.hpp | 3 +- include/morok/passes/BogusControlFlow.hpp | 3 +- include/morok/passes/CallerKeyedDispatch.hpp | 3 +- include/morok/passes/ChaosStateMachine.hpp | 3 +- include/morok/passes/CoherentDecoys.hpp | 3 +- include/morok/passes/ConstantEncryption.hpp | 3 +- .../morok/passes/DataEntangledFlattening.hpp | 3 +- include/morok/passes/DataFlowIntegrity.hpp | 3 +- include/morok/passes/DecoyStrings.hpp | 3 +- .../morok/passes/DispatcherlessRouting.hpp | 3 +- include/morok/passes/EnvBindingKdf.hpp | 3 +- .../morok/passes/ExternalOpaquePredicates.hpp | 3 +- .../morok/passes/ExternalSecretBinding.hpp | 3 +- include/morok/passes/FaultPagedPayload.hpp | 3 +- include/morok/passes/Flattening.hpp | 3 +- .../morok/passes/FunctionCallObfuscate.hpp | 3 +- include/morok/passes/FunctionFission.hpp | 3 +- include/morok/passes/FunctionWrapper.hpp | 3 +- include/morok/passes/HashGatedSelfDecrypt.hpp | 3 +- include/morok/passes/IndirectBranch.hpp | 3 +- include/morok/passes/InterproceduralFsm.hpp | 3 +- include/morok/passes/Mba.hpp | 3 +- include/morok/passes/MicrocodeStress.hpp | 3 +- include/morok/passes/Mirage.hpp | 3 +- include/morok/passes/MisleadingMetadata.hpp | 3 +- include/morok/passes/MqGate.hpp | 3 +- include/morok/passes/MutualGuardGraph.hpp | 3 +- include/morok/passes/Nanomites.hpp | 3 +- include/morok/passes/NativeCodePack.hpp | 3 +- include/morok/passes/NonInvertibleState.hpp | 3 +- .../morok/passes/OptimizerAmplification.hpp | 3 +- include/morok/passes/PathExplosion.hpp | 3 +- include/morok/passes/PerBuildPolymorphism.hpp | 3 +- include/morok/passes/PhiTangling.hpp | 3 +- include/morok/passes/PointerLaundering.hpp | 3 +- include/morok/passes/ReturnlessDispatch.hpp | 3 +- include/morok/passes/SealedBlob.hpp | 3 +- .../morok/passes/SelfChecksumConstants.hpp | 3 +- include/morok/passes/ShamirShare.hpp | 3 +- include/morok/passes/SplitBasicBlocks.hpp | 3 +- include/morok/passes/StackCoalescing.hpp | 3 +- include/morok/passes/StackDeltaGames.hpp | 3 +- include/morok/passes/StackRebase.hpp | 3 +- .../morok/passes/StateOpaquePredicates.hpp | 3 +- include/morok/passes/StringEncryption.hpp | 3 +- .../morok/passes/SubThresholdPersistence.hpp | 3 +- include/morok/passes/Substitution.hpp | 3 +- include/morok/passes/TraceKeying.hpp | 3 +- include/morok/passes/TracerAttestation.hpp | 3 +- include/morok/passes/TypePunning.hpp | 3 +- .../morok/passes/UniformPrimitiveLowering.hpp | 3 +- include/morok/passes/VTableIntegrity.hpp | 3 +- include/morok/passes/VectorObfuscation.hpp | 3 +- include/morok/passes/Virtualization.hpp | 3 +- include/morok/pipeline/Scheduler.hpp | 3 +- run_tests.sh | 2 +- src/passes/PhiTangling.cpp | 4 +- src/passes/SealedBlob.cpp | 2 +- src/passes/TraceKeying.cpp | 2 +- src/pipeline/CMakeLists.txt | 2 +- src/pipeline/Plugin.cpp | 10 +- tests/CMakeLists.txt | 11 ++ tests/cmake/llvm_discovery.py | 101 ++++++++++++++++++ tests/ir/test_annotations.cpp | 2 +- tests/ir/test_passes.cpp | 2 +- 74 files changed, 231 insertions(+), 189 deletions(-) create mode 100644 tests/cmake/llvm_discovery.py diff --git a/.github/llvm-trunk.env b/.github/llvm-trunk.env index ad6ef79..af76c08 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 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6630993..5b93b8d 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 840aa10..18d8f9f 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 b94cb5c..1ff73b0 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 469bc0d..9082038 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 40b2798..f1f68b6 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 be8e19b..7ec7110 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 677aef3..e6fd25f 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 ed43117..ba5ab7e 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 c0c87fb..ff1562d 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 cd9e272..24fcc4b 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 8da6dc2..6bf38e3 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 5c50809..eab721c 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 b109a61..8581a50 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 47fd3ea..a8f0e58 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 ce20108..19a323b 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 fabea88..fe58bfb 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 a47ba30..88a02b5 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 d997aa5..6e52145 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 bca2769..0523d7b 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 71e4495..128216e 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 3d660f7..6c54342 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 2012e2e..5a78f20 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 4634bb9..e68c69c 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 804d7e6..191d6e3 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 8c21475..20372e6 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 68f5cc1..361b8b7 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 5269a62..4306b63 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 e453340..e192115 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 ae3d300..fc31335 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 95d70f1..ce5f686 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 c8a9634..457b42a 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 cb5224b..a6c43ac 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 9e221d8..8ec93d3 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 b2ebcc1..0c7b5cb 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 47e198f..beb3592 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 e5ef5aa..d1a43de 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 c356e88..ce07b4a 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 755cb86..6aefc05 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 925b053..6fa8f20 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 e7097e6..132f67e 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 1b53903..7f48ab8 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 daed867..1225d83 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 3d86565..526c696 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 33de8f0..87fbe85 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 4396a98..74e9cd2 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 1ecfcd0..d7e9e04 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 13667b1..10580d3 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 46490f6..ded3b6f 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 0a9a4d0..33ab61f 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 e4b46ef..54a52f9 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 d1c4380..83d896a 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 34b917c..84863a4 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 c837070..cd55a59 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 0557f29..58a861f 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 e02dfcb..097d797 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 4fe41a2..13a435e 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 923f2be..746ac63 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 935bd51..2830002 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 002a558..eaba973 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 e936c0e..97ca8d3 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 e53d851..fa826d6 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 8abaa8f..16493f2 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 94e2972..fedb759 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 dc8b60f..b32aca0 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 1d41f93..19a8da2 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 25a39f1..9a1c96c 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 b9b796c..db2903e 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 326e7e8..7cd8598 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 374ee4c..291694e 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 1f5ac8e..be39a65 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 0000000..bb85ed4 --- /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 a3079eb..7a94f26 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 897c611..ad91821 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());