From 10745ac134b19ee035fc4b9836325b9b743d1890 Mon Sep 17 00:00:00 2001
From: Wenlong Zhang <zhangwenlong@loongson.cn>
Date: Sat, 20 May 2023 02:26:48 +0000
Subject: [PATCH] add loongarch64 support for Firebird

---
 builds/posix/prefix.linux_loongarch64   |  7 +++++++
 configure.ac                            | 12 ++++++++++++
 src/common/classes/DbImplementation.cpp |  7 ++++---
 src/common/common.h                     |  4 ++++
 src/jrd/inf_pub.h                       |  1 +
 5 files changed, 28 insertions(+), 3 deletions(-)
 create mode 100644 builds/posix/prefix.linux_loongarch64

diff --git a/builds/posix/prefix.linux_loongarch64 b/builds/posix/prefix.linux_loongarch64
new file mode 100644
index 0000000..70532a6
--- /dev/null
+++ b/builds/posix/prefix.linux_loongarch64
@@ -0,0 +1,7 @@
+WARN_FLAGS=-Wall -Wno-switch -Wno-parentheses -Wno-unknown-pragmas -Wno-unused-variable -Wno-invalid-offsetof -Wno-narrowing -Wno-unused-local-typedefs
+
+PROD_FLAGS=-O3 -DLINUX -DRISCV64 -pipe -p -MMD -fPIC -fsigned-char -fmessage-length=0
+DEV_FLAGS=-ggdb -DLINUX -DRISCV64 -pipe -p -MMD -fPIC -Wall -fsigned-char -fmessage-length=0 $(WARN_FLAGS)
+
+CXXFLAGS := $(CXXFLAGS) -std=c++11
+
diff --git a/configure.ac b/configure.ac
index cdc9c3e..c6186fd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -262,6 +262,18 @@ dnl CPU_TYPE=ppc64
     STD_ICU=true
     libdir=/usr/lib64
     ;;
+ 
+  loongarch64*-*-linux*)
+    MAKEFILE_PREFIX=linux_loongarch64
+    INSTALL_PREFIX=linux
+    PLATFORM=LINUX
+    AC_DEFINE(LINUX, 1, [Define this if OS is Linux])
+    EDITLINE_FLG=Y
+    SHRLIB_EXT=so
+    STD_EDITLINE=true
+    STD_ICU=true
+    libdir=/usr/lib64
+    ;;
 
   powerpc64le-*-linux*)
     MAKEFILE_PREFIX=linux_powerpc64el
diff --git a/src/common/classes/DbImplementation.cpp b/src/common/classes/DbImplementation.cpp
index 7376b9b..fb68145 100644
--- a/src/common/classes/DbImplementation.cpp
+++ b/src/common/classes/DbImplementation.cpp
@@ -91,7 +91,8 @@ const char* hardware[] = {
 	"ARM64",
 	"PowerPC64el",
 	"M68k",
-        "RiscV64"
+        "RiscV64",
+        "LoongArch64"
 };
 
 const char* operatingSystem[] = {
@@ -118,7 +119,7 @@ const char* compiler[] = {
 // This table lists pre-fb3 implementation codes
 const UCHAR backwardTable[FB_NELEM(hardware) * FB_NELEM(operatingSystem)] =
 {
-//				Intel	AMD		Sparc	PPC		PPC64	MIPSEL	MIPS	ARM		IA64	s390	s390x	SH		SHEB	HPPA	Alpha	ARM64	PowerPC64el	RiscV64
+//				Intel	AMD		Sparc	PPC		PPC64	MIPSEL	MIPS	ARM		IA64	s390	s390x	SH		SHEB	HPPA	Alpha	ARM64	PowerPC64el	RiscV64	LoongArch64
 /* Windows */	50,		68,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
 /* Linux */		60,		66,		65,		69,		86,		71,		72,		75, 	76,		79, 	78,		80,		81,		82,		83,		84,		85,		88,
 /* Darwin */	70,		73,		0,		63,		77,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
@@ -132,7 +133,7 @@ const UCHAR backwardTable[FB_NELEM(hardware) * FB_NELEM(operatingSystem)] =
 
 const UCHAR backEndianess[FB_NELEM(hardware)] =
 {
-//	Intel	AMD		Sparc	PPC		PPC64	MIPSEL	MIPS	ARM		IA64	s390	s390x	SH		SHEB	HPPA	Alpha	ARM64	PowerPC64el	M68k	RiscV64
+//	Intel	AMD		Sparc	PPC		PPC64	MIPSEL	MIPS	ARM		IA64	s390	s390x	SH		SHEB	HPPA	Alpha	ARM64	PowerPC64el	M68k	RiscV64	LoongArch64
 	0,		0,		1,		1,		1,		0,		1,		0,		0,		1,		1,		0,		1,		1,		0,		0,		0,			1,		0,
 };
 
diff --git a/src/common/common.h b/src/common/common.h
index cf9fbe4..f7ead78 100644
--- a/src/common/common.h
+++ b/src/common/common.h
@@ -139,6 +139,10 @@
 #define FB_CPU CpuRiscV64
 #endif /* RISCV64 */
 
+#ifdef LOONGARCH64
+#define FB_CPU CpuLoongArch64
+#endif /* LOONGARCH64 */
+
 #ifdef sparc
 #define FB_CPU CpuUltraSparc
 #define RISC_ALIGNMENT
diff --git a/src/jrd/inf_pub.h b/src/jrd/inf_pub.h
index 04a4061..7aa8693 100644
--- a/src/jrd/inf_pub.h
+++ b/src/jrd/inf_pub.h
@@ -248,6 +248,7 @@ enum  info_db_implementations
 	isc_info_db_impl_linux_ppc64 = 86,
 	isc_info_db_impl_linux_m68k = 87,
         isc_info_db_impl_linux_riscv64 = 88,
+        isc_info_db_impl_linux_loongarch64 = 89,
 
 	isc_info_db_impl_last_value   // Leave this LAST!
 };
-- 
2.33.0

