This machine mirrors various open-source projects.
20 Gbit/s uplink.
If there are any issues or you want another project mirrored, please contact
mirror-service -=AT=- netcologne DOT de !
00001 //===-- codegen/DomainInfo.h ---------------------------------- -*- C++ -*-===// 00002 // 00003 // This file is distributed under the MIT license. See LICENSE.txt for details. 00004 // 00005 // Copyright (C) 2009-2010, Stephen Wilson 00006 // 00007 //===----------------------------------------------------------------------===// 00008 00009 #ifndef COMMA_CODEGEN_DOMAININFO_HDR_GUARD 00010 #define COMMA_CODEGEN_DOMAININFO_HDR_GUARD 00011 00012 #include "CodeGen.h" 00013 #include "comma/ast/Decl.h" 00014 00015 #include "llvm/Support/IRBuilder.h" 00016 00017 #include <string> 00018 #include <vector> 00019 00020 namespace comma { 00021 00022 class CommaRT; 00023 class DependencySet; 00024 00027 class DomainInfo { 00028 00029 public: 00030 DomainInfo(CommaRT &CRT); 00031 00032 void init(); 00033 00039 enum FieldId { 00040 Arity, 00041 Name, 00042 Ctor, 00043 ITable, 00044 }; 00045 00047 const std::string &getTypeName() const { return theTypeName; } 00048 00050 const llvm::StructType *getType() const; 00051 00053 const llvm::PointerType *getPointerTypeTo() const; 00054 00060 const llvm::PointerType *getCtorPtrType() const; 00061 00066 llvm::GlobalVariable *emit(const Domoid *domoid); 00067 00070 static std::string getLinkName(const Domoid *model); 00071 00072 template <FieldId F> 00073 struct FieldIdTraits { 00074 typedef const llvm::PointerType FieldType; 00075 }; 00076 00077 template <FieldId F> 00078 typename FieldIdTraits<F>::FieldType *getFieldType() 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 00092 llvm::Constant *genName(const Domoid *domoid); 00093 00095 llvm::Constant *genArity(const Domoid *domoid); 00096 00098 llvm::Constant *genConstructor(const Domoid *domoid); 00099 00101 llvm::Constant *genITable(const Domoid *domoid); 00102 00110 void genInstanceRequirement(llvm::IRBuilder<> &builder, 00111 const DependencySet &DS, 00112 unsigned ID, 00113 llvm::Value *destVector, 00114 llvm::Value *percent); 00115 00120 void genDomainRequirement(llvm::IRBuilder<> &builder, 00121 const DependencySet &DS, 00122 unsigned ID, 00123 llvm::Value *destVector); 00124 00129 void genFunctorRequirement(llvm::IRBuilder<> &builder, 00130 const DependencySet &DS, 00131 unsigned ID, 00132 llvm::Value *destVector, 00133 llvm::Value *percent); 00134 00137 static std::string getCtorName(const Domoid *domoid); 00138 }; 00139 00140 //===----------------------------------------------------------------------===// 00141 // DomainInfo::FieldIdTraits specializations for the various fields within a 00142 // domain_info. 00143 00144 template <> 00145 struct DomainInfo::FieldIdTraits<DomainInfo::Arity> { 00146 typedef const llvm::IntegerType FieldType; 00147 }; 00148 00149 //===----------------------------------------------------------------------===// 00150 // DomainInfo::getFieldType specializations for each field in a domain_info. 00151 00152 template <> inline 00153 DomainInfo::FieldIdTraits<DomainInfo::Arity>::FieldType * 00154 DomainInfo::getFieldType<DomainInfo::Arity>() const { 00155 typedef FieldIdTraits<Arity>::FieldType FTy; 00156 return llvm::cast<FTy>(getType()->getElementType(Arity)); 00157 } 00158 00159 template <> inline 00160 DomainInfo::FieldIdTraits<DomainInfo::Name>::FieldType * 00161 DomainInfo::getFieldType<DomainInfo::Name>() const { 00162 typedef FieldIdTraits<Name>::FieldType FTy; 00163 return llvm::cast<FTy>(getType()->getElementType(Name)); 00164 } 00165 00166 template <> inline 00167 DomainInfo::FieldIdTraits<DomainInfo::Ctor>::FieldType * 00168 DomainInfo::getFieldType<DomainInfo::Ctor>() const { 00169 typedef FieldIdTraits<Ctor>::FieldType FTy; 00170 return llvm::cast<FTy>(getType()->getElementType(Ctor)); 00171 } 00172 00173 template <> inline 00174 DomainInfo::FieldIdTraits<DomainInfo::ITable>::FieldType * 00175 DomainInfo::getFieldType<DomainInfo::ITable>() const { 00176 typedef FieldIdTraits<ITable>::FieldType FTy; 00177 return llvm::cast<FTy>(getType()->getElementType(ITable)); 00178 } 00179 00180 }; // end comma namespace. 00181 00182 #endif