Ejemplo n.º 1
0
bool ArrayInterface ::
may_alias(AstInterface& _fa, const AstNodePtr& r1, const AstNodePtr& r2)
{
  CPPAstInterface& fa = static_cast<CPPAstInterface&>(_fa);
  AstNodePtr array1, array2;
  ArrayAnnotation* annot = ArrayAnnotation::get_inst();
  bool elem1 = annot->is_access_array_elem( fa, r1, &array1) ;
  bool len1 = annot->is_access_array_length( fa, r1, &array1);
  bool elem2 = annot->is_access_array_elem( fa, r2, &array2);
  bool len2 = annot->is_access_array_length( fa, r2, &array2);

  if ( (elem1 && len2) || (len1 && elem2))  {
     return false;
  } 
  else if ( (elem1 && elem2)  || (len1 && len2)) {
     if (may_alias(fa, array1, array2)) {
        if (DebugAliasAnal())
            std::cerr << "has alias between " << AstInterface::AstToString(r1) << " and " << AstInterface::AstToString(r2) << std::endl;
        return true;
     }
  }
  else if (elem1 || len1) {
     if (may_alias(fa, array1, r2)) {
        if (DebugAliasAnal())
            std::cerr << "has alias between " << AstInterface::AstToString(r1) << " and " << AstInterface::AstToString(r2) << std::endl;
        return true;
     }
  }
  else if (elem2 || len2) {
     if (may_alias(fa, r1, array2)) {
        if (DebugAliasAnal())
            std::cerr << "has alias between " << AstInterface::AstToString(r1) << " and " << AstInterface::AstToString(r2) << std::endl;
        return true;
     }
  }
  else {
     AstInterface::AstNodeList args;
     if (annot->is_array_construct_op( fa, r1, &args)) {
        for (AstInterface::AstNodeList::iterator p = args.begin();
             p != args.end(); ++p) {
          AstNodePtr cur = *p;
          if (may_alias( fa, cur, r2)) {
            if (DebugAliasAnal())
               std::cerr << "has alias between " << AstInterface::AstToString(r1) << " and " << AstInterface::AstToString(r2) << std::endl;
             return true;
          }
        }
        return false;    
     }
     else if (annot->is_array_construct_op( fa, r2, &args)) {
        for (AstInterface::AstNodeList::iterator p = args.begin();
             p != args.end(); ++p) {
          AstNodePtr cur = *p;
          if (may_alias( fa, cur, r1)) {
            if (DebugAliasAnal())
               std::cerr << "has alias between " << AstInterface::AstToString(r1) << " and " << AstInterface::AstToString(r2) << std::endl;
             return true;
          }
        }
        return false;
     }
     return aliasCollect.may_alias( fa, r1, r2);
  }
  return false;
}