1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586
|
//===--- 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
|