Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit c4c2318

Browse files
committed
CodeGen: ensure that libcalls are always AAPCS CC
The original commit was too aggressive about marking LibCalls as AAPCS. The libcalls contain libc/libm/libunwind calls which are not AAPCS, but C. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280833 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 4a83266 commit c4c2318

File tree

3 files changed

+171
-9
lines changed

3 files changed

+171
-9
lines changed

lib/CodeGen/TargetLoweringBase.cpp

Lines changed: 169 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -488,12 +488,174 @@ static void InitLibcallNames(const char **Names, const Triple &TT) {
488488
Names[RTLIB::DEOPTIMIZE] = "__llvm_deoptimize";
489489
}
490490

491-
/// InitLibcallCallingConvs - Set default libcall CallingConvs.
492-
///
493-
static void InitLibcallCallingConvs(CallingConv::ID *CCs) {
494-
for (int i = 0; i < RTLIB::UNKNOWN_LIBCALL; ++i) {
495-
CCs[i] = CallingConv::C;
496-
}
491+
/// Set default libcall CallingConvs.
492+
static void InitLibcallCallingConvs(CallingConv::ID *CCs, const Triple &T) {
493+
for (int LC = 0; LC < RTLIB::UNKNOWN_LIBCALL; ++LC)
494+
CCs[LC] = CallingConv::C;
495+
496+
// The builtins on ARM always use AAPCS, irrespective of wheter C is AAPCS or
497+
// AAPCS_VFP.
498+
if (T.getArch() == Triple::arm || T.getArch() == Triple::thumb)
499+
for (const auto LC : {
500+
RTLIB::SHL_I16,
501+
RTLIB::SHL_I32,
502+
RTLIB::SHL_I64,
503+
RTLIB::SHL_I128,
504+
RTLIB::SRL_I16,
505+
RTLIB::SRL_I32,
506+
RTLIB::SRL_I64,
507+
RTLIB::SRL_I128,
508+
RTLIB::SRA_I16,
509+
RTLIB::SRA_I32,
510+
RTLIB::SRA_I64,
511+
RTLIB::SRA_I128,
512+
RTLIB::MUL_I8,
513+
RTLIB::MUL_I16,
514+
RTLIB::MUL_I32,
515+
RTLIB::MUL_I64,
516+
RTLIB::MUL_I128,
517+
RTLIB::MULO_I32,
518+
RTLIB::MULO_I64,
519+
RTLIB::MULO_I128,
520+
RTLIB::SDIV_I8,
521+
RTLIB::SDIV_I16,
522+
RTLIB::SDIV_I32,
523+
RTLIB::SDIV_I64,
524+
RTLIB::SDIV_I128,
525+
RTLIB::UDIV_I8,
526+
RTLIB::UDIV_I16,
527+
RTLIB::UDIV_I32,
528+
RTLIB::UDIV_I64,
529+
RTLIB::UDIV_I128,
530+
RTLIB::SREM_I8,
531+
RTLIB::SREM_I16,
532+
RTLIB::SREM_I32,
533+
RTLIB::SREM_I64,
534+
RTLIB::SREM_I128,
535+
RTLIB::UREM_I8,
536+
RTLIB::UREM_I16,
537+
RTLIB::UREM_I32,
538+
RTLIB::UREM_I64,
539+
RTLIB::UREM_I128,
540+
RTLIB::SDIVREM_I8,
541+
RTLIB::SDIVREM_I16,
542+
RTLIB::SDIVREM_I32,
543+
RTLIB::SDIVREM_I64,
544+
RTLIB::SDIVREM_I128,
545+
RTLIB::UDIVREM_I8,
546+
RTLIB::UDIVREM_I16,
547+
RTLIB::UDIVREM_I32,
548+
RTLIB::UDIVREM_I64,
549+
RTLIB::UDIVREM_I128,
550+
RTLIB::NEG_I32,
551+
RTLIB::NEG_I64,
552+
RTLIB::ADD_F32,
553+
RTLIB::ADD_F64,
554+
RTLIB::ADD_F80,
555+
RTLIB::ADD_F128,
556+
RTLIB::SUB_F32,
557+
RTLIB::SUB_F64,
558+
RTLIB::SUB_F80,
559+
RTLIB::SUB_F128,
560+
RTLIB::MUL_F32,
561+
RTLIB::MUL_F64,
562+
RTLIB::MUL_F80,
563+
RTLIB::MUL_F128,
564+
RTLIB::DIV_F32,
565+
RTLIB::DIV_F64,
566+
RTLIB::DIV_F80,
567+
RTLIB::DIV_F128,
568+
RTLIB::POWI_F32,
569+
RTLIB::POWI_F64,
570+
RTLIB::POWI_F80,
571+
RTLIB::POWI_F128,
572+
RTLIB::FPEXT_F64_F128,
573+
RTLIB::FPEXT_F32_F128,
574+
RTLIB::FPEXT_F32_F64,
575+
RTLIB::FPEXT_F16_F32,
576+
RTLIB::FPROUND_F32_F16,
577+
RTLIB::FPROUND_F64_F16,
578+
RTLIB::FPROUND_F80_F16,
579+
RTLIB::FPROUND_F128_F16,
580+
RTLIB::FPROUND_F64_F32,
581+
RTLIB::FPROUND_F80_F32,
582+
RTLIB::FPROUND_F128_F32,
583+
RTLIB::FPROUND_F80_F64,
584+
RTLIB::FPROUND_F128_F64,
585+
RTLIB::FPTOSINT_F32_I32,
586+
RTLIB::FPTOSINT_F32_I64,
587+
RTLIB::FPTOSINT_F32_I128,
588+
RTLIB::FPTOSINT_F64_I32,
589+
RTLIB::FPTOSINT_F64_I64,
590+
RTLIB::FPTOSINT_F64_I128,
591+
RTLIB::FPTOSINT_F80_I32,
592+
RTLIB::FPTOSINT_F80_I64,
593+
RTLIB::FPTOSINT_F80_I128,
594+
RTLIB::FPTOSINT_F128_I32,
595+
RTLIB::FPTOSINT_F128_I64,
596+
RTLIB::FPTOSINT_F128_I128,
597+
RTLIB::FPTOUINT_F32_I32,
598+
RTLIB::FPTOUINT_F32_I64,
599+
RTLIB::FPTOUINT_F32_I128,
600+
RTLIB::FPTOUINT_F64_I32,
601+
RTLIB::FPTOUINT_F64_I64,
602+
RTLIB::FPTOUINT_F64_I128,
603+
RTLIB::FPTOUINT_F80_I32,
604+
RTLIB::FPTOUINT_F80_I64,
605+
RTLIB::FPTOUINT_F80_I128,
606+
RTLIB::FPTOUINT_F128_I32,
607+
RTLIB::FPTOUINT_F128_I64,
608+
RTLIB::FPTOUINT_F128_I128,
609+
RTLIB::SINTTOFP_I32_F32,
610+
RTLIB::SINTTOFP_I32_F64,
611+
RTLIB::SINTTOFP_I32_F80,
612+
RTLIB::SINTTOFP_I32_F128,
613+
RTLIB::SINTTOFP_I64_F32,
614+
RTLIB::SINTTOFP_I64_F64,
615+
RTLIB::SINTTOFP_I64_F80,
616+
RTLIB::SINTTOFP_I64_F128,
617+
RTLIB::SINTTOFP_I128_F32,
618+
RTLIB::SINTTOFP_I128_F64,
619+
RTLIB::SINTTOFP_I128_F80,
620+
RTLIB::SINTTOFP_I128_F128,
621+
RTLIB::UINTTOFP_I32_F32,
622+
RTLIB::UINTTOFP_I32_F64,
623+
RTLIB::UINTTOFP_I32_F80,
624+
RTLIB::UINTTOFP_I32_F128,
625+
RTLIB::UINTTOFP_I64_F32,
626+
RTLIB::UINTTOFP_I64_F64,
627+
RTLIB::UINTTOFP_I64_F80,
628+
RTLIB::UINTTOFP_I64_F128,
629+
RTLIB::UINTTOFP_I128_F32,
630+
RTLIB::UINTTOFP_I128_F64,
631+
RTLIB::UINTTOFP_I128_F80,
632+
RTLIB::UINTTOFP_I128_F128,
633+
RTLIB::OEQ_F32,
634+
RTLIB::OEQ_F64,
635+
RTLIB::OEQ_F128,
636+
RTLIB::UNE_F32,
637+
RTLIB::UNE_F64,
638+
RTLIB::UNE_F128,
639+
RTLIB::OGE_F32,
640+
RTLIB::OGE_F64,
641+
RTLIB::OGE_F128,
642+
RTLIB::OLT_F32,
643+
RTLIB::OLT_F64,
644+
RTLIB::OLT_F128,
645+
RTLIB::OLE_F32,
646+
RTLIB::OLE_F64,
647+
RTLIB::OLE_F128,
648+
RTLIB::OGT_F32,
649+
RTLIB::OGT_F64,
650+
RTLIB::OGT_F128,
651+
RTLIB::UO_F32,
652+
RTLIB::UO_F64,
653+
RTLIB::UO_F128,
654+
RTLIB::O_F32,
655+
RTLIB::O_F64,
656+
RTLIB::O_F128,
657+
})
658+
CCs[LC] = CallingConv::ARM_AAPCS;
497659
}
498660

499661
/// getFPEXT - Return the FPEXT_*_* value for the given types, or
@@ -835,7 +997,7 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm) : TM(tm) {
835997

836998
InitLibcallNames(LibcallRoutineNames, TM.getTargetTriple());
837999
InitCmpLibcallCCs(CmpLibcallCCs);
838-
InitLibcallCallingConvs(LibcallCallingConvs);
1000+
InitLibcallCallingConvs(LibcallCallingConvs, TM.getTargetTriple());
8391001
}
8401002

8411003
void TargetLoweringBase::initActions() {

test/CodeGen/Thumb2/float-intrinsics-double.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ declare double @llvm.powi.f64(double %Val, i32 %power)
1818
define double @powi_d(double %a, i32 %b) {
1919
; CHECK-LABEL: powi_d:
2020
; SOFT: {{(bl|b)}} __powidf2
21-
; HARD: b __powidf2
21+
; HARD: bl __powidf2
2222
%1 = call double @llvm.powi.f64(double %a, i32 %b)
2323
ret double %1
2424
}

test/CodeGen/Thumb2/float-intrinsics-float.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ declare float @llvm.powi.f32(float %Val, i32 %power)
1818
define float @powi_f(float %a, i32 %b) {
1919
; CHECK-LABEL: powi_f:
2020
; SOFT: bl __powisf2
21-
; HARD: b __powisf2
21+
; HARD: bl __powisf2
2222
%1 = call float @llvm.powi.f32(float %a, i32 %b)
2323
ret float %1
2424
}

0 commit comments

Comments
 (0)