# include "firm.h"
/**
-*** This file constructs type information for the following pseudo-program:
+*** This file constructs type information for the following pseudo-program.
+*** The procedure code is not constructed.
***
*** interface I {
*** void m1 (void);
*** }
***
*** class D {
-*** int a;
+*** int b;
*** }
***
*** class E extends C, D {
int main(int argc, char **argv)
{
- ident *ii, *ci, *di, *ei, *m1i, *m2i, *inti, *ai; /* suffix i names identifiers */
- type_class *it, *ct, *dt, *et; /* t names types */
- type_method *m1t, *m2t;
- type_primitive *intt;
- entity *c_m1e, *c_m2e, *e_m2e, *d_ae, *e_ae; /* e names entities */
-
- ir_node *x;
+ 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 *i_m1e, *c_m1e, *c_m2e, *e_m2e, *d_be, *e_ae; /* e names entities */
printf("\nCreating type information...\n");
m2i = id_from_str("m2", strlen("m2"));
inti= id_from_str("int",strlen("int"));
ai = id_from_str("a", strlen("a"));
+ bi = id_from_str("b", strlen("b"));
/** make the type information needed */
/* Language defined types */
intt = new_type_primitive(inti, mode_I);
/* 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, (type *)intt);
- /* inheritance */
+ set_method_param_type(m2t, 0, intt);
+ /* 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 **/
- c_m1e = new_entity((type *)ct, m1i, (type *)m1t);
- c_m2e = new_entity((type *)ct, m2i, (type *)m2t);
- e_m2e = new_entity((type *)et, m2i, (type *)m2t);
- d_ae = new_entity((type *)dt, ai, (type *)intt);
- e_ae = new_entity((type *)et, ai, (type *)intt);
+ 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_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();