hllcode.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2002, Trent Waddington
00003  *
00004  * See the file "LICENSE.TERMS" for information on usage and
00005  * redistribution of this file, and for a DISCLAIMER OF ALL
00006  * WARRANTIES.
00007  *
00008  */
00009 
00010 /*==============================================================================
00011  * FILE:       hllcode.h
00012  * OVERVIEW:   Interface for a high level language code base class.
00013  *             This class is provides methods which are generic of procedural
00014  *             languages like C, Pascal, Fortran, etc.  Included in the base class
00015  *             is the follow and goto sets which are used during code generation.
00016  *             Concrete implementations of this class provide specific language
00017  *             bindings for a single procedure in the program.
00018  *============================================================================*/
00019 /*
00020  *  $Revision: 1.25 $   // 1.23.2.8
00021  */
00022 
00023 #ifndef _HLLCODE_H_
00024 #define _HLLCODE_H_
00025 
00026 #include <iostream>
00027 #include <vector>
00028 #include <assert.h>
00029 #include <statement.h>      // For CallStatement::RetLocs
00030 
00031 class BasicBlock;
00032 typedef BasicBlock *PBB;
00033 class Exp;
00034 class UserProc;
00035 class Proc;
00036 class Type;
00037 class Signature;
00038 class Assign;
00039 class LocationSet;
00040 class CallStatement;
00041 //class CallStatement::RetLocs;
00042 class ReturnStatement;
00043 
00044 class HLLCode {
00045 protected:
00046         UserProc *m_proc;       // Pointer to the enclosing UserProc
00047 
00048 public:
00049         // constructors
00050                 HLLCode() { }
00051                 HLLCode(UserProc *p) : m_proc(p) { }
00052 
00053     // destructor
00054 virtual         ~HLLCode() { }
00055 
00056     // clear the hllcode object (derived classes should call the base)
00057 virtual void    reset() {
00058         }
00059 
00060         // access to proc
00061         UserProc *getProc() { return m_proc; }
00062         void    setProc(UserProc *p) { m_proc = p; }
00063 
00064         /*
00065          * Functions to add new code, pure virtual.
00066          */
00067 
00068         // pretested loops
00069 virtual void    AddPretestedLoopHeader(int indLevel, Exp *cond) = 0;
00070 virtual void    AddPretestedLoopEnd(int indLevel) = 0;
00071 
00072         // endless loops
00073 virtual void    AddEndlessLoopHeader(int indLevel) = 0;
00074 virtual void    AddEndlessLoopEnd(int indLevel) = 0;
00075 
00076         // posttested loops
00077 virtual void    AddPosttestedLoopHeader(int indLevel) = 0;
00078 virtual void    AddPosttestedLoopEnd(int indLevel, Exp *cond) = 0;
00079 
00080         // case conditionals "nways"
00081 virtual void    AddCaseCondHeader(int indLevel, Exp *cond) = 0;
00082 virtual void    AddCaseCondOption(int indLevel, Exp *opt) = 0;
00083 virtual void    AddCaseCondOptionEnd(int indLevel) = 0;
00084 virtual void    AddCaseCondElse(int indLevel) = 0;
00085 virtual void    AddCaseCondEnd(int indLevel) = 0;
00086 
00087         // if conditions
00088 virtual void    AddIfCondHeader(int indLevel, Exp *cond) = 0;
00089 virtual void    AddIfCondEnd(int indLevel) = 0;
00090 
00091         // if else conditions
00092 virtual void    AddIfElseCondHeader(int indLevel, Exp *cond) = 0;
00093 virtual void    AddIfElseCondOption(int indLevel) = 0;
00094 virtual void    AddIfElseCondEnd(int indLevel) = 0;
00095 
00096         // goto, break, continue, etc
00097 virtual void    AddGoto(int indLevel, int ord) = 0;
00098 virtual void    AddBreak(int indLevel) = 0;
00099 virtual void    AddContinue(int indLevel) = 0;
00100 
00101         // labels
00102 virtual void    AddLabel(int indLevel, int ord) = 0;
00103 virtual void    RemoveLabel(int ord) = 0;
00104 virtual void    RemoveUnusedLabels(int maxOrd) = 0;
00105 
00106         // sequential statements
00107 virtual void    AddAssignmentStatement(int indLevel, Assign *s) = 0;
00108 virtual void    AddCallStatement(int indLevel, Proc *proc, const char *name, StatementList &args,
00109                     StatementList* results) = 0;
00110 virtual void    AddIndCallStatement(int indLevel, Exp *exp, StatementList& args, StatementList* results) = 0;
00111 virtual void    AddReturnStatement(int indLevel, StatementList* rets) = 0;
00112 
00113         // procedure related
00114 virtual void    AddProcStart(UserProc* proc) = 0;
00115 virtual void    AddProcEnd() = 0;
00116 virtual void    AddLocal(const char *name, Type *type, bool last = false) = 0;
00117 virtual void    AddGlobal(const char *name, Type *type, Exp *init = NULL) = 0;
00118 virtual void    AddPrototype(UserProc* proc) = 0;
00119 
00120     // comments
00121 virtual void    AddLineComment(char* cmt) = 0;
00122     
00123         /*
00124          * output functions, pure virtual.
00125          */
00126 virtual void    print(std::ostream &os) = 0;
00127 };      // class HLLCode
00128 
00129 class SyntaxNode {
00130 protected:
00131         PBB     pbb;
00132         int     nodenum;
00133         int     score;
00134         SyntaxNode *correspond; // corresponding node in previous state
00135         bool    notGoto;
00136         int     depth;
00137 
00138 public:
00139                 SyntaxNode();
00140 virtual         ~SyntaxNode();
00141 
00142 virtual bool    isBlock() { return false; }
00143 virtual bool    isGoto();
00144 virtual bool    isBranch();
00145 
00146 virtual void    ignoreGoto() { };
00147 
00148 virtual int     getNumber() { return nodenum; }
00149 
00150         PBB     getBB() { return pbb; }
00151         void    setBB(PBB bb) { pbb = bb; }
00152 
00153 virtual int     getNumOutEdges() = 0;
00154 virtual SyntaxNode *getOutEdge(SyntaxNode *root, int n) = 0;
00155 virtual bool    endsWithGoto() = 0;
00156 virtual bool    startsWith(SyntaxNode *node) { return this == node; }
00157 
00158 virtual SyntaxNode *getEnclosingLoop(SyntaxNode *pFor, 
00159                                          SyntaxNode *cur = NULL) = 0;
00160 
00161         int     getScore();
00162         void    addToScore(int n) { score = getScore() + n; }
00163         void    setDepth(int n) { depth = n; }
00164         int     getDepth() { return depth; }
00165 
00166 virtual SyntaxNode *clone() = 0;
00167 virtual SyntaxNode *replace(SyntaxNode *from, SyntaxNode *to) = 0;
00168         SyntaxNode *getCorrespond() { return correspond; }
00169 
00170 virtual SyntaxNode *findNodeFor(PBB bb) = 0;
00171 virtual void    printAST(SyntaxNode *root, std::ostream &os) = 0;
00172 virtual int     evaluate(SyntaxNode *root) = 0;
00173 virtual void    addSuccessors(SyntaxNode *root, std::vector<SyntaxNode*> &successors) { }
00174 };      // class SyntaxNode
00175 
00176 class BlockSyntaxNode : public SyntaxNode {
00177 private:
00178     std::vector<SyntaxNode*> statements;
00179 
00180 public:
00181     BlockSyntaxNode();
00182     virtual ~BlockSyntaxNode();
00183 
00184     virtual bool isBlock() { return pbb == NULL; }
00185 
00186     virtual void ignoreGoto() {
00187         if (pbb) notGoto = true;
00188         else if (statements.size() > 0)
00189             statements[statements.size()-1]->ignoreGoto();
00190     }
00191 
00192     int getNumStatements() { 
00193         return pbb ? 0 : statements.size(); 
00194     }
00195     SyntaxNode *getStatement(int n) {
00196         assert(pbb == NULL);
00197         return statements[n]; 
00198     }
00199     void prependStatement(SyntaxNode *n) {
00200         assert(pbb == NULL);
00201         statements.resize(statements.size()+1);
00202         for (int i = statements.size()-1; i > 0;  i--)
00203             statements[i] = statements[i-1];
00204         statements[0] = n;
00205     }
00206     void addStatement(SyntaxNode *n) { 
00207         assert(pbb == NULL);
00208         statements.push_back(n); 
00209     }
00210     void setStatement(int i, SyntaxNode *n) { 
00211         assert(pbb == NULL);
00212         statements[i] = n; 
00213     }
00214 
00215 virtual int getNumOutEdges();
00216 virtual SyntaxNode *getOutEdge(SyntaxNode *root, int n);
00217 virtual bool endsWithGoto() {
00218             if (pbb) return isGoto();
00219             bool last = false;
00220             if (statements.size() > 0)
00221                 last = statements[statements.size()-1]->endsWithGoto();
00222             return last;
00223         }
00224 virtual bool    startsWith(SyntaxNode *node) { 
00225             return this == node || (statements.size() > 0 && statements[0]->startsWith(node)); 
00226         }
00227 virtual SyntaxNode *getEnclosingLoop(SyntaxNode *pFor, SyntaxNode *cur = NULL) {
00228             if (this == pFor) return cur;
00229             for (unsigned i = 0; i < statements.size(); i++) {
00230                 SyntaxNode *n = statements[i]->getEnclosingLoop(pFor, cur);
00231                 if (n) return n;
00232             }
00233             return NULL;
00234         }
00235 
00236 virtual SyntaxNode *clone();
00237 virtual SyntaxNode *replace(SyntaxNode *from, SyntaxNode *to);
00238 
00239 virtual SyntaxNode *findNodeFor(PBB bb);
00240 virtual void    printAST(SyntaxNode *root, std::ostream &os);
00241 virtual int     evaluate(SyntaxNode *root);
00242 virtual void    addSuccessors(SyntaxNode *root, std::vector<SyntaxNode*> &successors);
00243 };      // class BlockSyntaxNode
00244 
00245 class IfThenSyntaxNode : public SyntaxNode {
00246 protected:
00247         SyntaxNode *pThen;
00248         Exp     *cond;
00249 
00250 public:
00251                 IfThenSyntaxNode();
00252 virtual         ~IfThenSyntaxNode();
00253 
00254 virtual bool    isGoto() { return false; }
00255 virtual bool    isBranch() { return false; }
00256 
00257 virtual int     getNumOutEdges() {
00258         return 1;
00259     }
00260 virtual SyntaxNode *getOutEdge(SyntaxNode *root, int n);
00261 virtual bool    endsWithGoto() { return false; }
00262 
00263 virtual SyntaxNode *clone();
00264 virtual SyntaxNode *replace(SyntaxNode *from, SyntaxNode *to);
00265 
00266 virtual SyntaxNode *getEnclosingLoop(SyntaxNode *pFor, SyntaxNode *cur = NULL) {
00267             if (this == pFor) return cur;
00268             return pThen->getEnclosingLoop(pFor, cur);
00269         }
00270 
00271         void    setCond(Exp *e) { cond = e; }
00272         Exp     *getCond() { return cond; }
00273         void    setThen(SyntaxNode *n) { pThen = n; }
00274 
00275 virtual SyntaxNode *findNodeFor(PBB bb);
00276 virtual void    printAST(SyntaxNode *root, std::ostream &os);
00277 virtual int     evaluate(SyntaxNode *root);
00278 virtual void    addSuccessors(SyntaxNode *root, std::vector<SyntaxNode*> &successors);
00279 };      // class IfThenSyntaxNode
00280 
00281 class IfThenElseSyntaxNode : public SyntaxNode {
00282 protected:
00283         SyntaxNode *pThen;
00284         SyntaxNode *pElse;
00285         Exp     *cond;
00286 
00287 public:
00288                 IfThenElseSyntaxNode();
00289 virtual         ~IfThenElseSyntaxNode();
00290 virtual bool    isGoto() { return false; }
00291 virtual bool    isBranch() { return false; }
00292 
00293 virtual int     getNumOutEdges() {
00294             return 1;
00295         }
00296 virtual SyntaxNode *getOutEdge(SyntaxNode *root, int n) {
00297             SyntaxNode *o = pThen->getOutEdge(root, 0);
00298             assert(o == pElse->getOutEdge(root, 0));
00299             return o;
00300         }
00301 virtual bool    endsWithGoto() { return false; }
00302 
00303 virtual SyntaxNode *getEnclosingLoop(SyntaxNode *pFor, SyntaxNode *cur = NULL) {
00304             if (this == pFor) return cur;
00305             SyntaxNode *n = pThen->getEnclosingLoop(pFor, cur);
00306             if (n) return n;
00307             return pElse->getEnclosingLoop(pFor, cur);
00308         }
00309 
00310 
00311 virtual SyntaxNode *clone();
00312 virtual SyntaxNode *replace(SyntaxNode *from, SyntaxNode *to);
00313 
00314         void    setCond(Exp *e) { cond = e; }
00315         void    setThen(SyntaxNode *n) { pThen = n; }
00316         void    setElse(SyntaxNode *n) { pElse = n; }
00317 
00318 virtual SyntaxNode *findNodeFor(PBB bb);
00319 virtual void printAST(SyntaxNode *root, std::ostream &os);
00320 virtual int evaluate(SyntaxNode *root);
00321 virtual void addSuccessors(SyntaxNode *root,
00322                                std::vector<SyntaxNode*> &successors);
00323 };      // class IfThenElseSyntaxNode
00324 
00325 class PretestedLoopSyntaxNode : public SyntaxNode {
00326 protected:
00327         SyntaxNode *pBody;
00328         Exp     *cond;
00329 
00330 public:
00331                 PretestedLoopSyntaxNode();
00332 virtual         ~PretestedLoopSyntaxNode();
00333 virtual bool    isGoto() { return false; }
00334 virtual bool    isBranch() { return false; }
00335 
00336 virtual int     getNumOutEdges() {
00337         return 1;
00338     }
00339 virtual SyntaxNode *getOutEdge(SyntaxNode *root, int n);
00340 virtual bool    endsWithGoto() { return false; }
00341 virtual SyntaxNode *getEnclosingLoop(SyntaxNode *pFor, SyntaxNode *cur = NULL) {
00342             if (this == pFor) return cur;
00343             return pBody->getEnclosingLoop(pFor, this);
00344         }
00345 
00346 virtual SyntaxNode *clone();
00347 virtual SyntaxNode *replace(SyntaxNode *from, SyntaxNode *to);
00348 
00349         void    setCond(Exp *e) { cond = e; }
00350         void    setBody(SyntaxNode *n) { pBody = n; }
00351 
00352 virtual SyntaxNode *findNodeFor(PBB bb);
00353 virtual void    printAST(SyntaxNode *root, std::ostream &os);
00354 virtual int     evaluate(SyntaxNode *root);
00355 virtual void    addSuccessors(SyntaxNode *root, std::vector<SyntaxNode*> &successors);
00356 };      // class PretestedLoopSyntaxNode
00357 
00358 class PostTestedLoopSyntaxNode : public SyntaxNode {
00359 protected:
00360         SyntaxNode *pBody;
00361         Exp     *cond;
00362 
00363 public:
00364                     PostTestedLoopSyntaxNode();
00365 virtual ~PostTestedLoopSyntaxNode();
00366 virtual bool    isGoto() { return false; }
00367 virtual bool    isBranch() { return false; }
00368 
00369 virtual int     getNumOutEdges() {
00370             return 1;
00371         }
00372 virtual SyntaxNode *getOutEdge(SyntaxNode *root, int n);
00373 virtual bool    endsWithGoto() { return false; }
00374 virtual SyntaxNode *getEnclosingLoop(SyntaxNode *pFor, SyntaxNode *cur = NULL) {
00375             if (this == pFor) return cur;
00376             return pBody->getEnclosingLoop(pFor, this);
00377         }
00378 
00379 virtual SyntaxNode *clone();
00380 virtual SyntaxNode *replace(SyntaxNode *from, SyntaxNode *to);
00381 
00382         void    setCond(Exp *e) { cond = e; }
00383         void    setBody(SyntaxNode *n) { pBody = n; }
00384 
00385 virtual SyntaxNode *findNodeFor(PBB bb);
00386 virtual void    printAST(SyntaxNode *root, std::ostream &os);
00387 virtual int     evaluate(SyntaxNode *root);
00388 virtual void    addSuccessors(SyntaxNode *root, std::vector<SyntaxNode*> &successors);
00389 };      // class PostTestedLoopSyntaxNode
00390 
00391 class InfiniteLoopSyntaxNode : public SyntaxNode {
00392 protected:
00393         SyntaxNode *pBody;
00394 
00395 public:
00396                 InfiniteLoopSyntaxNode();
00397 virtual         ~InfiniteLoopSyntaxNode();
00398 virtual bool    isGoto() { return false; }
00399 virtual bool    isBranch() { return false; }
00400 
00401 virtual int getNumOutEdges() {
00402             return 0;
00403         }
00404 virtual SyntaxNode *getOutEdge(SyntaxNode *root, int n) {
00405             return NULL;
00406         }
00407 virtual bool endsWithGoto() { return false; }
00408 virtual SyntaxNode *getEnclosingLoop(SyntaxNode *pFor, SyntaxNode *cur = NULL) {
00409             if (this == pFor) return cur;
00410             return pBody->getEnclosingLoop(pFor, this);
00411         }
00412 
00413 virtual SyntaxNode *clone();
00414 virtual SyntaxNode *replace(SyntaxNode *from, SyntaxNode *to);
00415 
00416         void    setBody(SyntaxNode *n) { pBody = n; }
00417 
00418 virtual SyntaxNode *findNodeFor(PBB bb);
00419 virtual void    printAST(SyntaxNode *root, std::ostream &os);
00420 virtual int     evaluate(SyntaxNode *root);
00421 virtual void    addSuccessors(SyntaxNode *root, std::vector<SyntaxNode*> &successors);
00422 };      // class InfiniteLoopSyntaxNode
00423 
00424 #endif
00425 

Generated on Tue Sep 19 21:18:24 2006 for Boomerang by  doxygen 1.4.6