本文整理汇总了C++中codegen_finishfun函数的典型用法代码示例。如果您正苦于以下问题:C++ codegen_finishfun函数的具体用法?C++ codegen_finishfun怎么用?C++ codegen_finishfun使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了codegen_finishfun函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: genfun_newbe
static LLVMValueRef genfun_newbe(compile_t* c, gentype_t* g, const char *name,
ast_t* typeargs)
{
ast_t* fun = get_fun(g, name, typeargs);
LLVMValueRef func = get_prototype(c, g, name, typeargs, fun);
if(func == NULL)
{
ast_free_unattached(fun);
return NULL;
}
codegen_startfun(c, func, ast_debug(fun));
name_params(c, g->ast, ast_childidx(fun, 3), func);
genfun_dwarf(c, g, name, typeargs, fun);
if(!gen_field_init(c, g))
{
ast_free_unattached(fun);
return NULL;
}
ast_t* body = ast_childidx(fun, 6);
LLVMValueRef value = gen_expr(c, body);
if(value == NULL)
{
ast_free_unattached(fun);
return NULL;
}
LLVMBuildRetVoid(c->builder);
codegen_finishfun(c);
// Generate the sender.
LLVMValueRef sender = get_sender(c, g, name, typeargs);
codegen_startfun(c, sender, false);
LLVMValueRef this_ptr = LLVMGetParam(sender, 0);
// Send the arguments in a message to 'this'.
uint32_t index = genfun_vtable_index(c, g, name, typeargs);
LLVMTypeRef msg_type_ptr = send_message(c, fun, this_ptr, sender, index);
genfun_dwarf_return(c, body);
// Return 'this'.
LLVMBuildRet(c->builder, this_ptr);
codegen_finishfun(c);
// Add the dispatch case.
add_dispatch_case(c, g, fun, index, func, msg_type_ptr);
ast_free_unattached(fun);
return func;
}
开发者ID:fydot,项目名称:ponyc,代码行数:55,代码来源:genfun.c
示例2: genfun_new
static bool genfun_new(compile_t* c, reachable_type_t* t,
reachable_method_t* m)
{
assert(m->func != NULL);
AST_GET_CHILDREN(m->r_fun, cap, id, typeparams, params, result, can_error,
body);
codegen_startfun(c, m->func, m->di_file, m->di_method);
name_params(c, t, m, params, m->func);
LLVMValueRef value = gen_expr(c, body);
if(value == NULL)
return false;
// Return 'this'.
if(t->primitive == NULL)
value = LLVMGetParam(m->func, 0);
codegen_debugloc(c, ast_childlast(body));
LLVMBuildRet(c->builder, value);
codegen_debugloc(c, NULL);
codegen_finishfun(c);
return true;
}
开发者ID:sparseinference,项目名称:ponyc,代码行数:27,代码来源:genfun.c
示例3: pointer_offset
static void pointer_offset(compile_t* c, reach_type_t* t, reach_type_t* t_elem)
{
FIND_METHOD("_offset");
LLVMTypeRef params[3];
params[0] = t->use_type;
params[1] = c->intptr;
start_function(c, m, t->use_type, params, 2);
// Set up a constant integer for the allocation size.
size_t size = (size_t)LLVMABISizeOfType(c->target_data, t_elem->use_type);
LLVMValueRef l_size = LLVMConstInt(c->intptr, size, false);
LLVMValueRef ptr = LLVMGetParam(m->func, 0);
LLVMValueRef n = LLVMGetParam(m->func, 1);
// Return ptr + (n * sizeof(len)).
LLVMValueRef src = LLVMBuildPtrToInt(c->builder, ptr, c->intptr, "");
LLVMValueRef offset = LLVMBuildMul(c->builder, n, l_size, "");
LLVMValueRef result = LLVMBuildAdd(c->builder, src, offset, "");
result = LLVMBuildIntToPtr(c->builder, result, t->use_type, "");
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
BOX_FUNCTION();
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:27,代码来源:genprim.c
示例4: make_serialise
static void make_serialise(compile_t* c, reach_type_t* t)
{
// Use the trace function as the serialise_trace function.
t->serialise_trace_fn = t->trace_fn;
// Generate the serialise function.
t->serialise_fn = codegen_addfun(c, genname_serialise(t->name),
c->serialise_type);
codegen_startfun(c, t->serialise_fn, NULL, NULL);
LLVMSetFunctionCallConv(t->serialise_fn, LLVMCCallConv);
LLVMSetLinkage(t->serialise_fn, LLVMExternalLinkage);
LLVMValueRef ctx = LLVMGetParam(t->serialise_fn, 0);
LLVMValueRef arg = LLVMGetParam(t->serialise_fn, 1);
LLVMValueRef addr = LLVMGetParam(t->serialise_fn, 2);
LLVMValueRef offset = LLVMGetParam(t->serialise_fn, 3);
LLVMValueRef object = LLVMBuildBitCast(c->builder, arg, t->structure_ptr,
"");
LLVMValueRef offset_addr = LLVMBuildInBoundsGEP(c->builder, addr, &offset, 1,
"");
serialise(c, t, ctx, object, offset_addr);
LLVMBuildRetVoid(c->builder);
codegen_finishfun(c);
}
开发者ID:enigma,项目名称:ponyc,代码行数:28,代码来源:genserialise.c
示例5: genprim_string_deserialise
void genprim_string_deserialise(compile_t* c, reach_type_t* t)
{
// Generate the deserisalise function.
t->deserialise_fn = codegen_addfun(c, genname_serialise(t->name),
c->trace_type);
codegen_startfun(c, t->deserialise_fn, NULL, NULL);
LLVMSetFunctionCallConv(t->deserialise_fn, LLVMCCallConv);
LLVMValueRef ctx = LLVMGetParam(t->deserialise_fn, 0);
LLVMValueRef arg = LLVMGetParam(t->deserialise_fn, 1);
LLVMValueRef object = LLVMBuildBitCast(c->builder, arg, t->structure_ptr,
"");
gendeserialise_typeid(c, t, object);
// Deserialise the string contents.
LLVMValueRef alloc = field_value(c, object, 2);
LLVMValueRef ptr_offset = field_value(c, object, 3);
ptr_offset = LLVMBuildPtrToInt(c->builder, ptr_offset, c->intptr, "");
LLVMValueRef args[3];
args[0] = ctx;
args[1] = ptr_offset;
args[2] = alloc;
LLVMValueRef ptr_addr = gencall_runtime(c, "pony_deserialise_block", args, 3,
"");
LLVMValueRef ptr = LLVMBuildStructGEP(c->builder, object, 3, "");
LLVMBuildStore(c->builder, ptr_addr, ptr);
LLVMBuildRetVoid(c->builder);
codegen_finishfun(c);
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:34,代码来源:genprim.c
示例6: make_rdtscp
static void make_rdtscp(compile_t* c)
{
if(target_is_x86(c->opt->triple))
{
// i64 @llvm.x86.rdtscp(i8*)
LLVMTypeRef f_type = LLVMFunctionType(c->i64, &c->void_ptr, 1, false);
LLVMValueRef rdtscp = LLVMAddFunction(c->module, "llvm.x86.rdtscp",
f_type);
// i64 @internal.x86.rdtscp(i32*)
LLVMTypeRef i32_ptr = LLVMPointerType(c->i32, 0);
f_type = LLVMFunctionType(c->i64, &i32_ptr, 1, false);
LLVMValueRef fun = codegen_addfun(c, "internal.x86.rdtscp", f_type);
LLVMSetFunctionCallConv(fun, LLVMCCallConv);
codegen_startfun(c, fun, NULL, NULL);
// Cast i32* to i8* and call the intrinsic.
LLVMValueRef arg = LLVMGetParam(fun, 0);
arg = LLVMBuildBitCast(c->builder, arg, c->void_ptr, "");
LLVMValueRef result = LLVMBuildCall(c->builder, rdtscp, &arg, 1, "");
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
} else {
(void)c;
}
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:27,代码来源:genprim.c
示例7: pointer_alloc
static void pointer_alloc(compile_t* c, reach_type_t* t,
reach_type_t* t_elem)
{
FIND_METHOD("_alloc");
LLVMTypeRef params[2];
params[0] = t->use_type;
params[1] = c->intptr;
start_function(c, m, t->use_type, params, 2);
// Set up a constant integer for the allocation size.
size_t size = (size_t)LLVMABISizeOfType(c->target_data, t_elem->use_type);
LLVMValueRef l_size = LLVMConstInt(c->intptr, size, false);
LLVMValueRef len = LLVMGetParam(m->func, 1);
LLVMValueRef args[2];
args[0] = codegen_ctx(c);
args[1] = LLVMBuildMul(c->builder, len, l_size, "");
LLVMValueRef result = gencall_runtime(c, "pony_alloc", args, 2, "");
result = LLVMBuildBitCast(c->builder, result, t->use_type, "");
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:25,代码来源:genprim.c
示例8: genfun_allocator
static bool genfun_allocator(compile_t* c, gentype_t* g)
{
// No allocator for primitive types or pointers.
if((g->primitive != NULL) || is_pointer(g->ast))
return true;
const char* funname = genname_fun(g->type_name, "Alloc", NULL);
LLVMTypeRef ftype = LLVMFunctionType(g->use_type, NULL, 0, false);
LLVMValueRef fun = codegen_addfun(c, funname, ftype);
codegen_startfun(c, fun, false);
LLVMValueRef result;
switch(g->underlying)
{
case TK_PRIMITIVE:
case TK_CLASS:
// Allocate the object or return the global instance.
result = gencall_alloc(c, g);
break;
case TK_ACTOR:
// Allocate the actor.
result = gencall_create(c, g);
break;
default:
assert(0);
return false;
}
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
return true;
}
开发者ID:fydot,项目名称:ponyc,代码行数:35,代码来源:genfun.c
示例9: make_dispatch
static void make_dispatch(compile_t* c, gentype_t* g)
{
// Do nothing if we're not an actor.
if(g->underlying != TK_ACTOR)
return;
// Create a dispatch function.
const char* dispatch_name = genname_dispatch(g->type_name);
g->dispatch_fn = codegen_addfun(c, dispatch_name, c->dispatch_type);
LLVMSetFunctionCallConv(g->dispatch_fn, LLVMCCallConv);
codegen_startfun(c, g->dispatch_fn, false);
LLVMBasicBlockRef unreachable = codegen_block(c, "unreachable");
// Read the message ID.
LLVMValueRef msg = LLVMGetParam(g->dispatch_fn, 2);
LLVMValueRef id_ptr = LLVMBuildStructGEP(c->builder, msg, 1, "");
LLVMValueRef id = LLVMBuildLoad(c->builder, id_ptr, "id");
// Store a reference to the dispatch switch. When we build behaviours, we
// will add cases to this switch statement based on message ID.
g->dispatch_switch = LLVMBuildSwitch(c->builder, id, unreachable, 0);
// Mark the default case as unreachable.
LLVMPositionBuilderAtEnd(c->builder, unreachable);
LLVMBuildUnreachable(c->builder);
codegen_finishfun(c);
}
开发者ID:nunb,项目名称:ponyc,代码行数:28,代码来源:gentype.c
示例10: donotoptimise_apply
static void donotoptimise_apply(compile_t* c, reach_type_t* t,
reach_method_t* m)
{
const char* strtab_name = m->name;
m->intrinsic = true;
ast_t* typearg = ast_child(m->typeargs);
reach_type_t* t_elem = reach_type(c->reach, typearg);
LLVMTypeRef params[2];
params[0] = t->use_type;
params[1] = t_elem->use_type;
start_function(c, m, m->result->use_type, params, 2);
LLVMValueRef obj = LLVMGetParam(m->func, 1);
LLVMTypeRef void_fn = LLVMFunctionType(c->void_type, &t_elem->use_type, 1,
false);
LLVMValueRef asmstr = LLVMConstInlineAsm(void_fn, "", "imr,~{memory}", true,
false);
LLVMBuildCall(c->builder, asmstr, &obj, 1, "");
LLVMBuildRet(c->builder, m->result->instance);
codegen_finishfun(c);
BOX_FUNCTION();
}
开发者ID:locksfree,项目名称:ponyc,代码行数:26,代码来源:genprim.c
示例11: genprim_string_serialise_trace
void genprim_string_serialise_trace(compile_t* c, reach_type_t* t)
{
// Generate the serialise_trace function.
t->serialise_trace_fn = codegen_addfun(c, genname_serialise_trace(t->name),
c->serialise_type);
codegen_startfun(c, t->serialise_trace_fn, NULL, NULL);
LLVMSetFunctionCallConv(t->serialise_trace_fn, LLVMCCallConv);
LLVMValueRef ctx = LLVMGetParam(t->serialise_trace_fn, 0);
LLVMValueRef arg = LLVMGetParam(t->serialise_trace_fn, 1);
LLVMValueRef object = LLVMBuildBitCast(c->builder, arg, t->use_type, "");
// Read the size.
LLVMValueRef size = field_value(c, object, 1);
LLVMValueRef alloc = LLVMBuildAdd(c->builder, size,
LLVMConstInt(c->intptr, 1, false), "");
// Reserve space for the contents.
LLVMValueRef ptr = field_value(c, object, 3);
LLVMValueRef args[3];
args[0] = ctx;
args[1] = ptr;
args[2] = alloc;
gencall_runtime(c, "pony_serialise_reserve", args, 3, "");
LLVMBuildRetVoid(c->builder);
codegen_finishfun(c);
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:30,代码来源:genprim.c
示例12: maybe_none
static void maybe_none(compile_t* c, reach_type_t* t)
{
FIND_METHOD("none");
start_function(c, m, t->use_type, &t->use_type, 1);
LLVMBuildRet(c->builder, LLVMConstNull(t->use_type));
codegen_finishfun(c);
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:8,代码来源:genprim.c
示例13: pointer_unsafe
static void pointer_unsafe(compile_t* c, reach_type_t* t)
{
FIND_METHOD("_unsafe");
start_function(c, m, t->use_type, &t->use_type, 1);
LLVMBuildRet(c->builder, LLVMGetParam(m->func, 0));
codegen_finishfun(c);
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:8,代码来源:genprim.c
示例14: number_conversion
static void number_conversion(compile_t* c, num_conv_t* from, num_conv_t* to,
bool native128)
{
if(!native128 &&
((from->is_float && (to->size > 64)) ||
(to->is_float && (from->size > 64)))
)
{
return;
}
reach_type_t* t = reach_type_name(c->reach, from->type_name);
if(t == NULL)
return;
FIND_METHOD(to->fun_name);
start_function(c, m, to->type, &from->type, 1);
LLVMValueRef arg = LLVMGetParam(m->func, 0);
LLVMValueRef result;
if(from->is_float)
{
if(to->is_float)
{
if(from->size < to->size)
result = LLVMBuildFPExt(c->builder, arg, to->type, "");
else if(from->size > to->size)
result = LLVMBuildFPTrunc(c->builder, arg, to->type, "");
else
result = arg;
} else if(to->is_signed) {
result = LLVMBuildFPToSI(c->builder, arg, to->type, "");
} else {
result = LLVMBuildFPToUI(c->builder, arg, to->type, "");
}
} else if(to->is_float) {
if(from->is_signed)
result = LLVMBuildSIToFP(c->builder, arg, to->type, "");
else
result = LLVMBuildUIToFP(c->builder, arg, to->type, "");
} else if(from->size > to->size) {
result = LLVMBuildTrunc(c->builder, arg, to->type, "");
} else if(from->size < to->size) {
if(from->is_signed)
result = LLVMBuildSExt(c->builder, arg, to->type, "");
else
result = LLVMBuildZExt(c->builder, arg, to->type, "");
} else {
result = arg;
}
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
BOX_FUNCTION();
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:58,代码来源:genprim.c
示例15: f64__nan
static void f64__nan(compile_t* c, reach_type_t* t)
{
FIND_METHOD("_nan");
start_function(c, m, c->f64, &c->f64, 1);
LLVMValueRef result = LLVMConstNaN(c->f64);
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
}
开发者ID:locksfree,项目名称:ponyc,代码行数:9,代码来源:genprim.c
示例16: pointer_create
static void pointer_create(compile_t* c, reach_type_t* t)
{
FIND_METHOD("create");
start_function(c, m, t->use_type, &t->use_type, 1);
LLVMValueRef result = LLVMConstNull(t->use_type);
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:10,代码来源:genprim.c
示例17: genfun_newbe
static bool genfun_newbe(compile_t* c, reachable_type_t* t,
reachable_method_t* m)
{
assert(m->func != NULL);
assert(m->func_handler != NULL);
AST_GET_CHILDREN(m->r_fun, cap, id, typeparams, params, result, can_error,
body);
// Generate the handler.
codegen_startfun(c, m->func_handler, m->di_file, m->di_method);
name_params(c, t, m, params, m->func_handler);
LLVMValueRef value = gen_expr(c, body);
if(value == NULL)
return false;
LLVMBuildRetVoid(c->builder);
codegen_finishfun(c);
// Generate the sender.
codegen_startfun(c, m->func, NULL, NULL);
LLVMValueRef this_ptr = LLVMGetParam(m->func, 0);
// Send the arguments in a message to 'this'.
LLVMTypeRef msg_type_ptr = send_message(c, params, this_ptr, m->func,
m->vtable_index);
// Return 'this'.
codegen_debugloc(c, ast_childlast(body));
LLVMBuildRet(c->builder, this_ptr);
codegen_debugloc(c, NULL);
codegen_finishfun(c);
// Add the dispatch case.
add_dispatch_case(c, t, params, m->vtable_index, m->func_handler,
msg_type_ptr);
return true;
}
开发者ID:sparseinference,项目名称:ponyc,代码行数:42,代码来源:genfun.c
示例18: platform_debug
static void platform_debug(compile_t* c, reach_type_t* t)
{
FIND_METHOD("debug");
start_function(c, m, c->ibool, &t->use_type, 1);
LLVMValueRef result = LLVMConstInt(c->ibool, !c->opt->release, false);
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
BOX_FUNCTION();
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:11,代码来源:genprim.c
示例19: pointer_usize
static void pointer_usize(compile_t* c, reach_type_t* t)
{
FIND_METHOD("usize");
start_function(c, m, c->intptr, &t->use_type, 1);
LLVMValueRef ptr = LLVMGetParam(m->func, 0);
LLVMValueRef result = LLVMBuildPtrToInt(c->builder, ptr, c->intptr, "");
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:11,代码来源:genprim.c
示例20: f64_bits
static void f64_bits(compile_t* c, reach_type_t* t)
{
FIND_METHOD("bits");
start_function(c, m, c->i64, &c->f64, 1);
LLVMValueRef result = LLVMBuildBitCast(c->builder, LLVMGetParam(m->func, 0),
c->i64, "");
LLVMBuildRet(c->builder, result);
codegen_finishfun(c);
BOX_FUNCTION();
}
开发者ID:georgemarrows,项目名称:ponyc,代码行数:12,代码来源:genprim.c
注:本文中的codegen_finishfun函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论