diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/chillAST/chillAST_def.hh | 23 | ||||
| -rw-r--r-- | include/chillAST/chillAST_node.hh | 196 | ||||
| -rw-r--r-- | include/chillAST/chillASTs.hh | 13 | 
3 files changed, 39 insertions, 193 deletions
diff --git a/include/chillAST/chillAST_def.hh b/include/chillAST/chillAST_def.hh index f336e14..4ec60aa 100644 --- a/include/chillAST/chillAST_def.hh +++ b/include/chillAST/chillAST_def.hh @@ -23,7 +23,7 @@ enum CHILLAST_NODE_TYPE {    CHILLAST_NODE_TYPEDEFDECL,    CHILLAST_NODE_VARDECL,    //  CHILLAST_NODE_PARMVARDECL,   not used any more -  CHILLAST_NODE_FUNCTIONDECL, +      CHILLAST_NODE_FUNCTIONDECL,    CHILLAST_NODE_RECORDDECL,     // struct or union (or class)    CHILLAST_NODE_MACRODEFINITION,    CHILLAST_NODE_COMPOUNDSTMT, @@ -41,7 +41,7 @@ enum CHILLAST_NODE_TYPE {    CHILLAST_NODE_RETURNSTMT,    CHILLAST_NODE_CALLEXPR,    //CHILLAST_NODE_DECLSTMT, not used -  CHILLAST_NODE_PARENEXPR, +      CHILLAST_NODE_PARENEXPR,    CHILLAST_NODE_CSTYLECASTEXPR,    CHILLAST_NODE_CSTYLEADDRESSOF,    CHILLAST_NODE_IFSTMT, @@ -51,7 +51,7 @@ enum CHILLAST_NODE_TYPE {    CHILLAST_NODE_PREPROCESSING, // comments, #define, #include, whatever else works    CHILLAST_NODE_NOOP,   // NO OP    // CUDA specific -  CHILLAST_NODE_CUDAMALLOC, +      CHILLAST_NODE_CUDAMALLOC,    CHILLAST_NODE_CUDAFREE,    CHILLAST_NODE_CUDAMEMCPY,    CHILLAST_NODE_CUDAKERNELCALL, @@ -97,6 +97,7 @@ char *splitTypeInfo(char *underlyingtype);  //! change "1024UL" to "1024"  char *ulhack(char *brackets); +  //! remove __restrict__ , MODIFIES the argument!  char *restricthack(char *typeinfo); @@ -106,8 +107,10 @@ extern const char *ChillAST_Node_Names[];  // WARNING MUST BE KEPT IN SYNC WITH  // fwd declarations  //! the generic node, who specific types are derived from  class chillAST_Node; +  //! empty node  class chillAST_NULL; +  //! ast for an entire source file (translationunit)  class chillAST_SourceFile; @@ -120,15 +123,19 @@ class chillAST_FunctionDecl;  //! structs and unions (and classes?)  class chillAST_RecordDecl; +  class chillAST_MacroDefinition;  //! A sequence of statements  class chillAST_CompoundStmt; +  //! a For LOOP  class chillAST_ForStmt;  class chillAST_UnaryOperator; +  class chillAST_BinaryOperator; +  class chillAST_TernaryOperator;  class chillAST_ArraySubscriptExpr; @@ -169,6 +176,7 @@ class chillAST_CudaFree;  class chillAST_CudaMemcpy; +// Not implemented  class chillAST_CudaKernelCall;  class chillAST_CudaSyncthreads; @@ -180,20 +188,21 @@ typedef std::vector<chillAST_VarDecl *> chillAST_SymbolTable;  typedef std::vector<chillAST_TypedefDecl *> chillAST_TypedefTable;  chillAST_VarDecl *symbolTableFindName(chillAST_SymbolTable *table, const char *name); +  chillAST_VarDecl *symbolTableFindVariableNamed(chillAST_SymbolTable *table,                                                 const char *name); -chillAST_TypedefDecl *typedefTableFindName(chillAST_TypedefTable *table, const char *name); - -void printSymbolTable(chillAST_SymbolTable *st); -void printSymbolTableMoreInfo(chillAST_SymbolTable *st); +chillAST_TypedefDecl *typedefTableFindName(chillAST_TypedefTable *table, const char *name);  chillAST_Node *lessthanmacro(chillAST_Node *left, chillAST_Node *right); +  chillAST_SymbolTable *addSymbolToTable(chillAST_SymbolTable *st, chillAST_VarDecl *vd); +  chillAST_TypedefTable *addTypedefToTable(chillAST_TypedefTable *tt, chillAST_TypedefDecl *td);  void chillindent(int i, FILE *fp); +  void insertNewDeclAtLocationOfOldIfNeeded(chillAST_VarDecl *newdecl, chillAST_VarDecl *olddecl);  chillAST_DeclRefExpr *buildDeclRefExpr(chillAST_VarDecl *); diff --git a/include/chillAST/chillAST_node.hh b/include/chillAST/chillAST_node.hh index 511386d..3ea29d9 100644 --- a/include/chillAST/chillAST_node.hh +++ b/include/chillAST/chillAST_node.hh @@ -153,20 +153,17 @@ public:    virtual void addTypedefToScope(chillAST_TypedefDecl *tdd); -  chillAST_TypedefDecl *findTypeDecleration(const char *t); - -  chillAST_VarDecl *findVariableDecleration(const char *t); - +  //! Non recursive version that tries to find the declaration in this node    chillAST_VarDecl *getVariableDeclaration(const char *vn); +  //! Non recursive version that tries to find the declaration in this node    chillAST_TypedefDecl *getTypeDeclaration(const char *tn); -  virtual chillAST_VarDecl *findVariableNamed(const char *name); // recursive - -  chillAST_RecordDecl *findRecordDeclNamed(const char *name); // recursive - -  // void addDecl( chillAST_VarDecl *vd); // recursive, adds to first  symbol table it can find +  //! Recursive version that will go to parent node if not finding in this +  chillAST_VarDecl *findVariableDecleration(const char *t); +  //! Recursive version that will go the parent node if not finding in this +  chillAST_TypedefDecl *findTypeDecleration(const char *t);    int getNumChildren() { return children.size(); }; @@ -181,72 +178,19 @@ public:    void setMetaComment(const char *c) { metacomment = strdup(c); }; -  virtual void chillMergeChildInfo(chillAST_Node) { -    // TODO if (par) par->add to definition for vardecl/typedecl -    // TODO  if (par) par->getSourceFile()->addFunc(this); for FuncDecl -    // TODO if (par) par->getSourceFile()->addMacro(this); For MacroDecl -    // TODO if (parent) parent->addVariableToSymbolTable(this); // should percolate up until something has a symbol table -  } +  virtual void mergeChildInfo(chillAST_Node); -  virtual void addChild(chillAST_Node *c) { -    c->parent = this; -    // check to see if it's already there -    for (int i = 0; i < children.size(); i++) { -      if (c == children[i]) { -        CHILL_ERROR("addchild ALREADY THERE\n"); -        return; // already there -      } -    } -    children.push_back(c); -  };  // not usually useful - -  virtual void addChildren(const chillAST_NodeList &c) { -    for (int i = 0; i < c.size(); ++i) { -      addChild(c[i]); -    } -  } +  virtual void addChild(chillAST_Node *c); -  virtual void insertChild(int i, chillAST_Node *node) { -    //fprintf(stderr, "%s inserting child of type %s at location %d\n", getTypeString(), node->getTypeString(), i);  -    node->parent = this; -    children.insert(children.begin() + i, node); -  }; +  virtual void addChildren(const chillAST_NodeList &c); -  virtual void removeChild(int i) { -    children.erase(children.begin() + i); -  }; +  virtual void insertChild(int i, chillAST_Node *node); -  int findChild(chillAST_Node *c) { -    for (int i = 0; i < children.size(); i++) { -      if (children[i] == c) return i; -    } -    return -1; -  } +  virtual void removeChild(int i); -  virtual void replaceChild(chillAST_Node *old, chillAST_Node *newchild) { -    CHILL_DEBUG_PRINT("(%s) forgot to implement replaceChild() ... using generic\n", getTypeString()); -    CHILL_DEBUG_PRINT("%d children\n", children.size()); -    for (int i = 0; i < children.size(); i++) { -      if (children[i] == old) { -        children[i] = newchild; -        newchild->setParent(this); -        return; -      } -    } -    CHILL_ERROR("%s %p generic replaceChild called with oldchild that was not a child\n", -                getTypeString(), this); -    CHILL_DEBUG_BEGIN -      fprintf(stderr, "printing\n"); -      print(); -      fprintf(stderr, "\nchild: "); -      if (!old) fprintf(stderr, "oldchild NULL!\n"); -      old->print(); -      fprintf(stderr, "\nnew: "); -      newchild->print(); -      fprintf(stderr, "\n"); -    CHILL_DEBUG_END -    exit(-1); -  }; +  int findChild(chillAST_Node *c); + +  virtual void replaceChild(chillAST_Node *old, chillAST_Node *newchild);    //! Spread the loop across a bunch of cores that will each calculate its own loop variable.    /*! @@ -262,12 +206,7 @@ public:     *     * @param var     */ -  virtual void loseLoopWithLoopVar(char *var) { -    std::vector<chillAST_Node *> dupe = children; // simple enough? -    for (int i = 0; i < dupe.size(); i++) {  // recurse on all children -      dupe[i]->loseLoopWithLoopVar(var); -    } -  } +  virtual void loseLoopWithLoopVar(char *var);    virtual int evalAsInt() {      CHILL_ERROR("(%s) can't be evaluated as an integer??\n", getTypeString()); @@ -314,37 +253,13 @@ public:    };    //! recursive walk parent links, looking for loops, and grabbing the declRefExpr in the loop init and cond. -  virtual void gatherLoopIndeces( -      std::vector<chillAST_VarDecl *> &indeces) { -    // you can quit when you get to certain nodes - -    CHILL_DEBUG_PRINT("%s::gatherLoopIndeces()\n", getTypeString()); - -    if (isSourceFile() || isFunctionDecl()) return; // end of the line - -    if (!parent) return; // should not happen, but be careful - -    // for most nodes, this just recurses upwards -    parent->gatherLoopIndeces(indeces); -  } +  virtual void gatherLoopIndeces(std::vector<chillAST_VarDecl *> &indeces);    //! recursive walk parent links, looking for loops -  chillAST_ForStmt *findContainingLoop() { -    CHILL_DEBUG_PRINT("%s::findContainingLoop()   ", getTypeString()); -    if (!parent) return NULL; -    if (parent->isForStmt()) return (chillAST_ForStmt *) parent; -    return parent->findContainingLoop(); // recurse upwards -  } +  chillAST_ForStmt *findContainingLoop();    //! recursive walk parent links, avoiding loops -  chillAST_Node *findContainingNonLoop() { -    fprintf(stderr, "%s::findContainingNonLoop()   ", getTypeString()); -    if (!parent) return NULL; -    if (parent->isCompoundStmt() && parent->getParent()->isForStmt()) -      return parent->getParent()->findContainingNonLoop(); // keep recursing -    if (parent->isForStmt()) return parent->findContainingNonLoop(); // keep recursing -    return (chillAST_Node *) parent; // return non-loop -  } +  chillAST_Node *findContainingNonLoop();    // TODO gather loop init and cond (and if cond) like gatherloopindeces @@ -415,87 +330,22 @@ public:      fprintf(fp, "(%s) forgot to implement printName()\n", getTypeString());    };// print CODE  -  //! The AST's print version, for reason unknown and incorrect -  virtual char *stringRep(int indent = 0) { -    fflush(stdout); -    // TODO chillindent(indent, fp); -    CHILL_ERROR("(%s) forgot to implement stringRep()\n", getTypeString()); -    exit(-1); -  } +  virtual void getTopLevelLoops(std::vector<chillAST_ForStmt *> &loops); -  virtual void getTopLevelLoops(std::vector<chillAST_ForStmt *> &loops) { -    int n = children.size(); -    for (int i = 0; i < n; i++) { -      if (children[i]->isForStmt()) { -        loops.push_back(((chillAST_ForStmt *) (children[i]))); -      } -    } -  } +  virtual void repairParentChild(); - -  virtual void repairParentChild() {  // for nodes where all subnodes are children -    int n = children.size(); -    for (int i = 0; i < n; i++) { -      if (children[i]->parent != this) { -        fprintf(stderr, "fixing child %s that didn't know its parent\n", children[i]->getTypeString()); -        children[i]->parent = this; -      } -    } -  } - - -  virtual void -  get_deep_loops(std::vector<chillAST_ForStmt *> &loops) { // this is probably broken - returns ALL loops under it -    int n = children.size(); -    //fprintf(stderr, "get_deep_loops of a %s with %d children\n", getTypeString(), n);  -    for (int i = 0; i < n; i++) { -      //fprintf(stderr, "child %d is a %s\n", i, children[i]->getTypeString());  -      children[i]->get_deep_loops(loops); -    } -    //fprintf(stderr, "found %d deep loops\n", loops.size());  -  } +  virtual void get_deep_loops(std::vector<chillAST_ForStmt *> &loops);    // generic for chillAST_Node with children -  virtual void find_deepest_loops(std::vector<chillAST_ForStmt *> &loops) { // returns DEEPEST nesting of loops -    std::vector<chillAST_ForStmt *> deepest; // deepest below here - -    int n = children.size(); -    //fprintf(stderr, "find_deepest_loops of a %s with %d children\n", getTypeString(), n);  -    for (int i = 0; i < n; i++) { -      std::vector<chillAST_ForStmt *> subloops;  // loops below here among a child of mine  - -      //fprintf(stderr, "child %d is a %s\n", i, children[i]->getTypeString());  -      children[i]->find_deepest_loops(subloops); - -      if (subloops.size() > deepest.size()) { -        deepest = subloops; -      } -    } - -    // append deepest we see at this level to loops  -    for (int i = 0; i < deepest.size(); i++) { -      loops.push_back(deepest[i]); -    } - -    //fprintf(stderr, "found %d deep loops\n", loops.size());  - -  } - +  virtual void find_deepest_loops(std::vector<chillAST_ForStmt *> &loops);    void setParent(chillAST_Node *p) { parent = p; };    chillAST_Node *getParent() { return parent; };    //! This will be ideally replaced by call at to the top level -  chillAST_SourceFile *getSourceFile() { -    if (isSourceFile()) return ((chillAST_SourceFile *) this); -    if (parent != NULL) return parent->getSourceFile(); -    CHILL_ERROR("UHOH, getSourceFile() called on node %p %s that does not have a parent and is not a source file\n", -                this, this->getTypeString()); -    this->print(); -    exit(-1); -  } +  chillAST_SourceFile *getSourceFile();    // TODO DOC    virtual chillAST_Node *getEnclosingStatement(int level = 0); diff --git a/include/chillAST/chillASTs.hh b/include/chillAST/chillASTs.hh index 8e5cee0..4ff70c9 100644 --- a/include/chillAST/chillASTs.hh +++ b/include/chillAST/chillASTs.hh @@ -227,8 +227,6 @@ public:    };    // required methods that I can't seem to get to inherit -  char *stringRep(int indent = 0); -    chillAST_Node *constantFold();    chillAST_Node *clone(); @@ -498,15 +496,10 @@ public:    virtual CHILLAST_NODE_TYPE getType() { return CHILLAST_NODE_MACRODEFINITION; }    char *macroName; -  char *rhsString;    // parameters - these will be odd, in that they HAVE NO TYPE    void setName(char *n) { macroName = strdup(n); /* probable memory leak */ }; -  void setRhsString(char *n) { rhsString = strdup(n); /* probable memory leak */ }; - -  char *getRhsString() { return rhsString; } -    chillAST_MacroDefinition(const char *name, const char *rhs);    void addChild(chillAST_Node *node); // special because inserts into BODY @@ -808,8 +801,6 @@ public:    // required methods that I can't seem to get to inherit -  char *stringRep(int indent = 0); -    chillAST_Node *constantFold();    chillAST_Node *clone(); @@ -879,8 +870,6 @@ public:    void replaceChild(chillAST_Node *old, chillAST_Node *newchild); // will examine index    // required methods that I can't seem to get to inherit -  char *stringRep(int indent = 0); -    chillAST_Node *constantFold();    chillAST_Node *clone(); @@ -941,8 +930,6 @@ public:    bool operator==(const chillAST_MemberExpr &);    // required methods that I can't seem to get to inherit -  char *stringRep(int indent = 0); -    chillAST_Node *constantFold();    chillAST_Node *clone();  | 
