Advertisement
Guest User

Untitled

a guest
May 27th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.54 KB | None | 0 0
  1. #include "code.h"
  2. char* global_vars[1000] = {0};
  3. int pos_global_vars[1000] = {0};
  4. int glob_vars = 0;
  5. char* local_vars[1000] = {0};
  6. int pos_local_vars[1000] = {0};
  7. int loc_vars = 1;
  8. void code(Node* ast,Symbol* ST){
  9. int i;
  10. if(strcmp(ast->type,"Program")==0){
  11. for(i=0;i<ast->numChilds;i++){
  12. if(strcmp(ast->childs[i]->type,"Declaration")==0){
  13.  
  14. code_declaration(ast->childs[i],NULL);
  15. }
  16. else if(strcmp(ast->childs[i]->type,"FuncDefinition")==0){
  17. code_funcdefinition(ast->childs[i],ST);
  18. }
  19. }
  20. }
  21.  
  22. }
  23.  
  24. int code_funcdefinition(Node* node,Symbol* ST){
  25. printf("define %s @%s(",type_to_llvmtype(node->childs[0]->type),node->childs[1]->value); //header function
  26. int i;
  27. Node* param;
  28. int localparams;
  29.  
  30. for(i=0;i<node->childs[2]->numChilds;i++){
  31. if(i>0)
  32. printf(", ");
  33. param = node->childs[2]->childs[i];
  34. if(strcmp(param->childs[0]->type,"Void")!=0 && strcmp(param->childs[0]->type,"Char")!=0 )
  35. printf("%s %%%s",type_to_llvmtype(param->childs[0]->type),param->childs[1]->value); // params function
  36. else if(strcmp(param->childs[0]->type,"Char")==0)
  37. printf("%s signext %%%s",type_to_llvmtype(param->childs[0]->type),param->childs[1]->value); // params function
  38. }
  39. printf("){\n");
  40. if(strcmp(node->childs[0]->type,"Void")!=0){
  41. printf("%%1 = alloca %s, align %d\n",type_to_llvmtype(node->childs[0]->type),type_num_bits(node->childs[0]->type)); //alloca return type
  42.  
  43. }
  44. for(i=0;i<node->childs[2]->numChilds;i++){
  45. param = node->childs[2]->childs[i];
  46. if(strcmp(param->childs[0]->type,"Void")!=0){
  47. local_vars[loc_vars++] = strdup("null");
  48. 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
  49. }
  50.  
  51. }
  52. code_variable(node->childs[3],ST,node->childs[1]->value);
  53.  
  54. localparams = loc_vars - node->childs[2]->numChilds;
  55. for(i=0;i<node->childs[2]->numChilds;i++){
  56. param = node->childs[2]->childs[i];
  57. if(strcmp(param->childs[0]->type,"Void")!=0){
  58. local_vars[localparams++] = strdup(param->childs[1]->value);
  59. 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
  60. }
  61. }
  62.  
  63. if(strcmp(node->childs[0]->type,"Void")==0)
  64. printf("ret void\n");
  65. printf("}\n");
  66.  
  67.  
  68. }
  69. int get_ascii_code(char* string){ //Ainda nao está totalmente funcional
  70. char* p;
  71. if(string[1] == '\\'){
  72. if(string[2] == 'n')
  73. return '\n';
  74. else if(string[2] == 'r')
  75. return '\r';
  76. else if(string[2] == 't')
  77. return '\t';
  78. else{
  79. return '\0';
  80. }
  81. }
  82.  
  83.  
  84. }
  85. void code_declaration(Node* node,char* func){
  86.  
  87. if(func==NULL){
  88. printf("@%s = global %s ",node->childs[1]->value,type_to_llvmtype(node->childs[0]->type));
  89. if(node->numChilds==2)
  90. printf("%s, align ",double_int(node->childs[0]->type,"0"));
  91. else
  92. printf("%s, align ",double_int(node->childs[0]->type,node->childs[2]->value));
  93. printf("%d\n",type_num_bits(node->childs[0]->type));
  94. }
  95. else{
  96. 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));
  97. if(node->numChilds==3){
  98. 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));
  99. }
  100. }
  101.  
  102. }
  103. void code_store(Node* node){
  104. if(strcmp(node->childs[1]->type,"IntLit")==0){
  105. 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));
  106.  
  107. }
  108. else if(strcmp(node->childs[1]->type,"ChrLit")==0){
  109. 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));
  110.  
  111. }
  112. else if(strcmp(node->childs[1]->type,"RealLit")==0){
  113. 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));
  114.  
  115. }
  116. else{
  117. 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));
  118.  
  119. }
  120. }
  121. void code_if_while(Node* node,Symbol* ST,char* func){
  122. int label = loc_vars++;
  123. int if_count = loc_vars++;
  124. int i;
  125. code_variable(node->childs[0], ST,func); //Operator
  126. printf("br i1 %%%d, label %%%d\n\n", label,if_count-1);
  127. printf("<label>:%d\n",label);
  128. for(i = 1;i<node->numChilds;i++){
  129. code_variable(node->childs[i],ST,func);
  130. }
  131. if(strcmp(node->type,"While")==0){
  132. printf("br label %%%d\n\n",label );
  133. }
  134. }
  135. void code_variable(Node* node,Symbol* ST,char* func){
  136. int i;
  137.  
  138. for(i=0;i<node->numChilds;i++){
  139. code_variable(node->childs[i],ST,func);
  140. }
  141. if(strcmp(node->type,"Add")==0)
  142. code_add(node,ST,func);
  143. else if(strcmp(node->type,"Declaration")==0)
  144. code_declaration(node,func);
  145. else if(strcmp(node->type,"Store") == 0)
  146. code_store(node);
  147. else if(strcmp(node->type,"If") == 0 ||strcmp(node->type,"While") == 0 )
  148. code_if_while(node,ST,func);
  149.  
  150. }
  151.  
  152. void code_add(Node* node,Symbol* ST,char* func){
  153. Symbol * symb1,*symb2;
  154. int child0,child1;
  155. if(strcmp(node->childs[0]->type,"Id")==0 && strcmp(node->childs[1]->type,"Id")==0){
  156. symb1 = search_var(node->childs[0]->value,ST,func);
  157. symb2 = search_var(node->childs[1]->value,ST,func);
  158. local_vars[loc_vars++] = strdup("null");
  159. child0 = loc_vars;
  160. 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));
  161. local_vars[loc_vars++] = strdup("null");
  162. child1 = loc_vars;
  163. 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));
  164.  
  165. local_vars[loc_vars++] = strdup("null");
  166. printf("%%%d = add nsw %s %%%d, %%%d\n",loc_vars,type_to_llvmtype(node->s_type),child0,child1);
  167. /*if(strcmp(node->childs[0]->type,"Id")==0)
  168. printf("%%%d, ",search_on_localvars(node->childs[0]->value));
  169. else
  170. printf("%s, ",double_int(node->childs[0]->type,node->childs[0]->value));
  171. if(strcmp(node->childs[1]->type,"Id")==0)
  172. printf("%%%d\n",search_on_localvars(node->childs[1]->value));
  173. else
  174. printf("%s\n",double_int(node->childs[1]->type,node->childs[1]->value));*/
  175. }else if(strcmp(node->childs[0]->type,"Id")==0){
  176. symb1 = search_var(node->childs[0]->value,ST,func);
  177. local_vars[loc_vars++] = strdup("null");
  178. child0 = loc_vars;
  179. 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));
  180. local_vars[loc_vars++] = strdup("null");
  181. 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));
  182.  
  183. }else if(strcmp(node->childs[1]->type,"Id")==0){
  184. symb1 = search_var(node->childs[1]->value,ST,func);
  185. local_vars[loc_vars++] = strdup("null");
  186. child0 = loc_vars;
  187. 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));
  188. local_vars[loc_vars++] = strdup("null");
  189. 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);
  190.  
  191. }
  192.  
  193. }
  194. int search_on_localvars(char* var){
  195. int i;
  196. for(i=0;i<loc_vars;i++){
  197. if(strcmp(local_vars[i],var)==0)
  198. return i+1;
  199. }
  200. return -1;
  201.  
  202. }
  203. void code_id(Node* node){
  204. /*if(search_var_on_function(node->value)>=0){
  205. printf("sad");
  206. }*/
  207. }
  208. Symbol* search_var(char*var,Symbol* ST,char* func){
  209. Symbol* curNode = ST;
  210. Symbol* curNode2;
  211. while(curNode!=NULL){
  212. if(strcmp(curNode->id,func)==0){
  213. curNode2 = curNode->func_definition;
  214. while(curNode2!=NULL){
  215. if(strcmp(curNode2->id,var)==0)
  216. return curNode2;
  217. curNode2 = curNode2->next;
  218. }
  219.  
  220. }
  221. curNode = curNode->next;
  222. }
  223. return NULL;
  224.  
  225. }
  226.  
  227. char* double_int(char* type,char* value){
  228. char* str = value;
  229. if(strcmp(type,"Double")==0)
  230. sprintf(str,"%s.0",value);
  231. else if(strcmp(type,"Char")==0){
  232. sprintf(str,"%d",get_ascii_code(value));
  233. }
  234. return str;
  235. }
  236. int type_num_bits(char* type){
  237. if(strcmp(type,"Int")==0 || strcmp(type,"int")==0)
  238. return 4;
  239. else if(strcmp(type,"Double")==0 || strcmp(type,"double")==0)
  240. return 8;
  241. else if(strcmp(type,"Char")==0|| strcmp(type,"char")==0)
  242. return 1;
  243. else if(strcmp(type,"Short")==0|| strcmp(type,"short")==0)
  244. return 2;
  245. else
  246. printf("Função: TYPE TO LLVMTYPE -> Não estás à espera do tipo: %s",type);
  247.  
  248. }
  249. char* type_to_llvmtype(char* type){
  250. if(strcmp(type,"Int")==0 || strcmp(type,"int")==0)
  251. return "i32";
  252. else if(strcmp(type,"Double")==0 || strcmp(type,"double")==0)
  253. return "double";
  254. else if(strcmp(type,"Char")==0|| strcmp(type,"char")==0)
  255. return "i8";
  256. else if(strcmp(type,"Short")==0|| strcmp(type,"short")==0)
  257. return "i16";
  258. else if(strcmp(type,"Void")==0|| strcmp(type,"void")==0)
  259. return "void";
  260. else
  261. printf("Função: TYPE TO LLVMTYPE -> Não estás à espera do tipo: %s\n",type);
  262.  
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement