3 * File name: testprograms/empty.c
4 * Purpose: The smallest possible firm graph.
5 * Author: Christian Schaefer, Goetz Lindenmaier
9 * Copyright: (c) 1999-2003 Universität Karlsruhe
10 * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
22 * An empty Firm program.
24 * This file constructs the ir for the following pseudo-program:
33 int main(int argc, char **argv)
35 ir_graph *irg; /* this variable contains the irgraph */
36 type *owner; /* the class in which this method is defined */
37 type *proc_main; /* type information for the method main */
38 entity *ent; /* represents this method as entity of owner */
39 ir_node *x; /* to build control flow */
41 printf("\nCreating an IR graph: EMPTY...\n");
46 /** Build type information for the procedure. **/
48 /* FIRM was designed for oo languages where all methods belong to a class.
49 * For imperative languages like C we view a file as a large class containing
50 * all functions in this file as methods.
51 * This clas is generated automatically.
53 owner = get_glob_type();
55 #define METHODNAME "EMPTY_main"
58 /* The type of the method */
59 proc_main = new_type_method(new_id_from_chars(METHODNAME, strlen(METHODNAME)),
61 /* An entity representing the method. Owner of the entity is the global class
62 type mentioned above. */
63 ent = new_entity ((type *)owner,
64 new_id_from_chars (METHODNAME, strlen(METHODNAME)),
67 /** Build code for the procedure. **/
69 /* Generates the basic graph for the method represented by entity ent, that
70 * is, generates start and end blocks and nodes and a first, initial block.
71 * The constructor needs to know the number of local variables (including
72 * the arguments) in the method.
74 #define NUM_OF_LOCAL_VARS 0
75 irg = new_ir_graph (ent, NUM_OF_LOCAL_VARS);
77 /* The constructor new_ir_graph() generated a region to place nodes in.
78 * This region is accessible via the attribut current_block of irg and
80 * Generate the return node into this region. The Return node is needed to
81 * return at least the memory. */
82 x = new_Return (get_store(), 0, NULL);
83 /* Now we generated all instructions for this block and all its predecessor
84 * blocks so we can mature it. (There are not too much.) */
85 mature_immBlock (get_irg_current_block(irg));
87 /* This adds the in edge of the end block which originates at the return statement.
88 * The return node passes controlflow to the end block. */
89 add_immBlock_pred (get_irg_end_block(irg), x);
90 /* Now we can mature the end block as all it's predecessors are known. */
91 mature_immBlock (get_irg_end_block(irg));
93 /* Verify the graph. Finds some very bad errors in the graph. */
97 printf("Done building the graph. Dumping it.\n");
98 dump_ir_block_graph (irg, 0);
100 printf("use xvcg to view this graph:\n");
101 printf("/ben/goetz/bin/xvcg GRAPHNAME\n\n");