diff options
author | bloodstalker <thabogre@gmail.com> | 2017-07-16 12:22:24 +0000 |
---|---|---|
committer | bloodstalker <thabogre@gmail.com> | 2017-07-16 12:22:24 +0000 |
commit | 150b4996185e5fad33b98df7cb6d7ee327f756c3 (patch) | |
tree | 1a16f4358d2bab9070bb4b521c9d035fd579940a /bruiser/ORCmutation.h | |
parent | added a pp check due to api changes (diff) | |
download | mutator-150b4996185e5fad33b98df7cb6d7ee327f756c3.tar.gz mutator-150b4996185e5fad33b98df7cb6d7ee327f756c3.zip |
wip
Diffstat (limited to 'bruiser/ORCmutation.h')
-rw-r--r-- | bruiser/ORCmutation.h | 109 |
1 files changed, 103 insertions, 6 deletions
diff --git a/bruiser/ORCmutation.h b/bruiser/ORCmutation.h index 5ca243e..c026a1b 100644 --- a/bruiser/ORCmutation.h +++ b/bruiser/ORCmutation.h @@ -23,7 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* /*inclusion guard*/ #ifndef ORC_MUTATION_H #define ORC_MUTATION_H -#if 0 +#if __clang_major__ == 5 /**********************************************************************************************************************/ /*included modules*/ /*project headers*/ @@ -33,38 +33,135 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* /*llvm headers*/ #include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/ExecutionEngine/ExecutionEngine.h" +#include "llvm/ExecutionEngine/JITSymbol.h" #include "llvm/ExecutionEngine/RTDyldMemoryManager.h" +#include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/ExecutionEngine/Orc/CompileUtils.h" #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/IRTransformLayer.h" #include "llvm/ExecutionEngine/Orc/LambdaResolver.h" #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h" +#include "llvm/IR/DataLayout.h" #include "llvm/IR/Mangler.h" +#include "llvm/IR/LegacyPassManager.h" #include "llvm/Support/DynamicLibrary.h" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Scalar/GVN.h" /**********************************************************************************************************************/ /*using*/ using namespace llvm; /**********************************************************************************************************************/ /*globals*/ /**********************************************************************************************************************/ +namespace mutatorjit{ class MutatorJIT { private: std::unique_ptr<TargetMachine> TM; const DataLayout DL; std::unique_ptr<orc::JITCompileCallbackManager> CompileCallbackManager; - orc::RTDyldObjectLinkingLayer<> ObjectLinkingLayer; - orc::IRCompileLayer<decltype(ObjectLinkingLayer)> CompileLayer; + orc::RTDyldObjectLinkingLayer ObjectLayer; + orc::IRCompileLayer<decltype(ObjectLayer), orc::SimpleCompiler> CompileLayer; - typedef std::function<std::unique_ptr<llvm::Module>(std::unique_ptr<llvm::Module>)> OptimizeFunction; + using OptimizeFunction = std::function<std::shared_ptr<llvm::Module>(std::shared_ptr<llvm::Module>)>; orc::IRTransformLayer<decltype(CompileLayer), OptimizeFunction> OptimizeLayer; - orc::CompileOnDemandLayer<decltype(OptimizeLayer)> CODL; + //orc::CompileOnDemandLayer<decltype(OptimizeLayer)> CODL; public: - typedef decltype(CODL)::ModuleSetHandleT ModuleHandle; + using ModuleHandle = decltype(OptimizeLayer)::ModuleHandleT; + + MutatorJIT() : TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()), \ + ObjectLayer([]() {return std::make_shared<SectionMemoryManager>();}),\ + CompileLayer(ObjectLayer, orc::SimpleCompiler(*TM)), \ + OptimizeLayer(CompileLayer, [this](std::shared_ptr<llvm::Module> M){return optimizeModule(std::move(M));}) + { + llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr); + } + + TargetMachine &getTargetMachine() + { + return *TM; + } + + ModuleHandle addModule(std::unique_ptr<llvm::Module> M) + { + auto Resolver = orc::createLambdaResolver + ( + [&](const std::string &Name) + { + if (auto Sym = OptimizeLayer.findSymbol(Name, false)) + { + return Sym; + } + else + { + return JITSymbol(nullptr); + } + }, + [](const std::string &Name) + { + if (auto SymAddr = RTDyldMemoryManager::getSymbolAddressInProcess(Name)) + { + return JITSymbol(SymAddr, JITSymbolFlags::Exported); + } + else + { + return JITSymbol(nullptr); + } + } + ); + + return cantFail(OptimizeLayer.addModule(std::move(M), std::move(Resolver))); + } + + JITSymbol findSymbol(const std::string Name) + { + std::string MangledName; + raw_string_ostream MangledNameStream(MangledName); + Mangler::getNameWithPrefix(MangledNameStream, Name, DL); + return OptimizeLayer.findSymbol(MangledNameStream.str(), true); + } + + void removeModule(ModuleHandle H) + { + cantFail(OptimizeLayer.removeModule(H)); + } + + private: + std::shared_ptr<llvm::Module> optimizeModule(std::shared_ptr<llvm::Module> M) + { + auto FPM = llvm::make_unique<legacy::FunctionPassManager>(M.get()); + + FPM->add(createInstructionCombiningPass()); + FPM->add(createReassociatePass()); + FPM->add(createGVNPass()); + FPM->add(createCFGSimplificationPass()); + FPM->doInitialization(); + + for (auto &F : *M) + { + FPM->run(F); + } + + return M; + } +}; + +class runMainOnJit +{ +#if 0 + std::unique_ptr<llvm::Module> M = buildModule(); + MutatorJIT jit; + Handle H = jit.addModule(*M); + int (*Main)(int, char*[]) = + (int(*)(int*, char*[]))jit.findSymbol("main").getSymbolAddressInProcess(); + int result = Main(); + jit.removeModule(H); +#endif }; +} //end of namespace mutatorjit /**********************************************************************************************************************/ /**********************************************************************************************************************/ /**********************************************************************************************************************/ |