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/CommaRT.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_COMMART_HDR_GUARD 00010 #define COMMA_CODEGEN_COMMART_HDR_GUARD 00011 00012 #include "comma/ast/AstBase.h" 00013 00014 #include "llvm/ADT/DenseMap.h" 00015 #include "llvm/Support/IRBuilder.h" 00016 00017 namespace llvm { 00018 00019 class TargetData; 00020 00021 } // end llvm namespace; 00022 00023 namespace comma { 00024 00025 class CodeGen; 00026 class DomainInfo; 00027 class DomainInstance; 00028 class SRFrame; 00029 00030 class CommaRT { 00031 00032 public: 00033 CommaRT(CodeGen &CG); 00034 00035 ~CommaRT(); 00036 00039 CodeGen &getCodeGen() { return CG; } 00040 const CodeGen &getCodeGen() const { return CG; } 00041 00042 enum TypeId { 00043 CRT_ITable, 00044 CRT_DomainInfo, 00045 CRT_DomainInstance, 00046 CRT_DomainCtor 00047 }; 00048 00049 template <TypeId F> 00050 struct TypeIdTraits { 00051 typedef const llvm::PointerType FieldType; 00052 }; 00053 00054 template <TypeId F> 00055 typename TypeIdTraits<F>::FieldType *getType() const; 00056 00057 const std::string &getTypeName(TypeId id) const; 00058 00059 llvm::GlobalVariable *registerCapsule(Domoid *domoid); 00060 00061 llvm::Value *getDomain(llvm::IRBuilder<> &builder, 00062 llvm::GlobalValue *capsuleInfo) const; 00063 00064 llvm::Value *getDomain(llvm::IRBuilder<> &builder, 00065 std::vector<llvm::Value*> &args) const; 00066 00067 llvm::Value *getLocalCapsule(llvm::IRBuilder<> &builder, 00068 llvm::Value *percent, unsigned ID) const; 00069 00072 llvm::Value *getCapsuleParameter(llvm::IRBuilder<> &builder, 00073 llvm::Value *instance, 00074 unsigned index) const; 00075 00078 const DomainInfo *getDomainInfo() const { return DInfo; } 00079 const DomainInstance *getDomainInstance() const { return DInstance; } 00080 00085 00086 00094 llvm::Constant *registerException(const ExceptionDecl *exception); 00095 00103 void raise(SRFrame *frame, const ExceptionDecl *exception, 00104 llvm::Value *fileName, llvm::Value *lineNum, 00105 llvm::GlobalVariable *message = 0); 00106 00119 void raise(SRFrame *frame, const ExceptionDecl *exception, 00120 llvm::Value *fileName, llvm::Value *lineNum, 00121 llvm::Value *message = 0, llvm::Value *length = 0); 00122 00124 void reraise(SRFrame *frame, llvm::Value *exception); 00125 00127 void raiseProgramError(SRFrame *frame, 00128 llvm::Value *fileName, llvm::Value *lineNum, 00129 llvm::GlobalVariable *message) const; 00130 00132 void raiseConstraintError(SRFrame *frame, 00133 llvm::Value *fileName, llvm::Value *lineNum, 00134 llvm::GlobalVariable *message) const; 00135 00137 void raiseAssertionError(SRFrame *frame, 00138 llvm::Value *fileName, llvm::Value *lineNum, 00139 llvm::Value *message, llvm::Value *length) const; 00140 00146 void unhandledException(llvm::IRBuilder<> &builder, 00147 llvm::Value *exception) const; 00148 00151 llvm::Constant *getEHPersonality() const; 00153 00155 00156 llvm::Value *pow_i32_i32(llvm::IRBuilder<> &builder, 00157 llvm::Value *x, llvm::Value *n) const; 00158 llvm::Value *pow_i64_i32(llvm::IRBuilder<> &builder, 00159 llvm::Value *x, llvm::Value *n) const; 00161 00162 00164 00165 00166 00167 void vstack_alloc(llvm::IRBuilder<> &builder, llvm::Value *size) const; 00168 00170 void vstack_push(llvm::IRBuilder<> &builder, 00171 llvm::Value *data, llvm::Value *size) const; 00172 00174 void vstack_pop(llvm::IRBuilder<> &builder) const; 00175 00178 llvm::Value *vstack(llvm::IRBuilder<> &builder, 00179 const llvm::Type *ptrTy) const; 00181 00183 00184 llvm::Value *comma_alloc(llvm::IRBuilder<> &builder, 00185 uint64_t size, unsigned alignment) const; 00186 00187 llvm::Value *comma_alloc(llvm::IRBuilder<> &builder, 00188 llvm::Value *size, unsigned alignment) const; 00189 00191 00192 private: 00193 CodeGen &CG; 00194 00195 // Names of the basic runtime types as they appear in llvm IR. 00196 std::string InvalidName; 00197 std::string ITableName; 00198 std::string DomainCtorName; 00199 00200 DomainInfo *DInfo; 00201 const llvm::PointerType *DomainInfoPtrTy; 00202 00203 DomainInstance *DInstance; 00204 const llvm::PointerType *DomainInstancePtrTy; 00205 00206 const llvm::PointerType *ITablePtrTy; 00207 const llvm::PointerType *DomainCtorPtrTy; 00208 00209 // Function declarations for the comma runtime functions. 00210 llvm::Function *getDomainFn; 00211 llvm::Function *EHPersonalityFn; 00212 llvm::Function *unhandledExceptionFn; 00213 llvm::Function *raiseStaticExceptionFn; 00214 llvm::Function *raiseUserExceptionFn; 00215 llvm::Function *reraiseExceptionFn; 00216 llvm::Function *pow_i32_i32_Fn; 00217 llvm::Function *pow_i64_i32_Fn; 00218 llvm::Function *vstack_alloc_Fn; 00219 llvm::Function *vstack_push_Fn; 00220 llvm::Function *vstack_pop_Fn; 00221 llvm::Function *alloc_Fn; 00222 00223 // Runtime global variables. 00224 llvm::GlobalVariable *vstack_Var; 00225 00226 // Mapping from user-defined exceptions to the llvm::GlobalVariable's that 00227 // contain their associated comma_exinfo objects. 00228 typedef llvm::DenseMap<const ExceptionDecl*, 00229 llvm::GlobalVariable*> ExceptionMap; 00230 ExceptionMap registeredExceptions; 00231 00232 // External globals representing the language defined exceptions. 00233 // Definitions of these globals are provided by libruntime. 00234 llvm::Constant *theProgramErrorExinfo; 00235 llvm::Constant *theConstraintErrorExinfo; 00236 llvm::Constant *theAssertErrorExinfo; 00237 00238 const llvm::PointerType *getDomainCtorPtrTy(); 00239 const llvm::PointerType *getITablePtrTy(); 00240 00241 // Methods which build the LLVM IR for the comma runtime functions. 00242 void defineGetDomain(); 00243 void defineEHPersonality(); 00244 void defineUnhandledException(); 00245 void defineRaiseException(); 00246 void defineExinfos(); 00247 void define_pow_i32_i32(); 00248 void define_pow_i64_i32(); 00249 void define_vstack_alloc(); 00250 void define_vstack_push(); 00251 void define_vstack_pop(); 00252 void define_vstack(); 00253 void define_alloc(); 00254 00255 // Builds the llvm IR for the primitive types needed by the runtime system. 00256 void generateRuntimeTypes(); 00257 00258 // Builds the llvm IR declarations for the primitive functions provided by 00259 // the runtime library. 00260 void generateRuntimeFunctions(); 00261 00264 llvm::Constant *genExinfoInitializer(const ExceptionDecl *exception); 00265 00268 llvm::Constant *checkAndConvertMessage(llvm::GlobalVariable *message) const; 00269 00272 void raiseExinfo(SRFrame *frame, llvm::Value *exinfo, 00273 llvm::Value *fileName, llvm::Value *lineNum, 00274 llvm::GlobalVariable *message) const; 00275 00278 void raiseExinfo(SRFrame *frame, llvm::Value *exinfo, 00279 llvm::Value *fileName, llvm::Value *lineNum, 00280 llvm::Value *message, llvm::Value *length) const; 00281 }; 00282 00283 template <> inline 00284 CommaRT::TypeIdTraits<CommaRT::CRT_ITable>::FieldType * 00285 CommaRT::getType<CommaRT::CRT_ITable>() const { 00286 return ITablePtrTy; 00287 } 00288 00289 template <> inline 00290 CommaRT::TypeIdTraits<CommaRT::CRT_DomainInfo>::FieldType * 00291 CommaRT::getType<CommaRT::CRT_DomainInfo>() const { 00292 return DomainInfoPtrTy; 00293 } 00294 00295 template <> inline 00296 CommaRT::TypeIdTraits<CommaRT::CRT_DomainInstance>::FieldType * 00297 CommaRT::getType<CommaRT::CRT_DomainInstance>() const { 00298 return DomainInstancePtrTy; 00299 } 00300 00301 template <> inline 00302 CommaRT::TypeIdTraits<CommaRT::CRT_DomainCtor>::FieldType * 00303 CommaRT::getType<CommaRT::CRT_DomainCtor>() const { 00304 return DomainCtorPtrTy; 00305 } 00306 00307 } // end comma namespace. 00308 00309 #endif 00310