#include "builtins/builtins.h"
#include "ir/ir.h"
namespace goose::builtins
{
void SetupApiCGModule( Env& e )
{
RegisterBuiltinFunc< ptr< codegen::Module > ( string ) >( e, "CGModuleCreate"_sid,
[]( const string& name )
{
return make_shared< codegen::Module >( name );
} );
// TODO add parameters to choose the cpu type, the target for cross compilation etc
RegisterBuiltinFunc< bool ( ptr< codegen::Module > ) >( e, "CGModuleSetupTarget"_sid,
[]( const ptr< codegen::Module >& module )
{
return module->setupTarget();
} );
// TODO add parameters to control the optimization level etc
RegisterBuiltinFunc< void ( ptr< codegen::Module > ) >( e, "CGModuleOptimize"_sid,
[]( const ptr< codegen::Module >& module )
{
module->runOptimizationPasses();
} );
RegisterBuiltinFunc< void ( ptr< codegen::Module >, string ) >( e, "CGModuleEmitLLVMIr"_sid,
[]( const ptr< codegen::Module >& module, const string& filename )
{
module->dumpAsLlvmIr( filename );
} );
RegisterBuiltinFunc< bool ( ptr< codegen::Module >, string ) >( e, "CGModuleEmitAsm"_sid,
[]( const ptr< codegen::Module >& module, const string& filename )
{
return module->emitToFile( filename, llvm::CGFT_AssemblyFile );
} );
RegisterBuiltinFunc< bool ( ptr< codegen::Module >, string ) >( e, "CGModuleEmitObj"_sid,
[]( const ptr< codegen::Module >& module, const string& filename )
{
return module->emitToFile( filename, llvm::CGFT_ObjectFile );
} );
}
}
namespace goose::ir
{
const Term& Bridge< ptr< codegen::Module > >::Type()
{
static auto type = ValueToIRExpr( Value( TypeType(), VEC( TSID( ct_type ), TSID( cg_module ) ) ) );
return type;
}
Value Bridge< ptr< codegen::Module > >::ToValue( const ptr< codegen::Module >& os )
{
return Value( Type(), TERM( static_pointer_cast< void >( os ) ) );
}
optional< ptr< codegen::Module > > Bridge< ptr< codegen::Module > >::FromValue( const Value& v )
{
if( v.type() != Type() )
return nullptr;
auto result = Decompose( v.val(),
Val< ptr< void > >()
);
if( !result )
return nullptr;
return static_pointer_cast< codegen::Module >( result->get() );
}
}