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 = 1;
- 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);
- }
- }
- }
- }
- int 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
- }
- }
- code_variable(node->childs[3],ST,node->childs[1]->value);
- 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
- }
- }
- if(strcmp(node->childs[0]->type,"Void")==0)
- printf("ret void\n");
- printf("}\n");
- }
- int get_ascii_code(char* string){ //Ainda nao está totalmente funcional
- char* p;
- 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';
- }
- }
- }
- void code_declaration(Node* node,char* func){
- if(func==NULL){
- printf("@%s = 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,"0"));
- else
- printf("%s, align ",double_int(node->childs[0]->type,node->childs[2]->value));
- 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[1]->type),node->childs[1]->value,type_to_llvmtype(node->childs[1]->type),node->childs[0]->value,type_num_bits(node->childs[0]->type));
- }
- }
- }
- void code_store(Node* node){
- if(strcmp(node->childs[1]->type,"IntLit")==0){
- 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));
- }
- else 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,"RealLit")==0){
- 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));
- }
- 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,"Add")==0)
- code_add(node,ST,func);
- else if(strcmp(node->type,"Declaration")==0)
- code_declaration(node,func);
- else if(strcmp(node->type,"Store") == 0)
- code_store(node);
- else if(strcmp(node->type,"If") == 0 ||strcmp(node->type,"While") == 0 )
- code_if_while(node,ST,func);
- }
- void code_add(Node* node,Symbol* ST,char* func){
- Symbol * symb1,*symb2;
- int child0,child1;
- if(strcmp(node->childs[0]->type,"Id")==0 && strcmp(node->childs[1]->type,"Id")==0){
- symb1 = search_var(node->childs[0]->value,ST,func);
- symb2 = search_var(node->childs[1]->value,ST,func);
- local_vars[loc_vars++] = strdup("null");
- child0 = loc_vars;
- printf("%%%d = load %s, %s* %%%d, 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");
- child1 = loc_vars;
- printf("%%%d = load %s, %s* %%%d, align %d\n",loc_vars,type_to_llvmtype(symb2->type),type_to_llvmtype(symb2->type),search_on_localvars(symb2->id),type_num_bits(symb2->type));
- local_vars[loc_vars++] = strdup("null");
- printf("%%%d = add nsw %s %%%d, %%%d\n",loc_vars,type_to_llvmtype(node->s_type),child0,child1);
- /*if(strcmp(node->childs[0]->type,"Id")==0)
- printf("%%%d, ",search_on_localvars(node->childs[0]->value));
- else
- printf("%s, ",double_int(node->childs[0]->type,node->childs[0]->value));
- if(strcmp(node->childs[1]->type,"Id")==0)
- printf("%%%d\n",search_on_localvars(node->childs[1]->value));
- else
- printf("%s\n",double_int(node->childs[1]->type,node->childs[1]->value));*/
- }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* %%%d, 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");
- 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(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* %%%d, 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");
- 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);
- }
- }
- int search_on_localvars(char* var){
- int i;
- for(i=0;i<loc_vars;i++){
- if(strcmp(local_vars[i],var)==0)
- return i+1;
- }
- return -1;
- }
- void code_id(Node* node){
- /*if(search_var_on_function(node->value)>=0){
- printf("sad");
- }*/
- }
- 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)
- return curNode2;
- curNode2 = curNode2->next;
- }
- }
- curNode = curNode->next;
- }
- return NULL;
- }
- char* double_int(char* type,char* value){
- char* str = value;
- if(strcmp(type,"Double")==0)
- sprintf(str,"%s.0",value);
- else if(strcmp(type,"Char")==0){
- sprintf(str,"%d",get_ascii_code(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);
- }
- 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);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement