You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
2.3 KiB
49 lines
2.3 KiB
#include <vmp_rtn_t.hpp>
|
|
|
|
namespace vm
|
|
{
|
|
vmp_rtn_t::vmp_rtn_t( std::uintptr_t rtn_begin, std::vector< vm::instrs::code_block_t > vmp2_code_blocks,
|
|
std::shared_ptr< llvm::IRBuilder<> > &ir_builder, llvm::Module *llvm_module )
|
|
: ir_builder( ir_builder ), vmp2_code_blocks( vmp2_code_blocks ), rtn_begin( rtn_begin ),
|
|
llvm_module( llvm_module )
|
|
{
|
|
create_routine();
|
|
// create virtual registers in the first code block...
|
|
ir_builder->SetInsertPoint( llvm_code_blocks[ 0 ].second );
|
|
flags = ir_builder->CreateAlloca( ir_builder->getInt64Ty(), nullptr, "flags" );
|
|
stack = ir_builder->CreateAlloca( llvm::PointerType::get( ir_builder->getInt8Ty(), 0ull ), nullptr, "sp" );
|
|
ir_builder->CreateStore( llvm_fptr->getArg( 0 ), stack );
|
|
create_virtual_registers();
|
|
}
|
|
|
|
void vmp_rtn_t::create_virtual_registers( void )
|
|
{
|
|
for ( auto idx = 0u; idx < 24; ++idx )
|
|
// allocate virtual register space...
|
|
virtual_registers.push_back(
|
|
ir_builder->CreateAlloca( llvm::IntegerType::get( ir_builder->getContext(), 64 ), nullptr,
|
|
( std::string( "vreg" ) + std::to_string( idx ) ).c_str() ) );
|
|
}
|
|
|
|
void vmp_rtn_t::create_routine( void )
|
|
{
|
|
auto func_ty =
|
|
llvm::FunctionType::get( llvm::PointerType::getInt8PtrTy( ir_builder->getContext() ),
|
|
{ llvm::PointerType::getInt8PtrTy( ir_builder->getContext() ) }, false );
|
|
|
|
std::stringstream rtn_name;
|
|
rtn_name << "rtn_" << std::hex << rtn_begin;
|
|
llvm_fptr = llvm::Function::Create( func_ty, llvm::GlobalValue::LinkageTypes::ExternalLinkage,
|
|
rtn_name.str().c_str(), *llvm_module );
|
|
|
|
for ( const auto &vmp2_code_block : vmp2_code_blocks )
|
|
{
|
|
// create basic block name... block_xxxxxxxx format...
|
|
std::stringstream blk_name;
|
|
blk_name << "blk_" << std::hex << vmp2_code_block.vip_begin;
|
|
llvm_code_blocks.push_back(
|
|
{ vmp2_code_block.vip_begin,
|
|
llvm::BasicBlock::Create( ir_builder->getContext(), blk_name.str().c_str(), llvm_fptr ) } );
|
|
}
|
|
}
|
|
} // namespace vm
|