26 #ifndef _TYPECHECK_COMMON_H
27 #define _TYPECHECK_COMMON_H
44 #ifdef TYPECHECK_DEBUG
45 #define TYPECHECK_ASSERT(cond) assert(cond)
47 #define TYPECHECK_ASSERT(cond)
50 #ifdef TYPECHECK_VERBOSE_OPT
51 extern bool opt_typecheckverbose;
52 #define DOLOG(action) do { if (opt_typecheckverbose) {action;} } while(0)
57 #ifdef TYPECHECK_VERBOSE
58 #define TYPECHECK_VERBOSE_IMPORTANT
59 #define OLD_LOGNL DOLOG(puts(""))
60 #define OLD_LOG(str) DOLOG(puts(str);)
61 #define OLD_LOG1(str,a) DOLOG(printf(str,a); OLD_LOGNL)
62 #define OLD_LOG2(str,a,b) DOLOG(printf(str,a,b); OLD_LOGNL)
63 #define OLD_LOG3(str,a,b,c) DOLOG(printf(str,a,b,c); OLD_LOGNL)
64 #define OLD_LOGIF(cond,str) DOLOG(do {if (cond) { puts(str); }} while(0))
66 #define OLD_LOGINFO(info) DOLOG(do {typeinfo_print_short(stdout,(info)); OLD_LOGNL;} while(0))
68 #define OLD_LOGINFO(info)
69 #define typevector_print(x,y,z)
71 #define OLD_LOGFLUSH DOLOG(fflush(stdout))
72 #define OLD_LOGSTR(str) DOLOG(printf("%s", str))
73 #define OLD_LOGSTR1(str,a) DOLOG(printf(str,a))
74 #define OLD_LOGSTR2(str,a,b) DOLOG(printf(str,a,b))
75 #define OLD_LOGSTR3(str,a,b,c) DOLOG(printf(str,a,b,c))
76 #define OLD_LOGNAME(c) DOLOG(class_classref_or_classinfo_print(c))
77 #define OLD_LOGMETHOD(str,m) DOLOG(printf("%s", str); method_println(m);)
80 #define OLD_LOG1(str,a)
81 #define OLD_LOG2(str,a,b)
82 #define OLD_LOG3(str,a,b,c)
83 #define OLD_LOGIF(cond,str)
84 #define OLD_LOGINFO(info)
87 #define OLD_LOGSTR(str)
88 #define OLD_LOGSTR1(str,a)
89 #define OLD_LOGSTR2(str,a,b)
90 #define OLD_LOGSTR3(str,a,b,c)
91 #define OLD_LOGNAME(c)
92 #define OLD_LOGMETHOD(str,m)
95 #ifdef TYPECHECK_VERBOSE_IMPORTANT
96 #define OLD_LOGimp(str) DOLOG(puts(str);OLD_LOGNL)
97 #define OLD_LOGimpSTR(str) DOLOG(puts(str))
99 #define OLD_LOGimp(str)
100 #define OLD_LOGimpSTR(str)
103 #if defined(TYPECHECK_VERBOSE) || defined(TYPECHECK_VERBOSE_IMPORTANT)
106 void typecheck_print_vararray(FILE *file,
jitdata *jd,
s4 *vars,
int len);
114 #if defined(TYPECHECK_DEBUG) && !defined(TYPECHECK_NO_STATISTICS)
118 #ifdef TYPECHECK_STATISTICS
119 #define STAT_ITERATIONS 10
120 #define STAT_BLOCKS 10
121 #define STAT_LOCALS 16
123 extern int stat_typechecked;
124 extern int stat_methods_with_handlers;
125 extern int stat_methods_maythrow;
126 extern int stat_iterations[STAT_ITERATIONS+1];
127 extern int stat_reached;
128 extern int stat_copied;
129 extern int stat_merged;
130 extern int stat_merging_changed;
131 extern int stat_blocks[STAT_BLOCKS+1];
132 extern int stat_locals[STAT_LOCALS+1];
134 extern int stat_ins_maythrow;
135 extern int stat_ins_stack;
136 extern int stat_ins_field;
137 extern int stat_ins_field_unresolved;
138 extern int stat_ins_field_uninitialized;
139 extern int stat_ins_invoke;
140 extern int stat_ins_invoke_unresolved;
141 extern int stat_ins_primload;
142 extern int stat_ins_aload;
143 extern int stat_ins_builtin;
144 extern int stat_ins_builtin_gen;
145 extern int stat_ins_branch;
146 extern int stat_ins_switch;
147 extern int stat_ins_primitive_return;
148 extern int stat_ins_areturn;
149 extern int stat_ins_areturn_unresolved;
150 extern int stat_ins_athrow;
151 extern int stat_ins_athrow_unresolved;
152 extern int stat_ins_unchecked;
153 extern int stat_handlers_reached;
154 extern int stat_savedstack;
156 #define TYPECHECK_MARK(var) ((var) = true)
157 #define TYPECHECK_COUNT(cnt) (cnt)++
158 #define TYPECHECK_COUNTIF(cond,cnt) do{if(cond) (cnt)++;} while(0)
159 #define TYPECHECK_COUNT_FREQ(array,val,limit) \
161 if ((val) < (limit)) (array)[val]++; \
162 else (array)[limit]++; \
165 void typecheck_print_statistics(FILE *file);
169 #define TYPECHECK_COUNT(cnt)
170 #define TYPECHECK_MARK(var)
171 #define TYPECHECK_COUNTIF(cond,cnt)
172 #define TYPECHECK_COUNT_FREQ(array,val,limit)
181 #define TYPECHECK_VERIFYERROR_ret(m,msg,retval) \
183 exceptions_throw_verifyerror((m), (msg)); \
187 #define TYPECHECK_VERIFYERROR_main(msg) TYPECHECK_VERIFYERROR_ret(state.m,(msg),NULL)
188 #define TYPECHECK_VERIFYERROR_bool(msg) TYPECHECK_VERIFYERROR_ret(state->m,(msg),false)
195 #define COPYTYPE(source,dest) \
196 {if (VAROP(source)->type == TYPE_ADR) { \
197 VAROP(dest)->typeinfo = VAROP(source)->typeinfo;}}
258 #ifdef TYPECHECK_STATISTICS
278 s4 *srcvars,
s4 *dstvars,
s4 n);
typecheck_result typecheck_merge_types(verifier_state *state, s4 *srcvars, s4 *dstvars, s4 n)
State
State of block during stack analysis.
exception_entry ** handlers
typedescriptor_t * startstack
typecheck_jsr_t ** jsrinfos
void typecheck_init_state(verifier_state *state, basicblock::State minstate)
typedescriptor_t * retlocals
bool typecheck_init_locals(verifier_state *state, bool newthis)
typedescriptor_t * locals
typecheck_result typestate_merge(verifier_state *state, s4 *srcvars, varinfo *srclocals, s4 *dstvars, varinfo *dstlocals, s4 n)
void typecheck_reset_state(verifier_state *state)
typecheck_jsr_caller_t * next
typedescriptor_t * startlocals
typedescriptor_t * retstack
bool typecheck_copy_types(verifier_state *state, s4 *srcvars, s4 *dstvars, s4 n)
struct verifier_state verifier_state
typedescriptor_t returntype
typedescriptor_t * stackceiling
bool typestate_reach(verifier_state *state, basicblock *destblock, s4 *srcvars, varinfo *srclocals, s4 n)
typecheck_jsr_caller_t * callers