Advertisement
Guest User

Untitled

a guest
May 27th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.36 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 = 0;
  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. printf("declare i32 @putchar(i32)\n");
  22. printf("declare i32 @getchar()\n");
  23.  
  24.  
  25. }
  26.  
  27. void code_funcdefinition(Node* node,Symbol* ST){
  28. printf("define %s @%s(",type_to_llvmtype(node->childs[0]->type),node->childs[1]->value); //header function
  29. int i;
  30. Node* param;
  31. int localparams;
  32.  
  33. for(i=0;i<node->childs[2]->numChilds;i++){
  34. if(i>0)
  35. printf(", ");
  36. param = node->childs[2]->childs[i];
  37. if(strcmp(param->childs[0]->type,"Void")!=0 && strcmp(param->childs[0]->type,"Char")!=0 )
  38. printf("%s %%%s",type_to_llvmtype(param->childs[0]->type),param->childs[1]->value); // params function
  39. else if(strcmp(param->childs[0]->type,"Char")==0)
  40. printf("%s signext %%%s",type_to_llvmtype(param->childs[0]->type),param->childs[1]->value); // params function
  41. }
  42. printf("){\n");
  43. /*if(strcmp(node->childs[0]->type,"Void")!=0){
  44. printf("%%1 = alloca %s, align %d\n",type_to_llvmtype(node->childs[0]->type),type_num_bits(node->childs[0]->type)); //alloca return type
  45.  
  46. }*/
  47. for(i=0;i<node->childs[2]->numChilds;i++){
  48. param = node->childs[2]->childs[i];
  49. if(strcmp(param->childs[0]->type,"Void")!=0){
  50. local_vars[loc_vars++] = strdup("null");
  51. 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
  52. }
  53.  
  54. }
  55. localparams = loc_vars - node->childs[2]->numChilds;
  56. for(i=0;i<node->childs[2]->numChilds;i++){
  57. param = node->childs[2]->childs[i];
  58. if(strcmp(param->childs[0]->type,"Void")!=0){
  59. local_vars[localparams++] = strdup(param->childs[1]->value);
  60. 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
  61. }
  62. }
  63. code_variable(node->childs[3],ST,node->childs[1]->value);
  64. if(strcmp(node->childs[0]->type,"Void")==0)
  65. printf("ret void\n");
  66. else if(strcmp(node->childs[0]->type,"Int")==0)
  67. printf("ret i32 0\n");
  68. printf("}\n\n");
  69.  
  70.  
  71. }
  72. int get_ascii_code(char* string){ //Ainda nao está totalmente funcional
  73. if(string[1] == '\\'){
  74. if(string[2] == 'n')
  75. return '\n';
  76. else if(string[2] == 'r')
  77. return '\r';
  78. else if(string[2] == 't')
  79. return '\t';
  80. else{
  81. return '\0';
  82. }
  83. }
  84. return string[1];
  85.  
  86. }
  87. void code_declaration(Node* node,char* func){
  88. Node* node2 = create_node("int",0,0,0);
  89. node2->value = strdup("0");
  90. node2->s_type = strdup("int");
  91. if(func==NULL){
  92. printf("@%s = common global %s ",node->childs[1]->value,type_to_llvmtype(node->childs[0]->type));
  93. if(node->numChilds==2)
  94. printf("%s, align ",double_int(node->childs[0]->type,node2));
  95. else
  96. printf("%s, align ",double_int(node->childs[0]->type,node->childs[2]));
  97. printf("%d\n",type_num_bits(node->childs[0]->type));
  98. }
  99. else{
  100. 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));
  101. if(node->numChilds==3){
  102. 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));
  103. }
  104. }
  105.  
  106. }
  107. void code_store(Node* node,Symbol* ST,char* func){
  108. 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. }else if(strcmp(node->childs[1]->type,"IntLit")==0 || strcmp(node->childs[1]->type,"RealLit")==0){
  112. 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));
  113.  
  114. }else if(node->childs[1]->numChilds>1){
  115. if(!node->childs[1]->has_special_value)
  116. 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));
  117. else
  118. 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));
  119. }else{
  120. 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));
  121.  
  122. }
  123. }
  124. void code_if_while(Node* node,Symbol* ST,char* func){
  125. int label = loc_vars++;
  126. int if_count = loc_vars++;
  127. int i;
  128. code_variable(node->childs[0], ST,func); //Operator
  129. printf("br i1 %%%d, label %%%d\n\n", label,if_count-1);
  130. printf("<label>:%d\n",label);
  131. for(i = 1;i<node->numChilds;i++){
  132. code_variable(node->childs[i],ST,func);
  133. }
  134. if(strcmp(node->type,"While")==0){
  135. printf("br label %%%d\n\n",label );
  136. }
  137. }
  138. void code_variable(Node* node,Symbol* ST,char* func){
  139. int i;
  140.  
  141. for(i=0;i<node->numChilds;i++){
  142. code_variable(node->childs[i],ST,func);
  143. }
  144. if(strcmp(node->type,"Declaration")==0)
  145. code_declaration(node,func);
  146. else if(strcmp(node->type,"Store") == 0)
  147. code_store(node,ST,func);
  148. /*else if(strcmp(node->type,"If") == 0 ||strcmp(node->type,"While") == 0 )
  149. code_if_while(node,ST,func);*/
  150. else if(strcmp(node->type,"Add")==0)
  151. code_add_sub_div(node,ST,func,strdup("add nsw"));
  152. else if(strcmp(node->type,"Sub")==0)
  153. code_add_sub_div(node,ST,func,strdup("sub nsw"));
  154. else if(strcmp(node->type,"Div")==0)
  155. code_add_sub_div(node,ST,func,strdup("sdiv"));
  156. else if(strcmp(node->type,"Mul")==0)
  157. code_add_sub_div(node,ST,func,strdup("mul"));
  158. /*else
  159. printf("\n\n%s\n\n",node->type);*/
  160.  
  161. }
  162. void code_id(Node* node,Symbol* ST,char* func){
  163. Symbol * symb1 = search_var(node->value,ST,func);
  164. local_vars[loc_vars++] = strdup("null");
  165. if(!symb1->is_global)
  166. 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));
  167. else{
  168. 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));
  169. }
  170. }
  171. char* code_add_sub_div(Node* node,Symbol* ST,char* func,char* option){
  172. node->value = strdup("");
  173. 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)){
  174. node->has_special_value = 1;
  175. if(strcmp(option,"add nsw")==0){
  176. if(strcmp(node->childs[0]->s_type,"int")==0 && strcmp(node->childs[1]->s_type,"int")==0)
  177. sprintf(node->value,"%d",atoi(node->childs[0]->value) + atoi(node->childs[1]->value));
  178. else
  179. sprintf(node->value,"%f",atof(node->childs[0]->value) + atof(node->childs[1]->value));
  180. }
  181. else if(strcmp(option,"sub nsw")==0){
  182. if(strcmp(node->childs[0]->s_type,"int")==0 && strcmp(node->childs[1]->s_type,"int")==0)
  183. sprintf(node->value,"%d",atoi(node->childs[0]->value) - atoi(node->childs[1]->value));
  184. else
  185. sprintf(node->value,"%f",atof(node->childs[0]->value) - atof(node->childs[1]->value));
  186. }else if(strcmp(option,"sdiv")==0){
  187. if(strcmp(node->childs[0]->s_type,"int")==0 && strcmp(node->childs[1]->s_type,"int")==0)
  188. sprintf(node->value,"%d",atoi(node->childs[0]->value) / atoi(node->childs[1]->value));
  189. else
  190. sprintf(node->value,"%f",atof(node->childs[0]->value) / atof(node->childs[1]->value));
  191. }else if(strcmp(option,"mul")==0){
  192. if(strcmp(node->childs[0]->s_type,"int")==0 && strcmp(node->childs[1]->s_type,"int")==0)
  193. sprintf(node->value,"%d",atoi(node->childs[0]->value) * atoi(node->childs[1]->value));
  194. else
  195. sprintf(node->value,"%f",atof(node->childs[0]->value) * atof(node->childs[1]->value));
  196. }
  197. }else if(strcmp(node->childs[0]->type,"Id")==0 || strcmp(node->childs[1]->type,"Id")==0){
  198. if(strcmp(node->childs[0]->type,"Id")==0 && strcmp(node->childs[1]->type,"Id")==0){
  199. code_id(node->childs[0],ST,func);
  200. code_id(node->childs[1],ST,func);
  201. local_vars[loc_vars++] = strdup("null");
  202. printf("%%%d = %s %s %%%d, %%%d\n",loc_vars,option,type_to_llvmtype(node->s_type),loc_vars-2,loc_vars-1);
  203. }
  204. else if(strcmp(node->childs[0]->type,"Id")==0){
  205. code_id(node->childs[0],ST,func);
  206. local_vars[loc_vars++] = strdup("null");
  207. printf("%%%d = %s %s %%%d, %s\n",loc_vars,option,type_to_llvmtype(node->s_type),loc_vars-1,node->childs[1]->value);
  208.  
  209. }else if(strcmp(node->childs[1]->type,"Id")==0){
  210. code_id(node->childs[1],ST,func);
  211. local_vars[loc_vars++] = strdup("null");
  212. printf("%%%d = %s %s %s, %%%d\n",loc_vars,option,type_to_llvmtype(node->s_type),node->childs[0]->value,loc_vars-1);
  213.  
  214. }
  215. sprintf(node->value,"%%%d",loc_vars);
  216.  
  217. }else{
  218. local_vars[loc_vars++] = strdup("null");
  219. printf("%%%d = %s %s %s, %s\n",loc_vars,option,type_to_llvmtype(node->s_type),node->childs[0]->value,node->childs[1]->value);
  220. sprintf(node->value,"%%%d",loc_vars);
  221.  
  222. }
  223. return node->value;
  224. /*if(strcmp(node->childs[0]->type,"Id")==0 && strcmp(node->childs[1]->type,"Id")==0){
  225. local_vars[loc_vars++] = strdup("null");
  226. 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));
  227.  
  228. }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){
  229. return "null";
  230.  
  231.  
  232. }else if(strcmp(node->childs[0]->type,"Id")==0){
  233. symb1 = search_var(node->childs[0]->value,ST,func);
  234. local_vars[loc_vars++] = strdup("null");
  235. child0 = loc_vars;
  236. 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));
  237. local_vars[loc_vars++] = strdup("null");
  238. if(option == 1)
  239. 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));
  240. else if(option == 2)
  241. 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));
  242. else
  243. 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));
  244. }else if(strcmp(node->childs[1]->type,"Id")==0){
  245. symb1 = search_var(node->childs[1]->value,ST,func);
  246. local_vars[loc_vars++] = strdup("null");
  247. child0 = loc_vars;
  248. 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));
  249. local_vars[loc_vars++] = strdup("null");
  250. if(option ==1)
  251. 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);
  252. else if(option ==2)
  253. 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);
  254. else
  255. 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);
  256.  
  257. }else{
  258. if(option == 1){
  259. if(strcmp(node->s_type,"int")==0 || strcmp(node->s_type,"char")==0)
  260. sprintf(str,"%d",atoi(node->childs[0]->value) + atoi(node->childs[1]->value));
  261. else if(strcmp(node->s_type,"double")==0)
  262. sprintf(str,"%f",atof(node->childs[0]->value) + atof(node->childs[1]->value));
  263. }
  264. else if(option == 2){
  265. if(strcmp(node->s_type,"int")==0 || strcmp(node->s_type,"char")==0)
  266. sprintf(str,"%d",atoi(node->childs[0]->value) - atoi(node->childs[1]->value));
  267. else if(strcmp(node->s_type,"double")==0)
  268. sprintf(str,"%f",atof(node->childs[0]->value) - atof(node->childs[1]->value));
  269. }else{
  270. if(strcmp(node->s_type,"int")==0 || strcmp(node->s_type,"char")==0)
  271. sprintf(str,"%d",atoi(node->childs[0]->value) / atoi(node->childs[1]->value));
  272. else if(strcmp(node->s_type,"double")==0)
  273. sprintf(str,"%f",(double) (atof(node->childs[0]->value) / atof(node->childs[1]->value)));
  274. }
  275. return str;
  276.  
  277.  
  278. }
  279. return "null";*/
  280.  
  281. }
  282. char* search_on_localvars(char* var){
  283. int i;
  284. char* str = strdup(var);
  285. for(i=0;i<loc_vars;i++){
  286. if(strcmp(local_vars[i],var)==0){
  287. sprintf(str,"%d",i+1);
  288. break;
  289. }
  290. }
  291. return str;
  292.  
  293. }
  294.  
  295. Symbol* search_var(char*var,Symbol* ST,char* func){
  296. Symbol* curNode = ST;
  297. Symbol* curNode2;
  298. while(curNode!=NULL){
  299. if(strcmp(curNode->id,func)==0){
  300. curNode2 = curNode->func_definition;
  301. while(curNode2!=NULL){
  302. if(strcmp(curNode2->id,var)==0){
  303. curNode2->is_global = 0;
  304. return curNode2;
  305. }
  306. curNode2 = curNode2->next;
  307. }
  308.  
  309. }
  310. if(strcmp(curNode->id,var)==0){
  311. curNode->is_global = 1;
  312. return curNode;
  313. }
  314. curNode = curNode->next;
  315. }
  316. return NULL;
  317.  
  318. }
  319.  
  320. char* double_int(char* type,Node* node){
  321. char* str = node->value;
  322. if(strcmp(type,"Double")==0 || strcmp(type,"double")==0){
  323. sprintf(str,"%f",(double)atof(node->value));
  324. }
  325. else if(strcmp(type,"Char")==0){
  326. sprintf(str,"%d",get_ascii_code(node->value));
  327. }else if(strcmp(type,"int")==0){
  328. sprintf(str,"%d",atoi(node->value));
  329. }
  330. return str;
  331. }
  332. int type_num_bits(char* type){
  333. if(strcmp(type,"Int")==0 || strcmp(type,"int")==0)
  334. return 4;
  335. else if(strcmp(type,"Double")==0 || strcmp(type,"double")==0)
  336. return 8;
  337. else if(strcmp(type,"Char")==0|| strcmp(type,"char")==0)
  338. return 1;
  339. else if(strcmp(type,"Short")==0|| strcmp(type,"short")==0)
  340. return 2;
  341. else
  342. printf("Função: TYPE TO LLVMTYPE -> Não estás à espera do tipo: %s",type);
  343. return -1;
  344. }
  345. char* type_to_llvmtype(char* type){
  346. if(strcmp(type,"Int")==0 || strcmp(type,"int")==0)
  347. return "i32";
  348. else if(strcmp(type,"Double")==0 || strcmp(type,"double")==0)
  349. return "double";
  350. else if(strcmp(type,"Char")==0|| strcmp(type,"char")==0)
  351. return "i8";
  352. else if(strcmp(type,"Short")==0|| strcmp(type,"short")==0)
  353. return "i16";
  354. else if(strcmp(type,"Void")==0|| strcmp(type,"void")==0)
  355. return "void";
  356. else
  357. printf("Função: TYPE TO LLVMTYPE -> Não estás à espera do tipo: %s\n",type);
  358. return NULL;
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement