comparison gen/toir.c @ 36:c0967c4b2a74 trunk

[svn r40] Cleaned up some of the array routines to use gep/load/store instead of memcpy/memset. Resizing arrays did not allocate enough memory for types bigger than 1 byte.
author lindquist
date Tue, 09 Oct 2007 07:51:13 +0200
parents 4648206ca213
children 77cdca8c210f
comparison
equal deleted inserted replaced
35:3cfcb944304e 36:c0967c4b2a74
2156 elem* HaltExp::toElem(IRState* p) 2156 elem* HaltExp::toElem(IRState* p)
2157 { 2157 {
2158 Logger::print("HaltExp::toElem: %s | %s\n", toChars(), type->toChars()); 2158 Logger::print("HaltExp::toElem: %s | %s\n", toChars(), type->toChars());
2159 LOG_SCOPE; 2159 LOG_SCOPE;
2160 2160
2161 std::vector<llvm::Value*> llargs; 2161 llvm::Value* loca = llvm::ConstantInt::get(llvm::Type::Int32Ty, loc.linnum, false);
2162 llargs.resize(3); 2162 LLVM_DtoAssert(llvm::ConstantInt::getFalse(), loca, NULL);
2163 llargs[0] = llvm::ConstantInt::get(llvm::Type::Int1Ty, 0, false); 2163
2164 llargs[1] = llvm::ConstantInt::get(llvm::Type::Int32Ty, loc.linnum, false);
2165 llargs[2] = llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty));
2166
2167 //Logger::cout() << *llargs[0] << '|' << *llargs[1] << '\n';
2168
2169 llvm::Function* fn = LLVM_D_GetRuntimeFunction(p->module, "_d_assert");
2170 assert(fn);
2171 llvm::CallInst* call = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", p->scopebb());
2172 call->setCallingConv(llvm::CallingConv::C);
2173
2174 //new llvm::UnreachableInst(p->scopebb()); 2164 //new llvm::UnreachableInst(p->scopebb());
2175
2176 return 0; 2165 return 0;
2177 } 2166 }
2178 2167
2179 ////////////////////////////////////////////////////////////////////////////////////////// 2168 //////////////////////////////////////////////////////////////////////////////////////////
2180 2169
2342 2331
2343 e->val = llvm::BinaryOperator::createSub(zero,val,"tmp",p->scopebb()); 2332 e->val = llvm::BinaryOperator::createSub(zero,val,"tmp",p->scopebb());
2344 e->type = elem::VAL; 2333 e->type = elem::VAL;
2345 2334
2346 return e; 2335 return e;
2336 }
2337
2338 //////////////////////////////////////////////////////////////////////////////////////////
2339
2340 elem* CatExp::toElem(IRState* p)
2341 {
2342 Logger::print("CatExp::toElem: %s | %s\n", toChars(), type->toChars());
2343 LOG_SCOPE;
2344
2345 assert(0 && "array concatenation is not yet implemented");
2346
2347 elem* lhs = e1->toElem(p);
2348 elem* rhs = e2->toElem(p);
2349
2350 // determine new size
2351
2352 delete lhs;
2353 delete rhs;
2354
2355 return 0;
2347 } 2356 }
2348 2357
2349 ////////////////////////////////////////////////////////////////////////////////////////// 2358 //////////////////////////////////////////////////////////////////////////////////////////
2350 2359
2351 #define STUB(x) elem *x::toElem(IRState * p) {error("Exp type "#x" not implemented: %s", toChars()); fatal(); return 0; } 2360 #define STUB(x) elem *x::toElem(IRState * p) {error("Exp type "#x" not implemented: %s", toChars()); fatal(); return 0; }
2372 //STUB(DivAssignExp); 2381 //STUB(DivAssignExp);
2373 //STUB(MulExp); 2382 //STUB(MulExp);
2374 //STUB(MulAssignExp); 2383 //STUB(MulAssignExp);
2375 //STUB(ModExp); 2384 //STUB(ModExp);
2376 //STUB(ModAssignExp); 2385 //STUB(ModAssignExp);
2377 STUB(CatExp); 2386 //STUB(CatExp);
2378 STUB(CatAssignExp); 2387 STUB(CatAssignExp);
2379 //STUB(AddExp); 2388 //STUB(AddExp);
2380 //STUB(AddAssignExp); 2389 //STUB(AddAssignExp);
2381 STUB(Expression); 2390 STUB(Expression);
2382 //STUB(MinExp); 2391 //STUB(MinExp);