00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #define __STDC_LIMIT_MACROS
00042 #include <stdint.h>
00043 #ifdef USE_PCH
00044 #include "be_com_pch.h"
00045 #endif
00046 #pragma hdrstop
00047 #include <sys/types.h>
00048 #include <ctype.h>
00049 #include <limits.h>
00050 #include "wn.h"
00051 #include "wn_simp.h"
00052 #include "strtab.h"
00053 #include "opt_du.h"
00054 #include "dep_graph.h"
00055 #include "targ_const.h"
00056 #include "wb_util.h"
00057 #include "prompf.h"
00058 #include "lnopt_main.h"
00059 #include "wb_buffer.h"
00060 #include "wb_carray.h"
00061 #include "targ_sim.h"
00062 #include "wutil.h"
00063 #include "intrn_info.h"
00064
00065
00066
00067
00068
00069
00070 extern void WB_Bell()
00071 {
00072 fprintf(stdout, "%c", '\007');
00073 fflush(stdout);
00074 }
00075
00076
00077
00078
00079
00080
00081 extern void WB_Prompt()
00082 {
00083 fprintf(stdout, "WB> ");
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 extern const char* WB_Whirl_Symbol(WN* wn)
00095 {
00096 if (wn == NULL)
00097 return NULL;
00098 WN* wn_symbol = NULL;
00099 const char* name = NULL;
00100 OPCODE opc = WN_opcode(wn);
00101 OPERATOR opr = OPCODE_operator(opc);
00102 if (opc == OPC_PRAGMA || opc == OPC_XPRAGMA)
00103 return WN_pragmas[WN_pragma(wn)].name;
00104 if (opr == OPR_INTRINSIC_CALL)
00105 return INTRINSIC_name((INTRINSIC) WN_intrinsic(wn));
00106 wn_symbol = (opc == OPC_DO_LOOP) ? WN_index(wn) : (OPCODE_has_sym(opc))
00107 ? wn : NULL;
00108 if (wn_symbol == NULL)
00109 return NULL;
00110 if (WN_st(wn_symbol) == NULL)
00111 return NULL;
00112 name = ST_class(WN_st(wn_symbol)) != CLASS_PREG
00113 ? ST_name(WN_st(wn_symbol)) :
00114 WN_offset(wn_symbol) > Last_Dedicated_Preg_Offset
00115 ? Preg_Name(WN_offset(wn_symbol)) : "DEDICATED PREG";
00116 return name;
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 static BOOL Is_Leaf(WN* wn)
00129 {
00130 switch (WN_operator(wn)) {
00131 case OPR_INTCONST:
00132 case OPR_LDID:
00133 return TRUE;
00134 default:
00135 return FALSE;
00136 }
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146 extern INT Dump_Whirl_Node(WN* wn,
00147 char* buffer,
00148 INT cc)
00149 {
00150 BOOL printed = FALSE;
00151
00152 if (wn == NULL) {
00153 cc += sprintf(buffer + cc, "<null>");
00154 return cc;
00155 }
00156
00157 OPCODE opc = WN_opcode(wn);
00158 OPERATOR opr = OPCODE_operator(opc);
00159
00160 printed = TRUE;
00161 switch(opr) {
00162 case OPR_CONST:
00163 switch (OPCODE_rtype(opc)) {
00164 case MTYPE_F4:
00165 cc += sprintf(buffer + cc, "%g", STC_val(WN_st(wn)).vals.fval);
00166 break;
00167 case MTYPE_F8:
00168 cc += sprintf(buffer + cc, "%g", STC_val(WN_st(wn)).vals.dval);
00169 break;
00170 default:
00171 printed = FALSE;
00172 break;
00173 }
00174 break;
00175 case OPR_INTCONST:
00176 cc += sprintf(buffer + cc, "%lld", WN_const_val(wn));
00177 break;
00178 case OPR_LDID:
00179 cc += sprintf(buffer + cc, "%s", WB_Whirl_Symbol(wn));
00180 break;
00181 case OPR_ADD:
00182 cc += sprintf(buffer + cc, "+");
00183 break;
00184 case OPR_SUB:
00185 cc += sprintf(buffer + cc, "-");
00186 break;
00187 case OPR_MPY:
00188 cc += sprintf(buffer + cc, "*");
00189 break;
00190 case OPR_DIV:
00191 cc += sprintf(buffer + cc, "/");
00192 break;
00193 default:
00194 printed = FALSE;
00195 break;
00196 }
00197
00198 if (!printed) {
00199 FmtAssert(strncmp(OPCODE_name(opc), "OPC_", 4) == 0,
00200 ("opname=%s", OPCODE_name(opc)));
00201
00202 cc += sprintf(buffer + cc, "%s", OPCODE_name(opc) + 4);
00203 if (OPCODE_has_sym(opc))
00204 cc += sprintf(buffer + cc, " %s", WB_Whirl_Symbol(wn));
00205 if (OPCODE_has_label(opc))
00206 cc += sprintf(buffer + cc, " LAB%d", WN_offset(wn));
00207 if (opr == OPR_INTRINSIC_OP || opr == OPR_INTRINSIC_CALL) {
00208 INTRINSIC i = (INTRINSIC) WN_intrinsic(wn);
00209 if (i >= INTRINSIC_FIRST && i <= INTRINSIC_LAST)
00210 cc += sprintf(buffer + cc, "<%s>", INTRINSIC_name(i));
00211 else
00212 cc += sprintf(buffer + cc, "<bad intr #=%d>", i);
00213 }
00214 else if (opr == OPR_IO)
00215 cc += sprintf(buffer + cc, "<io=%d>", WN_io_statement(wn));
00216 else if (opr == OPR_IO_ITEM)
00217 cc += sprintf(buffer + cc, "<io item=%d>", WN_io_item(wn));
00218 }
00219 return cc;
00220 }
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 extern INT WB_Dump_Whirl_Expr(WN* wn_root,
00231 WN* wn,
00232 char* buffer,
00233 INT cc)
00234 {
00235 if (wn != wn_root && !Is_Leaf(wn))
00236 cc += sprintf(buffer + cc, "(");
00237 INT i = 0;
00238 switch (WN_operator(wn)) {
00239 case OPR_ADD:
00240 case OPR_SUB:
00241 case OPR_MPY:
00242 case OPR_DIV:
00243 for (i = 0; i < WN_kid_count(wn); i++) {
00244 cc = WB_Dump_Whirl_Expr(wn_root, WN_kid(wn, i), buffer, cc);
00245 if (i < WN_kid_count(wn) - 1)
00246 cc = Dump_Whirl_Node(wn, buffer, cc);
00247 }
00248 break;
00249 case OPR_ARRAY:
00250 cc = Dump_Whirl_Node(WN_array_base(wn), buffer, cc);
00251 cc += sprintf(buffer + cc, "[");
00252 for (i = 0; i < WN_num_dim(wn); i++) {
00253 cc = WB_Dump_Whirl_Expr(WN_array_index(wn, i), WN_array_index(wn, i),
00254 buffer, cc);
00255 if (i < WN_num_dim(wn) - 1)
00256 cc += sprintf(buffer + cc, ",");
00257 }
00258 cc += sprintf(buffer + cc, "]");
00259 break;
00260 case OPR_LDID:
00261 case OPR_INTCONST:
00262 case OPR_CONST:
00263 cc = Dump_Whirl_Node(wn, buffer, cc);
00264 break;
00265 default:
00266 cc = Dump_Whirl_Node(wn, buffer, cc);
00267 cc += sprintf(buffer + cc, "(");
00268 for (i = 0; i < WN_kid_count(wn); i++) {
00269 cc = WB_Dump_Whirl_Expr(wn_root, WN_kid(wn, i), buffer, cc);
00270 if (i < WN_kid_count(wn) - 1)
00271 cc += sprintf(buffer + cc, ",");
00272 }
00273 cc += sprintf(buffer + cc, ")");
00274 break;
00275 }
00276 if (wn != wn_root && !Is_Leaf(wn))
00277 cc += sprintf(buffer + cc, ")");
00278 return cc;
00279 }
00280