source: icGREP/icgrep-devel/icgrep/pablo/function.h @ 4765

Last change on this file since 4765 was 4734, checked in by cameron, 4 years ago

Reorganize icgrep into RE/Pablo/IR passes, support -precompiled IR

File size: 4.7 KB
RevLine 
[4656]1#ifndef FUNCTION_H
2#define FUNCTION_H
3
4#include <pablo/pabloAST.h>
[4657]5#include <pablo/pe_var.h>
6#include <pablo/ps_assign.h>
7#include <pablo/symbol_generator.h>
[4656]8
9namespace pablo {
10
11class Var;
12class Assign;
[4657]13class PabloBlock;
[4659]14class String;
[4656]15
[4680]16class Prototype : public PabloAST {
[4656]17    friend class PabloBlock;
[4680]18public:
19
20    static inline bool classof(const PabloAST * e) {
21        return e->getClassTypeId() == ClassTypeId::Prototype;
22    }
23
[4684]24    static inline bool classof(void *) {
[4680]25        return false;
26    }
27
[4726]28    static Prototype * Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults, void * functionPtr = nullptr);
[4680]29
30    const String * getName() const {
31        return mName;
32    }
33
34    unsigned getNumOfParameters() const {
35        return mNumOfParameters;
36    }
37
38    unsigned getNumOfResults() const {
39        return mNumOfResults;
40    }
41
[4684]42    void * getFunctionPtr() const {
43        return mFunctionPtr;
[4680]44    }
45
46protected:
[4726]47    Prototype(const PabloAST::ClassTypeId type, std::string && name, const unsigned numOfParameters, const unsigned numOfResults, void * functionPtr);
[4684]48protected:
[4680]49    const String * const    mName;
50    const unsigned          mNumOfParameters;
51    const unsigned          mNumOfResults;
[4684]52    void *                  mFunctionPtr;
[4680]53};
54
[4726]55inline Prototype * Prototype::Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults, void * functionPtr) {
56    return new Prototype(PabloAST::ClassTypeId::Prototype, std::move(name), numOfParameters, numOfResults, functionPtr);
[4680]57}
58
59class PabloFunction : public Prototype {
60    friend class PabloBlock;
[4657]61    using ParamAllocator = VectorAllocator::rebind<Var *>::other;
62    using ResultAllocator = VectorAllocator::rebind<Assign *>::other;
[4656]63public:
[4657]64
[4656]65    static inline bool classof(const PabloAST * e) {
[4680]66        switch (e->getClassTypeId()) {
67            case ClassTypeId::Function:
68            case ClassTypeId::Prototype:
69                return true;
70            default:
71                return false;
72        }       
[4656]73    }
[4657]74
[4684]75    static inline bool classof(void *) {
[4656]76        return false;
77    }
[4657]78
[4734]79    static PabloFunction * Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults);
80   
[4656]81    virtual bool operator==(const PabloAST & other) const {
82        return &other == this;
83    }
[4657]84
85    PabloBlock & getEntryBlock() {
86        return mEntryBlock;
87    }
88
89    const PabloBlock & getEntryBlock() const {
90        return mEntryBlock;
91    }
92
[4680]93    SymbolGenerator & getSymbolTable() {
94        return mSymbolTable;
[4657]95    }
96
97    Var * getParameter(const unsigned index) {
[4680]98        if (LLVM_LIKELY(index < getNumOfParameters()))
99            return mParameters[index];
100        else throwInvalidParameterIndex(index);
[4657]101    }
102
103    const Var * getParameter(const unsigned index) const {
[4680]104        if (LLVM_LIKELY(index < getNumOfParameters()))
105            return mParameters[index];
106        else throwInvalidParameterIndex(index);
[4657]107    }
108
[4680]109    void setParameter(const unsigned index, Var * value) {
110        if (LLVM_LIKELY(index < getNumOfParameters()))
111            mParameters[index] = value;
112        else throwInvalidParameterIndex(index);
[4657]113    }
114
115    Assign * getResult(const unsigned index) {
[4680]116        if (LLVM_LIKELY(index < getNumOfResults()))
117            return mResults[index];
118        else throwInvalidResultIndex(index);
[4657]119    }
120
121    const Assign * getResult(const unsigned index) const {
[4680]122        if (LLVM_LIKELY(index < getNumOfResults()))
123            return mResults[index];
124        else throwInvalidResultIndex(index);
[4657]125    }
126
[4680]127    void setResult(const unsigned index, Assign * value) {       
128        if (LLVM_LIKELY(index < getNumOfResults())) {
129            if (LLVM_LIKELY(mResults[index] != value)) {
130                if (LLVM_UNLIKELY(mResults[index] != nullptr)) {
131                    mResults[index]->removeUser(this);
132                }
133                mResults[index] = value;
134                value->addUser(this);
135            }
136        }
137        else throwInvalidResultIndex(index);
[4657]138    }
139
[4684]140    void setFunctionPtr(void * functionPtr) {
141        mFunctionPtr = functionPtr;
142    }
143
[4680]144    virtual ~PabloFunction() { }
[4657]145
[4680]146protected:
[4657]147
[4680]148    __attribute__((noreturn)) void throwInvalidParameterIndex(const unsigned index) const;
[4657]149
[4680]150    __attribute__((noreturn)) void throwInvalidResultIndex(const unsigned index) const;
151
152    PabloFunction(std::string && name, const unsigned numOfParameters, const unsigned numOfResults);
[4656]153private:
[4657]154    PabloBlock &        mEntryBlock;
155    SymbolGenerator     mSymbolTable;
[4680]156    Var ** const        mParameters;
157    Assign ** const     mResults;
[4656]158};
159
[4734]160inline PabloFunction * PabloFunction::Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults) {
161    return new PabloFunction(std::move(name), numOfParameters, numOfResults);
[4656]162}
[4734]163   
[4657]164}
165
[4656]166#endif // FUNCTION_H
Note: See TracBrowser for help on using the repository browser.