3 * Dump/print a slang_operation tree
8 #include "slang_compile.h"
9 #include "slang_print.h"
21 print_type(const slang_fully_specified_type
*t
)
23 switch (t
->qualifier
) {
27 case slang_qual_const
:
30 case slang_qual_attribute
:
33 case slang_qual_varying
:
36 case slang_qual_uniform
:
42 case slang_qual_inout
:
45 case slang_qual_fixedoutput
:
46 printf("fixedoutput");
48 case slang_qual_fixedinput
:
52 printf("unknown qualifer!");
55 switch (t
->specifier
.type
) {
62 case slang_spec_bvec2
:
65 case slang_spec_bvec3
:
68 case slang_spec_bvec4
:
74 case slang_spec_ivec2
:
77 case slang_spec_ivec3
:
80 case slang_spec_ivec4
:
83 case slang_spec_float
:
101 case slang_spec_mat4
:
104 case slang_spec_sampler1D
:
107 case slang_spec_sampler2D
:
110 case slang_spec_sampler3D
:
113 case slang_spec_samplerCube
:
114 printf("samplerCube");
116 case slang_spec_sampler1DShadow
:
117 printf("sampler1DShadow");
119 case slang_spec_sampler2DShadow
:
120 printf("sampler2DShadow");
122 case slang_spec_struct
:
125 case slang_spec_array
:
129 printf("unknown type");
136 print_variable(const slang_variable
*v
, int indent
)
140 print_type(&v
->type
);
141 printf(" %s", (char *) v
->a_name
);
142 if (v
->initializer
) {
144 slang_print_tree(v
->initializer
, indent
+ 3);
153 print_binary(const slang_operation
*op
, const char *oper
, int indent
)
155 assert(op
->num_children
== 2);
156 slang_print_tree(&op
->children
[0], indent
+ 3);
158 printf("%s\n", oper
);
159 slang_print_tree(&op
->children
[1], indent
+ 3);
164 print_generic2(const slang_operation
*op
, const char *oper
,
165 const char *s
, int indent
)
170 printf("[%p locals %p] %s %s\n", (void*) op
, (void*) op
->locals
, oper
, s
);
172 for (i
= 0; i
< op
->num_children
; i
++) {
174 printf("//child %d:\n", i
);
175 slang_print_tree(&op
->children
[i
], indent
);
180 print_generic(const slang_operation
*op
, const char *oper
, int indent
)
182 print_generic2(op
, oper
, "", indent
);
186 static const slang_variable_scope
*
187 find_scope(const slang_variable_scope
*s
, slang_atom name
)
190 for (i
= 0; i
< s
->num_variables
; i
++) {
191 if (s
->variables
[i
].a_name
== name
)
195 return find_scope(s
->outer_scope
, name
);
200 static const slang_variable
*
201 find_var(const slang_variable_scope
*s
, slang_atom name
)
204 for (i
= 0; i
< s
->num_variables
; i
++) {
205 if (s
->variables
[i
].a_name
== name
)
206 return &s
->variables
[i
];
209 return find_var(s
->outer_scope
, name
);
216 slang_print_tree(const slang_operation
*op
, int indent
)
222 case slang_oper_none
:
224 printf("slang_oper_none\n");
227 case slang_oper_block_no_new_scope
:
229 printf("{ locals %p\n", (void*)op
->locals
);
230 print_generic(op
, NULL
, indent
+3);
235 case slang_oper_block_new_scope
:
237 printf("{{ // new scope locals %p\n", (void*)op
->locals
);
238 print_generic(op
, NULL
, indent
+3);
243 case slang_oper_variable_decl
:
244 assert(op
->num_children
== 0 || op
->num_children
== 1);
247 v
= _slang_locate_variable(op
->locals
, op
->a_id
, GL_TRUE
);
250 printf("DECL (locals=%p outer=%p) ", (void*)op
->locals
, (void*) op
->locals
->outer_scope
);
251 print_type(&v
->type
);
252 printf(" %s (%p)", (char *) op
->a_id
,
253 (void *) find_var(op
->locals
, op
->a_id
));
255 printf(" (in scope %p) ",
256 (void *) find_scope(op
->locals
, op
->a_id
));
257 if (op
->num_children
== 1) {
259 slang_print_tree(&op
->children
[0], indent
+ 3);
261 else if (v
->initializer
) {
262 printf(" := INITIALIZER\n");
263 slang_print_tree(v
->initializer
, indent
+ 3);
271 print_type(&v->type);
273 printf("ADDR: %d size: %d\n", v->address, v->size);
279 printf("DECL %s (anonymous variable!!!!)\n", (char *) op
->a_id
);
287 printf("ASM: %s\n", (char*) op
->a_id
);
288 print_generic(op
, NULL
, indent
+3);
291 case slang_oper_break
:
296 case slang_oper_continue
:
298 printf("CONTINUE\n");
301 case slang_oper_discard
:
306 case slang_oper_return
:
309 if (op
->num_children
> 0)
310 slang_print_tree(&op
->children
[0], indent
+ 3);
313 case slang_oper_goto
:
315 printf("GOTO %s\n", (char *) op
->a_id
);
318 case slang_oper_label
:
320 printf("LABEL %s\n", (char *) op
->a_id
);
323 case slang_oper_expression
:
325 printf("EXPR: locals %p\n", (void*) op
->locals
);
326 /*print_generic(op, "slang_oper_expression", indent);*/
327 slang_print_tree(&op
->children
[0], indent
+ 3);
333 slang_print_tree(&op
->children
[0], indent
+ 3);
336 slang_print_tree(&op
->children
[1], indent
+ 3);
339 slang_print_tree(&op
->children
[2], indent
+ 3);
344 case slang_oper_while
:
345 assert(op
->num_children
== 2);
347 printf("WHILE cond:\n");
348 slang_print_tree(&op
->children
[0], indent
+ 3);
350 printf("WHILE body:\n");
351 slang_print_tree(&op
->children
[1], indent
+ 3);
356 printf("DO body:\n");
357 slang_print_tree(&op
->children
[0], indent
+ 3);
359 printf("DO cond:\n");
360 slang_print_tree(&op
->children
[1], indent
+ 3);
365 printf("FOR init:\n");
366 slang_print_tree(&op
->children
[0], indent
+ 3);
368 printf("FOR while:\n");
369 slang_print_tree(&op
->children
[1], indent
+ 3);
371 printf("FOR step:\n");
372 slang_print_tree(&op
->children
[2], indent
+ 3);
374 printf("FOR body:\n");
375 slang_print_tree(&op
->children
[3], indent
+ 3);
379 print_generic(op, "FOR", indent + 3);
383 case slang_oper_void
:
385 printf("(oper-void)\n");
388 case slang_oper_literal_bool
:
390 /*printf("slang_oper_literal_bool\n");*/
391 printf("%s\n", op
->literal
[0] ? "TRUE" : "FALSE");
394 case slang_oper_literal_int
:
396 /*printf("slang_oper_literal_int\n");*/
397 printf("(%d %d %d %d)\n", (int) op
->literal
[0], (int) op
->literal
[1],
398 (int) op
->literal
[2], (int) op
->literal
[3]);
401 case slang_oper_literal_float
:
403 /*printf("slang_oper_literal_float\n");*/
404 printf("(%f %f %f %f)\n", op
->literal
[0], op
->literal
[1], op
->literal
[2],
408 case slang_oper_identifier
:
410 if (op
->var
&& op
->var
->a_name
)
411 printf("VAR %s (in scope %p)\n", (char *) op
->var
->a_name
,
412 (void *) find_scope(op
->locals
, op
->a_id
));
414 printf("VAR' %s (in scope %p)\n", (char *) op
->a_id
,
415 (void *) find_scope(op
->locals
, op
->a_id
));
418 case slang_oper_sequence
:
419 print_generic(op
, "COMMA-SEQ", indent
+3);
422 case slang_oper_assign
:
424 printf("ASSIGNMENT locals %p\n", (void*)op
->locals
);
425 print_binary(op
, ":=", indent
);
428 case slang_oper_addassign
:
431 print_binary(op
, "+=", indent
);
434 case slang_oper_subassign
:
437 print_binary(op
, "-=", indent
);
440 case slang_oper_mulassign
:
443 print_binary(op
, "*=", indent
);
446 case slang_oper_divassign
:
449 print_binary(op
, "/=", indent
);
452 /*slang_oper_modassign,*/
453 /*slang_oper_lshassign,*/
454 /*slang_oper_rshassign,*/
455 /*slang_oper_orassign,*/
456 /*slang_oper_xorassign,*/
457 /*slang_oper_andassign,*/
458 case slang_oper_select
:
460 printf("slang_oper_select n=%d\n", op
->num_children
);
461 assert(op
->num_children
== 3);
462 slang_print_tree(&op
->children
[0], indent
+3);
465 slang_print_tree(&op
->children
[1], indent
+3);
468 slang_print_tree(&op
->children
[2], indent
+3);
471 case slang_oper_logicalor
:
472 print_binary(op
, "||", indent
);
475 case slang_oper_logicalxor
:
476 print_binary(op
, "^^", indent
);
479 case slang_oper_logicaland
:
480 print_binary(op
, "&&", indent
);
484 /*slang_oper_bitxor*/
485 /*slang_oper_bitand*/
486 case slang_oper_equal
:
487 print_binary(op
, "==", indent
);
490 case slang_oper_notequal
:
491 print_binary(op
, "!=", indent
);
494 case slang_oper_less
:
495 print_binary(op
, "<", indent
);
498 case slang_oper_greater
:
499 print_binary(op
, ">", indent
);
502 case slang_oper_lessequal
:
503 print_binary(op
, "<=", indent
);
506 case slang_oper_greaterequal
:
507 print_binary(op
, ">=", indent
);
510 /*slang_oper_lshift*/
511 /*slang_oper_rshift*/
513 print_binary(op
, "+", indent
);
516 case slang_oper_subtract
:
517 print_binary(op
, "-", indent
);
520 case slang_oper_multiply
:
521 print_binary(op
, "*", indent
);
524 case slang_oper_divide
:
525 print_binary(op
, "/", indent
);
528 /*slang_oper_modulus*/
529 case slang_oper_preincrement
:
532 slang_print_tree(&op
->children
[0], indent
+3);
535 case slang_oper_predecrement
:
538 slang_print_tree(&op
->children
[0], indent
+3);
541 case slang_oper_plus
:
543 printf("slang_oper_plus\n");
546 case slang_oper_minus
:
548 printf("slang_oper_minus\n");
551 /*slang_oper_complement*/
555 slang_print_tree(&op
->children
[0], indent
+3);
558 case slang_oper_subscript
:
560 printf("slang_oper_subscript\n");
561 print_generic(op
, NULL
, indent
+3);
564 case slang_oper_call
:
567 = _slang_locate_function(A
->space
.funcs
, oper
->a_id
,
569 oper
->num_children
, &A
->space
, A
->atoms
);
572 printf("CALL %s(\n", (char *) op
->a_id
);
573 for (i
= 0; i
< op
->num_children
; i
++) {
574 slang_print_tree(&op
->children
[i
], indent
+3);
575 if (i
+ 1 < op
->num_children
) {
584 case slang_oper_field
:
586 printf("FIELD %s of\n", (char*) op
->a_id
);
587 slang_print_tree(&op
->children
[0], indent
+3);
590 case slang_oper_postincrement
:
593 slang_print_tree(&op
->children
[0], indent
+3);
596 case slang_oper_postdecrement
:
599 slang_print_tree(&op
->children
[0], indent
+3);
603 printf("unknown op->type %d\n", (int) op
->type
);
611 slang_print_function(const slang_function
*f
, GLboolean body
)
616 if (_mesa_strcmp((char *) f
->header
.a_name
, "main") != 0)
620 printf("FUNCTION %s (\n",
621 (char *) f
->header
.a_name
);
623 for (i
= 0; i
< f
->param_count
; i
++) {
624 print_variable(&f
->parameters
->variables
[i
], 3);
629 slang_print_tree(f
->body
, 0);
637 #define OP_BLOCK_BEGIN_NO_NEW_SCOPE 1
638 #define OP_BLOCK_BEGIN_NEW_SCOPE 2
642 #define OP_CONTINUE 6
645 #define OP_EXPRESSION 9
650 #define OP_PUSH_VOID 14
651 #define OP_PUSH_BOOL 15
652 #define OP_PUSH_INT 16
653 #define OP_PUSH_FLOAT 17
654 #define OP_PUSH_IDENTIFIER 18
655 #define OP_SEQUENCE 19
657 #define OP_ADDASSIGN 21
658 #define OP_SUBASSIGN 22
659 #define OP_MULASSIGN 23
660 #define OP_DIVASSIGN 24
661 /*#define OP_MODASSIGN 25*/
662 /*#define OP_LSHASSIGN 26*/
663 /*#define OP_RSHASSIGN 27*/
664 /*#define OP_ORASSIGN 28*/
665 /*#define OP_XORASSIGN 29*/
666 /*#define OP_ANDASSIGN 30*/
668 #define OP_LOGICALOR 32
669 #define OP_LOGICALXOR 33
670 #define OP_LOGICALAND 34
671 /*#define OP_BITOR 35*/
672 /*#define OP_BITXOR 36*/
673 /*#define OP_BITAND 37*/
675 #define OP_NOTEQUAL 39
677 #define OP_GREATER 41
678 #define OP_LESSEQUAL 42
679 #define OP_GREATEREQUAL 43
680 /*#define OP_LSHIFT 44*/
681 /*#define OP_RSHIFT 45*/
683 #define OP_SUBTRACT 47
684 #define OP_MULTIPLY 48
686 /*#define OP_MODULUS 50*/
687 #define OP_PREINCREMENT 51
688 #define OP_PREDECREMENT 52
691 /*#define OP_COMPLEMENT 55*/
693 #define OP_SUBSCRIPT 57
696 #define OP_POSTINCREMENT 60
697 #define OP_POSTDECREMENT 61
701 slang_print_opcode(unsigned int opcode
)
705 printf("OP_PUSH_VOID\n");
708 printf("OP_PUSH_BOOL\n");
711 printf("OP_PUSH_INT\n");
714 printf("OP_PUSH_FLOAT\n");
716 case OP_PUSH_IDENTIFIER
:
717 printf("OP_PUSH_IDENTIFIER\n");
720 printf("OP_SEQUENCE\n");
723 printf("OP_ASSIGN\n");
726 printf("OP_ADDASSIGN\n");
729 printf("OP_SUBASSIGN\n");
732 printf("OP_MULASSIGN\n");
735 printf("OP_DIVASSIGN\n");
737 /*case OP_MODASSIGN:*/
738 /*case OP_LSHASSIGN:*/
739 /*case OP_RSHASSIGN:*/
740 /*case OP_ORASSIGN:*/
741 /*case OP_XORASSIGN:*/
742 /*case OP_ANDASSIGN:*/
744 printf("OP_SELECT\n");
747 printf("OP_LOGICALOR\n");
750 printf("OP_LOGICALXOR\n");
753 printf("OP_LOGICALAND\n");
759 printf("OP_EQUAL\n");
762 printf("OP_NOTEQUAL\n");
768 printf("OP_GREATER\n");
771 printf("OP_LESSEQUAL\n");
773 case OP_GREATEREQUAL
:
774 printf("OP_GREATEREQUAL\n");
782 printf("OP_SUBTRACT\n");
785 printf("OP_MULTIPLY\n");
788 printf("OP_DIVIDE\n");
791 case OP_PREINCREMENT
:
792 printf("OP_PREINCREMENT\n");
794 case OP_PREDECREMENT
:
795 printf("OP_PREDECREMENT\n");
801 printf("OP_MINUS\n");
806 /*case OP_COMPLEMENT:*/
808 printf("OP_SUBSCRIPT\n");
814 printf("OP_FIELD\n");
816 case OP_POSTINCREMENT
:
817 printf("OP_POSTINCREMENT\n");
819 case OP_POSTDECREMENT
:
820 printf("OP_POSTDECREMENT\n");
823 printf("UNKNOWN OP %d\n", opcode
);
830 slang_asm_string(slang_assembly_type t
)
836 case slang_asm_float_copy
:
838 case slang_asm_float_move
:
840 case slang_asm_float_push
:
842 case slang_asm_float_deref
:
843 return "float_deref";
844 case slang_asm_float_add
:
846 case slang_asm_float_multiply
:
847 return "float_multiply";
848 case slang_asm_float_divide
:
849 return "float_divide";
850 case slang_asm_float_negate
:
851 return "float_negate";
852 case slang_asm_float_less
:
854 case slang_asm_float_equal_exp
:
855 return "float_equal";
856 case slang_asm_float_equal_int
:
857 return "float_equal";
858 case slang_asm_float_to_int
:
859 return "float_to_int";
860 case slang_asm_float_sine
:
862 case slang_asm_float_arcsine
:
863 return "float_arcsine";
864 case slang_asm_float_arctan
:
865 return "float_arctan";
866 case slang_asm_float_power
:
867 return "float_power";
868 case slang_asm_float_log2
:
870 case slang_asm_vec4_floor
:
872 case slang_asm_float_ceil
:
874 case slang_asm_float_noise1
:
875 return "float_noise1";
876 case slang_asm_float_noise2
:
877 return "float_noise2";
878 case slang_asm_float_noise3
:
879 return "float_noise3";
880 case slang_asm_float_noise4
:
881 return "float_noise4";
882 case slang_asm_int_copy
:
884 case slang_asm_int_move
:
886 case slang_asm_int_push
:
888 case slang_asm_int_deref
:
890 case slang_asm_int_to_float
:
891 return "int_to_float";
892 case slang_asm_int_to_addr
:
893 return "int_to_addr";
894 case slang_asm_bool_copy
:
896 case slang_asm_bool_move
:
898 case slang_asm_bool_push
:
900 case slang_asm_bool_deref
:
902 case slang_asm_addr_copy
:
904 case slang_asm_addr_push
:
906 case slang_asm_addr_deref
:
908 case slang_asm_addr_add
:
910 case slang_asm_addr_multiply
:
911 return "addr_multiply";
912 case slang_asm_vec4_tex1d
:
914 case slang_asm_vec4_tex2d
:
916 case slang_asm_vec4_tex3d
:
918 case slang_asm_vec4_texcube
:
919 return "vec4_texcube";
920 case slang_asm_vec4_shad1d
:
921 return "vec4_shad1d";
922 case slang_asm_vec4_shad2d
:
923 return "vec4_shad2d";
926 case slang_asm_jump_if_zero
:
927 return "jump_if_zero";
928 case slang_asm_enter
:
930 case slang_asm_leave
:
932 case slang_asm_local_alloc
:
933 return "local_alloc";
934 case slang_asm_local_free
:
936 case slang_asm_local_addr
:
938 case slang_asm_global_addr
:
939 return "global_addr";
942 case slang_asm_return
:
944 case slang_asm_discard
:
948 /* GL_MESA_shader_debug */
949 case slang_asm_float_print
:
950 return "float_print";
951 case slang_asm_int_print
:
953 case slang_asm_bool_print
:
956 case slang_asm_float_to_vec4
:
957 return "float_to_vec4";
958 case slang_asm_vec4_add
:
960 case slang_asm_vec4_subtract
:
961 return "vec4_subtract";
962 case slang_asm_vec4_multiply
:
963 return "vec4_multiply";
964 case slang_asm_vec4_divide
:
965 return "vec4_divide";
966 case slang_asm_vec4_negate
:
967 return "vec4_negate";
968 case slang_asm_vec4_dot
:
970 case slang_asm_vec4_copy
:
972 case slang_asm_vec4_deref
:
974 case slang_asm_vec4_equal_int
:
983 slang_type_qual_string(slang_type_qualifier q
)
986 case slang_qual_none
:
988 case slang_qual_const
:
990 case slang_qual_attribute
:
992 case slang_qual_varying
:
994 case slang_qual_uniform
:
998 case slang_qual_inout
:
1000 case slang_qual_fixedoutput
:
1001 return "fixedoutput";
1002 case slang_qual_fixedinput
:
1003 return "fixedinputk";
1011 slang_type_string(slang_type_specifier_type t
)
1014 case slang_spec_void
:
1016 case slang_spec_bool
:
1018 case slang_spec_bvec2
:
1020 case slang_spec_bvec3
:
1022 case slang_spec_bvec4
:
1024 case slang_spec_int
:
1026 case slang_spec_ivec2
:
1028 case slang_spec_ivec3
:
1030 case slang_spec_ivec4
:
1032 case slang_spec_float
:
1034 case slang_spec_vec2
:
1036 case slang_spec_vec3
:
1038 case slang_spec_vec4
:
1040 case slang_spec_mat2
:
1042 case slang_spec_mat3
:
1044 case slang_spec_mat4
:
1046 case slang_spec_sampler1D
:
1048 case slang_spec_sampler2D
:
1050 case slang_spec_sampler3D
:
1052 case slang_spec_samplerCube
:
1053 return "samplerCube";
1054 case slang_spec_sampler1DShadow
:
1055 return "sampler1DShadow";
1056 case slang_spec_sampler2DShadow
:
1057 return "sampler2DShadow";
1058 case slang_spec_struct
:
1060 case slang_spec_array
:
1069 slang_fq_type_string(const slang_fully_specified_type
*t
)
1071 static char str
[1000];
1072 sprintf(str
, "%s %s", slang_type_qual_string(t
->qualifier
),
1073 slang_type_string(t
->specifier
.type
));
1079 slang_print_type(const slang_fully_specified_type
*t
)
1081 printf("%s %s", slang_type_qual_string(t
->qualifier
),
1082 slang_type_string(t
->specifier
.type
));
1087 slang_var_string(const slang_variable
*v
)
1089 static char str
[1000];
1090 sprintf(str
, "%s : %s",
1092 slang_fq_type_string(&v
->type
));
1098 slang_print_variable(const slang_variable
*v
)
1100 printf("Name: %s\n", (char *) v
->a_name
);
1101 printf("Type: %s\n", slang_fq_type_string(&v
->type
));
1106 _slang_print_var_scope(const slang_variable_scope
*vars
, int indent
)
1111 printf("Var scope %p %d vars\n", (void *) vars
, vars
->num_variables
);
1112 for (i
= 0; i
< vars
->num_variables
; i
++) {
1114 printf("%s\n", (char *) vars
->variables
[i
].a_name
);
1117 if (vars
->outer_scope
) {
1119 printf("outer_scope = %p\n", (void*) vars
->outer_scope
);
1120 _slang_print_var_scope(vars
->outer_scope
, indent
+ 3);
1127 slang_checksum_tree(const slang_operation
*op
)
1129 int s
= op
->num_children
;
1132 for (i
= 0; i
< op
->num_children
; i
++) {
1133 s
+= slang_checksum_tree(&op
->children
[i
]);