4 #include "llvm_codegen_visitor.h"
6 static bool is_symboldecl
= FALSE
;
7 static void _print_symbol_table(struct AstNode
*node
);
8 static void _print_symbols(Symbol
*symbol
);
13 Visitor
*visitor
= (Visitor
*) malloc (sizeof(Visitor
));
15 visitor
->visit_program
= &llvm_codegen_visit_program
;
16 visitor
->visit_programdecl
= &llvm_codegen_visit_programdecl
;
17 visitor
->visit_vardecl_list
= &llvm_codegen_visit_vardecl_list
;
18 visitor
->visit_vardecl
= &llvm_codegen_visit_simplenode
;
19 visitor
->visit_identifier_list
= &llvm_codegen_visit_identifier_list
;
20 visitor
->visit_procfunc_list
= &llvm_codegen_visit_procfunc_list
;
21 visitor
->visit_procedure
= &llvm_codegen_visit_procfunc
;
22 visitor
->visit_function
= &llvm_codegen_visit_procfunc
;
23 visitor
->visit_param_list
= &llvm_codegen_visit_param_list
;
24 visitor
->visit_parameter
= &llvm_codegen_visit_simplenode
;
25 visitor
->visit_statement_list
= &llvm_codegen_visit_statement_list
;
26 visitor
->visit_printint_stmt
= &llvm_codegen_visit_simplenode
;
27 visitor
->visit_printchar_stmt
= &llvm_codegen_visit_simplenode
;
28 visitor
->visit_printbool_stmt
= &llvm_codegen_visit_simplenode
;
29 visitor
->visit_printline_stmt
= &llvm_codegen_visit_simplenode
;
30 visitor
->visit_assignment_stmt
= &llvm_codegen_visit_simplenode
;
31 visitor
->visit_if_stmt
= &llvm_codegen_visit_simplenode
;
32 visitor
->visit_while_stmt
= &llvm_codegen_visit_simplenode
;
33 visitor
->visit_for_stmt
= &llvm_codegen_visit_simplenode
;
34 visitor
->visit_rel_expr
= &llvm_codegen_visit_binary_expr
;
35 visitor
->visit_add_expr
= &llvm_codegen_visit_binary_expr
;
36 visitor
->visit_mul_expr
= &llvm_codegen_visit_binary_expr
;
37 visitor
->visit_notfactor
= &llvm_codegen_visit_simplenode
;
38 visitor
->visit_call
= &llvm_codegen_visit_simplenode
;
39 visitor
->visit_callparam_list
= &llvm_codegen_visit_callparam_list
;
40 visitor
->visit_identifier
= &llvm_codegen_visit_identifier
;
41 visitor
->visit_literal
= &llvm_codegen_visit_literal
;
42 visitor
->visit_add_op
= NULL
;
43 visitor
->visit_mul_op
= NULL
;
44 visitor
->visit_rel_op
= NULL
;
45 visitor
->visit_not_op
= NULL
;
51 llvm_codegen_visit_program(struct AstNode
*node
)
55 printf("/* toypasc AST graph. */\n");
56 printf("digraph {\n");
58 printf("\tremincross=true;\n");
59 printf("\tordering=out;\n");
60 printf("\tcompound=true;\n");
61 printf("\tranksep=1.0;\n");
62 printf("\tnode [fontsize=11,fontname=Courier];\n");
63 printf("\tedge [color=\"#22DDAA\"];\n\n");
65 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
66 printf("filled,color=orange,fillcolor=\"#FFEEEE\"];\n");
68 _print_symbol_table(node
);
72 llvm_codegen_visit_simplenode (struct AstNode
*node
)
74 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
75 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
76 printf("filled,fillcolor=\"#EEFFEE\",color=\"#%s\"];\n",
77 (node
->type
== ERROR
) ? "FF0000" : "EEFFEE");
81 llvm_codegen_visit_programdecl(struct AstNode
*node
)
84 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
85 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
86 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
90 llvm_codegen_visit_vardecl_list (struct AstNode
*node
)
93 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
94 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
95 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
96 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node
);
100 llvm_codegen_visit_identifier_list (struct AstNode
*node
)
102 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
103 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
104 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
105 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node
);
109 llvm_codegen_visit_procfunc_list (struct AstNode
*node
)
111 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
112 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
113 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
117 llvm_codegen_visit_procfunc (struct AstNode
*node
)
119 is_symboldecl
= TRUE
;
120 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
121 printf("\tnode_%x [label=\"%s\\n'%s'\",style=",
122 node
, node
->name
, node
->children
->symbol
->name
);
123 printf("filled,color=blue,fillcolor=\"#EEEEFF\"];\n");
124 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node
);
125 _print_symbol_table(node
);
129 llvm_codegen_visit_param_list (struct AstNode
*node
)
131 is_symboldecl
= TRUE
;
132 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
133 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
134 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
135 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node
);
139 llvm_codegen_visit_statement_list (struct AstNode
*node
)
141 is_symboldecl
= FALSE
;
142 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
143 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
144 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
145 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node
);
149 llvm_codegen_visit_binary_expr (struct AstNode
*node
)
151 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
152 printf("\tnode_%x [label=\"%s\\n(%s)\",style=",
153 node
, node
->name
, node
->children
->sibling
->name
);
154 printf("filled,fillcolor=\"#EEFFEE\",color=\"#%s\"];\n",
155 (node
->type
== ERROR
) ? "FF0000" : "EEFFEE");
159 llvm_codegen_visit_callparam_list (struct AstNode
*node
)
161 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
162 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
163 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
164 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", node
);
168 llvm_codegen_visit_identifier (struct AstNode
*node
)
170 printf("\tnode_%x -> node_%x;\n", node
->parent
, node
);
171 printf("\tnode_%x [label=\"%s\",style=", node
, node
->name
);
172 printf("filled,color=\"#EEFFEE\"];\n");
174 if (node
->symbol
->decl_linenum
== 0) {
175 printf("\tsymbol_%x [label=\"'%s'\\nundeclared\",",
176 node
->symbol
, node
->symbol
->name
);
177 printf("color=red,fillcolor=\"#FFEEEE\",style=filled];\n");
180 printf("\tnode_%x -> symbol_%x", node
, node
->symbol
);
183 printf(" [color=\"#00FF00\"]");
189 llvm_codegen_visit_literal (struct AstNode
*node
)
191 printf("\tnode_%x -> literal_%x;\n", node
->parent
, node
);
192 printf("\tliteral_%x [label=\"", node
);
193 value_print(&node
->value
, node
->type
);
194 printf("\",style=filled,color=\"#FFFFCC\"];\n");
198 llvm_codegen_close_group ()
204 _print_graph(struct AstNode
*self
)
210 struct AstNode
*temp
;
215 is_program
= self
->kind
== PROGRAM
;
216 is_funcproc
= self
->kind
== PROCEDURE
|| self
->kind
== FUNCTION
;
217 is_cluster
= is_program
|| is_funcproc
||
218 self
->kind
== PROGDECL
||
219 strstr(self
->name
, "List");
221 printf("\tnode_%x [label=\"%s\",style=", self
, self
->name
);
225 printf("filled,color=orange,fillcolor=\"#FFEEEE\"];\n");
226 else if (is_funcproc
)
227 printf("filled,color=blue,fillcolor=\"#EEEEFF\"];\n");
229 printf("filled,color=\"#22DDAA\",fillcolor=\"#EEFFEE\"];\n");
230 printf("subgraph cluster_%x {\n\tstyle=dotted;\n", self
, self
->name
);
232 printf("filled,color=\"#EEFFEE\"];\n");
235 printf("\tsubgraph cluster_symtab_0x%x {\tstyle=filled;\n", self
->symbol
);
236 printf("\tcolor=\"#EFEFEF\";\n\tfontname=Courier;\n");
237 printf("\tnode [style=filled,color=white,fillcolor=\"#CCFF99\"];\n");
238 //_ast_node_print_graph_symbol_table(self->symbol);
242 if (self
->children
!= NULL
) {
243 temp
= self
->children
;
244 while (temp
!= NULL
) {
245 printf("\tnode_%x -> node_%x;\n", self
, temp
);
246 temp
= temp
->sibling
;
249 if (self
->symbol
!= NULL
) {
250 printf("\tnode_%x -> symbol_%x [color=lightgray,headport=n];\n",
252 } else if (strstr(self
->name
, "Literal")) {
253 printf("\tliteral_%x [label=\"", self
);
254 value_print(&self
->value
, self
->type
);
255 printf("\",style=filled,color=\"#FFFFCC\"];\n");
256 printf("\tnode_%x -> literal_%x;\n", self
, self
);
261 _print_graph(self
->children
);
266 _print_graph(self
->sibling
);
270 _print_symbol_table(struct AstNode
*node
)
272 if (node
->symbol
->next
== NULL
)
275 printf("\tnode_%x -> symbol_%x [lhead=cluster_symtab_%x,color=",
276 node
, node
->symbol
->next
, node
);
277 if (node
->parent
== NULL
)
278 printf("orange];\n");
282 printf("\tsubgraph cluster_symtab_%x {\n\tstyle=filled;\n", node
);
284 if (node
->parent
== NULL
)
285 printf("\tcolor=orange;\n");
287 printf("\tcolor=blue;\n");
289 printf("\tstyle=filled;\n\tfillcolor=\"#EFEFEF\";\n\tfontname=Courier;\n");
290 printf("\tnode [style=filled,color=white,fillcolor=\"#CCFF99\"];\n");
292 _print_symbols(node
->symbol
->next
);
298 _print_symbols(Symbol
*symbol
)
303 if (symbol
->name
!= NULL
) {
304 printf("\t\tsymbol_%x [shape=record,label=\"{", symbol
);
305 printf("Symbol|Address: 0x%x\\l|lexeme: %s\\l|", symbol
, symbol
->name
);
306 printf("type: %s\\l}\"", type_get_lexeme(symbol
->type
));
307 printf(",style=filled,color=white,fillcolor=\"#CCFF99\"];\n");
310 _print_symbols(symbol
->next
);