summaryrefslogtreecommitdiff
path: root/libunwind/include
diff options
context:
space:
mode:
authorzhanglimin <zhanglimin@loongson.cn>2022-11-15 14:36:30 +0800
committerWeining Lu <luweining@loongson.cn>2022-11-15 14:37:00 +0800
commitc5072695127e767a76973cdbed683215df31fa40 (patch)
tree9b434ff96f27be94b40a59e635c5d548d29bef55 /libunwind/include
parent25dcca60f48e936d014fb0c9a8d4b3343f3125b3 (diff)
downloadllvm-c5072695127e767a76973cdbed683215df31fa40.tar.gz
[libunwind][LoongArch] Add 64-bit LoongArch support
Defines enums for the LoongArch registers. Adds the register class implementation for LoongArch. Adds save and restore context functionality. This only supports 64 bits integer and float-point register implementation. Fix https://github.com/llvm/llvm-project/issues/55398 Reviewed By: SixWeining Differential Revision: https://reviews.llvm.org/D137010
Diffstat (limited to 'libunwind/include')
-rw-r--r--libunwind/include/__libunwind_config.h12
-rw-r--r--libunwind/include/libunwind.h68
2 files changed, 80 insertions, 0 deletions
diff --git a/libunwind/include/__libunwind_config.h b/libunwind/include/__libunwind_config.h
index 5e9de90f649f..f69fe89e9a26 100644
--- a/libunwind/include/__libunwind_config.h
+++ b/libunwind/include/__libunwind_config.h
@@ -30,6 +30,7 @@
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_RISCV 64
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_VE 143
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_S390X 83
+#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_LOONGARCH 64
#if defined(_LIBUNWIND_IS_NATIVE_ONLY)
# if defined(__linux__)
@@ -166,6 +167,16 @@
# define _LIBUNWIND_CONTEXT_SIZE 34
# define _LIBUNWIND_CURSOR_SIZE 46
# define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_S390X
+#elif defined(__loongarch__)
+#define _LIBUNWIND_TARGET_LOONGARCH 1
+#if __loongarch_grlen == 64
+#define _LIBUNWIND_CONTEXT_SIZE 65
+#define _LIBUNWIND_CURSOR_SIZE 77
+#else
+#error "Unsupported LoongArch ABI"
+#endif
+#define _LIBUNWIND_HIGHEST_DWARF_REGISTER \
+ _LIBUNWIND_HIGHEST_DWARF_REGISTER_LOONGARCH
# else
# error "Unsupported architecture."
# endif
@@ -185,6 +196,7 @@
# define _LIBUNWIND_TARGET_RISCV 1
# define _LIBUNWIND_TARGET_VE 1
# define _LIBUNWIND_TARGET_S390X 1
+#define _LIBUNWIND_TARGET_LOONGARCH 1
# define _LIBUNWIND_CONTEXT_SIZE 167
# define _LIBUNWIND_CURSOR_SIZE 179
# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 287
diff --git a/libunwind/include/libunwind.h b/libunwind/include/libunwind.h
index f878b46f0348..8c8cf8f53338 100644
--- a/libunwind/include/libunwind.h
+++ b/libunwind/include/libunwind.h
@@ -1219,4 +1219,72 @@ enum {
// 68-83 Vector Registers %v16-%v31
};
+// LoongArch registers.
+enum {
+ UNW_LOONGARCH_R0 = 0,
+ UNW_LOONGARCH_R1 = 1,
+ UNW_LOONGARCH_R2 = 2,
+ UNW_LOONGARCH_R3 = 3,
+ UNW_LOONGARCH_R4 = 4,
+ UNW_LOONGARCH_R5 = 5,
+ UNW_LOONGARCH_R6 = 6,
+ UNW_LOONGARCH_R7 = 7,
+ UNW_LOONGARCH_R8 = 8,
+ UNW_LOONGARCH_R9 = 9,
+ UNW_LOONGARCH_R10 = 10,
+ UNW_LOONGARCH_R11 = 11,
+ UNW_LOONGARCH_R12 = 12,
+ UNW_LOONGARCH_R13 = 13,
+ UNW_LOONGARCH_R14 = 14,
+ UNW_LOONGARCH_R15 = 15,
+ UNW_LOONGARCH_R16 = 16,
+ UNW_LOONGARCH_R17 = 17,
+ UNW_LOONGARCH_R18 = 18,
+ UNW_LOONGARCH_R19 = 19,
+ UNW_LOONGARCH_R20 = 20,
+ UNW_LOONGARCH_R21 = 21,
+ UNW_LOONGARCH_R22 = 22,
+ UNW_LOONGARCH_R23 = 23,
+ UNW_LOONGARCH_R24 = 24,
+ UNW_LOONGARCH_R25 = 25,
+ UNW_LOONGARCH_R26 = 26,
+ UNW_LOONGARCH_R27 = 27,
+ UNW_LOONGARCH_R28 = 28,
+ UNW_LOONGARCH_R29 = 29,
+ UNW_LOONGARCH_R30 = 30,
+ UNW_LOONGARCH_R31 = 31,
+ UNW_LOONGARCH_F0 = 32,
+ UNW_LOONGARCH_F1 = 33,
+ UNW_LOONGARCH_F2 = 34,
+ UNW_LOONGARCH_F3 = 35,
+ UNW_LOONGARCH_F4 = 36,
+ UNW_LOONGARCH_F5 = 37,
+ UNW_LOONGARCH_F6 = 38,
+ UNW_LOONGARCH_F7 = 39,
+ UNW_LOONGARCH_F8 = 40,
+ UNW_LOONGARCH_F9 = 41,
+ UNW_LOONGARCH_F10 = 42,
+ UNW_LOONGARCH_F11 = 43,
+ UNW_LOONGARCH_F12 = 44,
+ UNW_LOONGARCH_F13 = 45,
+ UNW_LOONGARCH_F14 = 46,
+ UNW_LOONGARCH_F15 = 47,
+ UNW_LOONGARCH_F16 = 48,
+ UNW_LOONGARCH_F17 = 49,
+ UNW_LOONGARCH_F18 = 50,
+ UNW_LOONGARCH_F19 = 51,
+ UNW_LOONGARCH_F20 = 52,
+ UNW_LOONGARCH_F21 = 53,
+ UNW_LOONGARCH_F22 = 54,
+ UNW_LOONGARCH_F23 = 55,
+ UNW_LOONGARCH_F24 = 56,
+ UNW_LOONGARCH_F25 = 57,
+ UNW_LOONGARCH_F26 = 58,
+ UNW_LOONGARCH_F27 = 59,
+ UNW_LOONGARCH_F28 = 60,
+ UNW_LOONGARCH_F29 = 61,
+ UNW_LOONGARCH_F30 = 62,
+ UNW_LOONGARCH_F31 = 63,
+};
+
#endif