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