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