diff options
Diffstat (limited to 'libbanshee/points-to/andersen_terms.c')
-rw-r--r-- | libbanshee/points-to/andersen_terms.c | 1363 |
1 files changed, 1363 insertions, 0 deletions
diff --git a/libbanshee/points-to/andersen_terms.c b/libbanshee/points-to/andersen_terms.c new file mode 100644 index 00000000000..9268a516ee8 --- /dev/null +++ b/libbanshee/points-to/andersen_terms.c @@ -0,0 +1,1363 @@ +/* + +DO NOT edit this file + +*/ +#include <engine/list.h> +#include <regions.h> +#include <engine/banshee.h> +#include <assert.h> +#include <stdio.h> +#include <engine/bool.h> +#include <engine/ufind.h> +#include <string.h> +#include <engine/setif-sort.h> +#include <engine/flowrow-sort.h> +#include <engine/setif-sort.h> + +#define REF_ 11 +#define REFPROJ0_ 12 +#define REFPROJ1_ 13 +#define REFPROJ2_ 14 +#define LAM_ 15 +#define LAMPROJ0_ 16 +#define LAMPROJ1_ 17 +#define LAMPROJ2_ 18 + +typedef gen_e label_term; +typedef gen_e_list label_term_list; + +typedef struct flowrow_field *argterm_field; +typedef flowrow_map argterm_map; +typedef gen_e argterm; + +typedef gen_e aterm; +typedef gen_e_list aterm_list; + + +stamp label_term_get_stamp(gen_e arg1); +bool label_term_is_var(gen_e arg1); +DECLARE_OPAQUE_LIST(label_term_list,gen_e) +label_term label_term_zero(void); +label_term label_term_one(void); +label_term label_term_fresh(const char *name); +label_term label_term_union(label_term_list exprs) deletes; +label_term label_term_inter(label_term_list exprs) deletes; +label_term label_term_constant(const char *name) deletes; +bool label_term_is_constant(label_term e,const char *name); +label_term_list label_term_tlb(label_term e) deletes; +void label_term_inclusion(label_term e1,label_term e2) deletes; +void label_term_unify(label_term e1,label_term e2) deletes; + +void label_term_print(FILE* arg1,label_term arg2) deletes; +static bool label_term_res_proj(setif_var arg1,gen_e arg2) deletes; +static void label_term_con_match(gen_e arg1,gen_e arg2) deletes; +stamp argterm_get_stamp(gen_e arg1); +bool argterm_is_var(gen_e arg1); +DECLARE_OPAQUE_LIST(argterm_map,flowrow_field) +void argterm_print(FILE *f,argterm row) deletes; +stamp aterm_get_stamp(gen_e arg1); +bool aterm_is_var(gen_e arg1); +DECLARE_OPAQUE_LIST(aterm_list,gen_e) +aterm aterm_zero(void); +aterm aterm_one(void); +aterm aterm_fresh(const char *name); +aterm aterm_union(aterm_list exprs) deletes; +aterm aterm_inter(aterm_list exprs) deletes; +aterm aterm_constant(const char *name) deletes; +bool aterm_is_constant(aterm e,const char *name); +aterm_list aterm_tlb(aterm e) deletes; +void aterm_inclusion(aterm e1,aterm e2) deletes; +void aterm_unify(aterm e1,aterm e2) deletes; + +aterm ref(label_term arg1,aterm arg2,aterm arg3) deletes; +struct ref_decon ref_decon(aterm arg1); +struct ref_ +{ +int type; +stamp st; +label_term f0; +aterm f1; +aterm f2; +}; +struct ref_decon +{ +label_term f0; +aterm f1; +aterm f2; +}; +struct refProj0_ +{ +int type; +stamp st; +label_term f0; +}; +static gen_e ref_pat0_con(gen_e arg1) deletes; +aterm ref_pat0(label_term arg1) deletes; +struct refProj1_ +{ +int type; +stamp st; +aterm f0; +}; +static gen_e ref_pat1_con(gen_e arg1) deletes; +aterm ref_pat1(aterm arg1) deletes; +struct refProj2_ +{ +int type; +stamp st; +aterm f0; +}; +static gen_e ref_pat2_con(gen_e arg1) deletes; +aterm ref_pat2(aterm arg1) deletes; +aterm lam(label_term arg1,argterm arg2,aterm arg3) deletes; +struct lam_decon lam_decon(aterm arg1); +struct lam_ +{ +int type; +stamp st; +label_term f0; +argterm f1; +aterm f2; +}; +struct lam_decon +{ +label_term f0; +argterm f1; +aterm f2; +}; +struct lamProj0_ +{ +int type; +stamp st; +label_term f0; +}; +static gen_e lam_pat0_con(gen_e arg1) deletes; +aterm lam_pat0(label_term arg1) deletes; +struct lamProj1_ +{ +int type; +stamp st; +argterm f0; +}; +static gen_e lam_pat1_con(gen_e arg1) deletes; +aterm lam_pat1(argterm arg1) deletes; +struct lamProj2_ +{ +int type; +stamp st; +aterm f0; +}; +static gen_e lam_pat2_con(gen_e arg1) deletes; +aterm lam_pat2(aterm arg1) deletes; +void aterm_print(FILE* arg1,aterm arg2) deletes; +static bool aterm_res_proj(setif_var arg1,gen_e arg2) deletes; +static void aterm_con_match(gen_e arg1,gen_e arg2) deletes; + +stamp label_term_get_stamp(gen_e arg1) +{ +return setif_get_stamp((gen_e)arg1); +} + +bool label_term_is_var(gen_e arg1) +{ +return setif_is_var((gen_e)arg1); +} + +DEFINE_LIST(label_term_list,gen_e) +label_term label_term_zero(void) +{ + return setif_zero(); +} + +label_term label_term_one(void) +{ + return setif_one(); +} + +label_term label_term_fresh(const char *name) +{ + return setif_fresh(name); +} + +static label_term label_term_fresh_small(const char *name) +{ + return setif_fresh_small(name); +} + +static label_term label_term_fresh_large(const char *name) +{ + return setif_fresh_large(name); +} + +label_term label_term_union(label_term_list exprs) deletes +{ + return setif_union(exprs); +} + +label_term label_term_inter(label_term_list exprs) deletes +{ + return setif_inter(exprs); +} + +label_term label_term_constant(const char *name) deletes +{ + return setif_constant(name); +} + +bool label_term_is_constant(label_term e, const char *name) +{ + if (setif_is_constant(e)) +return (! strcmp(name,setif_get_constant_name(e))); +else return FALSE; +} + +label_term_list label_term_tlb(label_term e) deletes +{ + return setif_tlb(e); +} + +void label_term_inclusion(label_term e1, label_term e2) deletes +{ + setif_inclusion(label_term_con_match,label_term_res_proj,e1,e2); +} + +static void label_term_inclusion_contra(label_term e1, label_term e2) deletes +{ + setif_inclusion(label_term_con_match,label_term_res_proj,e2,e1); +} + +void label_term_unify(label_term e1, label_term e2) deletes +{ + setif_inclusion(label_term_con_match,label_term_res_proj,e1,e2); +setif_inclusion(label_term_con_match,label_term_res_proj,e2,e1); +} + +void label_term_print(FILE* arg1,label_term arg2) deletes +{ +switch(((setif_term)arg2)->type) +{ +case VAR_TYPE: +fprintf(arg1,"%s",sv_get_name((setif_var)arg2)); +break; +case ZERO_TYPE: +fprintf(arg1,"0"); +break; +case ONE_TYPE: +fprintf(arg1,"1"); +break; +case CONSTANT_TYPE: +fprintf(arg1,setif_get_constant_name(arg2)); +break; +case UNION_TYPE: +{ +gen_e_list list = setif_get_union(arg2); +gen_e_list_scanner scan; +gen_e temp; +gen_e_list_scan(list,&scan); +if (gen_e_list_next(&scan,&temp)) +label_term_print(arg1,temp); +while (gen_e_list_next(&scan,&temp)) +{ +fprintf(arg1," || "); +label_term_print(arg1,temp); +} + +} +break; +case INTER_TYPE: +{ +gen_e_list list = setif_get_inter(arg2); +gen_e_list_scanner scan; +gen_e temp; +gen_e_list_scan(list,&scan); +if (gen_e_list_next(&scan,&temp)) +label_term_print(arg1,temp); +while (gen_e_list_next(&scan,&temp)) +{ +fprintf(arg1," && "); +label_term_print(arg1,temp); +} + +} +break; + +default: +return ; +} + +} + +static bool label_term_res_proj(setif_var arg1,gen_e arg2) deletes +{ +switch(((setif_term)arg2)->type) +{ + +default: +return FALSE; +} + +return FALSE; +} + +static void label_term_con_match(gen_e arg1,gen_e arg2) deletes +{ +switch(((setif_term)arg1)->type) +{ + +default: +failure("Inconsistent system of constraints\n"); +} + +return; +} + +stamp argterm_get_stamp(gen_e arg1) +{ +return flowrow_get_stamp((gen_e)arg1); +} + +bool argterm_is_var(gen_e arg1) +{ +return flowrow_is_var((gen_e)arg1); +} + +DEFINE_LIST(argterm_map,flowrow_field) +argterm_field argterm_make_field(const char *label, aterm expr) +{ + flowrow_field result = ralloc(flowrow_region, struct flowrow_field); +result->label = rstrdup(flowrow_region,label); +result->expr = (gen_e) expr; +return result; +} + +argterm argterm_zero(void) +{ + return flowrow_zero(); +} + +argterm argterm_one(void) +{ + return flowrow_one(); +} + +argterm argterm_abs(void) +{ +return flowrow_abs(); +} + +argterm argterm_wild(void) +{ +return flowrow_wild(); +} + +argterm argterm_fresh(const char *name) +{ +return flowrow_fresh(name); +} + +static argterm argterm_fresh_small(const char *name) +{ +return flowrow_fresh_small(name); +} + +static argterm argterm_fresh_large(const char *name) +{ +return flowrow_fresh_large(name); +} + +argterm argterm_row(argterm_map fields,argterm rest) deletes +{ +return flowrow_row(aterm_get_stamp,fields,rest); +} + +aterm argterm_extract_field(const char *field_name, argterm row) +{ +return flowrow_extract_field(field_name,row); +} + +argterm argterm_extract_rest(argterm row) +{ +return flowrow_extract_rest(row); +} + +argterm_map argterm_extract_fields(argterm row) +{ +return flowrow_extract_fields(row); +} + +void argterm_inclusion(argterm row1, argterm row2) deletes +{ +flowrow_inclusion(aterm_fresh,aterm_get_stamp,aterm_inclusion,aterm_zero(), row1,row2); +} + +static void argterm_inclusion_contra(argterm row1, argterm row2) deletes +{ +flowrow_inclusion(aterm_fresh,aterm_get_stamp,aterm_inclusion,aterm_zero(), row2,row1); +} + +void argterm_unify(argterm row1, argterm row2) deletes +{ +argterm_inclusion(row1,row2); +argterm_inclusion(row2,row1); +} + +void argterm_print(FILE *f,argterm row) deletes +{ +flowrow_print(f,aterm_get_stamp,aterm_print,row); +} + +stamp aterm_get_stamp(gen_e arg1) +{ +return setif_get_stamp((gen_e)arg1); +} + +bool aterm_is_var(gen_e arg1) +{ +return setif_is_var((gen_e)arg1); +} + +DEFINE_LIST(aterm_list,gen_e) +aterm aterm_zero(void) +{ + return setif_zero(); +} + +aterm aterm_one(void) +{ + return setif_one(); +} + +aterm aterm_fresh(const char *name) +{ + return setif_fresh(name); +} + +static aterm aterm_fresh_small(const char *name) +{ + return setif_fresh_small(name); +} + +static aterm aterm_fresh_large(const char *name) +{ + return setif_fresh_large(name); +} + +aterm aterm_union(aterm_list exprs) deletes +{ + return setif_union(exprs); +} + +aterm aterm_inter(aterm_list exprs) deletes +{ + return setif_inter(exprs); +} + +aterm aterm_constant(const char *name) deletes +{ + return setif_constant(name); +} + +bool aterm_is_constant(aterm e, const char *name) +{ + if (setif_is_constant(e)) +return (! strcmp(name,setif_get_constant_name(e))); +else return FALSE; +} + +aterm_list aterm_tlb(aterm e) deletes +{ + return setif_tlb(e); +} + +void aterm_inclusion(aterm e1, aterm e2) deletes +{ + setif_inclusion(aterm_con_match,aterm_res_proj,e1,e2); +} + +static void aterm_inclusion_contra(aterm e1, aterm e2) deletes +{ + setif_inclusion(aterm_con_match,aterm_res_proj,e2,e1); +} + +void aterm_unify(aterm e1, aterm e2) deletes +{ + setif_inclusion(aterm_con_match,aterm_res_proj,e1,e2); +setif_inclusion(aterm_con_match,aterm_res_proj,e2,e1); +} + +bool aterm_is_ref(aterm e) +{ + return ((setif_term)e)->type == 11; +} + +aterm ref(label_term arg1,aterm arg2,aterm arg3) deletes +{ +struct ref_ *ret; +stamp s[4]; +s[0] = REF_; +s[1] = label_term_get_stamp((gen_e)arg1); +s[2] = aterm_get_stamp((gen_e)arg2); +s[3] = aterm_get_stamp((gen_e)arg3); +if ((ret = (struct ref_ *)term_hash_find(setif_hash,s,4)) == NULL) +{ +ret = ralloc(setif_region,struct ref_); +ret->type = s[0]; +ret->st = stamp_fresh(); +ret->f0 = arg1; +ret->f1 = arg2; +ret->f2 = arg3; +term_hash_insert(setif_hash,(gen_e)ret,s,4); +} +return (aterm)ret; +} + +struct ref_decon ref_decon(aterm arg1) +{ +if (((setif_term)arg1)->type == REF_) +{ +struct ref_* c = (struct ref_ *)arg1; +return (struct ref_decon){c->f0,c->f1,c->f2}; + +} +else +return (struct ref_decon){NULL,NULL,NULL}; +} + +static gen_e get_ref_proj0_arg(gen_e_list arg1) +{ +gen_e temp; +gen_e_list_scanner scan; +gen_e_list_scan(arg1,&scan); +while (gen_e_list_next(&scan,&temp)) +{ +if (((setif_term)temp)->type == REFPROJ0_) +return (gen_e)((struct refProj0_ * ) temp)->f0; +} +return NULL; +} + +label_term ref_proj0(aterm arg1) deletes + { +label_term c; +if (setif_is_var(arg1)) +{ +setif_var v = (setif_var)arg1; +c = (label_term)sv_get_ub_proj(v,get_ref_proj0_arg); +if (c != NULL) +return c; +else +{ +aterm e; +gen_e lb; +gen_e_list_scanner scan; +c = label_term_fresh(NULL); +e = ref_pat0(c); +sv_add_ub_proj(v,e); +gen_e_list_scan(sv_get_lbs(v),&scan); +while (gen_e_list_next(&scan,&lb)) +{ +setif_inclusion(aterm_con_match,aterm_res_proj,lb,e); +} +return c; +} +} +else if ( ((setif_term)arg1)->type == REF_) +return ((struct ref_ * )arg1)->f0; +else if ( setif_is_zero(arg1)) +return label_term_zero(); +else if ( setif_is_union(arg1)) +{ +c = get_ref_proj0_arg(setif_get_proj_cache(arg1)); +if (c != NULL) +return c; +else +{ +aterm e; +c = label_term_fresh(NULL); +e = ref_pat0(c); +setif_set_proj_cache(arg1,e); +aterm_inclusion(arg1,e); +return c; +} +} +else +{ +aterm e; +c = label_term_fresh(NULL); +e = ref_pat0(c); +aterm_inclusion(arg1,e); +return c; +} +} + +static gen_e ref_pat0_con(gen_e arg1) deletes +{ +return (gen_e)ref_pat0((label_term)arg1); +} + +aterm ref_pat0(label_term arg1) deletes +{ +struct refProj0_* ret; +stamp s[2]; +s[0] = REFPROJ0_; +s[1] = label_term_get_stamp((gen_e)arg1); +if ((ret = (struct refProj0_ *)term_hash_find(setif_hash,s,2)) == NULL) +{ +ret = ralloc(setif_region,struct refProj0_); +ret->type = REFPROJ0_; +ret->st = stamp_fresh(); +ret->f0 = arg1; +term_hash_insert(setif_hash,(gen_e)ret,s,2); +} +return (aterm)ret; +} + +static gen_e get_ref_proj1_arg(gen_e_list arg1) +{ +gen_e temp; +gen_e_list_scanner scan; +gen_e_list_scan(arg1,&scan); +while (gen_e_list_next(&scan,&temp)) +{ +if (((setif_term)temp)->type == REFPROJ1_) +return (gen_e)((struct refProj1_ * ) temp)->f0; +} +return NULL; +} + +aterm ref_proj1(aterm arg1) deletes + { +aterm c; +if (setif_is_var(arg1)) +{ +setif_var v = (setif_var)arg1; +c = (aterm)sv_get_ub_proj(v,get_ref_proj1_arg); +if (c != NULL) +return c; +else +{ +aterm e; +gen_e lb; +gen_e_list_scanner scan; +c = aterm_fresh(NULL); +e = ref_pat1(c); +sv_add_ub_proj(v,e); +gen_e_list_scan(sv_get_lbs(v),&scan); +while (gen_e_list_next(&scan,&lb)) +{ +setif_inclusion(aterm_con_match,aterm_res_proj,lb,e); +} +return c; +} +} +else if ( ((setif_term)arg1)->type == REF_) +return ((struct ref_ * )arg1)->f1; +else if ( setif_is_zero(arg1)) +return aterm_zero(); +else if ( setif_is_union(arg1)) +{ +c = get_ref_proj1_arg(setif_get_proj_cache(arg1)); +if (c != NULL) +return c; +else +{ +aterm e; +c = aterm_fresh(NULL); +e = ref_pat1(c); +setif_set_proj_cache(arg1,e); +aterm_inclusion(arg1,e); +return c; +} +} +else +{ +aterm e; +c = aterm_fresh(NULL); +e = ref_pat1(c); +aterm_inclusion(arg1,e); +return c; +} +} + +static gen_e ref_pat1_con(gen_e arg1) deletes +{ +return (gen_e)ref_pat1((aterm)arg1); +} + +aterm ref_pat1(aterm arg1) deletes +{ +struct refProj1_* ret; +stamp s[2]; +s[0] = REFPROJ1_; +s[1] = aterm_get_stamp((gen_e)arg1); +if ((ret = (struct refProj1_ *)term_hash_find(setif_hash,s,2)) == NULL) +{ +ret = ralloc(setif_region,struct refProj1_); +ret->type = REFPROJ1_; +ret->st = stamp_fresh(); +ret->f0 = arg1; +term_hash_insert(setif_hash,(gen_e)ret,s,2); +} +return (aterm)ret; +} + +static gen_e get_ref_proj2_arg(gen_e_list arg1) +{ +gen_e temp; +gen_e_list_scanner scan; +gen_e_list_scan(arg1,&scan); +while (gen_e_list_next(&scan,&temp)) +{ +if (((setif_term)temp)->type == REFPROJ2_) +return (gen_e)((struct refProj2_ * ) temp)->f0; +} +return NULL; +} + +aterm ref_proj2(aterm arg1) deletes + { +aterm c; +if (setif_is_var(arg1)) +{ +setif_var v = (setif_var)arg1; +c = (aterm)sv_get_ub_proj(v,get_ref_proj2_arg); +if (c != NULL) +return c; +else +{ +aterm e; +gen_e lb; +gen_e_list_scanner scan; +c = aterm_fresh(NULL); +e = ref_pat2(c); +sv_add_ub_proj(v,e); +gen_e_list_scan(sv_get_lbs(v),&scan); +while (gen_e_list_next(&scan,&lb)) +{ +setif_inclusion(aterm_con_match,aterm_res_proj,lb,e); +} +return c; +} +} +else if ( ((setif_term)arg1)->type == REF_) +return ((struct ref_ * )arg1)->f2; +else if ( setif_is_zero(arg1)) +return aterm_zero(); +else if ( setif_is_union(arg1)) +{ +c = get_ref_proj2_arg(setif_get_proj_cache(arg1)); +if (c != NULL) +return c; +else +{ +aterm e; +c = aterm_fresh(NULL); +e = ref_pat2(c); +setif_set_proj_cache(arg1,e); +aterm_inclusion(arg1,e); +return c; +} +} +else +{ +aterm e; +c = aterm_fresh(NULL); +e = ref_pat2(c); +aterm_inclusion(arg1,e); +return c; +} +} + +static gen_e ref_pat2_con(gen_e arg1) deletes +{ +return (gen_e)ref_pat2((aterm)arg1); +} + +aterm ref_pat2(aterm arg1) deletes +{ +struct refProj2_* ret; +stamp s[2]; +s[0] = REFPROJ2_; +s[1] = aterm_get_stamp((gen_e)arg1); +if ((ret = (struct refProj2_ *)term_hash_find(setif_hash,s,2)) == NULL) +{ +ret = ralloc(setif_region,struct refProj2_); +ret->type = REFPROJ2_; +ret->st = stamp_fresh(); +ret->f0 = arg1; +term_hash_insert(setif_hash,(gen_e)ret,s,2); +} +return (aterm)ret; +} + +bool aterm_is_lam(aterm e) +{ + return ((setif_term)e)->type == 15; +} + +aterm lam(label_term arg1,argterm arg2,aterm arg3) deletes +{ +struct lam_ *ret; +stamp s[4]; +s[0] = LAM_; +s[1] = label_term_get_stamp((gen_e)arg1); +s[2] = argterm_get_stamp((gen_e)arg2); +s[3] = aterm_get_stamp((gen_e)arg3); +if ((ret = (struct lam_ *)term_hash_find(setif_hash,s,4)) == NULL) +{ +ret = ralloc(setif_region,struct lam_); +ret->type = s[0]; +ret->st = stamp_fresh(); +ret->f0 = arg1; +ret->f1 = arg2; +ret->f2 = arg3; +term_hash_insert(setif_hash,(gen_e)ret,s,4); +} +return (aterm)ret; +} + +struct lam_decon lam_decon(aterm arg1) +{ +if (((setif_term)arg1)->type == LAM_) +{ +struct lam_* c = (struct lam_ *)arg1; +return (struct lam_decon){c->f0,c->f1,c->f2}; + +} +else +return (struct lam_decon){NULL,NULL,NULL}; +} + +static gen_e get_lam_proj0_arg(gen_e_list arg1) +{ +gen_e temp; +gen_e_list_scanner scan; +gen_e_list_scan(arg1,&scan); +while (gen_e_list_next(&scan,&temp)) +{ +if (((setif_term)temp)->type == LAMPROJ0_) +return (gen_e)((struct lamProj0_ * ) temp)->f0; +} +return NULL; +} + +label_term lam_proj0(aterm arg1) deletes + { +label_term c; +if (setif_is_var(arg1)) +{ +setif_var v = (setif_var)arg1; +c = (label_term)sv_get_ub_proj(v,get_lam_proj0_arg); +if (c != NULL) +return c; +else +{ +aterm e; +gen_e lb; +gen_e_list_scanner scan; +c = label_term_fresh(NULL); +e = lam_pat0(c); +sv_add_ub_proj(v,e); +gen_e_list_scan(sv_get_lbs(v),&scan); +while (gen_e_list_next(&scan,&lb)) +{ +setif_inclusion(aterm_con_match,aterm_res_proj,lb,e); +} +return c; +} +} +else if ( ((setif_term)arg1)->type == LAM_) +return ((struct lam_ * )arg1)->f0; +else if ( setif_is_zero(arg1)) +return label_term_zero(); +else if ( setif_is_union(arg1)) +{ +c = get_lam_proj0_arg(setif_get_proj_cache(arg1)); +if (c != NULL) +return c; +else +{ +aterm e; +c = label_term_fresh(NULL); +e = lam_pat0(c); +setif_set_proj_cache(arg1,e); +aterm_inclusion(arg1,e); +return c; +} +} +else +{ +aterm e; +c = label_term_fresh(NULL); +e = lam_pat0(c); +aterm_inclusion(arg1,e); +return c; +} +} + +static gen_e lam_pat0_con(gen_e arg1) deletes +{ +return (gen_e)lam_pat0((label_term)arg1); +} + +aterm lam_pat0(label_term arg1) deletes +{ +struct lamProj0_* ret; +stamp s[2]; +s[0] = LAMPROJ0_; +s[1] = label_term_get_stamp((gen_e)arg1); +if ((ret = (struct lamProj0_ *)term_hash_find(setif_hash,s,2)) == NULL) +{ +ret = ralloc(setif_region,struct lamProj0_); +ret->type = LAMPROJ0_; +ret->st = stamp_fresh(); +ret->f0 = arg1; +term_hash_insert(setif_hash,(gen_e)ret,s,2); +} +return (aterm)ret; +} + +static gen_e get_lam_proj1_arg(gen_e_list arg1) +{ +gen_e temp; +gen_e_list_scanner scan; +gen_e_list_scan(arg1,&scan); +while (gen_e_list_next(&scan,&temp)) +{ +if (((setif_term)temp)->type == LAMPROJ1_) +return (gen_e)((struct lamProj1_ * ) temp)->f0; +} +return NULL; +} + +argterm lam_proj1(aterm arg1) deletes + { +argterm c; +if (setif_is_var(arg1)) +{ +setif_var v = (setif_var)arg1; +c = (argterm)sv_get_ub_proj(v,get_lam_proj1_arg); +if (c != NULL) +return c; +else +{ +aterm e; +gen_e lb; +gen_e_list_scanner scan; +c = argterm_fresh(NULL); +e = lam_pat1(c); +sv_add_ub_proj(v,e); +gen_e_list_scan(sv_get_lbs(v),&scan); +while (gen_e_list_next(&scan,&lb)) +{ +setif_inclusion(aterm_con_match,aterm_res_proj,lb,e); +} +return c; +} +} +else if ( ((setif_term)arg1)->type == LAM_) +return ((struct lam_ * )arg1)->f1; +else if ( setif_is_zero(arg1)) +return argterm_zero(); +else if ( setif_is_union(arg1)) +{ +c = get_lam_proj1_arg(setif_get_proj_cache(arg1)); +if (c != NULL) +return c; +else +{ +aterm e; +c = argterm_fresh(NULL); +e = lam_pat1(c); +setif_set_proj_cache(arg1,e); +aterm_inclusion(arg1,e); +return c; +} +} +else +{ +aterm e; +c = argterm_fresh(NULL); +e = lam_pat1(c); +aterm_inclusion(arg1,e); +return c; +} +} + +static gen_e lam_pat1_con(gen_e arg1) deletes +{ +return (gen_e)lam_pat1((argterm)arg1); +} + +aterm lam_pat1(argterm arg1) deletes +{ +struct lamProj1_* ret; +stamp s[2]; +s[0] = LAMPROJ1_; +s[1] = argterm_get_stamp((gen_e)arg1); +if ((ret = (struct lamProj1_ *)term_hash_find(setif_hash,s,2)) == NULL) +{ +ret = ralloc(setif_region,struct lamProj1_); +ret->type = LAMPROJ1_; +ret->st = stamp_fresh(); +ret->f0 = arg1; +term_hash_insert(setif_hash,(gen_e)ret,s,2); +} +return (aterm)ret; +} + +static gen_e get_lam_proj2_arg(gen_e_list arg1) +{ +gen_e temp; +gen_e_list_scanner scan; +gen_e_list_scan(arg1,&scan); +while (gen_e_list_next(&scan,&temp)) +{ +if (((setif_term)temp)->type == LAMPROJ2_) +return (gen_e)((struct lamProj2_ * ) temp)->f0; +} +return NULL; +} + +aterm lam_proj2(aterm arg1) deletes + { +aterm c; +if (setif_is_var(arg1)) +{ +setif_var v = (setif_var)arg1; +c = (aterm)sv_get_ub_proj(v,get_lam_proj2_arg); +if (c != NULL) +return c; +else +{ +aterm e; +gen_e lb; +gen_e_list_scanner scan; +c = aterm_fresh(NULL); +e = lam_pat2(c); +sv_add_ub_proj(v,e); +gen_e_list_scan(sv_get_lbs(v),&scan); +while (gen_e_list_next(&scan,&lb)) +{ +setif_inclusion(aterm_con_match,aterm_res_proj,lb,e); +} +return c; +} +} +else if ( ((setif_term)arg1)->type == LAM_) +return ((struct lam_ * )arg1)->f2; +else if ( setif_is_zero(arg1)) +return aterm_zero(); +else if ( setif_is_union(arg1)) +{ +c = get_lam_proj2_arg(setif_get_proj_cache(arg1)); +if (c != NULL) +return c; +else +{ +aterm e; +c = aterm_fresh(NULL); +e = lam_pat2(c); +setif_set_proj_cache(arg1,e); +aterm_inclusion(arg1,e); +return c; +} +} +else +{ +aterm e; +c = aterm_fresh(NULL); +e = lam_pat2(c); +aterm_inclusion(arg1,e); +return c; +} +} + +static gen_e lam_pat2_con(gen_e arg1) deletes +{ +return (gen_e)lam_pat2((aterm)arg1); +} + +aterm lam_pat2(aterm arg1) deletes +{ +struct lamProj2_* ret; +stamp s[2]; +s[0] = LAMPROJ2_; +s[1] = aterm_get_stamp((gen_e)arg1); +if ((ret = (struct lamProj2_ *)term_hash_find(setif_hash,s,2)) == NULL) +{ +ret = ralloc(setif_region,struct lamProj2_); +ret->type = LAMPROJ2_; +ret->st = stamp_fresh(); +ret->f0 = arg1; +term_hash_insert(setif_hash,(gen_e)ret,s,2); +} +return (aterm)ret; +} + +void aterm_print(FILE* arg1,aterm arg2) deletes +{ +switch(((setif_term)arg2)->type) +{ +case VAR_TYPE: +fprintf(arg1,"%s",sv_get_name((setif_var)arg2)); +break; +case ZERO_TYPE: +fprintf(arg1,"0"); +break; +case ONE_TYPE: +fprintf(arg1,"1"); +break; +case CONSTANT_TYPE: +fprintf(arg1,setif_get_constant_name(arg2)); +break; +case UNION_TYPE: +{ +gen_e_list list = setif_get_union(arg2); +gen_e_list_scanner scan; +gen_e temp; +gen_e_list_scan(list,&scan); +if (gen_e_list_next(&scan,&temp)) +aterm_print(arg1,temp); +while (gen_e_list_next(&scan,&temp)) +{ +fprintf(arg1," || "); +aterm_print(arg1,temp); +} + +} +break; +case INTER_TYPE: +{ +gen_e_list list = setif_get_inter(arg2); +gen_e_list_scanner scan; +gen_e temp; +gen_e_list_scan(list,&scan); +if (gen_e_list_next(&scan,&temp)) +aterm_print(arg1,temp); +while (gen_e_list_next(&scan,&temp)) +{ +fprintf(arg1," && "); +aterm_print(arg1,temp); +} + +} +break; +case REF_: +{ +fprintf(arg1,"ref("); +label_term_print(arg1,((struct ref_ *)arg2)->f0); +fprintf(arg1,","); +aterm_print(arg1,((struct ref_ *)arg2)->f1); +fprintf(arg1,","); +aterm_print(arg1,((struct ref_ *)arg2)->f2); +fprintf(arg1,")"); + +} +break; +case LAM_: +{ +fprintf(arg1,"lam("); +label_term_print(arg1,((struct lam_ *)arg2)->f0); +fprintf(arg1,","); +argterm_print(arg1,((struct lam_ *)arg2)->f1); +fprintf(arg1,","); +aterm_print(arg1,((struct lam_ *)arg2)->f2); +fprintf(arg1,")"); + +} +break; +case REFPROJ0_: +{ +fprintf(arg1,"Proj[ref,0,"); +label_term_print(arg1,((struct refProj0_ *)arg2)->f0); +fprintf(arg1,"]"); + +} +break; +case REFPROJ1_: +{ +fprintf(arg1,"Proj[ref,1,"); +aterm_print(arg1,((struct refProj1_ *)arg2)->f0); +fprintf(arg1,"]"); + +} +break; +case REFPROJ2_: +{ +fprintf(arg1,"Proj[ref,2,"); +aterm_print(arg1,((struct refProj2_ *)arg2)->f0); +fprintf(arg1,"]"); + +} +break; +case LAMPROJ0_: +{ +fprintf(arg1,"Proj[lam,0,"); +label_term_print(arg1,((struct lamProj0_ *)arg2)->f0); +fprintf(arg1,"]"); + +} +break; +case LAMPROJ1_: +{ +fprintf(arg1,"Proj[lam,1,"); +argterm_print(arg1,((struct lamProj1_ *)arg2)->f0); +fprintf(arg1,"]"); + +} +break; +case LAMPROJ2_: +{ +fprintf(arg1,"Proj[lam,2,"); +aterm_print(arg1,((struct lamProj2_ *)arg2)->f0); +fprintf(arg1,"]"); + +} +break; + +default: +return ; +} + +} + +static bool aterm_res_proj(setif_var arg1,gen_e arg2) deletes +{ +switch(((setif_term)arg2)->type) +{ +case REFPROJ0_: +return setif_proj_merge(arg1,(gen_e)((struct refProj0_ *)arg2)->f0,get_ref_proj0_arg,ref_pat0_con,(fresh_large_fn_ptr)label_term_fresh_large,(incl_fn_ptr)label_term_inclusion,aterm_inclusion); +break; +case REFPROJ1_: +return setif_proj_merge(arg1,(gen_e)((struct refProj1_ *)arg2)->f0,get_ref_proj1_arg,ref_pat1_con,(fresh_large_fn_ptr)aterm_fresh_large,(incl_fn_ptr)aterm_inclusion_contra,aterm_inclusion); +break; +case REFPROJ2_: +return setif_proj_merge(arg1,(gen_e)((struct refProj2_ *)arg2)->f0,get_ref_proj2_arg,ref_pat2_con,(fresh_large_fn_ptr)aterm_fresh_large,(incl_fn_ptr)aterm_inclusion,aterm_inclusion); +break; +case LAMPROJ0_: +return setif_proj_merge(arg1,(gen_e)((struct lamProj0_ *)arg2)->f0,get_lam_proj0_arg,lam_pat0_con,(fresh_large_fn_ptr)label_term_fresh_large,(incl_fn_ptr)label_term_inclusion,aterm_inclusion); +break; +case LAMPROJ1_: +return setif_proj_merge(arg1,(gen_e)((struct lamProj1_ *)arg2)->f0,get_lam_proj1_arg,lam_pat1_con,(fresh_large_fn_ptr)argterm_fresh_large,(incl_fn_ptr)argterm_inclusion_contra,aterm_inclusion); +break; +case LAMPROJ2_: +return setif_proj_merge(arg1,(gen_e)((struct lamProj2_ *)arg2)->f0,get_lam_proj2_arg,lam_pat2_con,(fresh_large_fn_ptr)aterm_fresh_large,(incl_fn_ptr)aterm_inclusion,aterm_inclusion); +break; + +default: +return FALSE; +} + +return FALSE; +} + +static void aterm_con_match(gen_e arg1,gen_e arg2) deletes +{ +switch(((setif_term)arg1)->type) +{ +case REF_: +switch(((setif_term)arg2)->type) +{ +case REF_: +{ +label_term_inclusion(((struct ref_ *)arg1)->f0,((struct ref_ *)arg2)->f0); +aterm_inclusion_contra(((struct ref_ *)arg1)->f1,((struct ref_ *)arg2)->f1); +aterm_inclusion(((struct ref_ *)arg1)->f2,((struct ref_ *)arg2)->f2); + +} +break; +case REFPROJ0_: +label_term_inclusion(((struct ref_ *)arg1)->f0,((struct refProj0_ *)arg2)->f0); +break; +case REFPROJ1_: +aterm_inclusion_contra(((struct ref_ *)arg1)->f1,((struct refProj1_ *)arg2)->f0); +break; +case REFPROJ2_: +aterm_inclusion(((struct ref_ *)arg1)->f2,((struct refProj2_ *)arg2)->f0); +break; +case LAMPROJ0_: +return ; +break; +case LAMPROJ1_: +return ; +break; +case LAMPROJ2_: +return ; +break; + +default: +failure("Inconsistent system of constraints\n"); +} + +break; +case LAM_: +switch(((setif_term)arg2)->type) +{ +case LAM_: +{ +label_term_inclusion(((struct lam_ *)arg1)->f0,((struct lam_ *)arg2)->f0); +argterm_inclusion_contra(((struct lam_ *)arg1)->f1,((struct lam_ *)arg2)->f1); +aterm_inclusion(((struct lam_ *)arg1)->f2,((struct lam_ *)arg2)->f2); + +} +break; +case LAMPROJ0_: +label_term_inclusion(((struct lam_ *)arg1)->f0,((struct lamProj0_ *)arg2)->f0); +break; +case LAMPROJ1_: +argterm_inclusion_contra(((struct lam_ *)arg1)->f1,((struct lamProj1_ *)arg2)->f0); +break; +case LAMPROJ2_: +aterm_inclusion(((struct lam_ *)arg1)->f2,((struct lamProj2_ *)arg2)->f0); +break; +case REFPROJ0_: +return ; +break; +case REFPROJ1_: +return ; +break; +case REFPROJ2_: +return ; +break; + +default: +failure("Inconsistent system of constraints\n"); +} + +break; + +default: +failure("Inconsistent system of constraints\n"); +} + +return; +} + +void andersen_terms_init(void) +{ +engine_init(); +setif_init(); +setif_init(); +flowrow_init(); +} + +void andersen_terms_reset(void) deletes +{ +setif_reset(); +setif_reset(); +flowrow_reset(); +engine_reset(); +} + +void andersen_terms_stats(FILE * arg1) +{ +engine_stats(arg1); +} + +void andersen_terms_print_graph(FILE * arg1) +{ +print_constraint_graphs(arg1); +} + |