Mercurial > projects > ldc
diff gen/toobj.cpp @ 121:9c79b61fb638 trunk
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
Unit tests are now implemented.
author | lindquist |
---|---|
date | Tue, 27 Nov 2007 03:09:36 +0100 |
parents | 56a21f3e5d3e |
children | c42d245468ea |
line wrap: on
line diff
--- a/gen/toobj.cpp Mon Nov 26 07:26:21 2007 +0100 +++ b/gen/toobj.cpp Tue Nov 27 03:09:36 2007 +0100 @@ -223,6 +223,39 @@ return fn; } +// build module unittest + +static llvm::Function* build_module_unittest() +{ + if (gIR->unitTests.empty()) + return NULL; + + size_t n = gIR->unitTests.size(); + if (n == 1) + return llvm::cast<llvm::Function>(gIR->unitTests[0]->llvmValue); + + std::string name("_D"); + name.append(gIR->dmodule->mangle()); + name.append("10__unittestZ"); + + std::vector<const llvm::Type*> argsTy; + const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false); + llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); + fn->setCallingConv(llvm::CallingConv::Fast); + + llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); + LLVMBuilder builder(bb); + + for (size_t i=0; i<n; i++) { + llvm::Function* f = llvm::cast<llvm::Function>(gIR->unitTests[i]->llvmValue); + llvm::CallInst* call = builder.CreateCall(f,""); + call->setCallingConv(llvm::CallingConv::Fast); + } + + builder.CreateRetVoid(); + return fn; +} + // Put out instance of ModuleInfo for this Module void Module::genmoduleinfo() @@ -296,7 +329,7 @@ c = DtoConstSlice(DtoConstSize_t(importInits.size()), c); } else - c = moduleinfo->llvmInitZ->getOperand(3); + c = moduleinfo->llvmConstInit->getOperand(3); initVec.push_back(c); // localClasses[] @@ -330,7 +363,7 @@ c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); } else - c = moduleinfo->llvmInitZ->getOperand(4); + c = moduleinfo->llvmConstInit->getOperand(4); initVec.push_back(c); // flags @@ -342,16 +375,17 @@ // ctor llvm::Function* fctor = build_module_ctor(); - c = fctor ? fctor : moduleinfo->llvmInitZ->getOperand(6); + c = fctor ? fctor : moduleinfo->llvmConstInit->getOperand(6); initVec.push_back(c); // dtor llvm::Function* fdtor = build_module_dtor(); - c = fdtor ? fdtor : moduleinfo->llvmInitZ->getOperand(7); + c = fdtor ? fdtor : moduleinfo->llvmConstInit->getOperand(7); initVec.push_back(c); // unitTest - c = moduleinfo->llvmInitZ->getOperand(8); + llvm::Function* unittest = build_module_unittest(); + c = unittest ? unittest : moduleinfo->llvmConstInit->getOperand(8); initVec.push_back(c); // create initializer