|
OpenADFortTk (basic)
|
00001 // -*-Mode: C++;-*- 00002 //************************** Open64 Include Files *************************** 00003 00004 #include "Open64BasicTypes.h" 00005 00006 //*************************** User Include Files **************************** 00007 00008 #include "SymTab.h" 00009 00010 #include "stab_attr.h" 00011 #include "wn_attr.h" 00012 #include "IFDiagnostics.h" 00013 00014 //************************** Forward Declarations *************************** 00015 00016 //*************************************************************************** 00017 00018 // FIXME 00019 // Create a new symbol name 00020 static const char* cat(const char* str, UINT num) 00021 { 00022 // 39 bytes hold a 128-bit uint in base 10. [log(2^128)] 00023 #define SYMBUF_SZ (32 + 39 + 1) 00024 static char buf[SYMBUF_SZ]; 00025 snprintf(buf, SYMBUF_SZ, "%s%d", str, num); 00026 return buf; 00027 #undef SYMBUF_SZ 00028 } 00029 00030 //*************************************************************************** 00031 // 00032 //*************************************************************************** 00033 00034 // IsVarRefTranslatableToXAIF: Returns whether 'wn' a variable 00035 // reference that can be translated into XAIF. 'wn' must be an 00036 // expression; IOW it cannot be a store (=statement). 00037 bool 00038 IsVarRefTranslatableToXAIF(const WN* wn) 00039 { 00040 // FIXME: IsScalarRef should perhaps be is_translatable_to_xaif 00041 00042 OPERATOR opr = WN_operator(wn); 00043 if (!OPERATOR_is_expression(opr)) { return false; } 00044 00045 switch (opr) { 00046 // FIXME 00047 // ILOADX, ISTOREX 00048 // ILDBITS, ISTBITS 00049 // MLOAD, MSTORE: memref 00050 // OPR_IDNAME: 00051 00052 case OPR_LDA: 00053 case OPR_LDMA: 00054 return true; // FIXME: can this be used in some evil way? 00055 00056 case OPR_LDID: 00057 case OPR_LDBITS: { // symref 00058 TY_IDX baseobj_ty = ST_type(WN_st(wn)); 00059 TY_IDX refobj_ty = WN_Tree_Type(wn); 00060 return (IsScalarRef(baseobj_ty, refobj_ty)); 00061 } 00062 00063 case OPR_ILOAD: { // memref 00064 TY_IDX baseobj_ty = TY_pointed(WN_load_addr_ty(wn)); 00065 TY_IDX refobj_ty = WN_Tree_Type(wn); 00066 return (IsScalarRef(baseobj_ty, refobj_ty)); 00067 } 00068 00069 case OPR_ARRAY: 00070 case OPR_ARRSECTION: // FIXME: can we do arrsection? 00071 case OPR_ARRAYEXP: 00072 return true; 00073 00074 } // switch 00075 00076 return false; 00077 } 00078 00079 00080 bool 00081 IsScalarRef(TY_IDX baseobj_ty, TY_IDX refobj_ty) 00082 { 00083 if (TY_IsNonScalar(refobj_ty)) { 00084 // This is a reference to a non-scalar or a non-scalar within a 00085 // non-scalar (e.g. a record or a record within a record) 00086 return false; 00087 } else if (TY_Is_Scalar(refobj_ty)) { 00088 // Test whether 'baseobj_ty' is assignable to 'refobj_ty'. If 00089 // not, we have a non-scalar reference (e.g. a field within a 00090 // structure; an element within an array). 00091 return (WN2F_Can_Assign_Types(baseobj_ty, refobj_ty)); 00092 } else { 00093 return false; 00094 } 00095 } 00096 00097 bool 00098 IsNonScalarRef(TY_IDX baseobj_ty, TY_IDX refobj_ty) 00099 { 00100 return (!IsScalarRef(baseobj_ty, refobj_ty)); 00101 } 00102 00103 // NOTE: for store OPERATORs, only the LHS is checked 00104 bool 00105 IsNonScalarRef(const WN* wn) 00106 { 00107 // FIXME: redefine to be !IsVarRefTranslatableToXAIF 00108 00109 OPERATOR opr = WN_operator(wn); 00110 switch (opr) { 00111 // FIXME 00112 // ILOADX, ISTOREX 00113 // ILDBITS, ISTBITS 00114 // MLOAD, MSTORE: memref 00115 00116 case OPR_LDA: // FIXME: 00117 case OPR_LDMA: // FIXME: 00118 break; // can this be used to access records? 00119 00120 case OPR_LDID: 00121 case OPR_LDBITS: 00122 case OPR_STID: 00123 case OPR_STBITS: { // symref 00124 // For stores, only check LHS (kid1) 00125 TY_IDX baseobj_ty = WN_GetBaseObjType(wn); 00126 TY_IDX refobj_ty = WN_GetRefObjType(wn); 00127 return (IsNonScalarRef(baseobj_ty, refobj_ty)); 00128 } 00129 00130 case OPR_ILOAD: 00131 case OPR_ISTORE: { // memref 00132 // For stores, only check LHS (kid1) 00133 TY_IDX baseobj_ty = WN_GetBaseObjType(wn); 00134 TY_IDX refobj_ty = WN_GetRefObjType(wn); 00135 return (IsNonScalarRef(baseobj_ty, refobj_ty)); 00136 } 00137 00138 case OPR_ARRAY: 00139 case OPR_ARRSECTION: { 00140 // Arrays: 00141 // Kid 0 is an LDA or LDID which represents the base of the array 00142 // being referenced or defined. Kids 1..n are dimensions; Kids 00143 // n+1..2n are the index expressions. 00144 WN* base = WN_kid0(wn); 00145 ASSERT_FATAL(WN_operator(base) == OPR_LDA || WN_operator(base) == OPR_LDID, 00146 (DIAG_A_STRING, "Error!")); 00147 return true; 00148 } 00149 00150 case OPR_ARRAYEXP: // FIXME 00151 return true; 00152 00153 } // switch 00154 00155 return false; 00156 } 00157