Goose  Artifact [8db3ce07b6]

Artifact 8db3ce07b6dc20b04901f00d4be7f27f6adc7828d0ec171bcd2dac99f7d274a7:

  • File bs/builtins/api/codegen/module.cpp — part of check-in [d38aab5fc2] at 2020-04-11 23:33:06 on branch trunk — Updated to the latest git version of llvm. (user: achavasse size: 2589)

#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() );
    }
}