예제 #1
0
// 那个, 数组下标调用.
ExprASTPtr ArrayExprOperation::operator_call(ASTContext ctx, NamedExprASTPtr target, ExprListASTPtr callargslist)
{
	llvm::IRBuilder<>	builder(ctx.block);
	debug("array index\n");

	// 获得数组地址.
	llvm::Value * arrayptr = target->getptr(ctx);
	// 获得下标.
	llvm::Value * index = callargslist->expression_list.begin()->get()->getval(ctx);

	// 调用数组下标函数.
	llvm::Constant * func_qb_array_at = qbc::getbuiltinprotype(ctx,"btr_qbarray_at");

	llvm::Value * tmpval = builder.CreateCall(func_qb_array_at, {arrayptr, index});

	ArrayExprTypeAST * realtarget =dynamic_cast<ArrayExprTypeAST*>(target->nameresolve(ctx)->type.get());

	debug("realtarget is %p\n",realtarget);

	ExprASTPtr tmp = realtarget->elementtype->createtemp(ctx,NULL, tmpval);
	debug("array index,  little tmp created as %p\n",tmp.get());
	return tmp;
	exit(100);
}