1212using namespace llvm ;
1313using namespace RTLIB ;
1414
15- #define GET_INIT_RUNTIME_LIBCALL_UTILS
1615#define GET_INIT_RUNTIME_LIBCALL_NAMES
16+ #define GET_SET_TARGET_RUNTIME_LIBCALL_SETS
1717#include " llvm/IR/RuntimeLibcalls.inc"
18- #undef GET_INIT_RUNTIME_LIBCALL_UTILS
1918#undef GET_INIT_RUNTIME_LIBCALL_NAMES
19+ #undef GET_SET_TARGET_RUNTIME_LIBCALL_SETS
2020
2121static cl::opt<bool >
2222 HexagonEnableFastMathRuntimeCalls (" hexagon-fast-math" , cl::Hidden,
2323 cl::desc (" Enable Fast Math processing" ));
2424
25- static void setAArch64LibcallNames (RuntimeLibcallsInfo &Info,
26- const Triple &TT) {
27- #define LCALLNAMES (A, B, N ) \
28- Info.setLibcallImpl (A##N##_RELAX, B##N##_relax); \
29- Info.setLibcallImpl (A##N##_ACQ, B##N##_acq); \
30- Info.setLibcallImpl (A##N##_REL, B##N##_rel); \
31- Info.setLibcallImpl (A##N##_ACQ_REL, B##N##_acq_rel);
32- #define LCALLNAME4 (A, B ) \
33- LCALLNAMES (A, B, 1 ) \
34- LCALLNAMES (A, B, 2 ) LCALLNAMES (A, B, 4 ) LCALLNAMES (A, B, 8 )
35- #define LCALLNAME5 (A, B ) \
36- LCALLNAMES (A, B, 1 ) \
37- LCALLNAMES (A, B, 2 ) \
38- LCALLNAMES (A, B, 4 ) LCALLNAMES (A, B, 8 ) LCALLNAMES (A, B, 16 )
39-
40- if (TT.isWindowsArm64EC ()) {
41- LCALLNAME5 (RTLIB::OUTLINE_ATOMIC_CAS, RTLIB::arm64ec___aarch64_cas)
42- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_SWP, RTLIB::arm64ec___aarch64_swp)
43- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_LDADD, RTLIB::arm64ec___aarch64_ldadd)
44- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_LDSET, RTLIB::arm64ec___aarch64_ldset)
45- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_LDCLR, RTLIB::arm64ec___aarch64_ldclr)
46- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_LDEOR, RTLIB::arm64ec___aarch64_ldeor)
47- } else {
48- LCALLNAME5 (RTLIB::OUTLINE_ATOMIC_CAS, RTLIB::__aarch64_cas)
49- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_SWP, RTLIB::__aarch64_swp)
50- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_LDADD, RTLIB::__aarch64_ldadd)
51- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_LDSET, RTLIB::__aarch64_ldset)
52- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_LDCLR, RTLIB::__aarch64_ldclr)
53- LCALLNAME4 (RTLIB::OUTLINE_ATOMIC_LDEOR, RTLIB::__aarch64_ldeor)
54- }
55- #undef LCALLNAMES
56- #undef LCALLNAME4
57- #undef LCALLNAME5
58- }
59-
6025static void setARMLibcallNames (RuntimeLibcallsInfo &Info, const Triple &TT,
6126 FloatABI::ABIType FloatABIType,
6227 EABI EABIVersion) {
@@ -358,6 +323,8 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
358323 ExceptionHandling ExceptionModel,
359324 FloatABI::ABIType FloatABI,
360325 EABI EABIVersion, StringRef ABIName) {
326+ setTargetRuntimeLibcallSets (TT);
327+
361328 // Use the f128 variants of math functions on x86
362329 if (TT.isX86 () && TT.isGNUEnvironment ())
363330 setLongDoubleIsF128Libm (*this , /* FiniteOnlyFuncs=*/ true );
@@ -367,28 +334,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
367334 setLibcallImpl (RTLIB::UNWIND_RESUME, RTLIB::_Unwind_SjLj_Resume);
368335 }
369336
370- if (TT.isPPC ()) {
371- setPPCLibCallNameOverrides ();
372-
373- // TODO: Do the finite only functions exist?
374- setLongDoubleIsF128Libm (*this , /* FiniteOnlyFuncs=*/ false );
375-
376- // TODO: Tablegen predicate support
377- if (TT.isOSAIX ()) {
378- if (TT.isPPC64 ()) {
379- setLibcallImpl (RTLIB::MEMCPY, RTLIB::Unsupported);
380- setLibcallImpl (RTLIB::MEMMOVE, RTLIB::___memmove64);
381- setLibcallImpl (RTLIB::MEMSET, RTLIB::___memset64);
382- setLibcallImpl (RTLIB::BZERO, RTLIB::___bzero64);
383- } else {
384- setLibcallImpl (RTLIB::MEMCPY, RTLIB::Unsupported);
385- setLibcallImpl (RTLIB::MEMMOVE, RTLIB::___memmove);
386- setLibcallImpl (RTLIB::MEMSET, RTLIB::___memset);
387- setLibcallImpl (RTLIB::BZERO, RTLIB::___bzero);
388- }
389- }
390- }
391-
392337 // A few names are different on particular architectures or environments.
393338 if (TT.isOSDarwin ()) {
394339 // For f16/f32 conversions, Darwin uses the standard naming scheme,
@@ -401,8 +346,7 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
401346 if (TT.isX86 ()) {
402347 if (TT.isMacOSX () && !TT.isMacOSXVersionLT (10 , 6 ))
403348 setLibcallImpl (RTLIB::BZERO, RTLIB::__bzero);
404- } else if (TT.isAArch64 ())
405- setLibcallImpl (RTLIB::BZERO, RTLIB::bzero);
349+ }
406350
407351 if (darwinHasSinCosStret (TT)) {
408352 setLibcallImpl (RTLIB::SINCOS_STRET_F32, RTLIB::__sincosf_stret);
@@ -453,14 +397,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
453397 setLibcallImpl (RTLIB::FREXP_PPCF128, RTLIB::Unsupported);
454398 }
455399
456- // Disable most libcalls on AMDGPU and NVPTX.
457- if (TT.isAMDGPU () || TT.isNVPTX ()) {
458- for (RTLIB::Libcall LC : RTLIB::libcalls ()) {
459- if (!isAtomicLibCall (LC))
460- setLibcallImpl (LC, RTLIB::Unsupported);
461- }
462- }
463-
464400 if (TT.isOSMSVCRT ()) {
465401 // MSVCRT doesn't have powi; fall back to pow
466402 setLibcallImpl (RTLIB::POWI_F32, RTLIB::Unsupported);
@@ -488,55 +424,14 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
488424 }
489425 }
490426
491- if (TT.isAArch64 ()) {
492- if (TT.isWindowsArm64EC ()) {
493- setWindowsArm64LibCallNameOverrides ();
494- setLibcallImpl (RTLIB::SC_MEMCPY, RTLIB::arm64ec___arm_sc_memcpy);
495- setLibcallImpl (RTLIB::SC_MEMMOVE, RTLIB::arm64ec___arm_sc_memmove);
496- setLibcallImpl (RTLIB::SC_MEMSET, RTLIB::arm64ec___arm_sc_memset);
497- } else {
498- setLibcallImpl (RTLIB::SC_MEMCPY, RTLIB::__arm_sc_memcpy);
499- setLibcallImpl (RTLIB::SC_MEMMOVE, RTLIB::__arm_sc_memmove);
500- setLibcallImpl (RTLIB::SC_MEMSET, RTLIB::__arm_sc_memset);
501- }
502-
503- setAArch64LibcallNames (*this , TT);
504- } else if (TT.isARM () || TT.isThumb ()) {
427+ if (TT.isARM () || TT.isThumb ())
505428 setARMLibcallNames (*this , TT, FloatABI, EABIVersion);
506- } else if (TT.getArch () == Triple::ArchType::avr) {
507- // Division rtlib functions (not supported), use divmod functions instead
508- setLibcallImpl (RTLIB::SDIV_I8, RTLIB::Unsupported);
509- setLibcallImpl (RTLIB::SDIV_I16, RTLIB::Unsupported);
510- setLibcallImpl (RTLIB::SDIV_I32, RTLIB::Unsupported);
511- setLibcallImpl (RTLIB::UDIV_I8, RTLIB::Unsupported);
512- setLibcallImpl (RTLIB::UDIV_I16, RTLIB::Unsupported);
513- setLibcallImpl (RTLIB::UDIV_I32, RTLIB::Unsupported);
514-
515- // Modulus rtlib functions (not supported), use divmod functions instead
516- setLibcallImpl (RTLIB::SREM_I8, RTLIB::Unsupported);
517- setLibcallImpl (RTLIB::SREM_I16, RTLIB::Unsupported);
518- setLibcallImpl (RTLIB::SREM_I32, RTLIB::Unsupported);
519- setLibcallImpl (RTLIB::UREM_I8, RTLIB::Unsupported);
520- setLibcallImpl (RTLIB::UREM_I16, RTLIB::Unsupported);
521- setLibcallImpl (RTLIB::UREM_I32, RTLIB::Unsupported);
522-
523- // Division and modulus rtlib functions
524- setLibcallImpl (RTLIB::SDIVREM_I8, RTLIB::__divmodqi4);
525- setLibcallImpl (RTLIB::SDIVREM_I16, RTLIB::__divmodhi4);
526- setLibcallImpl (RTLIB::SDIVREM_I32, RTLIB::__divmodsi4);
527- setLibcallImpl (RTLIB::UDIVREM_I8, RTLIB::__udivmodqi4);
528- setLibcallImpl (RTLIB::UDIVREM_I16, RTLIB::__udivmodhi4);
529- setLibcallImpl (RTLIB::UDIVREM_I32, RTLIB::__udivmodsi4);
530-
429+ else if (TT.getArch () == Triple::ArchType::avr) {
531430 // Several of the runtime library functions use a special calling conv
532431 setLibcallCallingConv (RTLIB::SDIVREM_I8, CallingConv::AVR_BUILTIN);
533432 setLibcallCallingConv (RTLIB::SDIVREM_I16, CallingConv::AVR_BUILTIN);
534433 setLibcallCallingConv (RTLIB::UDIVREM_I8, CallingConv::AVR_BUILTIN);
535434 setLibcallCallingConv (RTLIB::UDIVREM_I16, CallingConv::AVR_BUILTIN);
536-
537- // Trigonometric rtlib functions
538- setLibcallImpl (RTLIB::SIN_F32, RTLIB::avr_sin);
539- setLibcallImpl (RTLIB::COS_F32, RTLIB::avr_cos);
540435 }
541436
542437 if (!TT.isWasm ()) {
@@ -550,11 +445,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
550445 }
551446
552447 setLibcallImpl (RTLIB::MULO_I128, RTLIB::Unsupported);
553- } else {
554- // Define the emscripten name for return address helper.
555- // TODO: when implementing other Wasm backends, make this generic or only do
556- // this on emscripten depending on what they end up doing.
557- setLibcallImpl (RTLIB::RETURN_ADDRESS, RTLIB::emscripten_return_address);
558448 }
559449
560450 if (TT.getArch () == Triple::ArchType::hexagon) {
@@ -601,17 +491,9 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
601491
602492 if (TT.getArch () == Triple::ArchType::msp430)
603493 setMSP430Libcalls (*this , TT);
604-
605- if (TT.isSystemZ () && TT.isOSzOS ())
606- setZOSLibCallNameOverrides ();
607-
608- if (TT.getArch () == Triple::ArchType::xcore)
609- setLibcallImpl (RTLIB::MEMCPY_ALIGN_4, RTLIB::__memcpy_4);
610494}
611495
612496bool RuntimeLibcallsInfo::darwinHasExp10 (const Triple &TT) {
613- assert (TT.isOSDarwin () && " should be called with darwin triple" );
614-
615497 switch (TT.getOS ()) {
616498 case Triple::MacOSX:
617499 return !TT.isMacOSXVersionLT (10 , 9 );
0 commit comments