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"); } }
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; }