Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "code.h"
- char* global_vars[1000] = {0};
- int pos_global_vars[1000] = {0};
- int glob_vars = 0;
- char* local_vars[1000] = {0};
- int pos_local_vars[1000] = {0};
- int loc_vars = 0;
- void code(Node* ast,Symbol* ST){
- int i;
- if(strcmp(ast->type,"Program")==0){
- for(i=0;i<ast->numChilds;i++){
- if(strcmp(ast->childs[i]->type,"Declaration")==0){
- code_declaration(ast->childs[i],NULL);
- }
- else if(strcmp(ast->childs[i]->type,"FuncDefinition")==0){
- code_funcdefinition(ast->childs[i],ST);
- }
- }
- }
- printf("declare i32 @putchar(i32)\n");
- printf("declare i32 @getchar()\n");
- }
- void code_funcdefinition(Node* node,Symbol* ST){
- printf("define %s @%s(",type_to_llvmtype(node->childs[0]->type),node->childs[1]->value); //header function
- int i;
- Node* param;
- int localparams;
- for(i=0;i<node->childs[2]->numChilds;i++){
- if(i>0)
- printf(", ");
- param = node->childs[2]->childs[i];
- if(strcmp(param->childs[0]->type,"Void")!=0 && strcmp(param->childs[0]->type,"Char")!=0 )
- printf("%s %%%s",type_to_llvmtype(param->childs[0]->type),param->childs[1]->value); // params function
- else if(strcmp(param->childs[0]->type,"Char")==0)
- printf("%s signext %%%s",type_to_llvmtype(param->childs[0]->type),param->childs[1]->value); // params function
- }
- printf("){\n");
- /*if(strcmp(node->childs[0]->type,"Void")!=0){
- printf("%%1 = alloca %s, align %d\n",type_to_llvmtype(node->childs[0]->type),type_num_bits(node->childs[0]->type)); //alloca return type
- }*/
- for(i=0;i<node->childs[2]->numChilds;i++){
- param = node->childs[2]->childs[i];
- if(strcmp(param->childs[0]->type,"Void")!=0){
- local_vars[loc_vars++] = strdup("null");
- printf("%%%d = alloca %s, align %d\n",loc_vars,type_to_llvmtype(param->childs[0]->type),type_num_bits(param->childs[0]->type)); //alloca variable param
- }
- }
- localparams = loc_vars - node->childs[2]->numChilds;
- for(i=0;i<node->childs[2]->numChilds;i++){
- param = node->childs[2]->childs[i];
- if(strcmp(param->childs[0]->type,"Void")!=0){
- local_vars[localparams++] = strdup(param->childs[1]->value);
- printf("store %s %%%s, %s* %%%d, align %d\n",type_to_llvmtype(param->childs[0]->type),param->childs[1]->value,type_to_llvmtype(param->childs[0]->type),localparams,type_num_bits(param->childs[0]->type)); //store variable param
- }
- }
- code_variable(node->childs[3],ST,node->childs[1]->value);
- if(strcmp(node->childs[0]->type,"Void")==0)
- printf("ret void\n");
- else if(strcmp(node->childs[0]->type,"Int")==0)
- printf("ret i32 0\n");
- printf("}\n\n");
- }
- int get_ascii_code(char* string){ //Ainda nao está totalmente funcional
- if(string[1] == '\\'){
- if(string[2] == 'n')
- return '\n';
- else if(string[2] == 'r')
- return '\r';
- else if(string[2] == 't')
- return '\t';
- else{
- return '\0';
- }
- }
- return string[1];
- }
- void code_declaration(Node* node,char* func){
- Node* node2 = create_node("int",0,0,0);
- node2->value = strdup("0");
- node2->s_type = strdup("int");
- if(func==NULL){
- printf("@%s = common global %s ",node->childs[1]->value,type_to_llvmtype(node->childs[0]->type));
- if(node->numChilds==2)
- printf("%s, align ",double_int(node->childs[0]->type,node2));
- else
- printf("%s, align ",double_int(node->childs[0]->type,node->childs[2]));
- printf("%d\n",type_num_bits(node->childs[0]->type));
- }
- else{
- printf("%%%s = alloca %s, align %d\n",node->childs[1]->value,type_to_llvmtype(node->childs[0]->type),type_num_bits(node->childs[0]->type));
- if(node->numChilds==3){
- printf("store %s %%%s, %s* %%%s, align %d\n",type_to_llvmtype(node->childs[0]->type),node->childs[1]->value,type_to_llvmtype(node->childs[0]->type),node->childs[2]->value,type_num_bits(node->childs[0]->type));
- }
- }
- }
- void code_store(Node* node,Symbol* ST,char* func){
- if(strcmp(node->childs[1]->type,"ChrLit")==0){
- printf("store %s %d, %s* %%%s, align %d\n",type_to_llvmtype(node->childs[0]->s_type),(int)node->childs[1]->value[1],type_to_llvmtype(node->childs[0]->s_type),node->childs[0]->value,type_num_bits(node->childs[0]->s_type));
- }else if(strcmp(node->childs[1]->type,"IntLit")==0 || strcmp(node->childs[1]->type,"RealLit")==0){
- printf("store %s %s, %s* %%%s, align %d\n",type_to_llvmtype(node->childs[0]->s_type),double_int(node->childs[0]->s_type,node->childs[1]),type_to_llvmtype(node->childs[0]->s_type),node->childs[0]->value,type_num_bits(node->childs[0]->s_type));
- }else if(node->childs[1]->numChilds>1){
- if(!node->childs[1]->has_special_value)
- printf("store %s %s, %s* %%%s, align %d\n",type_to_llvmtype(node->childs[0]->s_type),node->childs[1]->value,type_to_llvmtype(node->childs[0]->s_type),search_on_localvars(node->childs[0]->value),type_num_bits(node->childs[0]->s_type));
- else
- printf("store %s %s, %s* %%%s, align %d\n",type_to_llvmtype(node->childs[0]->s_type),double_int(node->childs[0]->s_type,node->childs[1]),type_to_llvmtype(node->childs[0]->s_type),search_on_localvars(node->childs[0]->value),type_num_bits(node->childs[0]->s_type));
- }else{
- printf("store %s %s, %s* %%%s, align %d\n",type_to_llvmtype(node->childs[0]->s_type),node->childs[1]->value,type_to_llvmtype(node->childs[0]->s_type),node->childs[0]->value,type_num_bits(node->childs[0]->s_type));
- }
- }
- void code_if_while(Node* node,Symbol* ST,char* func){
- int label = loc_vars++;
- int if_count = loc_vars++;
- int i;
- code_variable(node->childs[0], ST,func); //Operator
- printf("br i1 %%%d, label %%%d\n\n", label,if_count-1);
- printf("<label>:%d\n",label);
- for(i = 1;i<node->numChilds;i++){
- code_variable(node->childs[i],ST,func);
- }
- if(strcmp(node->type,"While")==0){
- printf("br label %%%d\n\n",label );
- }
- }
- void code_variable(Node* node,Symbol* ST,char* func){
- int i;
- for(i=0;i<node->numChilds;i++){
- code_variable(node->childs[i],ST,func);
- }
- if(strcmp(node->type,"Declaration")==0)
- code_declaration(node,func);
- else if(strcmp(node->type,"Store") == 0)
- code_store(node,ST,func);
- /*else if(strcmp(node->type,"If") == 0 ||strcmp(node->type,"While") == 0 )
- code_if_while(node,ST,func);*/
- else if(strcmp(node->type,"Add")==0)
- code_add_sub_div(node,ST,func,strdup("add nsw"));
- else if(strcmp(node->type,"Sub")==0)
- code_add_sub_div(node,ST,func,strdup("sub nsw"));
- else if(strcmp(node->type,"Div")==0)
- code_add_sub_div(node,ST,func,strdup("sdiv"));
- else if(strcmp(node->type,"Mul")==0)
- code_add_sub_div(node,ST,func,strdup("mul"));
- /*else
- printf("\n\n%s\n\n",node->type);*/
- }
- void code_id(Node* node,Symbol* ST,char* func){
- Symbol * symb1 = search_var(node->value,ST,func);
- local_vars[loc_vars++] = strdup("null");
- if(!symb1->is_global)
- printf("%%%d = load %s, %s* %%%s, align %d\n",loc_vars,type_to_llvmtype(symb1->type),type_to_llvmtype(symb1->type),search_on_localvars(symb1->id),type_num_bits(symb1->type));
- else{
- printf("%%%d = load %s, %s* @%s, align %d\n",loc_vars,type_to_llvmtype(symb1->type),type_to_llvmtype(symb1->type),symb1->id,type_num_bits(symb1->type));
- }
- }
- char* code_add_sub_div(Node* node,Symbol* ST,char* func,char* option){
- node->value = strdup("");
- if((strcmp(node->childs[0]->type,"IntLit")==0 || strcmp(node->childs[0]->type,"RealLit")==0 || strcmp(node->childs[0]->type,"ChrLit")==0) && (strcmp(node->childs[1]->type,"IntLit")==0 || strcmp(node->childs[1]->type,"RealLit")==0 || strcmp(node->childs[1]->type,"ChrLit")==0)){
- node->has_special_value = 1;
- if(strcmp(option,"add nsw")==0){
- if(strcmp(node->childs[0]->s_type,"int")==0 && strcmp(node->childs[1]->s_type,"int")==0)
- sprintf(node->value,"%d",atoi(node->childs[0]->value) + atoi(node->childs[1]->value));
- else
- sprintf(node->value,"%f",atof(node->childs[0]->value) + atof(node->childs[1]->value));
- }
- else if(strcmp(option,"sub nsw")==0){
- if(strcmp(node->childs[0]->s_type,"int")==0 && strcmp(node->childs[1]->s_type,"int")==0)
- sprintf(node->value,"%d",atoi(node->childs[0]->value) - atoi(node->childs[1]->value));
- else
- sprintf(node->value,"%f",atof(node->childs[0]->value) - atof(node->childs[1]->value));
- }else if(strcmp(option,"sdiv")==0){
- if(strcmp(node->childs[0]->s_type,"int")==0 && strcmp(node->childs[1]->s_type,"int")==0)
- sprintf(node->value,"%d",atoi(node->childs[0]->value) / atoi(node->childs[1]->value));
- else
- sprintf(node->value,"%f",atof(node->childs[0]->value) / atof(node->childs[1]->value));
- }else if(strcmp(option,"mul")==0){
- if(strcmp(node->childs[0]->s_type,"int")==0 && strcmp(node->childs[1]->s_type,"int")==0)
- sprintf(node->value,"%d",atoi(node->childs[0]->value) * atoi(node->childs[1]->value));
- else
- sprintf(node->value,"%f",atof(node->childs[0]->value) * atof(node->childs[1]->value));
- }
- }else if(strcmp(node->childs[0]->type,"Id")==0 || strcmp(node->childs[1]->type,"Id")==0){
- if(strcmp(node->childs[0]->type,"Id")==0 && strcmp(node->childs[1]->type,"Id")==0){
- code_id(node->childs[0],ST,func);
- code_id(node->childs[1],ST,func);
- local_vars[loc_vars++] = strdup("null");
- printf("%%%d = %s %s %%%d, %%%d\n",loc_vars,option,type_to_llvmtype(node->s_type),loc_vars-2,loc_vars-1);
- }
- else if(strcmp(node->childs[0]->type,"Id")==0){
- code_id(node->childs[0],ST,func);
- local_vars[loc_vars++] = strdup("null");
- printf("%%%d = %s %s %%%d, %s\n",loc_vars,option,type_to_llvmtype(node->s_type),loc_vars-1,node->childs[1]->value);
- }else if(strcmp(node->childs[1]->type,"Id")==0){
- code_id(node->childs[1],ST,func);
- local_vars[loc_vars++] = strdup("null");
- printf("%%%d = %s %s %s, %%%d\n",loc_vars,option,type_to_llvmtype(node->s_type),node->childs[0]->value,loc_vars-1);
- }
- sprintf(node->value,"%%%d",loc_vars);
- }else{
- local_vars[loc_vars++] = strdup("null");
- printf("%%%d = %s %s %s, %s\n",loc_vars,option,type_to_llvmtype(node->s_type),node->childs[0]->value,node->childs[1]->value);
- sprintf(node->value,"%%%d",loc_vars);
- }
- return node->value;
- /*if(strcmp(node->childs[0]->type,"Id")==0 && strcmp(node->childs[1]->type,"Id")==0){
- local_vars[loc_vars++] = strdup("null");
- printf("%%%d = %s %s %%%d, %%%d\n",loc_vars,option,type_to_llvmtype(node->s_type),search_on_localvars(node->childs[0]->value),search_on_localvars(node->childs[0]->value));
- }else if(strcmp(node->childs[0]->type,"Add")==0 || strcmp(node->childs[0]->type,"Sub")==0 || strcmp(node->childs[0]->type,"Div")==0 || strcmp(node->childs[1]->type,"Add")==0 || strcmp(node->childs[1]->type,"Sub")==0 || strcmp(node->childs[1]->type,"Div")==0){
- return "null";
- }else if(strcmp(node->childs[0]->type,"Id")==0){
- symb1 = search_var(node->childs[0]->value,ST,func);
- local_vars[loc_vars++] = strdup("null");
- child0 = loc_vars;
- printf("%%%d = load %s, %s* %%%s, align %d\n",loc_vars,type_to_llvmtype(symb1->type),type_to_llvmtype(symb1->type),search_on_localvars(symb1->id),type_num_bits(symb1->type));
- local_vars[loc_vars++] = strdup("null");
- if(option == 1)
- printf("%%%d = add nsw %s %%%d, %s\n",loc_vars,type_to_llvmtype(node->s_type),child0,double_int(node->childs[1]->type,node->childs[1]->value));
- else if(option == 2)
- printf("%%%d = sub nsw %s %%%d, %s\n",loc_vars,type_to_llvmtype(node->s_type),child0,double_int(node->childs[1]->type,node->childs[1]->value));
- else
- printf("%%%d = sdiv %s %%%d, %s\n",loc_vars,type_to_llvmtype(node->s_type),child0,double_int(node->childs[1]->type,node->childs[1]->value));
- }else if(strcmp(node->childs[1]->type,"Id")==0){
- symb1 = search_var(node->childs[1]->value,ST,func);
- local_vars[loc_vars++] = strdup("null");
- child0 = loc_vars;
- printf("%%%d = load %s, %s* %%%s, align %d\n",loc_vars,type_to_llvmtype(symb1->type),type_to_llvmtype(symb1->type),search_on_localvars(symb1->id),type_num_bits(symb1->type));
- local_vars[loc_vars++] = strdup("null");
- if(option ==1)
- printf("%%%d = add nsw %s %s, %%%d\n",loc_vars,type_to_llvmtype(node->s_type),double_int(node->childs[0]->type,node->childs[0]->value),child0);
- else if(option ==2)
- printf("%%%d = sub nsw %s %s, %%%d\n",loc_vars,type_to_llvmtype(node->s_type),double_int(node->childs[0]->type,node->childs[0]->value),child0);
- else
- printf("%%%d = sdiv %s %s, %%%d\n",loc_vars,type_to_llvmtype(node->s_type),double_int(node->childs[0]->type,node->childs[0]->value),child0);
- }else{
- if(option == 1){
- if(strcmp(node->s_type,"int")==0 || strcmp(node->s_type,"char")==0)
- sprintf(str,"%d",atoi(node->childs[0]->value) + atoi(node->childs[1]->value));
- else if(strcmp(node->s_type,"double")==0)
- sprintf(str,"%f",atof(node->childs[0]->value) + atof(node->childs[1]->value));
- }
- else if(option == 2){
- if(strcmp(node->s_type,"int")==0 || strcmp(node->s_type,"char")==0)
- sprintf(str,"%d",atoi(node->childs[0]->value) - atoi(node->childs[1]->value));
- else if(strcmp(node->s_type,"double")==0)
- sprintf(str,"%f",atof(node->childs[0]->value) - atof(node->childs[1]->value));
- }else{
- if(strcmp(node->s_type,"int")==0 || strcmp(node->s_type,"char")==0)
- sprintf(str,"%d",atoi(node->childs[0]->value) / atoi(node->childs[1]->value));
- else if(strcmp(node->s_type,"double")==0)
- sprintf(str,"%f",(double) (atof(node->childs[0]->value) / atof(node->childs[1]->value)));
- }
- return str;
- }
- return "null";*/
- }
- char* search_on_localvars(char* var){
- int i;
- char* str = strdup(var);
- for(i=0;i<loc_vars;i++){
- if(strcmp(local_vars[i],var)==0){
- sprintf(str,"%d",i+1);
- break;
- }
- }
- return str;
- }
- Symbol* search_var(char*var,Symbol* ST,char* func){
- Symbol* curNode = ST;
- Symbol* curNode2;
- while(curNode!=NULL){
- if(strcmp(curNode->id,func)==0){
- curNode2 = curNode->func_definition;
- while(curNode2!=NULL){
- if(strcmp(curNode2->id,var)==0){
- curNode2->is_global = 0;
- return curNode2;
- }
- curNode2 = curNode2->next;
- }
- }
- if(strcmp(curNode->id,var)==0){
- curNode->is_global = 1;
- return curNode;
- }
- curNode = curNode->next;
- }
- return NULL;
- }
- char* double_int(char* type,Node* node){
- char* str = node->value;
- if(strcmp(type,"Double")==0 || strcmp(type,"double")==0){
- sprintf(str,"%f",(double)atof(node->value));
- }
- else if(strcmp(type,"Char")==0){
- sprintf(str,"%d",get_ascii_code(node->value));
- }else if(strcmp(type,"int")==0){
- sprintf(str,"%d",atoi(node->value));
- }
- return str;
- }
- int type_num_bits(char* type){
- if(strcmp(type,"Int")==0 || strcmp(type,"int")==0)
- return 4;
- else if(strcmp(type,"Double")==0 || strcmp(type,"double")==0)
- return 8;
- else if(strcmp(type,"Char")==0|| strcmp(type,"char")==0)
- return 1;
- else if(strcmp(type,"Short")==0|| strcmp(type,"short")==0)
- return 2;
- else
- printf("Função: TYPE TO LLVMTYPE -> Não estás à espera do tipo: %s",type);
- return -1;
- }
- char* type_to_llvmtype(char* type){
- if(strcmp(type,"Int")==0 || strcmp(type,"int")==0)
- return "i32";
- else if(strcmp(type,"Double")==0 || strcmp(type,"double")==0)
- return "double";
- else if(strcmp(type,"Char")==0|| strcmp(type,"char")==0)
- return "i8";
- else if(strcmp(type,"Short")==0|| strcmp(type,"short")==0)
- return "i16";
- else if(strcmp(type,"Void")==0|| strcmp(type,"void")==0)
- return "void";
- else
- printf("Função: TYPE TO LLVMTYPE -> Não estás à espera do tipo: %s\n",type);
- return NULL;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement