@@ -91,7 +91,7 @@ internal let _countGPRegisters = 16
91
91
@usableFromInline
92
92
internal let _registerSaveWords = _countGPRegisters
93
93
94
- #elseif arch(arm64) && os(Linux )
94
+ #elseif arch(arm64) && !( os(macOS) || os(iOS) || os(tvOS) || os(watchOS) || os(Windows) )
95
95
// ARM Procedure Call Standard for aarch64. (IHI0055B)
96
96
// The va_list type may refer to any parameter in a parameter list may be in one
97
97
// of three memory locations depending on its type and position in the argument
@@ -408,7 +408,7 @@ extension Float80 : CVarArg, _CVarArgAligned {
408
408
public var _cVarArgEncoding : [ Int ] {
409
409
return _encodeBitsAsWords ( self )
410
410
}
411
-
411
+
412
412
/// Returns the required alignment in bytes of
413
413
/// the value returned by `_cVarArgEncoding`.
414
414
@inlinable // FIXME(sil-serialize-all)
@@ -419,7 +419,7 @@ extension Float80 : CVarArg, _CVarArgAligned {
419
419
}
420
420
#endif
421
421
422
- #if arch(x86_64) || arch(s390x)
422
+ #if arch(x86_64) || arch(s390x) || (arch(arm64) && !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS) || os(Windows)))
423
423
424
424
/// An object that can manage the lifetime of storage backing a
425
425
/// `CVaListPointer`.
@@ -429,6 +429,7 @@ extension Float80 : CVarArg, _CVarArgAligned {
429
429
@_fixed_layout
430
430
@usableFromInline // c-abi
431
431
final internal class __VaListBuilder {
432
+ #if arch(x86_64) || arch(s390x)
432
433
@_fixed_layout // c-abi
433
434
@usableFromInline
434
435
internal struct Header {
@@ -445,15 +446,19 @@ final internal class __VaListBuilder {
445
446
@usableFromInline // c-abi
446
447
internal var reg_save_area : UnsafeMutablePointer < Int > ?
447
448
}
449
+ #endif
448
450
449
451
@usableFromInline // c-abi
450
452
internal var gpRegistersUsed = 0
451
453
@usableFromInline // c-abi
452
454
internal var fpRegistersUsed = 0
453
455
456
+ #if arch(x86_64) || arch(s390x)
454
457
@usableFromInline // c-abi
455
458
final // Property must be final since it is used by Builtin.addressof.
456
459
internal var header = Header ( )
460
+ #endif
461
+
457
462
@usableFromInline // c-abi
458
463
internal var storage : ContiguousArray < Int >
459
464
@@ -470,12 +475,16 @@ final internal class __VaListBuilder {
470
475
internal func append( _ arg: CVarArg ) {
471
476
var encoded = arg. _cVarArgEncoding
472
477
473
- #if arch(x86_64)
478
+ #if arch(x86_64) || arch(arm64)
474
479
let isDouble = arg is _CVarArgPassedAsDouble
475
480
476
481
if isDouble && fpRegistersUsed < _countFPRegisters {
477
- var startIndex = _countGPRegisters
478
- + ( fpRegistersUsed * _fpRegisterWords)
482
+ #if arch(arm64)
483
+ var startIndex = fpRegistersUsed * _fpRegisterWords
484
+ #else
485
+ var startIndex = _countGPRegisters
486
+ + ( fpRegistersUsed * _fpRegisterWords)
487
+ #endif
479
488
for w in encoded {
480
489
storage [ startIndex] = w
481
490
startIndex += 1
@@ -485,7 +494,12 @@ final internal class __VaListBuilder {
485
494
else if encoded. count == 1
486
495
&& !isDouble
487
496
&& gpRegistersUsed < _countGPRegisters {
488
- storage [ gpRegistersUsed] = encoded [ 0 ]
497
+ #if arch(arm64)
498
+ let startIndex = ( _fpRegisterWords * _countFPRegisters) + gpRegistersUsed
499
+ #else
500
+ let startIndex = gpRegistersUsed
501
+ #endif
502
+ storage [ startIndex] = encoded [ 0 ]
489
503
gpRegistersUsed += 1
490
504
}
491
505
else {
@@ -510,139 +524,24 @@ final internal class __VaListBuilder {
510
524
511
525
@inlinable // c-abi
512
526
internal func va_list( ) -> CVaListPointer {
513
- header. reg_save_area = storage. _baseAddress
514
- header. overflow_arg_area
515
- = storage. _baseAddress + _registerSaveWords
516
- return CVaListPointer (
517
- _fromUnsafeMutablePointer: UnsafeMutableRawPointer (
518
- Builtin . addressof ( & self . header) ) )
519
- }
520
- }
521
- #elseif arch(arm64) && os(Linux)
522
-
523
- // NOTE: older runtimes called this _VaListBuilder. The two must
524
- // coexist, so it was renamed. The old name must not be used in the new
525
- // runtime.
526
- @_fixed_layout // FIXME(sil-serialize-all)
527
- @usableFromInline // FIXME(sil-serialize-all)
528
- final internal class __VaListBuilder {
529
- @usableFromInline // FIXME(sil-serialize-all)
530
- internal init ( ) {
531
- // Prepare the register save area.
532
- allocated = _registerSaveWords
533
- storage = allocStorage ( wordCount: allocated)
534
- // Append stack arguments after register save area.
535
- count = allocated
536
- }
537
-
538
- @usableFromInline // FIXME(sil-serialize-all)
539
- deinit {
540
- if let allocatedStorage = storage {
541
- deallocStorage ( wordCount: allocated, storage: allocatedStorage)
542
- }
543
- }
544
-
545
- @usableFromInline // FIXME(sil-serialize-all)
546
- internal func append( _ arg: CVarArg ) {
547
- var encoded = arg. _cVarArgEncoding
548
-
549
- if arg is _CVarArgPassedAsDouble
550
- && fpRegistersUsed < _countFPRegisters {
551
- var startIndex = ( fpRegistersUsed * _fpRegisterWords)
552
- for w in encoded {
553
- storage [ startIndex] = w
554
- startIndex += 1
555
- }
556
- fpRegistersUsed += 1
557
- } else if encoded. count == 1
558
- && !( arg is _CVarArgPassedAsDouble )
559
- && gpRegistersUsed < _countGPRegisters {
560
- var startIndex = ( _fpRegisterWords * _countFPRegisters) + gpRegistersUsed
561
- storage [ startIndex] = encoded [ 0 ]
562
- gpRegistersUsed += 1
563
- } else {
564
- // Arguments in stack slot.
565
- appendWords ( encoded)
566
- }
567
- }
568
-
569
- @usableFromInline // FIXME(sil-serialize-all)
570
- internal func va_list( ) -> CVaListPointer {
571
- let vr_top = storage + ( _fpRegisterWords * _countFPRegisters)
572
- let gr_top = vr_top + _countGPRegisters
573
-
574
- return CVaListPointer ( __stack: gr_top, __gr_top: gr_top,
575
- __vr_top: vr_top, __gr_off: - 64 , __vr_off: - 128 )
527
+ #if arch(x86_64) || arch(s390x)
528
+ header. reg_save_area = storage. _baseAddress
529
+ header. overflow_arg_area
530
+ = storage. _baseAddress + _registerSaveWords
531
+ return CVaListPointer (
532
+ _fromUnsafeMutablePointer: UnsafeMutableRawPointer (
533
+ Builtin . addressof ( & self . header) ) )
534
+ #elseif arch(arm64)
535
+ let vr_top = storage. _baseAddress + ( _fpRegisterWords * _countFPRegisters)
536
+ let gr_top = vr_top + _countGPRegisters
537
+
538
+ return CVaListPointer ( __stack: gr_top,
539
+ __gr_top: gr_top,
540
+ __vr_top: vr_top,
541
+ __gr_off: - 64 ,
542
+ __vr_off: - 128 )
543
+ #endif
576
544
}
577
-
578
- @usableFromInline // FIXME(sil-serialize-all)
579
- internal func appendWords( _ words: [ Int ] ) {
580
- let newCount = count + words. count
581
- if newCount > allocated {
582
- let oldAllocated = allocated
583
- let oldStorage = storage
584
- let oldCount = count
585
-
586
- allocated = max ( newCount, allocated * 2 )
587
- let newStorage = allocStorage ( wordCount: allocated)
588
- storage = newStorage
589
- // Count is updated below.
590
- if let allocatedOldStorage = oldStorage {
591
- newStorage. moveInitialize ( from: allocatedOldStorage, count: oldCount)
592
- deallocStorage ( wordCount: oldAllocated, storage: allocatedOldStorage)
593
- }
594
- }
595
-
596
- let allocatedStorage = storage!
597
- for word in words {
598
- allocatedStorage [ count] = word
599
- count += 1
600
- }
601
- }
602
-
603
- @usableFromInline // FIXME(sil-serialize-all)
604
- internal func rawSizeAndAlignment(
605
- _ wordCount: Int
606
- ) -> ( Builtin . Word , Builtin . Word ) {
607
- return ( ( wordCount * MemoryLayout < Int > . stride) . _builtinWordValue,
608
- requiredAlignmentInBytes. _builtinWordValue)
609
- }
610
-
611
- @usableFromInline // FIXME(sil-serialize-all)
612
- internal func allocStorage( wordCount: Int ) -> UnsafeMutablePointer < Int > {
613
- let ( rawSize, rawAlignment) = rawSizeAndAlignment ( wordCount)
614
- let rawStorage = Builtin . allocRaw ( rawSize, rawAlignment)
615
- return UnsafeMutablePointer < Int > ( rawStorage)
616
- }
617
-
618
- @usableFromInline // FIXME(sil-serialize-all)
619
- internal func deallocStorage(
620
- wordCount: Int , storage: UnsafeMutablePointer < Int >
621
- ) {
622
- let ( rawSize, rawAlignment) = rawSizeAndAlignment ( wordCount)
623
- Builtin . deallocRaw ( storage. _rawValue, rawSize, rawAlignment)
624
- }
625
-
626
- @usableFromInline // FIXME(sil-serialize-all)
627
- internal let requiredAlignmentInBytes = MemoryLayout< Double> . alignment
628
-
629
- @usableFromInline // FIXME(sil-serialize-all)
630
- internal var count = 0
631
-
632
- @usableFromInline // FIXME(sil-serialize-all)
633
- internal var allocated = 0
634
-
635
- @usableFromInline // FIXME(sil-serialize-all)
636
- internal var storage : UnsafeMutablePointer < Int > !
637
-
638
- @usableFromInline // FIXME(sil-serialize-all)
639
- internal var gpRegistersUsed = 0
640
-
641
- @usableFromInline // FIXME(sil-serialize-all)
642
- internal var fpRegistersUsed = 0
643
-
644
- @usableFromInline // FIXME(sil-serialize-all)
645
- internal var overflowWordsUsed = 0
646
545
}
647
546
648
547
#else
0 commit comments