summaryrefslogtreecommitdiff
path: root/include/chillAST
diff options
context:
space:
mode:
Diffstat (limited to 'include/chillAST')
-rw-r--r--include/chillAST/chillAST_def.hh23
-rw-r--r--include/chillAST/chillAST_node.hh196
-rw-r--r--include/chillAST/chillASTs.hh13
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();