diff --git a/src/devirt_t.cpp b/src/devirt_t.cpp index 5e1dad3..20c3d18 100644 --- a/src/devirt_t.cpp +++ b/src/devirt_t.cpp @@ -85,6 +85,19 @@ namespace vm bool devirt_t::compile( std::vector< std::uint8_t > &obj ) { + llvm::legacy::FunctionPassManager pass_mgr( llvm_module ); + pass_mgr.add( llvm::createPromoteMemoryToRegisterPass() ); + pass_mgr.add( llvm::createNewGVNPass() ); + pass_mgr.add( llvm::createReassociatePass() ); + pass_mgr.add( llvm::createDeadCodeEliminationPass() ); + pass_mgr.add( llvm::createInstructionCombiningPass() ); + + for ( auto vmp_rtn : vmp_rtns ) + { + pass_mgr.run( *vmp_rtn->llvm_fptr ); + std::printf( "> opt rtn_0x%p\n", vmp_rtn->rtn_begin ); + } + llvm::TargetOptions opt; llvm::SmallVector< char, 128 > buff; llvm::raw_svector_ostream dest( buff ); diff --git a/src/lifters/rdtsc.cpp b/src/lifters/rdtsc.cpp index c456ff5..4f9b660 100644 --- a/src/lifters/rdtsc.cpp +++ b/src/lifters/rdtsc.cpp @@ -8,25 +8,21 @@ namespace vm llvm::Function *rdtsc_intrin = nullptr; if ( !( rdtsc_intrin = rtn->llvm_module->getFunction( "rdtsc" ) ) ) { - rdtsc_intrin = llvm::Function::Create( - llvm::FunctionType::get( ir_builder->getVoidTy(), - { llvm::PointerType::get( ir_builder->getInt8Ty(), 0ull ) }, false ), - llvm::GlobalValue::LinkageTypes::ExternalLinkage, "rdtsc", *rtn->llvm_module ); + rdtsc_intrin = llvm::Function::Create( llvm::FunctionType::get( ir_builder->getVoidTy(), false ), + llvm::GlobalValue::LinkageTypes::ExternalLinkage, "rdtsc", + *rtn->llvm_module ); auto entry_block = llvm::BasicBlock::Create( ir_builder->getContext(), "", rdtsc_intrin ); auto ib = ir_builder->GetInsertBlock(); ir_builder->SetInsertPoint( entry_block ); - std::string asm_str( "rdtsc; sub rbp, 0x08; mov [rcx], edx; mov [rcx+0x04], eax; ret" ); - auto intrin = llvm::InlineAsm::get( llvm::FunctionType::get( ir_builder->getVoidTy(), false ), asm_str, - "", false, false, llvm::InlineAsm::AD_Intel ); + // TODO: put RDTSC code here... - ir_builder->CreateCall( intrin ); ir_builder->CreateRetVoid(); ir_builder->SetInsertPoint( ib ); } auto &vmp_rtn = rtn->vmp_rtns.back(); - ir_builder->CreateCall( rdtsc_intrin, { vmp_rtn->stack } ); + ir_builder->CreateCall( rdtsc_intrin ); }; } \ No newline at end of file