Пример #1
0
void Variable::inc_array_size(BaseExpression* dim_size){
	if(size==NULL) size = new vector<int>;
	
	dereference_level++;

	if(dim_size==NULL){
		size->push_back(0);
		return;
	} 

	BaseExpression* tmp_expr=NULL;
	try{
		tmp_expr = dim_size->simplify();
		if(tmp_expr!=NULL){
			delete dim_size;
			dim_size = tmp_expr; 		
			if(tmp_expr->get_expr_type()!=EXPR_constant) generate_error("Variable size array not allowed");
		}
		Constant<uint64_t>* value = static_cast<Constant<uint64_t>*>(dim_size);		
		size->push_back((int)value->get_value());
	}
	catch(const int& exception_in){
		generate_error("Invalid array dimensions size");
	}
}
Пример #2
0
void Variable::renderasm_global(ASMhandle& context){
	if(debug) cerr<<"Variable: renderasm_global start"<<endl;
	
	global=true;
	try{
		pair<string, Variable*> tmp(string(name), this);
		context.insert_global_var(tmp);
	}
	catch(const ErrorgenT& error_in){
		if(error_in == ERROR_redefinition) generate_error("Redefinition of global variable \""+string(name)+"\"");
		if(error_in == ERROR_fn_var_clash) generate_error("\""+string(name)+"\" redeclared as different kind of symbol");
	}

	if(debug) cerr<<"Variable: renderasm_global(): variable inserted in ASMhandle"<<endl;

	if(init_val!=NULL){
		// Try to optimize the expression if not already a Constant
		simplify_init_val();
		if(init_val->get_expr_type()!=EXPR_constant) generate_error("Initializer for global variable not constant");
		if(debug) cerr<<"Variable: renderasm_global() : initializer expression optimized"<<endl;
	}

	assembler.push_back(ss<<pad<<".globl"<<name<<endl);
	if(first_global){
		first_global=false;
		assembler.push_back(ss<<pad<<".data"<<endl);
	}
	
	assembler.push_back(ss<<pad<<".align"<<2<<endl);
	assembler.push_back(ss<<pad<<".type"<<name<<", @object"<<endl);
	assembler.push_back(ss<<pad<<".size"<<name<<", 4"<<endl);
	assembler.push_back(ss<<name<<":"<<endl);
	if(init_val!=NULL && init_val->get_expr_type()==EXPR_constant){
		Constant<uint64_t> *value = static_cast<Constant<uint64_t>*>(init_val);		
		assembler.push_back(ss<<pad<<".word"<<value->get_value()<<endl);
	} 
	assembler.push_back(ss<<endl);

	if(debug) cerr<<"Variable: renderasm_global successful"<<endl;
}