Mercurial > projects > ldc
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 |