OpenADFortTk (basic)
src/lib/support/Open64IRInterface/SymTab.cpp
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines