VariableId VariableIdMapping::variableIdOfArrayElement(VariableId arrayVar, int elemIndex) { int idCode = arrayVar.getIdCode(); int elemIdCode = idCode + elemIndex; VariableId elemVarId; elemVarId.setIdCode(elemIdCode); return elemVarId; }
/*! * \author Markus Schordan * \date 2012. */ VariableIdMapping::VariableIdSet VariableIdMapping::getVariableIdSet() { VariableIdSet set; for(map<SgSymbol*,size_t>::iterator i=mappingSymToVarId.begin();i!=mappingSymToVarId.end();++i) { size_t t=(*i).second; VariableId id; id.setIdCode(t); set.insert(id); } return set; }
// Returns a valid VariableId corresponding to *ref* // if indices in *ref* are all integers and sizes of // all array dimensions are known. // Returns an invalid VariableId otherwise. VariableId VariableIdMapping::idForArrayRef(SgPntrArrRefExp* ref) { assert(ref); VariableId result; result.setIdCode(-1); // Check failure conditions if(isSgPntrArrRefExp(ref->get_parent())) return result; SgExpression* varRef; vector<SgExpression*> subscripts; vector<SgExpression*>* pSubscripts = &subscripts; SageInterface::isArrayReference(ref, &varRef, &pSubscripts); SgVarRefExp* arrVar = isSgVarRefExp(varRef); if(!arrVar) return result; SgArrayType* arrType = isSgArrayType(SageInterface::convertRefToInitializedName(arrVar)->get_type()); if(!arrType) return result; vector<size_t> arrayDimensions; size_t arrSize = getArrayDimensions(arrType, &arrayDimensions); if(!arrSize) { arrayDimensions.clear(); arrSize = getArrayDimensionsFromInitializer( isSgAggregateInitializer(SageInterface::convertRefToInitializedName(arrVar)->get_initializer()), &arrayDimensions); } if(!arrSize) return result; // Array size is unknown assert(arrayDimensions.size() == subscripts.size()); // Calculate the index as below. // int a[M][N][K]; // a[x][y][z] => index = x*N*K + y*K + z. int index = 0; for(unsigned i = 0; i < subscripts.size(); i++) { int curIndex = exprToInt(subscripts[i]); if(curIndex == -1) return result; int dimension_size = (i == arrayDimensions.size() - 1 ? 1 : arrayDimensions[i + 1]); for(unsigned d = i + 2; d < arrayDimensions.size(); d++) dimension_size*= arrayDimensions[d]; index += curIndex*dimension_size; } VariableId varId = variableId(arrVar); result = variableIdOfArrayElement(varId, index); return result; }
/*! * \author Markus Schordan * \date 2012. */ VariableId VariableIdMapping::variableIdFromCode(int i) { VariableId id; id.setIdCode(i); return id; }