Home | History | Annotate | Download | only in ExceptionDemo

Lines Matching full:llvm

1 //===-- ExceptionDemo.cpp - An example using llvm Exceptions --------------===//
3 // The LLVM Compiler Infrastructure
10 // Demo program which implements an example LLVM exception implementation, and
46 // This code uses code from the llvm compiler-rt project and the llvm
51 #include "llvm/IR/Verifier.h"
52 #include "llvm/ExecutionEngine/MCJIT.h"
53 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
54 #include "llvm/IR/DataLayout.h"
55 #include "llvm/IR/DerivedTypes.h"
56 #include "llvm/IR/IRBuilder.h"
57 #include "llvm/IR/Intrinsics.h"
58 #include "llvm/IR/LLVMContext.h"
59 #include "llvm/IR/Module.h"
60 #include "llvm/PassManager.h"
61 #include "llvm/Support/Dwarf.h"
62 #include "llvm/Support/TargetSelect.h"
63 #include "llvm/Target/TargetOptions.h"
64 #include "llvm/Transforms/Scalar.h"
69 // issue for them. Given that LLVM's best practices include the goal
73 // which LLVM header file, if any, would include these symbols.
172 static std::map<std::string, llvm::Value*> namedValues;
185 static llvm::StructType *ourTypeInfoType;
186 static llvm::StructType *ourCaughtResultType;
187 static llvm::StructType *ourExceptionType;
188 static llvm::StructType *ourUnwindExceptionType;
190 static llvm::ConstantInt *ourExceptionNotThrownState;
191 static llvm::ConstantInt *ourExceptionThrownState;
192 static llvm::ConstantInt *ourExceptionCaughtState;
195 typedef std::vector<llvm::Type*> ArgTypes;
213 llvm::Function *createFunction(llvm::Module &module,
214 llvm::Type *retType,
218 llvm::GlobalValue::LinkageTypes linkage,
221 llvm::FunctionType *functType =
222 llvm::FunctionType::get(retType, theArgTypes, isVarArg);
223 llvm::Function *ret =
224 llvm::Function::Create(functType, linkage, functName, &module);
230 for (llvm::Function::arg_iterator argIndex = ret->arg_begin();
249 static llvm::AllocaInst *createEntryBlockAlloca(llvm::Function &function,
251 llvm::Type *type,
252 llvm::Constant *initWith = 0) {
253 llvm::BasicBlock &block = function.getEntryBlock();
254 llvm::IRBuilder<> tmp(&block, block.begin());
255 llvm::AllocaInst *ret = tmp.CreateAlloca(type, 0, varName.c_str());
422 if (Encoding == llvm::dwarf::DW_EH_PE_omit)
426 case llvm::dwarf::DW_EH_PE_absptr:
428 case llvm::dwarf::DW_EH_PE_udata2:
430 case llvm::dwarf::DW_EH_PE_udata4:
432 case llvm::dwarf::DW_EH_PE_udata8:
434 case llvm::dwarf::DW_EH_PE_sdata2:
436 case llvm::dwarf::DW_EH_PE_sdata4:
438 case llvm::dwarf::DW_EH_PE_sdata8:
456 if (encoding == llvm::dwarf::DW_EH_PE_omit)
461 case llvm::dwarf::DW_EH_PE_absptr:
465 case llvm::dwarf::DW_EH_PE_uleb128:
469 case llvm::dwarf::DW_EH_PE_sleb128:
472 case llvm::dwarf::DW_EH_PE_udata2:
476 case llvm::dwarf::DW_EH_PE_udata4:
480 case llvm::dwarf::DW_EH_PE_udata8:
484 case llvm::dwarf::DW_EH_PE_sdata2:
488 case llvm::dwarf::DW_EH_PE_sdata4:
492 case llvm::dwarf::DW_EH_PE_sdata8:
504 case llvm::dwarf::DW_EH_PE_absptr:
507 case llvm::dwarf::DW_EH_PE_pcrel:
510 case llvm::dwarf::DW_EH_PE_textrel:
511 case llvm::dwarf::DW_EH_PE_datarel:
512 case llvm::dwarf::DW_EH_PE_funcrel:
513 case llvm::dwarf::DW_EH_PE_aligned:
521 if (encoding & llvm::dwarf::DW_EH_PE_indirect) {
535 /// corresponding llvm.eh.selector type info arguments, cleanup arguments
598 // Note: A typeOffset == 0 implies that a cleanup llvm.eh.selector
675 if (lpStartEncoding != llvm::dwarf::DW_EH_PE_omit) {
682 if (ttypeEncoding != llvm::dwarf::DW_EH_PE_omit) {
684 // were flagged by type info arguments to llvm.eh.selector
771 // to the return of the llvm.eh.selector intrinsic
779 // Matched type info index of llvm.eh.selector intrinsic
893 /// @param context llvm context
901 void generateStringPrint(llvm::LLVMContext &context,
902 llvm::Module &module,
903 llvm::IRBuilder<> &builder,
906 llvm::Function *printFunct = module.getFunction("printStr");
908 llvm::Value *stringVar;
909 llvm::Constant *stringConstant =
910 llvm::ConstantDataArray::getString(context, toPrint);
915 new llvm::GlobalVariable(module,
918 llvm::GlobalValue::PrivateLinkage,
927 llvm::Value *cast = builder.CreatePointerCast(stringVar,
935 /// @param context llvm context
945 void generateIntegerPrint(llvm::LLVMContext &context,
946 llvm::Module &module,
947 llvm::IRBuilder<> &builder,
948 llvm::Function &printFunct,
949 llvm::Value &toPrint,
952 llvm::Constant *stringConstant =
953 llvm::ConstantDataArray::getString(context, format);
954 llvm::Value *stringVar;
959 new llvm::GlobalVariable(module,
962 llvm::GlobalValue::PrivateLinkage,
971 llvm::Value *cast = builder.CreateBitCast(stringVar,
985 /// @param context llvm context
997 static llvm::BasicBlock *createFinallyBlock(llvm::LLVMContext &context,
998 llvm::Module &module,
999 llvm::IRBuilder<> &builder,
1000 llvm::Function &toAddTo,
1003 llvm::BasicBlock &terminatorBlock,
1004 llvm::BasicBlock &unwindResumeBlock,
1005 llvm::Value **exceptionCaughtFlag,
1006 llvm::Value **exceptionStorage,
1007 llvm::Value **caughtResultStorage) {
1023 llvm::PointerType *exceptionStorageType = builder.getInt8PtrTy();
1027 llvm::ConstantPointerNull::get(
1032 llvm::ConstantAggregateZero::get(
1035 llvm::BasicBlock *ret = llvm::BasicBlock::Create(context,
1050 llvm::SwitchInst *theSwitch = builder.CreateSwitch(builder.CreateLoad(
1064 /// @param context llvm context
1073 static llvm::BasicBlock *createCatchBlock(llvm::LLVMContext &context,
1074 llvm::Module &module,
1075 llvm::IRBuilder<> &builder,
1076 llvm::Function &toAddTo,
1079 llvm::BasicBlock &terminatorBlock,
1080 llvm::Value &exceptionCaughtFlag) {
1082 llvm::BasicBlock *ret = llvm::BasicBlock::Create(context,
1126 llvm::Function *createCatchWrappedInvokeFunction(llvm::Module &module,
1127 llvm::IRBuilder<> &builder,
1128 llvm::FunctionPassManager &fpm,
1129 llvm::Function &toInvoke,
1134 llvm::LLVMContext &context = module.getContext();
1135 llvm::Function *toPrint32Int = module.getFunction("print32Int");
1143 llvm::Function *ret = createFunction(module,
1148 llvm::Function::ExternalLinkage,
1153 llvm::BasicBlock *entryBlock = llvm::BasicBlock::Create(context,
1157 llvm::BasicBlock *normalBlock = llvm::BasicBlock::Create(context,
1161 llvm::BasicBlock *exceptionBlock = llvm::BasicBlock::Create(context,
1166 llvm::BasicBlock *exceptionRouteBlock = llvm::BasicBlock::Create(context,
1171 llvm::BasicBlock *externalExceptionBlock = llvm::BasicBlock::Create(context,
1176 llvm::BasicBlock *unwindResumeBlock = llvm::BasicBlock::Create(context,
1181 llvm::BasicBlock *endBlock = llvm::BasicBlock::Create(context, "end", ret);
1184 std::vector<llvm::BasicBlock*> catchBlocks(numExceptionsToCatch);
1185 llvm::Value *exceptionCaughtFlag = NULL;
1186 llvm::Value *exceptionStorage = NULL;
1187 llvm::Value *caughtResultStorage = NULL;
1191 llvm::BasicBlock *finallyBlock = createFinallyBlock(context,
1222 std::vector<llvm::Value*> args;
1238 llvm::Function *deleteOurException = module.getFunction("deleteOurException");
1268 llvm::Function *personality = module.getFunction("ourPersonality");
1270 llvm::LandingPadInst *caughtResult =
1284 llvm::Value *unwindException = builder.CreateExtractValue(caughtResult, 0);
1285 llvm::Value *retTypeInfoIndex = builder.CreateExtractValue(caughtResult, 1);
1297 llvm::Value *unwindExceptionClass =
1306 llvm::ConstantInt::get(builder.getInt64Ty(),
1332 llvm::Value *typeInfoThrown = builder.CreatePointerCast(
1343 llvm::Value *typeInfoThrownType =
1358 llvm::SwitchInst *switchToCatchBlock = builder.CreateSwitch(retTypeInfoIndex,
1366 switchToCatchBlock->addCase(llvm::ConstantInt::get(
1367 llvm::Type::getInt32Ty(context), i),
1371 llvm
1393 llvm::Function *createThrowExceptionFunction(llvm::Module &module,
1394 llvm::IRBuilder<> &builder,
1395 llvm::FunctionPassManager &fpm,
1398 llvm::Function &nativeThrowFunct) {
1399 llvm::LLVMContext &context = module.getContext();
1406 llvm::Function *ret = createFunction(module,
1411 llvm::Function::ExternalLinkage,
1417 llvm::BasicBlock *entryBlock = llvm::BasicBlock::Create(context,
1421 llvm::BasicBlock *nativeThrowBlock = llvm::BasicBlock::Create(context,
1425 llvm::BasicBlock *generatedThrowBlock = llvm::BasicBlock::Create(context,
1429 llvm::Value *exceptionType = namedValues["exceptTypeToThrow"];
1443 llvm::Function *toPrint32Int = module.getFunction("print32Int");
1457 llvm::SwitchInst *theSwitch = builder.CreateSwitch(exceptionType,
1461 theSwitch->addCase(llvm::ConstantInt::get(llvm::Type::getInt32Ty(context),
1469 llvm::Function *createOurException = module.getFunction("createOurException");
1470 llvm::Function *raiseOurException = module.getFunction(
1474 llvm::Value *exception = builder.CreateCall(createOurException,
1481 llvm::verifyFunction(*ret);
1488 llvm::Module &module,
1489 llvm::IRBuilder<> &builder);
1511 llvm::Function *createUnwindExceptionTest(llvm::Module &module,
1512 llvm::IRBuilder<> &builder,
1513 llvm::FunctionPassManager &fpm,
1523 llvm::Function *nativeThrowFunct = module.getFunction(nativeThrowFunctName);
1527 llvm::Function *throwFunct = createThrowExceptionFunction(module,
1539 llvm::Function *innerCatchFunct = createCatchWrappedInvokeFunction(module,
1553 llvm::Function *outerCatchFunct = createCatchWrappedInvokeFunction(module,
1604 void runExceptionThrow(llvm::ExecutionEngine *engine,
1605 llvm::Function *function,
1640 typedef llvm::ArrayRef<llvm::Type*> TypeArray;
1649 llvm::Module &module,
1650 llvm::IRBuilder<> &builder) {
1652 llvm::LLVMContext &context = module.getContext();
1658 llvm::ConstantInt::get(llvm::Type::getInt8Ty(context), 0),
1660 llvm::ConstantInt::get(llvm::Type::getInt8Ty(context), 1),
1662 llvm::ConstantInt::get(llvm::Type::getInt8Ty(context), 2),
1667 ourTypeInfoType = llvm::StructType::get(context,
1670 llvm::Type *caughtResultFieldTypes[] = {
1676 ourCaughtResultType = llvm::StructType::get(context,
1680 ourExceptionType = llvm::StructType::get(context,
1688 llvm::StructType::get(context,
1716 std::vector<llvm::Constant*> structVals;
1718 llvm::Constant *nextStruct;
1725 structVals.push_back(llvm::ConstantInt::get(builder.getInt32Ty(), i));
1726 nextStruct = llvm::ConstantStruct::get(ourTypeInfoType, structVals);
1733 new llvm::GlobalVariable(module,
1736 llvm::GlobalValue::ExternalLinkage,
1746 llvm::Function *funct = NULL;
1750 llvm::Type *retType = builder.getVoidTy();
1763 llvm::Function::ExternalLinkage,
1782 llvm::Function::ExternalLinkage,
1800 llvm::Function::ExternalLinkage,
1818 llvm::Function::ExternalLinkage,
1836 llvm::Function::ExternalLinkage,
1854 llvm::Function::ExternalLinkage,
1872 llvm::Function::ExternalLinkage,
1892 llvm::Function::ExternalLinkage,
1916 llvm::Function::ExternalLinkage,
1920 // llvm.eh.typeid.for intrinsic
1922 getDeclaration(&module, llvm::Intrinsic::eh_typeid_for);
1952 llvm::TargetOptions Opts;
1954 llvm::InitializeNativeTarget();
1955 llvm::InitializeNativeTargetAsmPrinter();
1956 llvm::LLVMContext &context = llvm::getGlobalContext();
1957 llvm::IRBuilder<> theBuilder(context);
1960 llvm::Module *module = new llvm::Module("my cool jit", context);
1962 llvm::RTDyldMemoryManager *MemMgr = new llvm::SectionMemoryManager();
1965 llvm::EngineBuilder factory(module);
1966 factory.setEngineKind(llvm::EngineKind::JIT);
1971 llvm::ExecutionEngine *executionEngine = factory.create();
1974 llvm::FunctionPassManager fpm(module);
1980 fpm.add(new llvm::DataLayoutPass(module));
1986 fpm.add(llvm::createBasicAliasAnalysisPass());
1989 fpm.add(llvm::createPromoteMemoryToRegisterPass());
1992 fpm.add(llvm::createInstructionCombiningPass());
1995 fpm.add(llvm::createReassociatePass());
1998 fpm.add(llvm::createGVNPass());
2002 fpm.add(llvm::createCFGSimplificationPass());
2009 llvm::Function *toRun =