00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 #ifndef COMMA_CODEGEN_DOMAININSTANCE_HDR_GUARD
00010 #define COMMA_CODEGEN_DOMAININSTANCE_HDR_GUARD
00011 
00012 #include "CodeGen.h"
00013 
00014 #include "llvm/Support/IRBuilder.h"
00015 
00016 namespace comma {
00017 
00018 class CommaRT;
00019 
00020 class DomainInstance {
00021 
00022 public:
00023     DomainInstance(CommaRT &CRT);
00024 
00025     void init();
00026 
00027     enum FieldId {
00028         Info,
00029         Next,
00030         Params,
00031         Requirements
00032     };
00033 
00035     const std::string &getTypeName() const { return theTypeName; }
00036 
00038     const llvm::StructType *getType() const;
00039 
00041     const llvm::PointerType *getPointerTypeTo() const;
00042 
00043     template <FieldId F>
00044     struct FieldIdTraits {
00045         typedef const llvm::PointerType FieldType;
00046     };
00047 
00048     template <FieldId F>
00049     typename FieldIdTraits<F>::FieldType *getFieldType() const;
00050 
00052     llvm::Value *loadInfo(llvm::IRBuilder<> &builder,
00053                           llvm::Value *Instance) const;
00054 
00057     llvm::Value *loadParamVec(llvm::IRBuilder<> &builder,
00058                               llvm::Value *instance) const;
00059 
00062     llvm::Value *loadParam(llvm::IRBuilder<> &builder,
00063                            llvm::Value *instance,
00064                            unsigned paramIdx) const;
00065 
00067     llvm::Value *loadLocalVec(llvm::IRBuilder<> &builder,
00068                               llvm::Value *instance) const;
00069 
00071     void setLocalVec(llvm::IRBuilder<> &builder,
00072                      llvm::Value *instance,
00073                      llvm::Value *vec) const;
00074 
00076     llvm::Value *loadLocalInstance(llvm::IRBuilder<> &builder,
00077                                    llvm::Value *instance,
00078                                    unsigned localID) const;
00079 
00080 private:
00081     CommaRT &CRT;
00082     CodeGen &CG;
00083     const llvm::TargetData &TD;
00084 
00086     static const std::string theTypeName;
00087 
00089     llvm::PATypeHolder theType;
00090 };
00091 
00092 
00093 
00094 
00095 
00096 template <> inline
00097 DomainInstance::FieldIdTraits<DomainInstance::Info>::FieldType *
00098 DomainInstance::getFieldType<DomainInstance::Info>() const {
00099     typedef FieldIdTraits<Info>::FieldType FTy;
00100     return llvm::cast<FTy>(getType()->getElementType(Info));
00101 }
00102 
00103 template <> inline
00104 DomainInstance::FieldIdTraits<DomainInstance::Next>::FieldType *
00105 DomainInstance::getFieldType<DomainInstance::Next>() const {
00106     typedef FieldIdTraits<Next>::FieldType FTy;
00107     return llvm::cast<FTy>(getType()->getElementType(Next));
00108 }
00109 
00110 template <> inline
00111 DomainInstance::FieldIdTraits<DomainInstance::Params>::FieldType *
00112 DomainInstance::getFieldType<DomainInstance::Params>() const {
00113     typedef FieldIdTraits<Params>::FieldType FTy;
00114     return llvm::cast<FTy>(getType()->getElementType(Params));
00115 }
00116 
00117 template <> inline
00118 DomainInstance::FieldIdTraits<DomainInstance::Requirements>::FieldType *
00119 DomainInstance::getFieldType<DomainInstance::Requirements>() const {
00120     typedef FieldIdTraits<Requirements>::FieldType FTy;
00121     return llvm::cast<FTy>(getType()->getElementType(Requirements));
00122 }
00123 
00124 } 
00125 
00126 #endif