1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
4 * Authors: Goetz Lindenmaier
17 * imperative programs.
18 * It constructs the IR for the following program:
27 * The array is placed on the stack, i.e., a pointer to the array
28 * is obtained by selecting the entity "a" from the stack. The variables
29 * on the stack are considered to be entities of the method, as locals
30 * of a method are only visible within the method. (An alternative to
31 * make the method owner of the stack variables is to give the ownership
32 * to the class representing the C-file. This would extend the visibility
33 * of the locals, though.)
37 #define OPTIMIZE_NODE 0
42 /* describes the general structure of a C-file */
43 type *owner; /* the class standing for everything in this file */
44 type *proc_main; /* Typeinformation for method main. */
45 entity *proc_main_e; /* The entity describing that method main is an
46 entity of the fake class representing the file. */
48 /* describes types defined by the language */
51 /* describes the array and its fields. */
52 entity *array_ent; /* the entity representing the array as member
53 of the stack/method */
54 type *array_type; /* the type information for the array */
55 entity *field_ent; /* the entity representing a field of the
58 /* holds the graph and nodes. */
60 ir_node *array_ptr, *c3, *elt, *val, *x;
64 printf("\nCreating an IR graph: ARRAY-STACK_EXAMPLE...\n");
66 /* make basic type information for primitive type int.
67 In Sather primitive types are represented by a class.
68 This is the modeling appropriate for other languages.
69 Mode_i says that all language-integers shall be implemented
70 as a 32 bit processor-integer value. */
71 prim_t_int = new_type_primitive(id_from_str ("int", 3), mode_Is);
73 /* build typeinformation of procedure main */
74 owner = new_type_class (id_from_str ("ARRAY-STACK_EXAMPLE", 19));
75 proc_main = new_type_method(id_from_str("main_tp", 4), 0, 1);
76 set_method_res_type(proc_main, 0, prim_t_int);
77 proc_main_e = new_entity (owner, id_from_str ("main", 4), proc_main);
79 /* make type information for the array and set the bounds */
83 array_type = new_type_array(id_from_str("a_tp", 4), N_DIMS, prim_t_int);
84 current_ir_graph = get_const_code_irg();
85 set_array_bounds(array_type, 0,
86 new_Const(mode_Iu, new_tarval_from_long (L_BOUND, mode_Iu)),
87 new_Const(mode_Iu, new_tarval_from_long (U_BOUND, mode_Iu)));
89 main_irg = new_ir_graph (proc_main_e, 4);
91 /* The array is an entity of the method, placed on the mehtod's own memory,
93 array_ent = new_entity(get_cur_frame_type(), id_from_str("a", 1), array_type);
94 /* As the array is accessed by Sel nodes, we need information about
95 the entity the node selects. Entities of an array are it's elements
96 which are, in this case, integers. */
97 /* change entity owner types. */
98 field_ent = get_array_element_entity(array_type);
102 /* Now the "real" program: */
103 /* Select the array from the stack frame. */
104 array_ptr = new_simpleSel(get_store(), get_irg_frame(main_irg), array_ent);
105 /* Load element 3 of the array. For this first generate the pointer
106 to this the element by a select node. (Alternative: increase
107 array pointer by (three * elt_size), but this complicates some
108 optimizations.) The type information accessible via the entity
109 allows to generate the pointer increment later. */
110 c3 = new_Const (mode_Iu, new_tarval_from_long (3, mode_Iu));
114 elt = new_Sel(get_store(), array_ptr, 1, in, field_ent);
116 val = new_Load(get_store(), elt);
117 set_store(new_Proj(val, mode_M, 0));
118 val = new_Proj(val, mode_Is, 2);
120 /* return the result of procedure main */
125 x = new_Return (get_store (), 1, in);
127 mature_block (get_irg_current_block(main_irg));
129 /* complete the end_block */
130 add_in_edge (get_irg_end_block(main_irg), x);
131 mature_block (get_irg_end_block(main_irg));
133 finalize_cons (main_irg);
135 printf("Optimizing ...\n");
136 dead_node_elimination(main_irg);
138 /* verify the graph */
141 printf("Dumping the graph and a type graph.\n");
142 dump_ir_block_graph (main_irg);
143 dump_type_graph(main_irg);
144 dump_ir_block_graph_w_types(main_irg);
146 printf("Use xvcg to view these graphs:\n");
147 printf("/ben/goetz/bin/xvcg GRAPHNAME\n\n");