Mercurial > projects > ldc
comparison gen/runtime.cpp @ 240:0db62b770a49 trunk
[svn r257] Fixed: array .sort and .reverse runtime code was incorrect.
Fixed: most runtime calls did not get correct param attrs.
author | lindquist |
---|---|
date | Mon, 09 Jun 2008 00:01:10 +0200 |
parents | 7816aafeea3c |
children | a95056b3c996 |
comparison
equal
deleted
inserted
replaced
239:fa691b1c0498 | 240:0db62b770a49 |
---|---|
95 assert(0); | 95 assert(0); |
96 //return NULL; | 96 //return NULL; |
97 } | 97 } |
98 | 98 |
99 const llvm::FunctionType* fnty = fn->getFunctionType(); | 99 const llvm::FunctionType* fnty = fn->getFunctionType(); |
100 return llvm::cast<llvm::Function>(target->getOrInsertFunction(name, fnty)); | 100 llvm::Function* resfn = llvm::cast<llvm::Function>(target->getOrInsertFunction(name, fnty)); |
101 resfn->setParamAttrs(fn->getParamAttrs()); | |
102 return resfn; | |
101 } | 103 } |
102 | 104 |
103 ////////////////////////////////////////////////////////////////////////////////////////////////// | 105 ////////////////////////////////////////////////////////////////////////////////////////////////// |
104 | 106 |
105 llvm::GlobalVariable* LLVM_D_GetRuntimeGlobal(llvm::Module* target, const char* name) | 107 llvm::GlobalVariable* LLVM_D_GetRuntimeGlobal(llvm::Module* target, const char* name) |
215 std::string fname3("_d_switch_error"); | 217 std::string fname3("_d_switch_error"); |
216 std::vector<const LLType*> types; | 218 std::vector<const LLType*> types; |
217 types.push_back(stringTy); | 219 types.push_back(stringTy); |
218 types.push_back(intTy); | 220 types.push_back(intTy); |
219 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); | 221 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); |
220 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 222 llvm::PAListPtr palist; |
221 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); | 223 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); |
222 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname3, M); | 224 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); |
225 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)->setParamAttrs(palist); | |
226 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname3, M)->setParamAttrs(palist); | |
223 } | 227 } |
224 | 228 |
225 // void _d_assert_msg( char[] msg, char[] file, uint line ) | 229 // void _d_assert_msg( char[] msg, char[] file, uint line ) |
226 { | 230 { |
227 std::string fname("_d_assert_msg"); | 231 std::string fname("_d_assert_msg"); |
228 std::vector<const LLType*> types; | 232 std::vector<const LLType*> types; |
229 types.push_back(stringTy); | 233 types.push_back(stringTy); |
230 types.push_back(stringTy); | 234 types.push_back(stringTy); |
231 types.push_back(intTy); | 235 types.push_back(intTy); |
232 const llvm::FunctionType* fty = llvm::FunctionType::get(voidPtrTy, types, false); | 236 const llvm::FunctionType* fty = llvm::FunctionType::get(voidPtrTy, types, false); |
233 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 237 llvm::PAListPtr palist; |
238 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); | |
239 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); | |
240 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
234 } | 241 } |
235 | 242 |
236 ///////////////////////////////////////////////////////////////////////////////////// | 243 ///////////////////////////////////////////////////////////////////////////////////// |
237 ///////////////////////////////////////////////////////////////////////////////////// | 244 ///////////////////////////////////////////////////////////////////////////////////// |
238 ///////////////////////////////////////////////////////////////////////////////////// | 245 ///////////////////////////////////////////////////////////////////////////////////// |
359 | 366 |
360 ///////////////////////////////////////////////////////////////////////////////////// | 367 ///////////////////////////////////////////////////////////////////////////////////// |
361 ///////////////////////////////////////////////////////////////////////////////////// | 368 ///////////////////////////////////////////////////////////////////////////////////// |
362 ///////////////////////////////////////////////////////////////////////////////////// | 369 ///////////////////////////////////////////////////////////////////////////////////// |
363 | 370 |
371 // int _aApplycd1(char[] aa, dg_t dg) | |
364 #define STR_APPLY1(TY,a,b) \ | 372 #define STR_APPLY1(TY,a,b) \ |
365 { \ | 373 { \ |
366 std::string fname(a); \ | 374 std::string fname(a); \ |
367 std::string fname2(b); \ | 375 std::string fname2(b); \ |
368 std::vector<const LLType*> types; \ | 376 std::vector<const LLType*> types; \ |
369 types.push_back(TY); \ | 377 types.push_back(TY); \ |
370 types.push_back(rt_dg1()); \ | 378 types.push_back(rt_dg1()); \ |
371 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ | 379 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ |
372 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); \ | 380 llvm::PAListPtr palist; \ |
373 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); \ | 381 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); \ |
382 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); \ | |
383 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); \ | |
384 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)->setParamAttrs(palist); \ | |
374 } | 385 } |
375 STR_APPLY1(stringTy, "_aApplycw1", "_aApplycd1") | 386 STR_APPLY1(stringTy, "_aApplycw1", "_aApplycd1") |
376 STR_APPLY1(wstringTy, "_aApplywc1", "_aApplywd1") | 387 STR_APPLY1(wstringTy, "_aApplywc1", "_aApplywd1") |
377 STR_APPLY1(dstringTy, "_aApplydc1", "_aApplydw1") | 388 STR_APPLY1(dstringTy, "_aApplydc1", "_aApplydw1") |
378 #undef STR_APPLY | 389 #undef STR_APPLY |
379 | 390 |
391 // int _aApplycd2(char[] aa, dg2_t dg) | |
380 #define STR_APPLY2(TY,a,b) \ | 392 #define STR_APPLY2(TY,a,b) \ |
381 { \ | 393 { \ |
382 std::string fname(a); \ | 394 std::string fname(a); \ |
383 std::string fname2(b); \ | 395 std::string fname2(b); \ |
384 std::vector<const LLType*> types; \ | 396 std::vector<const LLType*> types; \ |
385 types.push_back(TY); \ | 397 types.push_back(TY); \ |
386 types.push_back(rt_dg2()); \ | 398 types.push_back(rt_dg2()); \ |
387 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ | 399 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ |
388 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); \ | 400 llvm::PAListPtr palist; \ |
389 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); \ | 401 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); \ |
402 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); \ | |
403 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); \ | |
404 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)->setParamAttrs(palist); \ | |
390 } | 405 } |
391 STR_APPLY2(stringTy, "_aApplycw2", "_aApplycd2") | 406 STR_APPLY2(stringTy, "_aApplycw2", "_aApplycd2") |
392 STR_APPLY2(wstringTy, "_aApplywc2", "_aApplywd2") | 407 STR_APPLY2(wstringTy, "_aApplywc2", "_aApplywd2") |
393 STR_APPLY2(dstringTy, "_aApplydc2", "_aApplydw2") | 408 STR_APPLY2(dstringTy, "_aApplydc2", "_aApplydw2") |
394 #undef STR_APPLY2 | 409 #undef STR_APPLY2 |
399 std::string fname2(b); \ | 414 std::string fname2(b); \ |
400 std::vector<const LLType*> types; \ | 415 std::vector<const LLType*> types; \ |
401 types.push_back(TY); \ | 416 types.push_back(TY); \ |
402 types.push_back(rt_dg1()); \ | 417 types.push_back(rt_dg1()); \ |
403 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ | 418 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ |
404 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); \ | 419 llvm::PAListPtr palist; \ |
405 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); \ | 420 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); \ |
421 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); \ | |
422 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); \ | |
423 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)->setParamAttrs(palist); \ | |
406 } | 424 } |
407 STR_APPLY_R1(stringTy, "_aApplyRcw1", "_aApplyRcd1") | 425 STR_APPLY_R1(stringTy, "_aApplyRcw1", "_aApplyRcd1") |
408 STR_APPLY_R1(wstringTy, "_aApplyRwc1", "_aApplyRwd1") | 426 STR_APPLY_R1(wstringTy, "_aApplyRwc1", "_aApplyRwd1") |
409 STR_APPLY_R1(dstringTy, "_aApplyRdc1", "_aApplyRdw1") | 427 STR_APPLY_R1(dstringTy, "_aApplyRdc1", "_aApplyRdw1") |
410 #undef STR_APPLY | 428 #undef STR_APPLY |
415 std::string fname2(b); \ | 433 std::string fname2(b); \ |
416 std::vector<const LLType*> types; \ | 434 std::vector<const LLType*> types; \ |
417 types.push_back(TY); \ | 435 types.push_back(TY); \ |
418 types.push_back(rt_dg2()); \ | 436 types.push_back(rt_dg2()); \ |
419 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ | 437 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ |
420 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); \ | 438 llvm::PAListPtr palist; \ |
421 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); \ | 439 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); \ |
440 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); \ | |
441 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); \ | |
442 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)->setParamAttrs(palist); \ | |
422 } | 443 } |
423 STR_APPLY_R2(stringTy, "_aApplyRcw2", "_aApplyRcd2") | 444 STR_APPLY_R2(stringTy, "_aApplyRcw2", "_aApplyRcd2") |
424 STR_APPLY_R2(wstringTy, "_aApplyRwc2", "_aApplyRwd2") | 445 STR_APPLY_R2(wstringTy, "_aApplyRwc2", "_aApplyRwd2") |
425 STR_APPLY_R2(dstringTy, "_aApplyRdc2", "_aApplyRdw2") | 446 STR_APPLY_R2(dstringTy, "_aApplyRdc2", "_aApplyRdw2") |
426 #undef STR_APPLY2 | 447 #undef STR_APPLY2 |
504 std::string fname2("_adSortChar"); | 525 std::string fname2("_adSortChar"); |
505 std::vector<const LLType*> types; | 526 std::vector<const LLType*> types; |
506 types.push_back(stringTy); | 527 types.push_back(stringTy); |
507 types.push_back(stringTy); | 528 types.push_back(stringTy); |
508 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); | 529 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); |
509 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 530 llvm::PAListPtr palist; |
510 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); | 531 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); |
532 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
533 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)->setParamAttrs(palist); | |
511 } | 534 } |
512 | 535 |
513 // wchar[] _adReverseWchar(wchar[] a) | 536 // wchar[] _adReverseWchar(wchar[] a) |
514 // wchar[] _adSortWchar(wchar[] a) | 537 // wchar[] _adSortWchar(wchar[] a) |
515 { | 538 { |
517 std::string fname2("_adSortWchar"); | 540 std::string fname2("_adSortWchar"); |
518 std::vector<const LLType*> types; | 541 std::vector<const LLType*> types; |
519 types.push_back(wstringTy); | 542 types.push_back(wstringTy); |
520 types.push_back(wstringTy); | 543 types.push_back(wstringTy); |
521 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); | 544 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); |
522 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 545 llvm::PAListPtr palist; |
523 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); | 546 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); |
547 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
548 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)->setParamAttrs(palist); | |
524 } | 549 } |
525 | 550 |
526 // Array _adReverse(Array a, size_t szelem) | 551 // Array _adReverse(Array a, size_t szelem) |
527 { | 552 { |
528 std::string fname("_adReverse"); | 553 std::string fname("_adReverse"); |
529 std::vector<const LLType*> types; | 554 std::vector<const LLType*> types; |
530 types.push_back(rt_array(byteTy)); | 555 types.push_back(rt_array(byteTy)); |
531 types.push_back(rt_array(byteTy)); | 556 types.push_back(rt_array(byteTy)); |
532 types.push_back(sizeTy); | 557 types.push_back(sizeTy); |
533 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); | 558 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); |
534 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 559 llvm::PAListPtr palist; |
560 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); | |
561 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
535 } | 562 } |
536 | 563 |
537 // Array _adDupT(TypeInfo ti, Array a) | 564 // Array _adDupT(TypeInfo ti, Array a) |
538 { | 565 { |
539 std::string fname("_adDupT"); | 566 std::string fname("_adDupT"); |
540 std::vector<const LLType*> types; | 567 std::vector<const LLType*> types; |
541 types.push_back(rt_array(byteTy)); | 568 types.push_back(rt_array(byteTy)); |
542 types.push_back(typeInfoTy); | 569 types.push_back(typeInfoTy); |
543 types.push_back(rt_array(byteTy)); | 570 types.push_back(rt_array(byteTy)); |
544 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); | 571 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); |
545 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 572 llvm::PAListPtr palist; |
573 palist = palist.addAttr(3, llvm::ParamAttr::ByVal); | |
574 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
546 } | 575 } |
547 | 576 |
548 // int _adEq(Array a1, Array a2, TypeInfo ti) | 577 // int _adEq(Array a1, Array a2, TypeInfo ti) |
549 // int _adCmp(Array a1, Array a2, TypeInfo ti) | 578 // int _adCmp(Array a1, Array a2, TypeInfo ti) |
550 { | 579 { |
553 std::vector<const LLType*> types; | 582 std::vector<const LLType*> types; |
554 types.push_back(rt_array(byteTy)); | 583 types.push_back(rt_array(byteTy)); |
555 types.push_back(rt_array(byteTy)); | 584 types.push_back(rt_array(byteTy)); |
556 types.push_back(typeInfoTy); | 585 types.push_back(typeInfoTy); |
557 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); | 586 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); |
558 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 587 llvm::PAListPtr palist; |
559 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); | 588 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); |
589 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); | |
590 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
591 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)->setParamAttrs(palist); | |
560 } | 592 } |
561 | 593 |
562 // int _adCmpChar(Array a1, Array a2) | 594 // int _adCmpChar(Array a1, Array a2) |
563 { | 595 { |
564 std::string fname("_adCmpChar"); | 596 std::string fname("_adCmpChar"); |
565 std::vector<const LLType*> types; | 597 std::vector<const LLType*> types; |
566 types.push_back(rt_array(byteTy)); | 598 types.push_back(rt_array(byteTy)); |
567 types.push_back(rt_array(byteTy)); | 599 types.push_back(rt_array(byteTy)); |
568 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); | 600 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); |
569 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 601 llvm::PAListPtr palist; |
602 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); | |
603 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); | |
604 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
570 } | 605 } |
571 | 606 |
572 // Array _adSort(Array a, TypeInfo ti) | 607 // Array _adSort(Array a, TypeInfo ti) |
573 { | 608 { |
574 std::string fname("_adSort"); | 609 std::string fname("_adSort"); |
575 std::vector<const LLType*> types; | 610 std::vector<const LLType*> types; |
576 types.push_back(rt_array(byteTy)); | 611 types.push_back(rt_array(byteTy)); |
577 types.push_back(rt_array(byteTy)); | 612 types.push_back(rt_array(byteTy)); |
578 types.push_back(typeInfoTy); | 613 types.push_back(typeInfoTy); |
579 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); | 614 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); |
580 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 615 llvm::PAListPtr palist; |
616 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); | |
617 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
581 } | 618 } |
582 | 619 |
583 ///////////////////////////////////////////////////////////////////////////////////// | 620 ///////////////////////////////////////////////////////////////////////////////////// |
584 ///////////////////////////////////////////////////////////////////////////////////// | 621 ///////////////////////////////////////////////////////////////////////////////////// |
585 ///////////////////////////////////////////////////////////////////////////////////// | 622 ///////////////////////////////////////////////////////////////////////////////////// |
678 std::vector<const LLType*> types; | 715 std::vector<const LLType*> types; |
679 types.push_back(aaTy); | 716 types.push_back(aaTy); |
680 types.push_back(sizeTy); | 717 types.push_back(sizeTy); |
681 types.push_back(rt_dg1()); | 718 types.push_back(rt_dg1()); |
682 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); | 719 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); |
683 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 720 llvm::PAListPtr palist; |
721 palist = palist.addAttr(3, llvm::ParamAttr::ByVal); | |
722 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
684 } | 723 } |
685 | 724 |
686 // int _aaApply2(AA aa, size_t keysize, dg2_t dg) | 725 // int _aaApply2(AA aa, size_t keysize, dg2_t dg) |
687 { | 726 { |
688 std::string fname("_aaApply2"); | 727 std::string fname("_aaApply2"); |
689 std::vector<const LLType*> types; | 728 std::vector<const LLType*> types; |
690 types.push_back(aaTy); | 729 types.push_back(aaTy); |
691 types.push_back(sizeTy); | 730 types.push_back(sizeTy); |
692 types.push_back(rt_dg1()); | 731 types.push_back(rt_dg1()); |
693 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); | 732 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); |
694 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 733 llvm::PAListPtr palist; |
734 palist = palist.addAttr(3, llvm::ParamAttr::ByVal); | |
735 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
695 } | 736 } |
696 | 737 |
697 ///////////////////////////////////////////////////////////////////////////////////// | 738 ///////////////////////////////////////////////////////////////////////////////////// |
698 ///////////////////////////////////////////////////////////////////////////////////// | 739 ///////////////////////////////////////////////////////////////////////////////////// |
699 ///////////////////////////////////////////////////////////////////////////////////// | 740 ///////////////////////////////////////////////////////////////////////////////////// |
764 std::string fname("_d_switch_string"); | 805 std::string fname("_d_switch_string"); |
765 std::vector<const LLType*> types; | 806 std::vector<const LLType*> types; |
766 types.push_back(rt_array(rt_array2(byteTy))); | 807 types.push_back(rt_array(rt_array2(byteTy))); |
767 types.push_back(stringTy); | 808 types.push_back(stringTy); |
768 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); | 809 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); |
769 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 810 llvm::PAListPtr palist; |
811 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); | |
812 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); | |
813 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
770 } | 814 } |
771 | 815 |
772 // int _d_switch_ustring(wchar[][] table, wchar[] ca) | 816 // int _d_switch_ustring(wchar[][] table, wchar[] ca) |
773 { | 817 { |
774 std::string fname("_d_switch_ustring"); | 818 std::string fname("_d_switch_ustring"); |
775 std::vector<const LLType*> types; | 819 std::vector<const LLType*> types; |
776 types.push_back(rt_array(rt_array2(shortTy))); | 820 types.push_back(rt_array(rt_array2(shortTy))); |
777 types.push_back(wstringTy); | 821 types.push_back(wstringTy); |
778 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); | 822 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); |
779 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 823 llvm::PAListPtr palist; |
824 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); | |
825 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); | |
826 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); | |
780 } | 827 } |
781 | 828 |
782 // int _d_switch_dstring(dchar[][] table, dchar[] ca) | 829 // int _d_switch_dstring(dchar[][] table, dchar[] ca) |
783 { | 830 { |
784 std::string fname("_d_switch_dstring"); | 831 std::string fname("_d_switch_dstring"); |
785 std::vector<const LLType*> types; | 832 std::vector<const LLType*> types; |
786 types.push_back(rt_array(rt_array2(intTy))); | 833 types.push_back(rt_array(rt_array2(intTy))); |
787 types.push_back(dstringTy); | 834 types.push_back(dstringTy); |
788 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); | 835 const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); |
789 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); | 836 llvm::PAListPtr palist; |
790 } | 837 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); |
791 } | 838 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); |
792 | 839 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)->setParamAttrs(palist); |
793 | 840 } |
794 | 841 } |
795 | 842 |
796 | 843 |
797 | 844 |
845 | |
846 | |
847 |