diff options
| author | Tuowen Zhao <ztuowen@gmail.com> | 2016-09-25 11:06:42 -0600 | 
|---|---|---|
| committer | Tuowen Zhao <ztuowen@gmail.com> | 2016-09-25 11:06:42 -0600 | 
| commit | 2a5618583e1fdc8cde0308d3e5b1873bc94c5fb1 (patch) | |
| tree | 51e83cb14c9ba846ff5e2b8dd6c017e9b57dea75 | |
| parent | 51c4aaaa21a124abafe3f950e12c3c25ddbe0812 (diff) | |
| download | chill-2a5618583e1fdc8cde0308d3e5b1873bc94c5fb1.tar.gz chill-2a5618583e1fdc8cde0308d3e5b1873bc94c5fb1.tar.bz2 chill-2a5618583e1fdc8cde0308d3e5b1873bc94c5fb1.zip  | |
staging
| -rw-r--r-- | include/chillAST/chillAST_node.hh | 11 | ||||
| -rw-r--r-- | include/chillAST/chillASTs.hh | 40 | ||||
| -rw-r--r-- | include/printer/cfamily.h | 71 | ||||
| -rw-r--r-- | include/printer/dump.h | 10 | ||||
| -rw-r--r-- | include/printer/generic.h | 39 | ||||
| -rw-r--r-- | src/chillASTs.cc | 490 | ||||
| -rw-r--r-- | src/printer/cfamily.cpp | 279 | 
7 files changed, 367 insertions, 573 deletions
diff --git a/include/chillAST/chillAST_node.hh b/include/chillAST/chillAST_node.hh index 80f1be4..bed2f22 100644 --- a/include/chillAST/chillAST_node.hh +++ b/include/chillAST/chillAST_node.hh @@ -25,7 +25,6 @@ public:    char *filename;    //! for compiler internals, formerly a comment    char *metacomment; -  std::vector<chillAST_Preprocessing *> preprocessinginfo;    //! for manufactured scalars     static int chill_scalar_counter; @@ -418,7 +417,7 @@ public:      fprintf(fp, "(%s) forgot to implement printName()\n", getTypeString());    };// print CODE  -  //! The AST's print version +  //! The AST's print version, for reason unknown and incorrect    virtual char *stringRep(int indent = 0) {      fflush(stdout);      // TODO chillindent(indent, fp); @@ -426,9 +425,6 @@ public:      exit(-1);    } - -  virtual void printonly(int indent = 0, FILE *fp = stderr) { print(indent, fp); }; -    virtual void getTopLevelLoops(std::vector<chillAST_ForStmt *> &loops) {      int n = children.size();      for (int i = 0; i < n; i++) { @@ -528,14 +524,11 @@ public:      fprintf(stderr, "\n\n");    } -  void printPreprocBEFORE(int indent, FILE *fp); - -  void printPreprocAFTER(int indent, FILE *fp); -    virtual chillAST_SymbolTable* getParameters() {return parameters;}    virtual chillAST_VarDecl* getParameter(const char * name);    virtual void addParameter(chillAST_VarDecl* name); +  //! Emulation of the old dump function but using printer instead of hardcoded heuritics    void dump(int indent=0,FILE *fp = stderr);  }; diff --git a/include/chillAST/chillASTs.hh b/include/chillAST/chillASTs.hh index a84b820..36442ee 100644 --- a/include/chillAST/chillASTs.hh +++ b/include/chillAST/chillASTs.hh @@ -11,13 +11,6 @@ public:    virtual CHILLAST_NODE_TYPE getType(){return CHILLAST_NODE_NULL;}    chillAST_NULL() {    }; - -  void print(int indent = 0, FILE *fp = stderr) { -    chillindent(indent, fp); -    fprintf(fp, "/* (NULL statement); */ "); -    fflush(fp); -  } -  };  class chillAST_Preprocessing : public chillAST_Node { @@ -90,9 +83,6 @@ public:      fprintf(stderr, "TypedefDecl getUnderLyingType()\n");      return underlyingtype;    }; - -  void print(int indent = 0, FILE *fp = stderr); -  };  class chillAST_VarDecl : public chillAST_Node { @@ -166,8 +156,6 @@ public:    chillAST_VarDecl(chillAST_RecordDecl *astruct, const char *n, const char *arraypart); -  void print(int indent = 0, FILE *fp = stderr); -    void printName(int indent = 0, FILE *fp = stderr);    bool isParmVarDecl() { return (isAParameter == 1); }; @@ -446,13 +434,13 @@ public:  };  // end FunctionDecl   class chillAST_SourceFile : public chillAST_Node { +  // TODO included source file  public:    virtual CHILLAST_NODE_TYPE getType(){return CHILLAST_NODE_SOURCEFILE;}    // constructors    chillAST_SourceFile(const char *filename);  //  defined in chill_ast.cc -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc    void printToFile(char *filename = NULL);    char *SourceFileName; // where this originated @@ -522,8 +510,6 @@ public:    chillAST_Node *getBody() { return (body); } -  void print(int indent = 0, FILE *fp = stderr); // in chill_ast.cc -    chillAST_Node *clone();    // none of these make sense for macros  @@ -592,7 +578,6 @@ public:    // required methods that I can't seem to get to inherit -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc    void printControl(int indent = 0, FILE *fp = stderr);  // print just for ( ... ) but not body    chillAST_Node *constantFold(); @@ -711,7 +696,6 @@ public:    // required methods that I can't seem to get to inherit    void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc -  void printonly(int indent = 0, FILE *fp = stderr);    chillAST_Node *constantFold(); @@ -820,7 +804,6 @@ public:    // required methods that I can't seem to get to inherit    void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc -  void printonly(int indent = 0, FILE *fp = stderr);    char *stringRep(int indent = 0); @@ -892,9 +875,6 @@ public:    void replaceChild(chillAST_Node *old, chillAST_Node *newchild); // will examine index    // required methods that I can't seem to get to inherit -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc -  void printonly(int indent = 0, FILE *fp = stderr); -    void print(int indent = 0, FILE *fp = stderr) const;  // print CODE   in chill_ast.cc    char *stringRep(int indent = 0); @@ -957,10 +937,6 @@ public:    bool operator==(const chillAST_MemberExpr &);    // required methods that I can't seem to get to inherit -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc -  void printonly(int indent = 0, FILE *fp = stderr); - -  void print(int indent = 0, FILE *fp = stderr) const;  // print CODE   in chill_ast.cc    char *stringRep(int indent = 0);    chillAST_Node *constantFold(); @@ -1013,7 +989,6 @@ public:    int evalAsInt() { return value; }    // required methods that I can't seem to get to inherit -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc    chillAST_Node *constantFold();    chillAST_Node *clone(); @@ -1151,8 +1126,6 @@ public:    // required methods that I can't seem to get to inherit    void replaceChild(chillAST_Node *old, chillAST_Node *newchild); -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc -  void printonly(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc    chillAST_Node *constantFold();    chillAST_Node *clone(); @@ -1352,19 +1325,15 @@ class chillAST_Malloc : public chillAST_Node {   // malloc( sizeof(int) * 2048 )  public:    virtual CHILLAST_NODE_TYPE getType(){return CHILLAST_NODE_MALLOC;}    // variables that are special for this type of node -  //! to void if this is null  ,  sizeof(thing) if it is not -  char *thing;    //! The subexpression calculating bytes    chillAST_Node *sizeexpr; // bytes    // constructors -  chillAST_Malloc(char *thething, chillAST_Node *numthings); // malloc (sizeof(int) *1024) +  chillAST_Malloc(chillAST_Node *numthings); // malloc (sizeof(int) *1024)    // other methods particular to this type of node -    // required methods that I can't seem to get to inherit -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc    chillAST_Node *constantFold();    chillAST_Node *clone(); @@ -1412,7 +1381,6 @@ public:    // required methods that I can't seem to get to inherit -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc    chillAST_Node *constantFold();    chillAST_Node *clone(); @@ -1607,7 +1575,6 @@ public:    // required methods that I can't seem to get to inherit -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc    chillAST_Node *constantFold();    chillAST_Node *clone(); @@ -1641,7 +1608,6 @@ public:    chillAST_NoOp(); //  { parent = p; };    // required methods that I can't seem to get to inherit -  void print(int indent = 0, FILE *fp = stderr) {};  // print CODE   in chill_ast.cc    chillAST_Node *constantFold() {};    chillAST_Node *clone() { chillAST_Node* n = new chillAST_NoOp(); n->setParent(parent); return n; }; // ?? @@ -1746,8 +1712,6 @@ public:    // required methods that I can't seem to get to inherit -  void print(int indent = 0, FILE *fp = stderr);  // print CODE   in chill_ast.cc -  //void dump(  int indent=0,  FILE *fp = stderr );  // print ast    in chill_ast.cc  }; diff --git a/include/printer/cfamily.h b/include/printer/cfamily.h index b36a873..f6e2284 100644 --- a/include/printer/cfamily.h +++ b/include/printer/cfamily.h @@ -9,46 +9,53 @@  /*!   * \file - * \brief Print the AST for C like syntax, This replace the old print function   */  namespace chill {    namespace printer{ +    /*! +     * \brief Print the AST for C like syntax, This replace the old print function +     * Custom multiplexer should not be needed. This version should calculate the correct precedence for expressions. +     * Expression should be encapsulated in {} or () or ended with ; with heuristics at the parent node +     */      class CFamily : public GenericPrinter {      public:        CFamily() {}        virtual int getPrec(chillAST_Node *n); -      virtual void print(std::string ident, chillAST_ArraySubscriptExpr *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_BinaryOperator *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_CallExpr *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_CompoundStmt *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_CStyleAddressOf *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_CStyleCastExpr *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_CudaFree *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_CudaKernelCall *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_CudaMalloc *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_CudaMemcpy *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_CudaSyncthreads *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_DeclRefExpr *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_FloatingLiteral *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_ForStmt *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_Free *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_FunctionDecl *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_ImplicitCastExpr *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_MacroDefinition *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_Malloc *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_MemberExpr *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_ParenExpr *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_Preprocessing *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_RecordDecl *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_ReturnStmt *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_Sizeof *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_SourceFile *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_TypedefDecl *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_TernaryOperator *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_UnaryOperator *n, std::ostringstream &o); -      virtual void print(std::string ident, chillAST_VarDecl *n, std::ostringstream &o); -      virtual void print(string ident, chillAST_Node *n, ostringStream &o); +      virtual void printS(std::string ident, chillAST_ArraySubscriptExpr *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_BinaryOperator *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_CallExpr *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_CompoundStmt *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_CStyleAddressOf *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_CStyleCastExpr *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_CudaFree *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_CudaKernelCall *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_CudaMalloc *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_CudaMemcpy *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_CudaSyncthreads *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_DeclRefExpr *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_FloatingLiteral *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_ForStmt *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_Free *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_FunctionDecl *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_IfStmt *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_IntegerLiteral *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_ImplicitCastExpr *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_MacroDefinition *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_Malloc *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_MemberExpr *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_NULL *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_NoOp *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_ParenExpr *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_Preprocessing *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_RecordDecl *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_ReturnStmt *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_Sizeof *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_SourceFile *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_TypedefDecl *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_TernaryOperator *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_UnaryOperator *n, std::ostream &o); +      virtual void printS(std::string ident, chillAST_VarDecl *n, std::ostream &o);      };    }  } diff --git a/include/printer/dump.h b/include/printer/dump.h index bf7168b..dd8a0e8 100644 --- a/include/printer/dump.h +++ b/include/printer/dump.h @@ -7,13 +7,13 @@  #include "printer/generic.h" -/*! - * \file - * \brief this replace the old dump function in the chillAST - */ -  namespace chill {    namespace printer { +    /*! +     * \brief this replace the old dump function in the chillAST +     * +     * Everthing is written in a Tree-like structure: (<NodeName> <Params>). No precedence calculation is needed. +     */      class Dump : public GenericPrinter {      public:        Dump() {} diff --git a/include/printer/generic.h b/include/printer/generic.h index f3fd8f2..70ebb41 100644 --- a/include/printer/generic.h +++ b/include/printer/generic.h @@ -11,20 +11,25 @@  /*!   * \file - * \brief this is a generic AST printSer that printSs the code out to a C-family like syntax + * \brief this is a generic AST printSer that prints the code out to a C-family like syntax   */  namespace chill {    namespace printer {      class GenericPrinter {      private: -      std::string indentSpace; +      std::string identSpace;      public: -      GenericPrinter() { indentSpace = "  "; } - +      GenericPrinter() { identSpace = "  "; } +      //! Set the indentation for print +      /*! +       * Some subclass has indentation unused, like Dump. Also, only spaces is supported, +       * so it is a number of the spaces in the indentaion. +       * @param numspaces number of spaces for the indentation +       */        void setIndentSpace(int numspaces) { -        indentSpace = ""; +        identSpace = "";          for (int i = 0; i < numspaces; ++i) -          indentSpace += "  "; +          identSpace += "  ";        }        virtual int getPrecS(chillAST_ArraySubscriptExpr *n) { return INT8_MAX; }        virtual int getPrecS(chillAST_BinaryOperator *n) { return INT8_MAX; } @@ -118,6 +123,28 @@ namespace chill {          print(ident, n, os);          return os.str();        } +      //! Print the AST to stdout +      /*! +       * @param ident indentation of the node, the one inherited from the parent +       * @param n the chillAST_Node +       */ +      virtual void printOut(std::string ident, chillAST_Node *n) { +        print(ident,n,std::cout); +      } +      //! Print the AST to stdErr +      /*! +       * @param ident indentation of the node +       * @param n the chillAST_Node +       */ +      virtual void printErr(std::string ident, chillAST_Node *n) { +        print(ident,n,std::cerr); +      } +      //! Print the subexpression with precedence +      virtual void printPrec(std::string ident,chillAST_Node *n,std::ostream &o, int prec) { +        if (getPrec(n) > prec) o<<"("; +        print(ident,n,prec); +        if (getPrec(n) > prec) o<<")"; +      }     };    }  } diff --git a/src/chillASTs.cc b/src/chillASTs.cc index e5e9f74..69fe3ac 100644 --- a/src/chillASTs.cc +++ b/src/chillASTs.cc @@ -79,30 +79,6 @@ char *parseUnderlyingType(const char *sometype) {    return underlying;  } -void printSymbolTable(chillAST_SymbolTable *st) { -  CHILL_DEBUG_PRINT("%d entries\n", st->size()); -  if (!st) return; -  for (int i = 0; i < st->size(); i++) { -    printf("%d  ", i); -    (*st)[i]->printName(); -    printf("\n"); -  } -  if (st->size())printf("\n"); -  fflush(stdout); -} - -void printSymbolTableMoreInfo(chillAST_SymbolTable *st) { -  CHILL_DEBUG_PRINT("%d entries\n", st->size()); -  if (!st) return; -  for (int i = 0; i < st->size(); i++) { -    printf("%d  ", i); -    (*st)[i]->print(); -    printf("\n"); -  } -  if (st->size())printf("\n"); -  fflush(stdout); -} -  char *splitVariableName(char *name) {    char *cdot = strstr(name, ".");    char *carrow = strstr(name, "->");  // initial 'c' for const - can't change those @@ -311,33 +287,6 @@ chillAST_RecordDecl *chillAST_Node::findRecordDeclNamed(const char *name) { // r    return parent->findRecordDeclNamed(name);  } - -void chillAST_Node::printPreprocBEFORE(int indent, FILE *fp) { -  int numstmts = preprocessinginfo.size(); -  //if (0 != numstmts) { -  //  fprintf(fp, "chillAST_Node::printPreprocBEFORE()  %d statements\n", numstmts); -  //} - - -  for (int i = 0; i < numstmts; i++) { -    //fprintf(fp, "stmt %d   %d\n", i, preprocessinginfo[i]->position); -    if (preprocessinginfo[i]->position == CHILLAST_PREPROCESSING_LINEBEFORE || -        preprocessinginfo[i]->position == CHILLAST_PREPROCESSING_IMMEDIATELYBEFORE) { -      //fprintf(stderr, "before %d\n", preprocessinginfo[i]->position); -      preprocessinginfo[i]->print(indent, fp); -    } -  } -} - -void chillAST_Node::printPreprocAFTER(int indent, FILE *fp) { -  for (int i = 0; i < preprocessinginfo.size(); i++) { -    if (preprocessinginfo[i]->position == CHILLAST_PREPROCESSING_LINEAFTER || -        preprocessinginfo[i]->position == CHILLAST_PREPROCESSING_TOTHERIGHT) { -      preprocessinginfo[i]->print(indent, fp); -    } -  } -} -  chillAST_SourceFile::chillAST_SourceFile(const char *filename) {    if(filename) SourceFileName = strdup(filename);    else SourceFileName = strdup("No Source File"); @@ -347,32 +296,6 @@ chillAST_SourceFile::chillAST_SourceFile(const char *filename) {    frontend = strdup("unknown");  }; -void chillAST_SourceFile::print(int indent, FILE *fp) { -  fflush(fp); -  CHILL_DEBUG_PRINT("\n// this source derived from CHILL AST originally from file '%s' as parsed by frontend compiler %s\n\n", -          SourceFileName, frontend); -  std::vector<char *> includedfiles; -  int sofar = 0; - -  //fprintf(fp, "#define __rose_lt(x,y) ((x)<(y)?(x):(y))\n#define __rose_gt(x,y) ((x)>(y)?(x):(y))\n"); // help diff figure out what's going on - -  int numchildren = children.size(); - -  for (int i = 0; i < numchildren; i++) { -    if (children[i]->isFromSourceFile) { -      if (children[i]->isFunctionDecl()) { -        fprintf(stderr, "\nchild %d function %s\n", i, ((chillAST_FunctionDecl *) children[i])->functionName); -      } -      children[i]->print(indent, fp); -      if (children[i]->isVarDecl()) fprintf(fp, ";\n"); -      fflush(fp);  // top level vardecl\n"); -    } -  } - -  fflush(fp); -}; - -  void chillAST_SourceFile::printToFile(char *filename) {    char fn[1024]; @@ -461,49 +384,6 @@ chillAST_TypedefDecl::chillAST_TypedefDecl(char *t, const char *a, char *p) {    filename = NULL;  }; - -void chillAST_TypedefDecl::print(int indent, FILE *fp) { -  printPreprocBEFORE(indent, fp); - -  if (isStruct) { -    fprintf(fp, "\n/* A typedef STRUCT */\n"); -    chillindent(indent, fp); -  } - -  chillindent(indent, fp); -  fprintf(fp, "typedef "); -  fflush(fp); - -  if (rd) { -    rd->print(indent, fp);   // needs to not print the ending semicolon ?? -  } else if (isStruct) { -    fprintf(stderr, "/* no rd */\n"); - -    //fprintf(fp, "struct %s\n", structname); -    chillindent(indent, fp); -    fprintf(fp, "{\n"); -    for (int i = 0; i < subparts.size(); i++) { -      //fprintf(fp, "a %s\n", subparts[i]->getTypeString()); -      subparts[i]->print(indent + 1, fp); -      fprintf(fp, ";\n"); -    } -    fprintf(fp, "};\n"); -  } else { -    fprintf(fp, "/* NOT A STRUCT */ typedef %s  %s%s;\n", underlyingtype, newtype, arraypart); -    dump(); -    printf("\n\n"); -    fflush(stdout); -  } - -  // then the newname -  fprintf(fp, "%s;\n", newtype); -  fflush(fp); -  printPreprocAFTER(indent, fp); - -  return; -} - -  chillAST_VarDecl *chillAST_TypedefDecl::findSubpart(const char *name) {    //fprintf(stderr, "chillAST_TypedefDecl::findSubpart( %s )\n", name);    //fprintf(stderr, "typedef %s  %s\n", structname, newtype); @@ -580,8 +460,6 @@ void chillAST_RecordDecl::print(int indent, FILE *fp) {    CHILL_DEBUG_PRINT("chillAST_RecordDecl::print()\n");    if (isUnnamed) return; -  printPreprocBEFORE(indent, fp); -    chillindent(indent, fp);    if (isStruct) {      fprintf(fp, "struct "); @@ -600,7 +478,6 @@ void chillAST_RecordDecl::print(int indent, FILE *fp) {      CHILL_ERROR("/* UNKNOWN RECORDDECL print() */  ");      exit(-1);    } -  printPreprocAFTER(indent, fp);    fflush(fp);  } @@ -677,12 +554,10 @@ void chillAST_FunctionDecl::insertChild(int i, chillAST_Node *node) {      chillAST_VarDecl *vd = ((chillAST_VarDecl *) node);      fprintf(stderr, "functiondecl %s inserting a VarDecl named %s\n", functionName, vd->varname);      chillAST_SymbolTable *st = getSymbolTable(); -    if (!st) { +    if (!st)        fprintf(stderr, "symbol table is NULL!\n"); -    } else { +    else        fprintf(stderr, "%d entries in the symbol table\n", st->size()); -      printSymbolTable(getSymbolTable()); -    }      fprintf(stderr, "\n\n");    }  } @@ -706,8 +581,6 @@ void chillAST_FunctionDecl::print(int indent, FILE *fp) {    //chillindent(indent, fp);    //fprintf(fp, "//(functiondecl)  %d parameters\n", numparameters); -  printPreprocBEFORE(indent, fp); -    fprintf(fp, "\n");    chillindent(indent, fp); @@ -746,8 +619,6 @@ void chillAST_FunctionDecl::print(int indent, FILE *fp) {      fprintf(fp, "; // fwd decl\n");    } -  printPreprocAFTER(indent, fp); -    fflush(fp);  } @@ -940,26 +811,6 @@ void chillAST_MacroDefinition::addChild(chillAST_Node *node) {    node->setParent(this); // this, or body??  } -void chillAST_MacroDefinition::print(int indent, FILE *fp) {  // UHOH   TODO -  CHILL_DEBUG_PRINT("macro has %d parameters\n", parameters->size()); - -  printPreprocBEFORE(indent, fp); - -  fprintf(fp, "#define %s", macroName); -  if (0 != parameters->size()) { -    fprintf(fp, "("); -    for (int i = 0; i < parameters->size(); i++) { -      if (i) fprintf(fp, ","); -      fprintf(fp, "%s", (*parameters)[i]->varname); -    } -    fprintf(fp, ")  "); -  } - -  if (body) body->print(0, fp); // TODO should force newlines out of multiline macros -  fprintf(fp, "\n"); -} - -  chillAST_ForStmt::chillAST_ForStmt() {    init = cond = incr = NULL;    body = new chillAST_CompoundStmt(); @@ -1093,64 +944,6 @@ void chillAST_ForStmt::printControl(int in, FILE *fp) {    fflush(fp);  } - -void chillAST_ForStmt::print(int indent, FILE *fp) { -  printPreprocBEFORE(indent, fp); -  //fprintf(fp, "chillAST_ForStmt::print()\n"); -  if (metacomment) { -    chillindent(indent, fp); -    //for(int i=0; i<indent; i++) fprintf(fp, ".."); -    fprintf(fp, "// %s\n", metacomment); -  } - -  printControl(indent, fp);  // does not do a newline or bracket -  fprintf(fp, " {\n"); - - -  // I have no idea what made me do this next bit. -  // A forstmt with compounds inside compounds ??? -  // this should probably all go away - -  chillAST_Node *b = body; -  //fprintf(fp, "b children %d\n", b->getNumChildren()); -  //fprintf(fp, "body child 0 of type %s\n", b->children[0]->getTypeString()); -  //fprintf(stderr, "forstmt body type %s\n", Chill_AST_Node_Names[b->getType()] ); -  // deal with a tree of compound statements, in an ugly way. leave the ugliness -  while (1 == b->getNumChildren() && b->children[0]->isCompoundStmt()) { -    b = b->children[0]; -  } - - -  // this was to sometimes not enclose in a bracket. stupid. always enclose in a bracket. -  //if (1 == b->getNumChildren() && b->children[0]->isForStmt()) fprintf(fp, ") {\n" ); -  //else if (1 == b->getNumChildren() ) fprintf(fp, ") { ?? \n" ); // to allow for() for( ) to not have open bracket? -  //else { -  //fprintf(fp, ")\n"); -  //chillindent(in, fp); -  //fprintf(fp, "{\n" ); - -  //fprintf(fp, ")"); -  //} - -  b->print(indent + 1, fp); - -  // I think this can't happen any more. body is always a compound statement -  if (b->getType() == CHILLAST_NODE_BINARYOPERATOR) { // a single assignment statement -    fprintf(fp, ";\n"); -  } - -  // always print brackets - -  //if ((1 == b->getNumChildren() && b->children[0]->isForStmt()) || -  //    (1 != b->getNumChildren() )) { -  chillindent(indent, fp); -  fprintf(fp, "}\n"); -  //} - -  printPreprocAFTER(indent, fp); -  fflush(fp); // -} -  chillAST_Node *chillAST_ForStmt::constantFold() {    init = init->constantFold();    cond = cond->constantFold(); @@ -1159,7 +952,6 @@ chillAST_Node *chillAST_ForStmt::constantFold() {    return this;  } -  chillAST_Node *chillAST_ForStmt::clone() {    chillAST_ForStmt *fs = new chillAST_ForStmt(init->clone(), cond->clone(), incr->clone(), body->clone());    fs->isFromSourceFile = isFromSourceFile; @@ -1677,8 +1469,6 @@ chillAST_IntegerLiteral *chillAST_BinaryOperator::evalAsIntegerLiteral() {  }  void chillAST_BinaryOperator::print(int indent, FILE *fp) { -  printPreprocBEFORE(indent, fp); -    chillindent(indent, fp);    bool needparens = getPrec()<lhs->getPrec(); @@ -1696,8 +1486,6 @@ void chillAST_BinaryOperator::print(int indent, FILE *fp) {    else fprintf(fp, "(NULL)");    if (needparens) fprintf(fp, ")");    fflush(fp); -  printPreprocAFTER(indent, fp); -  } @@ -1706,18 +1494,6 @@ char *chillAST_BinaryOperator::stringRep(int indent) {    return strdup(s.c_str());  } - -void chillAST_BinaryOperator::printonly(int indent, FILE *fp) { - -  lhs->printonly(indent, fp); -  fprintf(fp, " %s ", op); -  rhs->printonly(0, fp); -  fflush(fp); - - -} - -  class chillAST_Node *chillAST_BinaryOperator::constantFold() {    //fprintf(stderr, "\nchillAST_BinaryOperator::constantFold()  ");    //print(0,stderr); fprintf(stderr, "\n"); @@ -1931,7 +1707,6 @@ chillAST_TernaryOperator::chillAST_TernaryOperator(const char *oper, chillAST_No  }  void chillAST_TernaryOperator::print(int indent, FILE *fp) { -  printPreprocBEFORE(indent, fp);    chillindent(indent, fp);    fprintf(fp, "(");    condition->print(0, fp); @@ -2000,18 +1775,6 @@ void chillAST_TernaryOperator::replaceVarDecls(chillAST_VarDecl *olddecl, chillA    rhs->replaceVarDecls(olddecl, newdecl);  } -void chillAST_TernaryOperator::printonly(int indent, FILE *fp) { -  fprintf(fp, "("); -  condition->printonly(0, fp); -  fprintf(fp, "%s", op); -  lhs->printonly(0, fp); -  fprintf(fp, ":"); -  rhs->printonly(0, fp); -  fprintf(fp, ")"); -  fflush(fp); -} - -  class chillAST_Node *chillAST_TernaryOperator::constantFold() {    condition = condition->constantFold();    lhs = lhs->constantFold(); @@ -2164,14 +1927,6 @@ void chillAST_ArraySubscriptExpr::gatherIndeces(std::vector<chillAST_Node *> &in    ind.push_back(index);  } -void chillAST_ArraySubscriptExpr::print(int indent, FILE *fp) { -  base->print(indent, fp); -  fprintf(fp, "["); -  index->print(0, fp); -  fprintf(fp, "]"); -  fflush(fp); -} -  char *chillAST_ArraySubscriptExpr::stringRep(int indent) {    fprintf(stderr, "chillAST_ArraySubscriptExpr::stringRep\n"); @@ -2183,25 +1938,6 @@ char *chillAST_ArraySubscriptExpr::stringRep(int indent) {    return strdup(s.c_str());  } - -void chillAST_ArraySubscriptExpr::printonly(int indent, FILE *fp) { -  base->printonly(indent, fp); -  fprintf(fp, "["); -  index->printonly(0, fp); -  fprintf(fp, "]"); -  fflush(fp); -} - - -void chillAST_ArraySubscriptExpr::print(int indent, FILE *fp) const { -  base->print(indent, fp); -  fprintf(fp, "["); -  index->print(0, fp); -  fprintf(fp, "]"); -  fflush(fp); -}; - -  chillAST_VarDecl *chillAST_ArraySubscriptExpr::multibase() {    //this should probably be a chillAST_Node function instead of having all these ifs    return base->multibase(); @@ -2395,27 +2131,7 @@ chillAST_MemberExpr::chillAST_MemberExpr(chillAST_Node *bas, const char *mem, vo    }  } -void chillAST_MemberExpr::print(int indent, FILE *fp) { -  if (base) base->print(indent, fp); -  else { -    chillindent(indent, fp); -    fprintf(fp, "(NULL)"); -  } -  if (exptype == CHILLAST_MEMBER_EXP_ARROW) fprintf(fp, "->"); -  else fprintf(fp, "."); -  if (member) fprintf(fp, "%s", member); -  else fprintf(fp, "(NULL)"); -  fflush(fp); -} - - -void chillAST_MemberExpr::printonly(int indent, FILE *fp) { -  base->print(indent, fp); -  if (exptype == CHILLAST_MEMBER_EXP_ARROW) fprintf(fp, "->"); -  else fprintf(fp, "."); -  fprintf(fp, "%s", member); -  fflush(fp); -} +// TODO member can be another member expression, Right?  char *chillAST_MemberExpr::stringRep(int indent) { // char pointer to what we'd print    fprintf(stderr, "*chillAST_MemberExpr::stringRep()\n"); @@ -2877,12 +2593,6 @@ chillAST_IntegerLiteral::chillAST_IntegerLiteral(int val) {    filename = NULL;  } -void chillAST_IntegerLiteral::print(int indent, FILE *fp) { -  chillindent(indent, fp); -  fprintf(fp, "%d", value); -  fflush(fp); -} -  class chillAST_Node *chillAST_IntegerLiteral::constantFold() { return this; } // can never do anything @@ -3090,18 +2800,6 @@ chillAST_ImplicitCastExpr::chillAST_ImplicitCastExpr(chillAST_Node *sub) {    //fprintf(stderr, " of type %s\n", subexpr->getTypeString());  } -void chillAST_ImplicitCastExpr::print(int indent, FILE *fp) { -  // No need to print anything, simply forward to the sub expression. -  subexpr->print(indent, fp); -  fflush(fp); -}; - -void chillAST_ImplicitCastExpr::printonly(int indent, FILE *fp) { -  // No need to print anything, simply forward to the sub expression. -  subexpr->printonly(indent, fp); -  fflush(fp); -}; -  void chillAST_ImplicitCastExpr::replaceChild(chillAST_Node *old, chillAST_Node *newchild) {    if (subexpr == old) { // should be the case for this to get called      subexpr = newchild; @@ -3320,10 +3018,7 @@ void chillAST_CStyleAddressOf::gatherVarUsage(vector<chillAST_VarDecl *> &decls)  } -chillAST_Malloc::chillAST_Malloc(char *thething, chillAST_Node *numthings) { -  thing = NULL; -  if (thething) -  thing = strdup(thething);   // "int" or "float" or "struct widget" +chillAST_Malloc::chillAST_Malloc(chillAST_Node *numthings) {    sizeexpr = numthings;    isFromSourceFile = true; // default    filename = NULL; @@ -3334,7 +3029,7 @@ chillAST_Node *chillAST_Malloc::constantFold() {  }  chillAST_Node *chillAST_Malloc::clone() { -  chillAST_Malloc *M = new chillAST_Malloc(thing, sizeexpr); // the general version +  chillAST_Malloc *M = new chillAST_Malloc(sizeexpr); // the general version    M->setParent(getParent());    M->isFromSourceFile = isFromSourceFile;    if (filename) M->filename = strdup(filename); @@ -3366,19 +3061,6 @@ void chillAST_Malloc::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {    sizeexpr->gatherVarUsage(decls);  }; - -void chillAST_Malloc::print(int indent, FILE *fp) { -  chillindent(indent, fp); -  fprintf(fp, "malloc("); - -  if (thing) { -    fprintf(fp, " sizeof(%s) * ", thing); -  } -  sizeexpr->print(0, fp); -  fprintf(fp, ")"); -  fflush(fp); -}; -  chillAST_CudaMalloc::chillAST_CudaMalloc(chillAST_Node *devmemptr, chillAST_Node *size) {    devPtr = devmemptr;    sizeinbytes = size;  // probably a multiply like   sizeof(int) * 1024 @@ -3495,20 +3177,6 @@ chillAST_CudaMemcpy::chillAST_CudaMemcpy(chillAST_VarDecl *d, chillAST_VarDecl *    cudaMemcpyKind = kind;  }; -void chillAST_CudaMemcpy::print(int indent, FILE *fp) { -  chillindent(indent, fp); -  fprintf(fp, "cudaMemcpy(%s,%s,", dest->varname, src->varname); -  //dest->print( 0, fp ); -  //fprintf(fp, ","); -  // src->print( 0, fp );  just want the src NAME, not name and array info -  //fprintf(fp, ","); -  size->print(0, fp); -  fprintf(fp, ",%s)", cudaMemcpyKind); -  fflush(fp); -}; - - -  class chillAST_Node *chillAST_CudaMemcpy::constantFold() {    dest = (chillAST_VarDecl *) dest->constantFold();    src = (chillAST_VarDecl *) src->constantFold(); @@ -3582,7 +3250,6 @@ chillAST_ReturnStmt::chillAST_ReturnStmt(chillAST_Node *retval) {  void chillAST_ReturnStmt::print(int indent, FILE *fp) { -  printPreprocBEFORE(indent, fp);    chillindent(indent, fp);    if (returnvalue != NULL) {      fprintf(fp, "return("); @@ -3654,7 +3321,6 @@ void chillAST_CallExpr::addArg(chillAST_Node *a) {  void chillAST_CallExpr::print(int indent, FILE *fp) { -  printPreprocBEFORE(indent, fp);    chillindent(indent, fp);    chillAST_FunctionDecl *FD = NULL;    chillAST_MacroDefinition *MD = NULL; @@ -4066,137 +3732,6 @@ chillAST_VarDecl::chillAST_VarDecl(const char *t, const char *n, const char *a,  }; - -void chillAST_VarDecl::print(int indent, FILE *fp) { -  //fprintf(fp, "chillAST_VarDecl::print()\n"); - -  printPreprocBEFORE(indent, fp); - -  //fprintf(fp, "VarDecl vartype '%s'    varname %s   ", vartype, varname); -  //if (isAStruct()) fprintf(fp, "isAStruct()\n"); -  //else  fprintf(fp, "NOT A Struct\n"); - -  // fprintf(fp, "\n");  fflush(fp); dump(0,fp); fflush(fp);  // debug - -  chillindent(indent, fp); -  //fprintf(fp, "vardecl->print  vartype '%s'\n", vartype); -  if (isDevice) fprintf(fp, "__device__ "); -  if (isShared) fprintf(fp, "__shared__ "); - -  //if (isAStruct()) fprintf(fp, "/* isAStruct() */  "); -  //else fprintf(fp, "/* NOT A Struct() */  "); -  //if (vardef)      fprintf(fp, "/* vardef */  "); -  //else  fprintf(fp, "/* NOT vardef */  "); - - -  //fprintf(stderr, "chillAST_VarDecl::print()  %s\n", varname ); -  //if (isParmVarDecl()) fprintf(stderr, "%s is a parameter\n", varname); -  //if (isAStruct()) fprintf(stderr, "%s is a struct\n", varname); -  //else fprintf(stderr, "%s is NOT a struct\n", varname); -  //if (!parent) fprintf(stderr, "VARDECL HAS NO PARENT\n"); -  //else fprintf(stderr, "parent of %s is type %s\n", varname, parent->getTypeString()); - -  // this logic is probably wrong (what about pointer to struct? ) - -  //fprintf(stderr, "checking for unnamed only used here\n"); - -  if ((!isAParameter) && isAStruct() && vardef) { // an unnamed  struct used only here ?? - -    //fprintf(fp, "i%s sAStruct() && vardef ??   vardecl of type UNNAMED ONLY USED HERE \n", varname ); -    // print the internals of the struct and then the name -    vardef->printStructure(0, fp); -    fprintf(fp, "%s", varname); - -    return; -  } - -  //fprintf(fp, "ugly logic\n"); -  // ugly logic TODO - -  if (typedefinition && typedefinition->isAStruct()) fprintf(fp, "struct "); - -  if (isAParameter) { -    //fprintf(fp, "%s isaparameter\n", varname); -    //if (isAStruct())  fprintf(fp, "struct "); -    //fprintf(fp, "(param) nd %d", numdimensions ); -    //dump(); -    if (numdimensions > 0) { -      if (knownArraySizes) {  // just [12][34][56] -        fprintf(fp, "%s ", vartype); -        if (byreference) fprintf(fp, "&"); -        fprintf(fp, "%s", varname); -        for (int n = 0; n < (numdimensions); n++) fprintf(fp, "[%d]", arraysizes[n]); -      } else {  // some unknown array part    float *a;  or float **a;  or float (*)a[1234] - -        //fprintf(fp, "\nsome unknown\n"); -        //fprintf(fp, "arraypointerpart '%s'\n", arraypointerpart); -        //fprintf(fp, "arraysetpart '%s'\n", arraysetpart); - -        if (numdimensions == 1) { -          //fprintf(fp, "\nnd1, vartype %s\n", vartype); - -          // TODO this if means I have probably made a mistake somewhere -          if (!index(vartype, '*')) fprintf(fp, "%s *%s", vartype, varname); // float *x -          else fprintf(fp, "%s%s", vartype, varname); // float *a; - - -        } else { // more than one dimension - -          if (!strcmp("", arraysetpart)) { // no known dimensions   float ***a; -            fprintf(fp, "%s %s%s", vartype, arraypointerpart, varname); -          } else if (!strcmp("", arraypointerpart)) { // ALL known  float a[2][7]; -            fprintf(fp, "%s %s", vartype, varname); -            for (int n = 0; n < numdimensions; n++) fprintf(fp, "[%d]", arraysizes[n]); -          } else { //   float (*)a[1234] -            // this seems really wrong -            //     float (*)a[1234] -            fprintf(fp, "%s (", vartype); -            for (int n = 0; n < (numdimensions - 1); n++) fprintf(fp, "*"); -            fprintf(fp, "%s)", varname); -            fprintf(fp, "[%d]", arraysizes[numdimensions - 1]); -          } - -        } -      } -    } // if numdimensions > 0 -    else { // parameter float x -      fprintf(fp, "%s ", vartype); -      if (byreference) fprintf(fp, "&"); -      fprintf(fp, "%s", varname); -    } -  } // end parameter - -  else { // NOT A PARAMETER -    //fprintf(fp, "NOT A PARAM ... vartype '%s'\n", vartype); -    //if (isArray()) fprintf(stderr, "an array, numdimensions %d\n", numdimensions); -    //fprintf(stderr, "arraysizes %p\n", arraysizes); - - - -    //if (isArray() && arraysizes == NULL) { -    //    // we just know the number of dimensions but no sizes -    //    // int ***something -    //    fprintf(fp, "%s ", vartype);   // "int " -    //    for (int i=0; i<numdimensions; i++) fprintf(fp, "*"); // *** -    //    fprintf(fp, "%s", varname); // variable name -    //  } -    //  else - -    fprintf(fp, "%s %s", vartype, arraypointerpart); -    if (isRestrict) fprintf(fp, " __restrict__ ");  // wrong place -    fprintf(fp, "%s%s", varname, arraysetpart); -    if (init) { -      fprintf(fp, " = "); -      fflush(fp); -      init->print(0, fp); -    } -  } -  fflush(fp); -  //fprintf(stderr, "numdimensions %d    arraysizes address 0x%x\n",  numdimensions, arraysizes); -  //if (!isAParameter) fprintf(fp, ";\n",   vartype, varname, arraypart ); -}; - -  void chillAST_VarDecl::printName(int in, FILE *fp) {    chillindent(in, fp);    fprintf(fp, "%s", varname); @@ -4218,9 +3753,7 @@ chillAST_CompoundStmt::chillAST_CompoundStmt() {  void chillAST_CompoundStmt::print(int indent, FILE *fp) { -  printPreprocBEFORE(indent, fp);    int numchildren = children.size(); -  //fprintf(stderr, "NUMCHILDREN %d\n", numchildren); sleep(1);    for (int i = 0; i < numchildren; i++) {      children[i]->print(indent, fp);      if (children[i]->getType() != CHILLAST_NODE_FORSTMT @@ -4510,14 +4043,6 @@ chillAST_Sizeof::chillAST_Sizeof(char *athing) {    thing = strdup(athing); // memory leak  } -void chillAST_Sizeof::print(int indent, FILE *fp) { -  //fprintf(stderr, "chillAST_Sizeof::print()\n"); -  chillindent(indent, fp); // hard to believe this will ever do anything -  fprintf(fp, "sizeof("); -  fprintf(fp, "%s)", thing); -  fflush(fp); -} -  void chillAST_Sizeof::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {}  void chillAST_Sizeof::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {} @@ -4741,7 +4266,6 @@ chillAST_Node *chillAST_IfStmt::clone() {  }  void chillAST_IfStmt::print(int indent, FILE *fp) { -  printPreprocBEFORE(indent, fp);    chillindent(indent, fp);    fprintf(fp, "if (");    if (cond) cond->print(0, fp); @@ -5084,9 +4608,9 @@ chillAST_VarDecl* chillAST_Node::getParameter(const char *t) {  void chillAST_Node::dump(int indent, FILE *fp) {    if (fp == stderr) {      chill::printer::Dump d; -    d.print("",this,std::cerr); +    d.printErr("",this);    } else {      chill::printer::Dump d; -    d.print("",this,std::cout); +    d.printOut("",this);    }  }
\ No newline at end of file diff --git a/src/printer/cfamily.cpp b/src/printer/cfamily.cpp index 8bfeb82..a15c106 100644 --- a/src/printer/cfamily.cpp +++ b/src/printer/cfamily.cpp @@ -6,3 +6,282 @@  using namespace std;  using namespace chill::printer; + +bool ifSemicolonFree(CHILLAST_NODE_TYPE t) { +  return t == CHILLAST_NODE_FUNCTIONDECL || t == CHILLAST_NODE_IFSTMT || +         t == CHILLAST_NODE_FORSTMT || t == CHILLAST_NODE_MACRODEFINITION; +} + +void dumpVector(GenericPrinter *p, string ident, chillAST_NodeList *n, ostream &o) { +  for (int i = 0; i < n->size(); ++i) +    p->print("", (*n)[i], o); +} + +void dumpVector(GenericPrinter *p, string ident, chillAST_SymbolTable *n, ostream &o) { +  for (int i = 0; i < n->size(); ++i) +    p->print("", (*n)[i], o); +} + +void dumpVector(GenericPrinter *p, string ident, chillAST_TypedefTable *n, ostream &o) { +  for (int i = 0; i < n->size(); ++i) +    p->print("", (*n)[i], o); +} + +void Dump::print(string ident, chillAST_Node *n, ostream &o) { +  o << "(" << n->getTypeString() << " "; +  if (n->getParameters()) { +    o << "(Params: "; +    dumpVector(this, ident, n->getParameters(), o); +    o << ") "; +  } +  if (n->getSymbolTable()) { +    o << "(VarScope: "; +    dumpVector(this, ident, n->getSymbolTable(), o); +    o << ") "; +  } +  if (n->getTypedefTable()) { +    o << "(TypeDef: "; +    dumpVector(this, ident, n->getTypedefTable(), o); +    o << ") "; +  } +  o << ": "; +  // Recurse +  GenericPrinter::print(ident, n, o); +  o << ") "; +} + +void Dump::printS(std::string ident, chillAST_ArraySubscriptExpr *n, std::ostream &o) { +  print(ident,n->base,o); +  o<<"["; +  print(ident,n->index,o); +  o<<"]"; +} + +void Dump::printS(std::string ident, chillAST_BinaryOperator *n, std::ostream &o) { +  o << n->op << " "; +  if (n->lhs) print(ident, n->lhs, o); +  else o << "(NULL) "; +  if (n->rhs) print(ident, n->rhs, o); +  else o << "(NULL) "; +} + +void Dump::printS(std::string ident, chillAST_CallExpr *n, std::ostream &o) { +  if (n->callee) +    print(ident, n->callee, o); +} + +void Dump::printS(std::string ident, chillAST_CompoundStmt *n, std::ostream &o) { +  dumpVector(this, ident, n->getChildren(), o); +} + +void Dump::printS(std::string ident, chillAST_CStyleAddressOf *n, std::ostream &o) { +  print(ident, n->subexpr, o); +} + +void Dump::printS(std::string ident, chillAST_CStyleCastExpr *n, std::ostream &o) { +  o << n->towhat << " "; +  print(ident, n->subexpr, o); +} + +void Dump::printS(std::string ident, chillAST_CudaFree *n, std::ostream &o) { +  o << n->variable->varname << " "; +} + +void Dump::printS(std::string ident, chillAST_CudaKernelCall *n, std::ostream &o) { +  CHILL_ERROR("Not implemented"); +} + +void Dump::printS(std::string ident, chillAST_CudaMalloc *n, std::ostream &o) { +  print(ident, n->devPtr, o); +  print(ident, n->sizeinbytes, o); +} + +void Dump::printS(std::string ident, chillAST_CudaMemcpy *n, std::ostream &o) { +  o << "cudaMemcpy(" << n->dest->varname << ", " << n->src->varname << ", "; +  print(ident, n->size, o); +  o << ", " << n->cudaMemcpyKind << ")"; +} + +void Dump::printS(std::string ident, chillAST_CudaSyncthreads *n, std::ostream &o) {} + +void Dump::printS(std::string ident, chillAST_DeclRefExpr *n, std::ostream &o) { +  chillAST_VarDecl *vd = n->getVarDecl(); +  if (vd) +    if (vd->isAParameter) o << "ParmVar "; else o << "Var "; +  o << n->declarationName << " "; +  chillAST_FunctionDecl *fd = n->getFunctionDecl(); +  if (fd) dumpVector(this, ident, fd->getParameters(), o); +} + +void Dump::printS(std::string ident, chillAST_FloatingLiteral *n, std::ostream &o) { +  if (n->precision == 1) o << "float "; +  else o << "double "; +  o << n->value; +} + +void Dump::printS(std::string ident, chillAST_ForStmt *n, std::ostream &o) { +  if (n->metacomment) +    o << "// " << n->metacomment << "\n"; +  o << "for ("; +  print(ident, n->getInit(), o); +  o << ";"; +  print(ident, n->getCond(), o); +  o << ";"; +  print(ident, n->getInc(), o); +  o << ")"; +  if (n->getBody()->getType() == CHILLAST_NODE_COMPOUNDSTMT) { +    if (n->getBody()->getChildren()->size() < 2) o << "\n" << ident << identSpace; +    else o << " "; +    print(ident, n->getBody(), o); +  } else { +    CHILL_ERROR("Body of for loop not COMPOUNDSTMT\n"); +    print(ident, n->getBody(), o); +  } +} + +void Dump::printS(std::string ident, chillAST_Free *n, std::ostream &o) {} + +void Dump::printS(std::string ident, chillAST_FunctionDecl *n, std::ostream &o) { +  if (n->filename) o << n->filename << " "; +  if (n->isFromSourceFile) o << "FromSourceFile" << " "; +  o << n->returnType << " " << n->functionName << " "; +  if (n->getBody()) print(ident, n->getBody(), o); +} + +void Dump::printS(std::string ident, chillAST_IfStmt *n, std::ostream &o) { +  print(ident, n->cond, o); +  print(ident, n->thenpart, o); +  if (n->elsepart) +    print(ident, n->elsepart, o); +} + +void Dump::printS(std::string ident, chillAST_IntegerLiteral *n, std::ostream &o) { +  o << n->value; +} + +void Dump::printS(std::string ident, chillAST_ImplicitCastExpr *n, std::ostream &o) { +  print(ident, n->subexpr, o); +} + +void Dump::printS(std::string ident, chillAST_MacroDefinition *n, std::ostream &o) { +  o << "#define" << n->macroName << " "; +  int np = n->getParameters()->size(); +  if (np) { +    o << "(" << n->getParameters()->at(0)->varname; +    for (int i = 1; i < np; ++i) +      o << ", " << n->getParameters()->at(i)->varname; +    o<<")"; +  } +  // TODO newline for multiline macro +  print(ident, n->getBody(), o); +} + +void Dump::printS(std::string ident, chillAST_Malloc *n, std::ostream &o) { +  o << "malloc("; +  print(ident, n->sizeexpr, o); +  o << ")"; +} + +void Dump::printS(std::string ident, chillAST_MemberExpr *n, std::ostream &o) { +  int prec = getPrec(n); +  if (n->base) printPrec(ident, n->base, o, prec); +  else o << "(NULL)"; +  if (n->exptype == CHILLAST_MEMBER_EXP_ARROW) o << "->"; +  else o << "."; +  if (n->member) o << n->member; +  else o << "(NULL)"; +} + +void Dump::printS(std::string ident, chillAST_NULL *n, std::ostream &o) { +  o << "/* (NULL statement) */"; +} + +void Dump::printS(std::string ident, chillAST_NoOp *n, std::ostream &o) {} + +void Dump::printS(std::string ident, chillAST_ParenExpr *n, std::ostream &o) { +  print(ident, n->subexpr, o); +} + +void Dump::printS(std::string ident, chillAST_Preprocessing *n, std::ostream &o) {} + +void Dump::printS(std::string ident, chillAST_RecordDecl *n, std::ostream &o) { +  // TODO access control +  o << n->getName() << " "; +  o << n->isAStruct() << " "; +  o << n->isAUnion() << " "; +} + +void Dump::printS(std::string ident, chillAST_ReturnStmt *n, std::ostream &o) { +  if (n->returnvalue) print(ident, n->returnvalue, o); +} + +void Dump::printS(std::string ident, chillAST_Sizeof *n, std::ostream &o) { +  o << "sizeof(" << n->thing << ")"; +} + +void Dump::printS(std::string ident, chillAST_SourceFile *n, std::ostream &o) { +  o << "// this source is derived from CHILL AST originally from file '" +    << n->filename << "' as parsed by frontend compiler " << n->frontend << "\n\n"; +  int nchild = n->getChildren()->size(); +  for (int i = 0; i < nchild; ++i) { +    if (n->getChild(i)->isFromSourceFile) { +      o << ident; +      print(indent, n->getChild(i), o); +      if (!isSemiColonFree(n->getChild(i)->getType())) o << ";\n"; +      else o<<"\n"; +    } +  } +} + +void Dump::printS(std::string ident, chillAST_TypedefDecl *n, std::ostream &o) { +  if (n->isAStruct()) +    o << "/* A typedef STRUCT */\n"; +  o << ident << "typedef "; +  if (n->rd) print(ident, n->rd, o); +  else if (n->isAStruct()) { +    o << "/* no rd */ "; +    // the struct subparts +  } else +    o << "/* Not A STRUCT */ " << n->getUnderlyingType() << " " << n->newtype << " " << n->arraypart; +  o << n->newtype; +} + +void Dump::printS(std::string ident, chillAST_TernaryOperator *n, std::ostream &o) { +  o << n->op << " "; +  print(ident, n->condition, o); +  print(ident, n->lhs, o); +  print(ident, n->rhs, o); +} + +void Dump::printS(std::string ident, chillAST_UnaryOperator *n, std::ostream &o) { +  if (n->prefix) o << "prefix "; +  else o << "postfix "; +  print(ident, n->subexpr, o); +} + +void Dump::printS(std::string ident, chillAST_VarDecl *n, std::ostream &o) { +  if (n->isDevice) o << "__device__ "; +  if (n->isShared) o << "__shared__ "; +  if (n->isRestrict) o << "__restrict__ "; + +  if ((!n->isAParameter) && n->isAStruct() && n->vardef) { +    print(ident, n->vardef, o); +    o << " " << n->varname; +  } + +  if (n->typedefinition && n->typedefinition->isAStruct()) +    o << "struct "; +  o << n->vartype << " "; +  if (n->arraypointerpart) +    o << n->arraypointerpart; +  if (n->byreference) +    o << "&"; +  o << n->varname; +  if (n->knownArraySizes) +    for (int i = 0; i < (n->numdimensions); ++i) o << "[" << n->arraysizes[i] << "]"; + +  if (n->init) { +    o << "= "; +    print(ident, n->init, o); +  } +}  | 
