github.com/cnboonhan/delve@v0.0.0-20230908061759-363f2388c2fb/pkg/dwarf/regnum/arm64.go (about)

     1  package regnum
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // The mapping between hardware registers and DWARF registers is specified
     8  // in the DWARF for the DWARF for the ArmĀ® 64-bit Architecture (AArch64),
     9  // Section 4, Table 1
    10  // https://github.com/ARM-software/abi-aa/blob/main/aadwarf64/aadwarf64.rst#4arm-specific-dwarf-definitions
    11  
    12  const (
    13  	ARM64_X0         = 0  // X1 through X30 follow
    14  	ARM64_BP         = 29 // also X29
    15  	ARM64_LR         = 30 // also X30
    16  	ARM64_SP         = 31
    17  	ARM64_PC         = 32
    18  	ARM64_V0         = 64 // V1 through V31 follow
    19  	_ARM64_MaxRegNum = ARM64_V0 + 31
    20  )
    21  
    22  func ARM64ToName(num uint64) string {
    23  	switch {
    24  	case num <= 30:
    25  		return fmt.Sprintf("X%d", num)
    26  	case num == ARM64_SP:
    27  		return "SP"
    28  	case num == ARM64_PC:
    29  		return "PC"
    30  	case num >= ARM64_V0 && num <= 95:
    31  		return fmt.Sprintf("V%d", num-64)
    32  	default:
    33  		return fmt.Sprintf("unknown%d", num)
    34  	}
    35  }
    36  
    37  func ARM64MaxRegNum() uint64 {
    38  	return _ARM64_MaxRegNum
    39  }
    40  
    41  var ARM64NameToDwarf = func() map[string]int {
    42  	r := make(map[string]int)
    43  	for i := 0; i <= 32; i++ {
    44  		r[fmt.Sprintf("x%d", i)] = ARM64_X0 + i
    45  	}
    46  	r["fp"] = 29
    47  	r["lr"] = 30
    48  	r["sp"] = 31
    49  	r["pc"] = 32
    50  
    51  	for i := 0; i <= 31; i++ {
    52  		r[fmt.Sprintf("v%d", i)] = ARM64_V0 + i
    53  	}
    54  
    55  	return r
    56  }()