comparison gen/runtime.cpp @ 1328:c78fd2d30da1

Changed array slice copying to call a runtime function when assertions or array bound checks are enabled instead of just doing a memcpy. This makes sure an exception is thrown if the copy is invalid (ie. different lengths or overlap). Fixes ticket #283 . Rebuilding the runtime is necessary.
author Tomas Lindquist Olsen <tomas.l.olsen gmail com>
date Sun, 10 May 2009 02:23:05 +0200
parents 329e45865d84
children 551b01341728
comparison
equal deleted inserted replaced
1327:49fd0c8040e6 1328:c78fd2d30da1
400 400
401 #undef ARRAY_INIT 401 #undef ARRAY_INIT
402 402
403 // array init mem 403 // array init mem
404 // void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) 404 // void _d_array_init_mem(void* a, size_t na, void* v, size_t nv)
405 // +
406 // array slice copy when assertions are on!
407 // void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen)
405 { 408 {
406 std::string fname("_d_array_init_mem"); 409 std::string fname("_d_array_init_mem");
407 std::vector<const LLType*> types; 410 std::string fname2("_d_array_slice_copy");
408 types.push_back(voidPtrTy); 411 std::vector<const LLType*> types;
409 types.push_back(sizeTy); 412 types.push_back(voidPtrTy);
410 types.push_back(voidPtrTy); 413 types.push_back(sizeTy);
411 types.push_back(sizeTy); 414 types.push_back(voidPtrTy);
412 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); 415 types.push_back(sizeTy);
413 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) 416 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false);
417 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)
418 ->setAttributes(Attr_1_3_NoCapture);
419 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)
414 ->setAttributes(Attr_1_3_NoCapture); 420 ->setAttributes(Attr_1_3_NoCapture);
415 } 421 }
416 422
417 ///////////////////////////////////////////////////////////////////////////////////// 423 /////////////////////////////////////////////////////////////////////////////////////
418 ///////////////////////////////////////////////////////////////////////////////////// 424 /////////////////////////////////////////////////////////////////////////////////////