Package: ply-probe
Severity: normal
Tags: sid patch
X-Debbugs-Cc: wuruil...@loongson.cn
User: debian-loonga...@lists.debian.org
Usertags: loong64

Dear Maintainer,

ply-probe fails to compile on loongarch. Please refer to loongarch 
documentation and riscv code to support loongarch architecture. It has been 
tested locally. Please merge the attached patch.

wuruilong
--- ply-probe-2.3.0.25.gec815ed.orig/src/libply/Makefile.am
+++ ply-probe-2.3.0.25.gec815ed/src/libply/Makefile.am
@@ -8,12 +8,13 @@ AM_YFLAGS = -d -Wall
 AM_LFLAGS = --header-file=lexer.h
 
 EXTRA_DIST = grammar.c grammar.h lexer.c lexer.h \
-       arch/aarch64.c \
-       arch/arm.c     \
-       arch/mips.c    \
-       arch/powerpc.c \
-       arch/riscv32.c \
-       arch/riscv64.c \
+       arch/aarch64.c     \
+       arch/arm.c         \
+       arch/loongarch64.c \
+       arch/mips.c        \
+       arch/powerpc.c     \
+       arch/riscv32.c     \
+       arch/riscv64.c     \
        arch/x86_64.c
 
 BUILT_SOURCES = grammar.h lexer.h
--- /dev/null
+++ ply-probe-2.3.0.25.gec815ed/src/libply/arch/loongarch64.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright Tobias Waldekranz <tob...@waldekranz.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#include <assert.h>
+
+#include <ply/internal.h>
+
+#define arch_typedef(_a, _t) {                                 \
+               .ttype = T_TYPEDEF,                             \
+               .tdef = { .name = #_a, .type = _t },            \
+       }
+
+struct type t_s8  = arch_typedef(s8,  &t_schar);
+struct type t_u8  = arch_typedef(u8,  &t_uchar);
+struct type t_s16 = arch_typedef(s16, &t_sshort);
+struct type t_u16 = arch_typedef(u16, &t_ushort);
+struct type t_s32 = arch_typedef(s32, &t_sint);
+struct type t_u32 = arch_typedef(u32, &t_uint);
+struct type t_s64 = arch_typedef(s64, &t_slong);
+struct type t_u64 = arch_typedef(u64, &t_ulong);
+
+static int reg_fprint(struct type *t, FILE *fp, const void *data)
+{
+       return fprintf(fp, "%#lx", *((unsigned long *)data));
+}
+
+struct type t_reg_t = {
+       .ttype = T_TYPEDEF,
+       .tdef = {
+               .name = "reg_t",
+               .type = &t_ulong,
+       },
+
+       .fprint = reg_fprint,
+};
+
+struct tfield f_pt_regs_fields[] = {
+       { .name = "pc",    .type = &t_reg_t },
+       { .name = "ra",      .type = &t_reg_t },
+       { .name = "tp",      .type = &t_reg_t },
+       { .name = "sp",      .type = &t_reg_t },
+       { .name = "a0",      .type = &t_reg_t },
+       { .name = "a1",      .type = &t_reg_t },
+       { .name = "a2",      .type = &t_reg_t },
+       { .name = "a3",      .type = &t_reg_t },
+       { .name = "a4",      .type = &t_reg_t },
+       { .name = "a5",      .type = &t_reg_t },
+       { .name = "a6",      .type = &t_reg_t },
+       { .name = "a7",      .type = &t_reg_t },
+       { .name = "t0",      .type = &t_reg_t },
+       { .name = "t1",      .type = &t_reg_t },
+       { .name = "t2",      .type = &t_reg_t },
+       { .name = "t3",      .type = &t_reg_t },
+       { .name = "t4",      .type = &t_reg_t },
+       { .name = "t5",      .type = &t_reg_t },
+       { .name = "t6",      .type = &t_reg_t },
+       { .name = "t7",      .type = &t_reg_t },
+       { .name = "t8",      .type = &t_reg_t },
+       { .name = "r21",      .type = &t_reg_t },
+       { .name = "fp",      .type = &t_reg_t },
+       { .name = "s0",      .type = &t_reg_t },
+       { .name = "s1",      .type = &t_reg_t },
+       { .name = "s2",      .type = &t_reg_t },
+       { .name = "s3",     .type = &t_reg_t },
+       { .name = "s4",     .type = &t_reg_t },
+       { .name = "s5",      .type = &t_reg_t },
+       { .name = "s6",      .type = &t_reg_t },
+       { .name = "s7",      .type = &t_reg_t },
+       { .name = "s8",      .type = &t_reg_t },
+
+       { .type = NULL }
+};
+
+struct type t_pt_regs = {
+       .ttype = T_STRUCT,
+
+       .sou = {
+               .name = "pt_regs",
+               .fields = f_pt_regs_fields,
+       },
+};
+
+struct type *arch_types[] = {
+       &t_s8, &t_u8,
+       &t_s16, &t_u16,
+       &t_s32, &t_u32,
+       &t_s64, &t_u64,
+       &t_reg_t, &t_pt_regs,
+
+       NULL
+};
+
+const char *arch_register_argument(int num)
+{
+       switch (num) {
+       case 0: return "a0";
+       case 1: return "a1";
+       case 2: return "a2";
+       case 3: return "a3";
+       case 4: return "a4";
+       case 5: return "a5";
+       case 6: return "a6";
+       }
+
+       return NULL;
+}
+
+const char *arch_register_pc(void)
+{
+       return "pc";
+}
+
+const char *arch_register_return(void)
+{
+       return "a0";
+}
+
+__attribute__((constructor))
+static void arch_init(void)
+{
+       type_struct_layout(&t_pt_regs);
+       type_add_list(arch_types);
+}

Reply via email to