mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Move the backtracing code into a new Runtime module. This means renaming the Swift Runtime's CMake target because otherwise there will be a name clash. rdar://124913332
587 lines
10 KiB
Swift
587 lines
10 KiB
Swift
//===--- Registers.swift - Dwarf register mapping -------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2022 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Holds enums that define DWARF register mappings for the architectures we
|
|
// care about.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import Swift
|
|
|
|
// .. x86-64 .................................................................
|
|
|
|
// https://gitlab.com/x86-psABIs/x86-64-ABI
|
|
@_spi(Registers) public enum X86_64Register: Int, Strideable, Comparable {
|
|
|
|
public func advanced(by n: Int) -> X86_64Register {
|
|
return X86_64Register(rawValue: self.rawValue + n)!
|
|
}
|
|
|
|
public func distance(to other: X86_64Register) -> Int {
|
|
return other.rawValue - self.rawValue
|
|
}
|
|
|
|
public static func < (lhs: Self, rhs: Self) -> Bool {
|
|
return lhs.rawValue < rhs.rawValue
|
|
}
|
|
|
|
case rax = 0
|
|
case rdx = 1
|
|
case rcx = 2
|
|
case rbx = 3
|
|
case rsi = 4
|
|
case rdi = 5
|
|
case rbp = 6
|
|
case rsp = 7
|
|
case r8 = 8
|
|
case r9 = 9
|
|
case r10 = 10
|
|
case r11 = 11
|
|
case r12 = 12
|
|
case r13 = 13
|
|
case r14 = 14
|
|
case r15 = 15
|
|
case ra = 16
|
|
case xmm0 = 17
|
|
case xmm1 = 18
|
|
case xmm2 = 19
|
|
case xmm3 = 20
|
|
case xmm4 = 21
|
|
case xmm5 = 22
|
|
case xmm6 = 23
|
|
case xmm7 = 24
|
|
case xmm8 = 25
|
|
case xmm9 = 26
|
|
case xmm10 = 27
|
|
case xmm11 = 28
|
|
case xmm12 = 29
|
|
case xmm13 = 30
|
|
case xmm14 = 31
|
|
case xmm15 = 32
|
|
case st0 = 33
|
|
case st1 = 34
|
|
case st2 = 35
|
|
case st3 = 36
|
|
case st4 = 37
|
|
case st5 = 38
|
|
case st6 = 39
|
|
case st7 = 40
|
|
case mm0 = 41
|
|
case mm1 = 42
|
|
case mm2 = 43
|
|
case mm3 = 44
|
|
case mm4 = 45
|
|
case mm5 = 46
|
|
case mm6 = 47
|
|
case mm7 = 48
|
|
case rflags = 49
|
|
case es = 50
|
|
case cs = 51
|
|
case ss = 52
|
|
case ds = 53
|
|
case fs = 54
|
|
case gs = 55
|
|
// 56-57 are reserved
|
|
case fs_base = 58
|
|
case gs_base = 59
|
|
// 60-61 are reserved
|
|
case tr = 62
|
|
case ldtr = 63
|
|
case mxcsr = 64
|
|
case fcw = 65
|
|
case fsw = 66
|
|
case xmm16 = 67
|
|
case xmm17 = 68
|
|
case xmm18 = 69
|
|
case xmm19 = 70
|
|
case xmm20 = 71
|
|
case xmm21 = 72
|
|
case xmm22 = 73
|
|
case xmm23 = 74
|
|
case xmm24 = 75
|
|
case xmm25 = 76
|
|
case xmm26 = 77
|
|
case xmm27 = 78
|
|
case xmm28 = 79
|
|
case xmm29 = 80
|
|
case xmm30 = 81
|
|
case xmm31 = 82
|
|
// 83-117 are reserved
|
|
case k0 = 118
|
|
case k1 = 119
|
|
case k2 = 120
|
|
case k3 = 121
|
|
case k4 = 122
|
|
case k5 = 123
|
|
case k6 = 124
|
|
case k7 = 125
|
|
// 126-129 are reserved
|
|
}
|
|
|
|
// .. i386 ...................................................................
|
|
|
|
// https://gitlab.com/x86-psABIs/i386-ABI
|
|
@_spi(Registers) public enum I386Register: Int, Strideable, Comparable {
|
|
|
|
public func advanced(by n: Int) -> I386Register {
|
|
return I386Register(rawValue: self.rawValue + n)!
|
|
}
|
|
|
|
public func distance(to other: I386Register) -> Int {
|
|
return other.rawValue - self.rawValue
|
|
}
|
|
|
|
public static func < (lhs: Self, rhs: Self) -> Bool {
|
|
return lhs.rawValue < rhs.rawValue
|
|
}
|
|
|
|
case eax = 0
|
|
case ecx = 1
|
|
case edx = 2
|
|
case ebx = 3
|
|
case esp = 4
|
|
case ebp = 5
|
|
case esi = 6
|
|
case edi = 7
|
|
case ra = 8
|
|
case eflags = 9
|
|
// 10 is reserved
|
|
case st0 = 11
|
|
case st1 = 12
|
|
case st2 = 13
|
|
case st3 = 14
|
|
case st4 = 15
|
|
case st5 = 16
|
|
case st6 = 17
|
|
case st7 = 18
|
|
// 19-20 are reserved
|
|
case xmm0 = 21
|
|
case xmm1 = 22
|
|
case xmm2 = 23
|
|
case xmm3 = 24
|
|
case xmm4 = 25
|
|
case xmm5 = 26
|
|
case xmm6 = 27
|
|
case xmm7 = 28
|
|
case mm0 = 29
|
|
case mm1 = 30
|
|
case mm2 = 31
|
|
case mm3 = 32
|
|
case mm4 = 33
|
|
case mm5 = 34
|
|
case mm6 = 35
|
|
case mm7 = 36
|
|
// 36-38 are reserved
|
|
case mxcsr = 39
|
|
case es = 40
|
|
case cs = 41
|
|
case ss = 42
|
|
case ds = 43
|
|
case fs = 44
|
|
case gs = 45
|
|
// 46-47 are reserved
|
|
case tr = 48
|
|
case ldtr = 49
|
|
// 50-92 are reserved
|
|
case fs_base = 93
|
|
case gs_base = 94
|
|
}
|
|
|
|
// .. arm64 ..................................................................
|
|
|
|
// https://github.com/ARM-software/abi-aa/tree/main/aadwarf64
|
|
@_spi(Registers) public enum ARM64Register: Int, Strideable, Comparable {
|
|
|
|
public func advanced(by n: Int) -> ARM64Register {
|
|
return ARM64Register(rawValue: self.rawValue + n)!
|
|
}
|
|
|
|
public func distance(to other: ARM64Register) -> Int {
|
|
return other.rawValue - self.rawValue
|
|
}
|
|
|
|
public static func < (lhs: Self, rhs: Self) -> Bool {
|
|
return lhs.rawValue < rhs.rawValue
|
|
}
|
|
|
|
case x0 = 0
|
|
case x1 = 1
|
|
case x2 = 2
|
|
case x3 = 3
|
|
case x4 = 4
|
|
case x5 = 5
|
|
case x6 = 6
|
|
case x7 = 7
|
|
case x8 = 8
|
|
case x9 = 9
|
|
case x10 = 10
|
|
case x11 = 11
|
|
case x12 = 12
|
|
case x13 = 13
|
|
case x14 = 14
|
|
case x15 = 15
|
|
case x16 = 16
|
|
case x17 = 17
|
|
case x18 = 18
|
|
case x19 = 19
|
|
case x20 = 20
|
|
case x21 = 21
|
|
case x22 = 22
|
|
case x23 = 23
|
|
case x24 = 24
|
|
case x25 = 25
|
|
case x26 = 26
|
|
case x27 = 27
|
|
case x28 = 28
|
|
case x29 = 29 // fp
|
|
case x30 = 30 // lr
|
|
case sp = 31 // x31
|
|
case pc = 32
|
|
case elr_mode = 33
|
|
case ra_sign_state = 34
|
|
case tpidrro_el0 = 35
|
|
case tpidr_el0 = 36
|
|
case tpidr_el1 = 37
|
|
case tpidr_el2 = 38
|
|
case tpidr_el3 = 39
|
|
// 40-45 are reserved
|
|
case vg = 46
|
|
case ffr = 47
|
|
case p0 = 48
|
|
case p1 = 49
|
|
case p2 = 50
|
|
case p3 = 51
|
|
case p4 = 52
|
|
case p5 = 53
|
|
case p6 = 54
|
|
case p7 = 55
|
|
case p8 = 56
|
|
case p9 = 57
|
|
case p10 = 58
|
|
case p11 = 59
|
|
case p12 = 60
|
|
case p13 = 61
|
|
case p14 = 62
|
|
case p15 = 63
|
|
case v0 = 64
|
|
case v1 = 65
|
|
case v2 = 66
|
|
case v3 = 67
|
|
case v4 = 68
|
|
case v5 = 69
|
|
case v6 = 70
|
|
case v7 = 71
|
|
case v8 = 72
|
|
case v9 = 73
|
|
case v10 = 74
|
|
case v11 = 75
|
|
case v12 = 76
|
|
case v13 = 77
|
|
case v14 = 78
|
|
case v15 = 79
|
|
case v16 = 80
|
|
case v17 = 81
|
|
case v18 = 82
|
|
case v19 = 83
|
|
case v20 = 84
|
|
case v21 = 85
|
|
case v22 = 86
|
|
case v23 = 87
|
|
case v24 = 88
|
|
case v25 = 89
|
|
case v26 = 90
|
|
case v27 = 91
|
|
case v28 = 92
|
|
case v29 = 93
|
|
case v30 = 94
|
|
case v31 = 95
|
|
case z0 = 96
|
|
case z1 = 97
|
|
case z2 = 98
|
|
case z3 = 99
|
|
case z4 = 100
|
|
case z5 = 101
|
|
case z6 = 102
|
|
case z7 = 103
|
|
case z8 = 104
|
|
case z9 = 105
|
|
case z10 = 106
|
|
case z11 = 107
|
|
case z12 = 108
|
|
case z13 = 109
|
|
case z14 = 110
|
|
case z15 = 111
|
|
case z16 = 112
|
|
case z17 = 113
|
|
case z18 = 114
|
|
case z19 = 115
|
|
case z20 = 116
|
|
case z21 = 117
|
|
case z22 = 118
|
|
case z23 = 119
|
|
case z24 = 120
|
|
case z25 = 121
|
|
case z26 = 122
|
|
case z27 = 123
|
|
case z28 = 124
|
|
case z29 = 125
|
|
case z30 = 126
|
|
case z31 = 127
|
|
}
|
|
|
|
// .. arm ....................................................................
|
|
|
|
// https://github.com/ARM-software/abi-aa/tree/main/aadwarf32
|
|
@_spi(Registers) public enum ARMRegister: Int, Strideable, Comparable {
|
|
|
|
public func advanced(by n: Int) -> ARMRegister {
|
|
return ARMRegister(rawValue: self.rawValue + n)!
|
|
}
|
|
|
|
public func distance(to other: ARMRegister) -> Int {
|
|
return other.rawValue - self.rawValue
|
|
}
|
|
|
|
public static func < (lhs: Self, rhs: Self) -> Bool {
|
|
return lhs.rawValue < rhs.rawValue
|
|
}
|
|
|
|
case r0 = 0
|
|
case r1 = 1
|
|
case r2 = 2
|
|
case r3 = 3
|
|
case r4 = 4
|
|
case r5 = 5
|
|
case r6 = 6
|
|
case r7 = 7
|
|
case r8 = 8
|
|
case r9 = 9
|
|
case r10 = 10
|
|
case r11 = 11 // fp
|
|
case r12 = 12 // ip - scratch register (NOT "instruction pointer")
|
|
case r13 = 13 // sp
|
|
case r14 = 14 // lr
|
|
case r15 = 15 // pc
|
|
|
|
// Obsolescent, overlapping mappings for FPA and VFP
|
|
case old_f0_s0 = 16
|
|
case old_f1_s1 = 17
|
|
case old_f2_s2 = 18
|
|
case old_f3_s3 = 19
|
|
case old_f4_s4 = 20
|
|
case old_f5_s5 = 21
|
|
case old_f6_s6 = 22
|
|
case old_f7_s7 = 23
|
|
case old_s8 = 24
|
|
case old_s9 = 25
|
|
case old_s10 = 26
|
|
case old_s11 = 27
|
|
case old_s12 = 28
|
|
case old_s13 = 29
|
|
case old_s14 = 30
|
|
case old_s15 = 31
|
|
case old_s16 = 32
|
|
case old_s17 = 33
|
|
case old_s18 = 34
|
|
case old_s19 = 35
|
|
case old_s20 = 36
|
|
case old_s21 = 37
|
|
case old_s22 = 38
|
|
case old_s23 = 39
|
|
case old_s24 = 40
|
|
case old_s25 = 41
|
|
case old_s26 = 42
|
|
case old_s27 = 43
|
|
case old_s28 = 44
|
|
case old_s29 = 45
|
|
case old_s30 = 46
|
|
case old_s31 = 47
|
|
|
|
// Legacy VFPv2
|
|
case s0 = 64
|
|
case s1 = 65
|
|
case s2 = 66
|
|
case s3 = 67
|
|
case s4 = 68
|
|
case s5 = 69
|
|
case s6 = 70
|
|
case s7 = 71
|
|
case s8 = 72
|
|
case s9 = 73
|
|
case s10 = 74
|
|
case s11 = 75
|
|
case s12 = 76
|
|
case s13 = 77
|
|
case s14 = 78
|
|
case s15 = 79
|
|
case s16 = 80
|
|
case s17 = 81
|
|
case s18 = 82
|
|
case s19 = 83
|
|
case s20 = 84
|
|
case s21 = 85
|
|
case s22 = 86
|
|
case s23 = 87
|
|
case s24 = 88
|
|
case s25 = 89
|
|
case s26 = 90
|
|
case s27 = 91
|
|
case s28 = 92
|
|
case s29 = 93
|
|
case s30 = 94
|
|
case s31 = 95
|
|
|
|
// Obsolescent FPA registers
|
|
case f0 = 96
|
|
case f1 = 97
|
|
case f2 = 98
|
|
case f3 = 99
|
|
case f4 = 100
|
|
case f5 = 101
|
|
case f6 = 102
|
|
case f7 = 103
|
|
|
|
// Intel wireless MMX GPRs / XScale accumulators
|
|
case wcgr0_acc0 = 104
|
|
case wcgr1_acc1 = 105
|
|
case wcgr2_acc2 = 106
|
|
case wcgr3_acc3 = 107
|
|
case wcgr4_acc4 = 108
|
|
case wcgr5_acc5 = 109
|
|
case wcgr6_acc6 = 110
|
|
case wcgr7_acc7 = 111
|
|
|
|
// Intel wireless MMX data registers
|
|
case wr0 = 112
|
|
case wr1 = 113
|
|
case wr2 = 114
|
|
case wr3 = 115
|
|
case wr4 = 116
|
|
case wr5 = 117
|
|
case wr6 = 118
|
|
case wr7 = 119
|
|
case wr8 = 120
|
|
case wr9 = 121
|
|
case wr10 = 122
|
|
case wr11 = 123
|
|
case wr12 = 124
|
|
case wr13 = 125
|
|
case wr14 = 126
|
|
case wr15 = 127
|
|
|
|
case spsr = 128
|
|
case spsr_fiq = 129
|
|
case spsr_irq = 130
|
|
case spsr_abt = 131
|
|
case spsr_und = 132
|
|
case spsr_svc = 133
|
|
|
|
// 134-142 are reserved
|
|
|
|
case ra_auth_code = 143
|
|
|
|
case r8_usr = 144
|
|
case r9_usr = 145
|
|
case r10_usr = 146
|
|
case r11_usr = 147
|
|
case r12_usr = 148
|
|
case r13_usr = 149
|
|
case r14_usr = 150
|
|
|
|
case r8_fiq = 151
|
|
case r9_fiq = 152
|
|
case r10_fiq = 153
|
|
case r11_fiq = 154
|
|
case r12_fiq = 155
|
|
case r13_fiq = 156
|
|
case r14_fiq = 157
|
|
|
|
case r13_irq = 158
|
|
case r14_irq = 159
|
|
|
|
case r13_abt = 160
|
|
case r14_abt = 161
|
|
|
|
case r13_und = 162
|
|
case r14_und = 163
|
|
|
|
case r13_svc = 164
|
|
case r14_svc = 165
|
|
|
|
// 166-191 are reserved
|
|
|
|
// Intel wqireless MMX control register
|
|
case wc0 = 192
|
|
case wc1 = 193
|
|
case wc2 = 194
|
|
case wc3 = 195
|
|
case wc4 = 196
|
|
case wc5 = 197
|
|
case wc6 = 198
|
|
case wc7 = 199
|
|
|
|
// 200-255 are reserved
|
|
|
|
case d0 = 256
|
|
case d1 = 257
|
|
case d2 = 258
|
|
case d3 = 259
|
|
case d4 = 260
|
|
case d5 = 261
|
|
case d6 = 262
|
|
case d7 = 263
|
|
case d8 = 264
|
|
case d9 = 265
|
|
case d10 = 266
|
|
case d11 = 267
|
|
case d12 = 268
|
|
case d13 = 269
|
|
case d14 = 270
|
|
case d15 = 271
|
|
case d16 = 272
|
|
case d17 = 273
|
|
case d18 = 274
|
|
case d19 = 275
|
|
case d20 = 276
|
|
case d21 = 277
|
|
case d22 = 278
|
|
case d23 = 279
|
|
case d24 = 280
|
|
case d25 = 281
|
|
case d26 = 282
|
|
case d27 = 283
|
|
case d28 = 284
|
|
case d29 = 285
|
|
case d30 = 286
|
|
case d31 = 287
|
|
|
|
// 288-319 are reserved
|
|
|
|
case tpidruro = 320
|
|
case tpidrurw = 321
|
|
case tpidpr = 322
|
|
case htpidpr = 323
|
|
|
|
// 324-8191 are reserved
|
|
// 8192-16383 are for vendor co-processors
|
|
}
|
|
|
|
#if arch(x86_64)
|
|
@_spi(Registers) public typealias HostRegister = X86_64Register
|
|
#elseif arch(i386)
|
|
@_spi(Registers) public typealias HostRegister = I386Register
|
|
#elseif arch(arm64) || arch(arm64_32)
|
|
@_spi(Registers) public typealias HostRegister = ARM64Register
|
|
#elseif arch(arm)
|
|
@_spi(Registers) public typealias HostRegister = ARMRegister
|
|
#endif
|