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) {
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,
@@ -485,14 +430,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
485430 setLibcallImpl (RTLIB::FREXP_PPCF128, RTLIB::Unsupported);
486431 }
487432
488- // Disable most libcalls on AMDGPU and NVPTX.
489- if (TT.isAMDGPU () || TT.isNVPTX ()) {
490- for (RTLIB::Libcall LC : RTLIB::libcalls ()) {
491- if (!isAtomicLibCall (LC))
492- setLibcallImpl (LC, RTLIB::Unsupported);
493- }
494- }
495-
496433 if (TT.isOSMSVCRT ()) {
497434 // MSVCRT doesn't have powi; fall back to pow
498435 setLibcallImpl (RTLIB::POWI_F32, RTLIB::Unsupported);
@@ -520,55 +457,14 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
520457 }
521458 }
522459
523- if (TT.isAArch64 ()) {
524- if (TT.isWindowsArm64EC ()) {
525- setWindowsArm64LibCallNameOverrides ();
526- setLibcallImpl (RTLIB::SC_MEMCPY, RTLIB::arm64ec___arm_sc_memcpy);
527- setLibcallImpl (RTLIB::SC_MEMMOVE, RTLIB::arm64ec___arm_sc_memmove);
528- setLibcallImpl (RTLIB::SC_MEMSET, RTLIB::arm64ec___arm_sc_memset);
529- } else {
530- setLibcallImpl (RTLIB::SC_MEMCPY, RTLIB::__arm_sc_memcpy);
531- setLibcallImpl (RTLIB::SC_MEMMOVE, RTLIB::__arm_sc_memmove);
532- setLibcallImpl (RTLIB::SC_MEMSET, RTLIB::__arm_sc_memset);
533- }
534-
535- setAArch64LibcallNames (*this , TT);
536- } else if (TT.isARM () || TT.isThumb ()) {
460+ if (TT.isARM () || TT.isThumb ())
537461 setARMLibcallNames (*this , TT, FloatABI, EABIVersion);
538- } else if (TT.getArch () == Triple::ArchType::avr) {
539- // Division rtlib functions (not supported), use divmod functions instead
540- setLibcallImpl (RTLIB::SDIV_I8, RTLIB::Unsupported);
541- setLibcallImpl (RTLIB::SDIV_I16, RTLIB::Unsupported);
542- setLibcallImpl (RTLIB::SDIV_I32, RTLIB::Unsupported);
543- setLibcallImpl (RTLIB::UDIV_I8, RTLIB::Unsupported);
544- setLibcallImpl (RTLIB::UDIV_I16, RTLIB::Unsupported);
545- setLibcallImpl (RTLIB::UDIV_I32, RTLIB::Unsupported);
546-
547- // Modulus rtlib functions (not supported), use divmod functions instead
548- setLibcallImpl (RTLIB::SREM_I8, RTLIB::Unsupported);
549- setLibcallImpl (RTLIB::SREM_I16, RTLIB::Unsupported);
550- setLibcallImpl (RTLIB::SREM_I32, RTLIB::Unsupported);
551- setLibcallImpl (RTLIB::UREM_I8, RTLIB::Unsupported);
552- setLibcallImpl (RTLIB::UREM_I16, RTLIB::Unsupported);
553- setLibcallImpl (RTLIB::UREM_I32, RTLIB::Unsupported);
554-
555- // Division and modulus rtlib functions
556- setLibcallImpl (RTLIB::SDIVREM_I8, RTLIB::__divmodqi4);
557- setLibcallImpl (RTLIB::SDIVREM_I16, RTLIB::__divmodhi4);
558- setLibcallImpl (RTLIB::SDIVREM_I32, RTLIB::__divmodsi4);
559- setLibcallImpl (RTLIB::UDIVREM_I8, RTLIB::__udivmodqi4);
560- setLibcallImpl (RTLIB::UDIVREM_I16, RTLIB::__udivmodhi4);
561- setLibcallImpl (RTLIB::UDIVREM_I32, RTLIB::__udivmodsi4);
562-
462+ else if (TT.getArch () == Triple::ArchType::avr) {
563463 // Several of the runtime library functions use a special calling conv
564464 setLibcallCallingConv (RTLIB::SDIVREM_I8, CallingConv::AVR_BUILTIN);
565465 setLibcallCallingConv (RTLIB::SDIVREM_I16, CallingConv::AVR_BUILTIN);
566466 setLibcallCallingConv (RTLIB::UDIVREM_I8, CallingConv::AVR_BUILTIN);
567467 setLibcallCallingConv (RTLIB::UDIVREM_I16, CallingConv::AVR_BUILTIN);
568-
569- // Trigonometric rtlib functions
570- setLibcallImpl (RTLIB::SIN_F32, RTLIB::avr_sin);
571- setLibcallImpl (RTLIB::COS_F32, RTLIB::avr_cos);
572468 }
573469
574470 if (!TT.isWasm ()) {
@@ -582,11 +478,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
582478 }
583479
584480 setLibcallImpl (RTLIB::MULO_I128, RTLIB::Unsupported);
585- } else {
586- // Define the emscripten name for return address helper.
587- // TODO: when implementing other Wasm backends, make this generic or only do
588- // this on emscripten depending on what they end up doing.
589- setLibcallImpl (RTLIB::RETURN_ADDRESS, RTLIB::emscripten_return_address);
590481 }
591482
592483 if (TT.getArch () == Triple::ArchType::hexagon) {
@@ -633,10 +524,4 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
633524
634525 if (TT.getArch () == Triple::ArchType::msp430)
635526 setMSP430Libcalls (*this , TT);
636-
637- if (TT.isSystemZ () && TT.isOSzOS ())
638- setZOSLibCallNameOverrides ();
639-
640- if (TT.getArch () == Triple::ArchType::xcore)
641- setLibcallImpl (RTLIB::MEMCPY_ALIGN_4, RTLIB::__memcpy_4);
642527}
0 commit comments