comparison 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
comparison
equal deleted inserted replaced
120:5ce8ab11e75a 121:9c79b61fb638
221 221
222 builder.CreateRetVoid(); 222 builder.CreateRetVoid();
223 return fn; 223 return fn;
224 } 224 }
225 225
226 // build module unittest
227
228 static llvm::Function* build_module_unittest()
229 {
230 if (gIR->unitTests.empty())
231 return NULL;
232
233 size_t n = gIR->unitTests.size();
234 if (n == 1)
235 return llvm::cast<llvm::Function>(gIR->unitTests[0]->llvmValue);
236
237 std::string name("_D");
238 name.append(gIR->dmodule->mangle());
239 name.append("10__unittestZ");
240
241 std::vector<const llvm::Type*> argsTy;
242 const llvm::FunctionType* fnTy = llvm::FunctionType::get(llvm::Type::VoidTy,argsTy,false);
243 llvm::Function* fn = new llvm::Function(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module);
244 fn->setCallingConv(llvm::CallingConv::Fast);
245
246 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn);
247 LLVMBuilder builder(bb);
248
249 for (size_t i=0; i<n; i++) {
250 llvm::Function* f = llvm::cast<llvm::Function>(gIR->unitTests[i]->llvmValue);
251 llvm::CallInst* call = builder.CreateCall(f,"");
252 call->setCallingConv(llvm::CallingConv::Fast);
253 }
254
255 builder.CreateRetVoid();
256 return fn;
257 }
258
226 // Put out instance of ModuleInfo for this Module 259 // Put out instance of ModuleInfo for this Module
227 260
228 void Module::genmoduleinfo() 261 void Module::genmoduleinfo()
229 { 262 {
230 // The layout is: 263 // The layout is:
294 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); 327 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module);
295 c = llvm::ConstantExpr::getBitCast(m_gvar, llvm::PointerType::get(importArrTy->getElementType())); 328 c = llvm::ConstantExpr::getBitCast(m_gvar, llvm::PointerType::get(importArrTy->getElementType()));
296 c = DtoConstSlice(DtoConstSize_t(importInits.size()), c); 329 c = DtoConstSlice(DtoConstSize_t(importInits.size()), c);
297 } 330 }
298 else 331 else
299 c = moduleinfo->llvmInitZ->getOperand(3); 332 c = moduleinfo->llvmConstInit->getOperand(3);
300 initVec.push_back(c); 333 initVec.push_back(c);
301 334
302 // localClasses[] 335 // localClasses[]
303 ClassDeclarations aclasses; 336 ClassDeclarations aclasses;
304 //printf("members->dim = %d\n", members->dim); 337 //printf("members->dim = %d\n", members->dim);
328 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); 361 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module);
329 c = llvm::ConstantExpr::getBitCast(m_gvar, llvm::PointerType::get(classArrTy->getElementType())); 362 c = llvm::ConstantExpr::getBitCast(m_gvar, llvm::PointerType::get(classArrTy->getElementType()));
330 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); 363 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c);
331 } 364 }
332 else 365 else
333 c = moduleinfo->llvmInitZ->getOperand(4); 366 c = moduleinfo->llvmConstInit->getOperand(4);
334 initVec.push_back(c); 367 initVec.push_back(c);
335 368
336 // flags 369 // flags
337 if (needmoduleinfo) 370 if (needmoduleinfo)
338 c = DtoConstUint(0); // flags (4 means MIstandalone) 371 c = DtoConstUint(0); // flags (4 means MIstandalone)
340 c = DtoConstUint(4); // flags (4 means MIstandalone) 373 c = DtoConstUint(4); // flags (4 means MIstandalone)
341 initVec.push_back(c); 374 initVec.push_back(c);
342 375
343 // ctor 376 // ctor
344 llvm::Function* fctor = build_module_ctor(); 377 llvm::Function* fctor = build_module_ctor();
345 c = fctor ? fctor : moduleinfo->llvmInitZ->getOperand(6); 378 c = fctor ? fctor : moduleinfo->llvmConstInit->getOperand(6);
346 initVec.push_back(c); 379 initVec.push_back(c);
347 380
348 // dtor 381 // dtor
349 llvm::Function* fdtor = build_module_dtor(); 382 llvm::Function* fdtor = build_module_dtor();
350 c = fdtor ? fdtor : moduleinfo->llvmInitZ->getOperand(7); 383 c = fdtor ? fdtor : moduleinfo->llvmConstInit->getOperand(7);
351 initVec.push_back(c); 384 initVec.push_back(c);
352 385
353 // unitTest 386 // unitTest
354 c = moduleinfo->llvmInitZ->getOperand(8); 387 llvm::Function* unittest = build_module_unittest();
388 c = unittest ? unittest : moduleinfo->llvmConstInit->getOperand(8);
355 initVec.push_back(c); 389 initVec.push_back(c);
356 390
357 // create initializer 391 // create initializer
358 llvm::Constant* constMI = llvm::ConstantStruct::get(moduleinfoTy, initVec); 392 llvm::Constant* constMI = llvm::ConstantStruct::get(moduleinfoTy, initVec);
359 393