예제 #1
0
ExprASTPtr NumberExprOperation::operator_comp(ASTContext ctx, MathOperator op, ExprASTPtr lval, ExprASTPtr rval)
{
	llvm::Value * LHS =	lval->getval(ctx);
	llvm::Value * RHS =	rval->getval(ctx);
	llvm::IRBuilder<> builder(ctx.block);
	llvm::Value * result;

	switch(op){
		case OPERATOR_LESS:
			result = builder.CreateICmpSLT(LHS,RHS);
			break;
		case OPERATOR_LESSEQU:
			result = builder.CreateICmpSLE(LHS,RHS);
			break;
		case OPERATOR_GREATER:
			result = builder.CreateICmpSGT(LHS,RHS);
			break;
		case OPERATOR_GREATEREQUL:
			result = builder.CreateICmpSGE(LHS,RHS);
			break;
		case OPERATOR_EQUL:
			result = builder.CreateICmpEQ(LHS,RHS);
			break;
	}

	//TODO , 构造临时 Number 对象.
	return lval->type(ctx)->createtemp(ctx,result,NULL);
}
예제 #2
0
ExprASTPtr StringExprOperation::operator_comp(ASTContext ctx,MathOperator op, ExprASTPtr lval, ExprASTPtr rval)
{
	llvm::Value * LHS =	lval->getval(ctx);
	llvm::Value * RHS =	rval->getval(ctx);
	llvm::IRBuilder<> builder(ctx.block);
	llvm::Value * result;

	switch(op){
		case OPERATOR_EQUL:{// call strcmp
			llvm::Constant * func_strcmp = qbc::getbuiltinprotype(ctx,"strcmp");

			result = builder.CreateCall(func_strcmp, {LHS, RHS});
			// 返回值是 int , not long , 执行转化.
			result = builder.CreateIntCast(result, qbc::getplatformlongtype(), true);
			result = builder.CreateICmpEQ(result, qbc::getconstlong(0));
		}
		break;
		default:
			debug("string comp not supported");
			exit(1);

	}
	//TODO , 构造临时 Number 对象.
	return NumberExprTypeAST::GetNumberExprTypeAST()->createtemp(ctx,result,NULL);
}
예제 #3
0
// 数字除法.
ExprASTPtr NumberExprOperation::operator_div(ASTContext ctx, ExprASTPtr lval, ExprASTPtr rval)
{
	llvm::Value * LHS =	lval->getval(ctx);
	llvm::Value * RHS =	rval->getval(ctx);
	llvm::IRBuilder<> builder(ctx.block);
	llvm::Value * result = builder.CreateSDiv(LHS,RHS);

	//TODO , 构造临时 Number 对象.
	return lval->type(ctx)->createtemp(ctx,result,NULL);
}
예제 #4
0
// 字符串加法.
ExprASTPtr StringExprOperation::operator_add(ASTContext ctx, ExprASTPtr lval, ExprASTPtr rval)
{
	llvm::IRBuilder<> builder(ctx.block);

	llvm::Constant * llvmfunc_calloc =  qbc::getbuiltinprotype(ctx,"malloc");
	llvm::Constant * llvmfunc_strlen =  qbc::getbuiltinprotype(ctx,"strlen");
	llvm::Constant * llvmfunc_strcpy = qbc::getbuiltinprotype(ctx,"strcpy");
	llvm::Constant * llvmfunc_strcat = qbc::getbuiltinprotype(ctx,"strcat");

	llvm::Value * string_left_length = builder.CreateCall(llvmfunc_strlen,lval->getval(ctx));
	llvm::Value * string_right_length = builder.CreateCall(llvmfunc_strlen,rval->getval(ctx));

	llvm::Value * result_length = builder.CreateAdd(string_left_length, string_right_length);

	llvm::Value * resultstring = builder.CreateCall(llvmfunc_calloc,result_length);

	builder.CreateCall(llvmfunc_strcpy, {resultstring, lval->getval(ctx)});
	builder.CreateCall(llvmfunc_strcat, {resultstring, rval->getval(ctx)});
	return 	lval->type(ctx)->createtemp(ctx, resultstring, NULL);
}
예제 #5
0
//	call get on lval and rval, then wrapper an value to NumberExprAST;
ExprASTPtr NumberExprOperation::operator_assign(ASTContext ctx, NamedExprASTPtr lval, ExprASTPtr rval)
{
	llvm::Value * LHS =	lval->getptr(ctx);
	llvm::Value * RHS =	rval->getval(ctx);

 	llvm::IRBuilder<> builder(ctx.block);
 	// 生成赋值语句,因为是简单的整型赋值,所以可以直接生成而不用调用 operator==()

	LHS = builder.CreateBitCast(LHS,qbc::getplatformlongtype()->getPointerTo());
  	builder.CreateStore(RHS,LHS);
	return lval->type(ctx)->createtemp(ctx,LHS,NULL);
}
예제 #6
0
//TODO 添加 free + strdup  指令.
ExprASTPtr StringExprOperation::operator_assign(ASTContext ctx, NamedExprASTPtr lval, ExprASTPtr rval)
{
	llvm::IRBuilder<> builder(ctx.block);

	llvm::Constant * llvmfunc_free =  qbc::getbuiltinprotype(ctx,"free");
	llvm::Constant * llvmfunc_strdup = qbc::getbuiltinprotype(ctx,"strdup");

	builder.CreateCall(llvmfunc_free,lval->getval(ctx));

	llvm::Value * dupedstr = builder.CreateCall(llvmfunc_strdup,rval->getval(ctx),"dumpstring");

	builder.CreateStore(dupedstr,lval->getptr(ctx));
	return lval;
}
예제 #7
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);
}
예제 #8
0
파일: type.cpp 프로젝트: Otome/llvm-qbasic
llvm::Value* CallExprAST::getval(ASTContext ctx)
{
	ExprASTPtr tmp = calltarget->type(ctx)->getop()->operator_call(ctx,calltarget,callargs);
	return tmp->getval(ctx);
}