-/* Copyright (C) 2000 by Universitaet Karlsruhe
-** All rights reserved.
-**
-** Author: Goetz Lindenmaier
-**
-** testprogram.
-*/
+/*
+ * Project: libFIRM
+ * File name: testprograms/inheritance_example.c
+ * Purpose: Shows type graph with inheritance.
+ * Author: Christian Schaefer, Goetz Lindenmaier
+ * Modified by:
+ * Created:
+ * CVS-ID: $Id$
+ * Copyright: (c) 1999-2003 Universität Karlsruhe
+ * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
+ */
-#include <stdio.h>
+# include <stdio.h>
+# include <string.h>
+# include "irvrfy.h"
# include "irdump.h"
# include "firm.h"
/**
-*** This file constructs type information for the following pseudo-program:
-***
-*** interface I {
-*** void m1 (void);
-*** }
-***
-*** class C implements I {
-*** void m1 (void) {return};
-*** void m2 (int) {return 0};
-*** }
-***
-*** class D {
-*** int a;
-*** }
-***
-*** class E extends C, D {
-*** void m2 (int) {return 1};
-*** int a;
-*** }
-***
+* This file constructs type information for the following pseudo-program.
+* The procedure code is not constructed.
+*
+* interface I {
+* void m1 (void);
+* }
+*
+* class C implements I {
+* void m1 (void) {return};
+* void m2 (int) {return 0};
+* }
+*
+* class D {
+* int b;
+* }
+*
+* class E extends C, D {
+* void m2 (int) {return 1};
+* int a;
+* }
+*
**/
int main(int argc, char **argv)
{
- ident *ii, *ci, *di, *ei, *m1i, *m2i, *inti, *ai; /* suffix i names identifiers */
- type *it, *ct, *dt, *et; /* t names types */
+ ident *ii, *ci, *di, *ei, *m1i, *m2i, *inti, *ai, *bi; /* suffix i names identifiers */
+ type *it, *ct, *dt, *et; /* t names types */
type *m1t, *m2t;
type *intt;
- entity *c_m1e, *c_m2e, *e_m2e, *d_ae, *e_ae; /* e names entities */
+ entity *i_m1e, *c_m1e, *c_m2e, *e_m2e, *d_be, *e_ae; /* e names entities */
- ir_node *x;
-
- printf("\nCreating type information...\n");
+ printf("\nCreating type information for INHERITANCE_EXAMPLE ...\n");
/** init library */
- init_firm ();
+ init_firm (NULL);
/** make idents for all used identifiers in the program. */
- ii = id_from_str("i", strlen("i"));
- ci = id_from_str("c", strlen("c"));
- di = id_from_str("d", strlen("d"));
- ei = id_from_str("e", strlen("e"));
- m1i = id_from_str("m1", strlen("m1"));
- m2i = id_from_str("m2", strlen("m2"));
- inti= id_from_str("int",strlen("int"));
- ai = id_from_str("a", strlen("a"));
+ ii = new_id_from_chars("i", strlen("i"));
+ ci = new_id_from_chars("c", strlen("c"));
+ di = new_id_from_chars("d", strlen("d"));
+ ei = new_id_from_chars("e", strlen("e"));
+ m1i = new_id_from_chars("m1", strlen("m1"));
+ m2i = new_id_from_chars("m2", strlen("m2"));
+ inti= new_id_from_chars("int",strlen("int"));
+ ai = new_id_from_chars("a", strlen("a"));
+ bi = new_id_from_chars("b", strlen("b"));
/** make the type information needed */
/* Language defined types */
- intt = new_type_primitive(inti, mode_I);
+ intt = new_type_primitive(inti, mode_Iu);
/* Program defined types */
- it = new_type_class(ii);
+ it = new_type_class(ii); /* The fact that this is an interface is
+ of no interest. It's just a class without
+ fields and implementations. But the
+ implementation will never be needed. */
ct = new_type_class(ci);
dt = new_type_class(di);
et = new_type_class(ei);
+ /* Methods with the same type should use the same
+ method type information! */
m1t = new_type_method(m1i, 0, 0); /* 0 parameters, 0 results */
m2t = new_type_method(m2i, 1, 0); /* 1 parameter, 0 results */
/** add structure to type graph **/
/* parameters of methods */
set_method_param_type(m2t, 0, intt);
- /* inheritance */
+ /* inheritance. The other direction is added automatically. */
add_class_subtype(it, ct);
add_class_subtype(ct, et);
add_class_subtype(dt, et);
- add_class_supertype(ct, it);
- add_class_supertype(et, ct);
- add_class_supertype(et, dt);
/** make entities **/
+ i_m1e = new_entity(it, m1i, m1t);
c_m1e = new_entity(ct, m1i, m1t);
c_m2e = new_entity(ct, m2i, m2t);
e_m2e = new_entity(et, m2i, m2t);
- d_ae = new_entity(dt, ai, intt);
+ d_be = new_entity(dt, bi, intt);
e_ae = new_entity(et, ai, intt);
+ /** Add overwirtes relation **/
+ /* How these edges are added depends on the source language. */
+ add_entity_overwrites (c_m1e, i_m1e);
+ add_entity_overwrites (e_m2e, c_m2e);
+
+
printf("Done building the graph. Dumping it.\n");
- dump_all_types();
+ dump_all_types(0);
printf("use xvcg to view this graph:\n");
printf("/ben/goetz/bin/xvcg GRAPHNAME\n\n");