Перейти к содержанию

Примеры


...

hello_jit.void
{   v_import("level-00/voidc_target.void");
    v_import("level-00/voidc_types.void");

    v_import("llvm-c/Core.void");

    v_import("printf.void");
}

{   llvm_ctx = v_target_get_voidc_llvm_ctx();
    module = LLVMModuleCreateWithNameInContext("hello_mod", llvm_ctx);

    builder = v_target_get_voidc_builder();

    hello_ft  = v_function_type(void, 0, 0, false);
    hello_ft_ = v_type_get_llvm_type(hello_ft);
    hello_f   = LLVMAddFunction(module, "hello", hello_ft_);

    entry = LLVMAppendBasicBlockInContext(llvm_ctx, hello_f, "entry");

    LLVMPositionBuilderAtEnd(builder, entry);


    typ_ = v_alloca(LLVMTypeRef);

    char_     = v_type_get_llvm_type(char);
    char_ptr_ = LLVMPointerType(char_, 0);

    v_store(char_ptr_, typ_);

    int_ = v_type_get_llvm_type(int);

    printf_ft_ = LLVMFunctionType(int_, typ_, 1, true);
    printf_f   = LLVMAddFunction(module, "printf", printf_ft_);

    str = LLVMBuildGlobalStringPtr(builder, "Hello world!\n", "str");

    arg = v_alloca(LLVMValueRef);

    v_store(str, arg);

    LLVMBuildCall2(builder, printf_ft_, printf_f, arg, 1, "");


    LLVMBuildRetVoid(builder);

    LLVMClearInsertionPosition(builder);

    //-----------------------------------------------------------------
    voidc_prepare_module_for_jit(module);

    //-----------------------------------------------------------------
    msg = LLVMPrintModuleToString(module);

    printf("\n%s\n", msg);

    LLVMDisposeMessage(msg);

    //-----------------------------------------------------------------
    voidc_add_module_to_jit(module);

//  LLVMDisposeModule(module);


    //-----------------------------------------------------------------
    v_add_symbol("hello", hello_ft, 0);
}

{   hello();
}

...


...

try_hz27.void
{ v_import("mainline.void"); }
{ v_enable_mainline(); }
{
    v_import("llvm-c/Core.void");

    v_import("cstdio.void");
}

//---------------------------------------------------------------------
#define iterate: (stmt, n)
{'stmt_list'

    #define doit: (l, r)
    {'stmt'

        #if (l < r-1)

            #define some: (m)
            {'stmt_list'

                doit(l, m);
                doit(m, r);

            'stmt_list'}

            some((l+r)/2);

        #else

            stmt(l);

        #endif

    'stmt'}

    #assert (0 < n)

    doit(0, n);

'stmt_list'}


//---------------------------------------------------------------------
//{   #define stmt: (i)  =  printf("%d\n", i);
//
//    iterate(stmt, 99);
//}


//---------------------------------------------------------------------
print_value_intrinsic: (*void, vis: *voidc_visitor_t, self: *v_ast_base_t) ~> void
{
    args = v_ast_expr_call_get_arg_list((self: *v_ast_expr_t));
    arg0 = v_list_get_item(args, 0);

    v_push_result();

    v_ast_accept_visitor(arg0, vis);

    val = v_get_result_value();

    str = LLVMPrintValueToString(val);
    defer LLVMDisposeMessage(str);

    expr: &v_ast_expr_t := {};

    v_ast_make_expr_string(&expr, str);

    v_pop_result();

    v_ast_accept_visitor(&expr, vis);
}

{   v_add_intrinsic("print_value", print_value_intrinsic, 0);
}


//---------------------------------------------------------------------
{   w = 2;

    v: uint(w)[2] = { 1, 0 };         //- Sic!

    #define stmt: (i)
    {'stmt_list'

        printf("i: %d; v: %s\n", i, print_value(v[1]));

        vv = v[0] + v[1];

        #if ((vv: int(w)) < 0)

            w = w + 1;

        #endif

        v: uint(w)[2] = { v[1], vv };

    'stmt_list'}

    n = 999;

    iterate(stmt, n);

    printf("n: %d; v: %s\n", n, print_value(v[1]));
}