12
12
using namespace llvm ;
13
13
using namespace RTLIB ;
14
14
15
- #define GET_INIT_RUNTIME_LIBCALL_UTILS
16
15
#define GET_INIT_RUNTIME_LIBCALL_NAMES
16
+ #define GET_SET_TARGET_RUNTIME_LIBCALL_SETS
17
17
#include " llvm/IR/RuntimeLibcalls.inc"
18
- #undef GET_INIT_RUNTIME_LIBCALL_UTILS
19
18
#undef GET_INIT_RUNTIME_LIBCALL_NAMES
19
+ #undef GET_SET_TARGET_RUNTIME_LIBCALL_SETS
20
20
21
21
static cl::opt<bool >
22
22
HexagonEnableFastMathRuntimeCalls (" hexagon-fast-math" , cl::Hidden,
23
23
cl::desc (" Enable Fast Math processing" ));
24
24
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
-
60
25
static void setARMLibcallNames (RuntimeLibcallsInfo &Info, const Triple &TT,
61
26
FloatABI::ABIType FloatABIType,
62
27
EABI EABIVersion) {
@@ -358,6 +323,8 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
358
323
ExceptionHandling ExceptionModel,
359
324
FloatABI::ABIType FloatABI,
360
325
EABI EABIVersion, StringRef ABIName) {
326
+ setTargetRuntimeLibcallSets (TT);
327
+
361
328
// Use the f128 variants of math functions on x86
362
329
if (TT.isX86 () && TT.isGNUEnvironment ())
363
330
setLongDoubleIsF128Libm (*this , /* FiniteOnlyFuncs=*/ true );
@@ -367,28 +334,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
367
334
setLibcallImpl (RTLIB::UNWIND_RESUME, RTLIB::_Unwind_SjLj_Resume);
368
335
}
369
336
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
-
392
337
// A few names are different on particular architectures or environments.
393
338
if (TT.isOSDarwin ()) {
394
339
// For f16/f32 conversions, Darwin uses the standard naming scheme,
@@ -485,14 +430,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
485
430
setLibcallImpl (RTLIB::FREXP_PPCF128, RTLIB::Unsupported);
486
431
}
487
432
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
-
496
433
if (TT.isOSMSVCRT ()) {
497
434
// MSVCRT doesn't have powi; fall back to pow
498
435
setLibcallImpl (RTLIB::POWI_F32, RTLIB::Unsupported);
@@ -520,55 +457,14 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
520
457
}
521
458
}
522
459
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 ())
537
461
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) {
563
463
// Several of the runtime library functions use a special calling conv
564
464
setLibcallCallingConv (RTLIB::SDIVREM_I8, CallingConv::AVR_BUILTIN);
565
465
setLibcallCallingConv (RTLIB::SDIVREM_I16, CallingConv::AVR_BUILTIN);
566
466
setLibcallCallingConv (RTLIB::UDIVREM_I8, CallingConv::AVR_BUILTIN);
567
467
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);
572
468
}
573
469
574
470
if (!TT.isWasm ()) {
@@ -582,11 +478,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
582
478
}
583
479
584
480
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);
590
481
}
591
482
592
483
if (TT.getArch () == Triple::ArchType::hexagon) {
@@ -633,10 +524,4 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
633
524
634
525
if (TT.getArch () == Triple::ArchType::msp430)
635
526
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);
642
527
}
0 commit comments