1 /* This file is part of GCC.
3 GCC is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 3, or (at your option)
8 GCC is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with GCC; see the file COPYING3. If not see
15 <http://www.gnu.org/licenses/>. */
19 static bool _no_infer
= false;
20 static bool first
= true;
22 #define RDOT_PREFIX_PRE ".pre-rdot"
23 #define RDOT_PREFIX_POST ".pst-rdot"
25 static const char * typeStrings
[] = {
36 typeStringNode (const rdot node
)
40 if (RDOT_MEM_MODIFIER (node
))
42 std::vector
<ALLOCA_
>::iterator it
;
43 for (it
= RDOT_MEM_MODIFIER (node
)->begin ();
44 it
!= RDOT_MEM_MODIFIER (node
)->end (); ++it
)
50 buffer
[offset
] = '~';
56 buffer
[offset
] = '&';
62 buffer
[offset
] = '*';
71 switch (RDOT_TYPE (node
))
74 strcpy (buffer
+offset
, typeStrings
[0]);
78 strcpy (buffer
+offset
, typeStrings
[1]);
82 strcpy (buffer
+offset
, typeStrings
[2]);
86 strcpy (buffer
+offset
, typeStrings
[3]);
92 fatal_error ("gcc-rust has failed to infer a type and cannot continue");
94 strcpy (buffer
+offset
, typeStrings
[4]);
98 case RTYPE_USER_STRUCT
:
99 strcpy (buffer
+offset
, RDOT_IDENTIFIER_POINTER (RDOT_lhs_TT (node
)));
103 fatal_error ("unhandled type [%s]", RDOT_OPCODE_STR (node
));
107 return xstrdup (buffer
);
110 static void dot_pass_dump_node (FILE *, rdot
, size_t);
111 static void dot_pass_dump_method (FILE *, rdot
, size_t);
112 static void dot_pass_dump_struct (FILE *, rdot
, size_t);
114 static void dot_pass_dumpPrimitive (FILE *, rdot
);
115 static void dot_pass_dumpExprNode (FILE *, rdot
);
116 static void dot_pass_dump_expr (FILE *, rdot
);
119 void dot_pass_dump_struct (FILE * fd
, rdot node
, size_t indents
)
122 for (i
= 0; i
< indents
; ++i
)
125 rdot ident
= RDOT_lhs_TT (node
);
126 rdot layout
= RDOT_rhs_TT (node
);
128 fprintf (fd
, "struct %s {\n", RDOT_IDENTIFIER_POINTER (ident
));
130 for (next
= layout
; next
!= NULL_DOT
; next
= RDOT_CHAIN (next
))
132 gcc_assert (RDOT_TYPE (next
) = D_PARAMETER
);
133 const char * id
= RDOT_IDENTIFIER_POINTER (RDOT_lhs_TT (next
));
134 const char * typestr
= typeStringNode (RDOT_rhs_TT (next
));
136 for (i
= 0; i
< (indents
+ 1); ++i
)
138 fprintf (fd
, "%s %s;\n", typestr
, id
);
140 for (i
= 0; i
< indents
; ++i
)
146 void dot_pass_dump_method (FILE * fd
, rdot node
, size_t indents
)
149 for (i
= 0; i
< indents
; ++i
)
152 const char * method_id
= RDOT_IDENTIFIER_POINTER (RDOT_FIELD (node
));
154 if (RDOT_FIELD2 (node
))
155 rtype
= typeStringNode (RDOT_FIELD2 (node
));
157 rtype
= xstrdup ("void");
158 rdot parameters
= RDOT_lhs_TT (node
);
160 if (DOT_RETVAL (node
))
161 fprintf (fd
, "pub fn %s ( ", method_id
);
163 fprintf (fd
, "fn %s ( ", method_id
);
165 if (parameters
== NULL_DOT
)
166 fprintf (fd
, "void");
170 for (next
= parameters
; next
!= NULL_DOT
; next
= RDOT_CHAIN (next
))
172 gcc_assert (RDOT_TYPE (next
) = D_PARAMETER
);
174 bool muta
= RDOT_qual (next
);
175 const char * id
= RDOT_IDENTIFIER_POINTER (RDOT_lhs_TT (next
));
177 if (strcmp (id
, "self") == 0)
189 fprintf (fd
, "[%s] _self_", smuta
);
192 const char * typestr
= typeStringNode (RDOT_rhs_TT (next
));
193 fprintf (fd
, "[%s] %s:%s", smuta
, typestr
, id
);
195 if (RDOT_CHAIN (next
) != NULL_DOT
)
199 fprintf (fd
, " ) -> %s {\n", rtype
);
203 for (suite
= RDOT_rhs_TT (node
); suite
!= NULL_DOT
; suite
= RDOT_CHAIN (suite
))
205 dot_pass_dump_node (fd
, suite
, indents
+ 1);
209 for (i
= 0; i
< indents
; ++i
)
215 void dot_pass_dumpPrimitive (FILE * fd
, rdot node
)
217 /* Handle other primitive literal types here ... */
218 switch (RDOT_lhs_TC (node
).T
)
221 fprintf (fd
, "%i", RDOT_lhs_TC (node
).o
.integer
);
225 fprintf (fd
, "%f", RDOT_lhs_TC (node
).o
.ffloat
);
229 fprintf (fd
, "\"%s\"", RDOT_lhs_TC (node
).o
.string
);
233 fatal_error ("Unable to dump primitive [%s]",
234 rdot_getOpString_T (RDOT_lhs_TC (node
).T
));
240 void dot_pass_dumpExprNode (FILE * fd
, rdot node
)
242 if (RDOT_MEM_MODIFIER (node
))
244 std::vector
<ALLOCA_
>::iterator it
;
245 for (it
= RDOT_MEM_MODIFIER (node
)->begin ();
246 it
!= RDOT_MEM_MODIFIER (node
)->end (); ++it
)
262 switch (RDOT_TYPE (node
))
265 dot_pass_dumpPrimitive (fd
, node
);
269 fprintf (fd
, "%s", RDOT_IDENTIFIER_POINTER (node
));
274 bool val
= RDOT_BOOLEAN_VAL (node
);
276 fprintf (fd
, "true");
278 fprintf (fd
, "false");
284 rdot id
= RDOT_lhs_TT (node
);
285 dot_pass_dump_expr (fd
, id
);
289 for (p
= RDOT_rhs_TT (node
); p
!= NULL_DOT
; p
= RDOT_CHAIN (p
))
291 dot_pass_dump_expr (fd
, p
);
292 if (RDOT_CHAIN (p
) != NULL_DOT
)
302 if (RDOT_qual (node
))
307 fprintf (fd
, "let [%s] ", mut
);
308 dot_pass_dumpExprNode (fd
, RDOT_lhs_TT (node
));
309 fprintf (fd
, " -> [%s]", typeStringNode (RDOT_rhs_TT (node
)));
315 rdot ident
= RDOT_lhs_TT (node
);
316 rdot init
= RDOT_rhs_TT (node
);
318 fprintf (fd
, "%s { ", RDOT_IDENTIFIER_POINTER (ident
));
320 for (next
= init
; next
!= NULL_DOT
; next
= RDOT_CHAIN (next
))
322 gcc_assert (RDOT_TYPE (next
) == D_STRUCT_PARAM
);
323 const char * name
= RDOT_IDENTIFIER_POINTER (RDOT_lhs_TT (next
));
325 fprintf (fd
, "%s:(", name
);
326 dot_pass_dump_expr (fd
, RDOT_rhs_TT (next
));
328 if (RDOT_CHAIN (next
) != NULL_DOT
)
336 error ("unhandled dumpExprNode [%s]\n", RDOT_OPCODE_STR (node
));
342 void dot_pass_dump_expr (FILE * fd
, rdot node
)
344 if (DOT_RETVAL (node
)) {
345 fprintf (fd
, "[_rust_retval]: ");
348 switch (RDOT_TYPE (node
))
356 dot_pass_dumpExprNode (fd
, node
);
361 /* print expr tree ... */
362 rdot lhs
= RDOT_lhs_TT (node
);
363 rdot rhs
= RDOT_rhs_TT (node
);
365 dot_pass_dump_expr (fd
, lhs
);
366 switch (RDOT_TYPE (node
))
389 fprintf (fd
, " <= ");
396 case D_GREATER_EQ_EXPR
:
397 fprintf (fd
, " >= ");
401 fprintf (fd
, " == ");
405 fprintf (fd
, " != ");
417 fatal_error ("unhandled dump [%s]!\n", RDOT_OPCODE_STR (node
));
420 dot_pass_dump_expr (fd
, rhs
);
427 void dot_pass_dump_enum (FILE * fd
, rdot node
, size_t indents
)
429 rdot enum_id
= RDOT_lhs_TT (node
);
430 rdot enum_layout
= RDOT_rhs_TT (node
);
433 for (i
= 0; i
< indents
; ++i
)
435 const char * id
= RDOT_IDENTIFIER_POINTER (enum_id
);
436 fprintf (fd
, "enum %s {\n", id
);
440 for (next
= enum_layout
; next
!= NULL_DOT
; next
= RDOT_CHAIN (next
))
442 for (i
= 0; i
< indents
; ++i
)
444 const char *enumit
= RDOT_IDENTIFIER_POINTER (next
);
445 fprintf (fd
, "[%s],\n", enumit
);
449 for (i
= 0; i
< indents
; ++i
)
455 void dot_pass_dump_cond (FILE * fd
, rdot node
, size_t indents
)
458 rdot ifb
= RDOT_lhs_TT (node
);
459 rdot elb
= RDOT_rhs_TT (node
);
461 gcc_assert (RDOT_TYPE (ifb
) == D_STRUCT_IF
);
463 for (i
= 0; i
< indents
; ++i
)
466 fprintf (fd
, "if (");
467 dot_pass_dump_expr (fd
, RDOT_lhs_TT (ifb
));
468 fprintf (fd
, ") {\n");
471 for (next
= RDOT_rhs_TT (ifb
) ; next
!= NULL_DOT
; next
= RDOT_CHAIN (next
))
473 dot_pass_dump_node (fd
, next
, indents
+ 1);
477 for (i
= 0; i
< indents
; ++i
)
483 fprintf (fd
, " else {\n");
484 for (next
= RDOT_lhs_TT (elb
); next
!= NULL_DOT
; next
= RDOT_CHAIN (next
))
486 dot_pass_dump_node (fd
, next
, indents
+ 1);
489 for (i
= 0; i
< indents
; ++i
)
496 void dot_pass_dump_break (FILE * fd
, const rdot node
, size_t indents
)
499 for (i
= 0; i
< indents
; ++i
)
501 fprintf (fd
, "break;");
505 void dot_pass_dump_loop (FILE * fd
, const rdot node
, size_t indents
)
507 const rdot suite
= RDOT_lhs_TT (node
);
509 for (i
= 0; i
< indents
; ++i
)
511 fprintf (fd
, "loop {\n");
514 for (next
= suite
; next
!= NULL_DOT
; next
= RDOT_CHAIN (next
))
516 dot_pass_dump_node (fd
, next
, indents
+ 1);
520 for (i
= 0; i
< indents
; ++i
)
526 void dot_pass_dump_while (FILE * fd
, const rdot node
, size_t indents
)
529 rdot expr
= RDOT_lhs_TT (node
);
530 rdot suite
= RDOT_rhs_TT (node
);
532 for (i
= 0; i
< indents
; ++i
)
534 fprintf (fd
, "while (");
535 dot_pass_dump_expr (fd
, expr
);
536 fprintf (fd
, ") {\n");
539 for (next
= suite
; next
!= NULL_DOT
; next
= RDOT_CHAIN (next
))
541 dot_pass_dump_node (fd
, next
, indents
+ 1);
545 for (i
= 0; i
< indents
; ++i
)
551 void dot_pass_dump_impl (FILE * fd
, rdot node
, size_t indents
)
553 const char * implid
= RDOT_IDENTIFIER_POINTER (RDOT_lhs_TT (node
));
554 fprintf (fd
, "impl %s {\n", implid
);
557 for (next
= RDOT_rhs_TT (node
); next
!= NULL_DOT
; next
= RDOT_CHAIN (next
))
559 dot_pass_dump_node (fd
, next
, indents
+ 1);
567 void dot_pass_dump_node (FILE * fd
, rdot node
, size_t indents
)
569 if (RDOT_T_FIELD (node
) == D_D_EXPR
)
572 for (i
= 0; i
< indents
; ++i
)
574 dot_pass_dump_expr (fd
, node
);
579 switch (RDOT_TYPE (node
))
582 dot_pass_dump_expr (fd
, node
);
586 dot_pass_dump_impl (fd
, node
, indents
);
589 case D_STRUCT_METHOD
:
590 dot_pass_dump_method (fd
, node
, indents
);
594 dot_pass_dump_struct (fd
, node
, indents
);
598 dot_pass_dump_enum (fd
, node
, indents
);
602 dot_pass_dump_cond (fd
, node
, indents
);
606 dot_pass_dump_while (fd
, node
, indents
);
610 dot_pass_dump_loop (fd
, node
, indents
);
614 dot_pass_dump_break (fd
, node
, indents
);
618 error ("unhandled node [%s]\n", RDOT_OPCODE_STR (node
));
624 vec
<rdot
,va_gc
> * dot_pass_PrettyPrint (vec
<rdot
,va_gc
> * decls
)
626 if (GRS_OPT_dump_dot
)
629 char * outfile
= (char *) alloca (bsize
);
630 gcc_assert (outfile
);
631 memset (outfile
, 0, bsize
);
633 strncpy (outfile
, GRS_current_infile
, strlen (GRS_current_infile
));
636 strncat (outfile
, RDOT_PREFIX_PRE
, sizeof (RDOT_PREFIX_PRE
));
641 strncat (outfile
, RDOT_PREFIX_POST
, sizeof (RDOT_PREFIX_POST
));
645 FILE * fd
= fopen (outfile
, "w");
648 error ("Unable to open %s for write\n", outfile
);
652 rdot idtx
= NULL_DOT
;
654 for (i
= 0; decls
->iterate (i
, &idtx
); ++i
)
656 dot_pass_dump_node (fd
, idtx
, 0);