git: 1ae6faf16455 - main - LoongArch: elftoolchain: add support

From: Warner Losh <imp_at_FreeBSD.org>
Date: Thu, 12 Jun 2025 00:29:02 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=1ae6faf1645516bbb97eaf2a43d867b59b22309b

commit 1ae6faf1645516bbb97eaf2a43d867b59b22309b
Author:     yu shan wei <mpysw@vip.163.com>
AuthorDate: 2025-04-29 02:08:12 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2025-06-12 00:21:30 +0000

    LoongArch: elftoolchain: add support
    
    According to the latest elftoolchain r4191, add support for Loongarch
    
    Co-authored-by: haowuge <gehaowu@bitmoe.com>
    Co-authored-by: xiaoqiang zhao <zxq_yx_007@163.com>
    Signed-off-by: yu shan wei <mpysw@vip.163.com>
    Reviewed by: imp
    Pull Request: https://github.com/freebsd/freebsd-src/pull/1682
    Closes: https://github.com/freebsd/freebsd-src/pull/1682
---
 contrib/elftoolchain/libdwarf/libdwarf.h           |   1 +
 contrib/elftoolchain/libdwarf/libdwarf_reloc.c     |   8 ++
 contrib/elftoolchain/libelf/_libelf_config.h       |   6 ++
 .../elftoolchain/libelftc/elftc_reloc_type_str.c   | 119 +++++++++++++++++++++
 contrib/elftoolchain/libelftc/libelftc_bfdtarget.c |  31 ++++++
 contrib/elftoolchain/libpe/pe.h                    |   2 +
 6 files changed, 167 insertions(+)

diff --git a/contrib/elftoolchain/libdwarf/libdwarf.h b/contrib/elftoolchain/libdwarf/libdwarf.h
index 0aa1857e3285..e8419620755d 100644
--- a/contrib/elftoolchain/libdwarf/libdwarf.h
+++ b/contrib/elftoolchain/libdwarf/libdwarf.h
@@ -442,6 +442,7 @@ enum Dwarf_ISA {
 	DW_ISA_X86_64,
 	DW_ISA_AARCH64,
 	DW_ISA_RISCV,
+	DW_ISA_LOONGARCH,
 	DW_ISA_MAX
 };
 
diff --git a/contrib/elftoolchain/libdwarf/libdwarf_reloc.c b/contrib/elftoolchain/libdwarf/libdwarf_reloc.c
index e76675838e41..d8ea4e36d29d 100644
--- a/contrib/elftoolchain/libdwarf/libdwarf_reloc.c
+++ b/contrib/elftoolchain/libdwarf/libdwarf_reloc.c
@@ -51,6 +51,8 @@ _dwarf_get_reloc_type(Dwarf_P_Debug dbg, int is64)
 		return (is64 ? R_MIPS_64 : R_MIPS_32);
 	case DW_ISA_RISCV:
 		return (is64 ? R_RISCV_64 : R_RISCV_32);
+	case DW_ISA_LOONGARCH:
+		return (is64 ? R_LARCH_64 : R_LARCH_32);
 	case DW_ISA_IA64:
 		return (is64 ? R_IA_64_DIR64LSB : R_IA_64_DIR32LSB);
 	default:
@@ -115,6 +117,12 @@ _dwarf_get_reloc_size(Dwarf_Debug dbg, Dwarf_Unsigned rel_type)
 		else if (rel_type == R_RISCV_64)
 			return (8);
 		break;
+	case EM_LOONGARCH:
+		if (rel_type == R_LARCH_32)
+			return (4);
+		else if (rel_type == R_LARCH_64)
+			return (8);
+		break;
 	case EM_IA_64:
 		if (rel_type == R_IA_64_SECREL32LSB)
 			return (4);
diff --git a/contrib/elftoolchain/libelf/_libelf_config.h b/contrib/elftoolchain/libelf/_libelf_config.h
index 0f16f3aefde5..df33e974a94b 100644
--- a/contrib/elftoolchain/libelf/_libelf_config.h
+++ b/contrib/elftoolchain/libelf/_libelf_config.h
@@ -105,6 +105,12 @@
 #define	LIBELF_BYTEORDER	ELFDATA2LSB
 #define	LIBELF_CLASS		ELFCLASS64
 
+#elif	defined(__loongarch64)
+
+#define	LIBELF_ARCH		EM_LOONGARCH
+#define	LIBELF_BYTEORDER	ELFDATA2LSB
+#define	LIBELF_CLASS		ELFCLASS64
+
 #elif	defined(__sparc__)
 
 #define	LIBELF_ARCH		EM_SPARCV9
diff --git a/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c
index bc8ff6c0d2c6..48970714c7d4 100644
--- a/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c
+++ b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c
@@ -670,6 +670,125 @@ elftc_reloc_type_str(unsigned int mach, unsigned int type)
 		case 58: return "R_RISCV_IRELATIVE";
 		}
 		break;
+	case EM_LOONGARCH:
+		switch (type) {
+		case 0: return "R_LARCH_NONE";
+		case 1: return "R_LARCH_32";
+		case 2: return "R_LARCH_64";
+		case 3: return "R_LARCH_RELATIVE";
+		case 4: return "R_LARCH_COPY";
+		case 5: return "R_LARCH_JUMP_SLOT";
+		case 6: return "R_LARCH_TLS_DTPMOD32";
+		case 7: return "R_LARCH_TLS_DTPMOD64";
+		case 8: return "R_LARCH_TLS_DTPREL32";
+		case 9: return "R_LARCH_TLS_DTPREL64";
+		case 10: return "R_LARCH_TLS_TPREL32";
+		case 11: return "R_LARCH_TLS_TPREL64";
+		case 12: return "R_LARCH_IRELATIVE";
+		case 13: return "R_LARCH_TLS_DESC32";
+		case 14: return "R_LARCH_TLS_DESC64";
+		case 20: return "R_LARCH_MARK_LA";
+		case 21: return "R_LARCH_MARK_PCREL";
+		case 22: return "R_LARCH_SOP_PUSH_PCREL";
+		case 23: return "R_LARCH_SOP_PUSH_ABSOLUTE";
+		case 24: return "R_LARCH_SOP_PUSH_DUP";
+		case 25: return "R_LARCH_SOP_PUSH_GPREL";
+		case 26: return "R_LARCH_SOP_PUSH_TLS_TPREL";
+		case 27: return "R_LARCH_SOP_PUSH_TLS_GOT";
+		case 28: return "R_LARCH_SOP_PUSH_TLS_GD";
+		case 29: return "R_LARCH_SOP_PUSH_PLT_PCREL";
+		case 30: return "R_LARCH_SOP_ASSERT";
+		case 31: return "R_LARCH_SOP_NOT";
+		case 32: return "R_LARCH_SOP_SUB";
+		case 33: return "R_LARCH_SOP_SL";
+		case 34: return "R_LARCH_SOP_SR";
+		case 35: return "R_LARCH_SOP_ADD";
+		case 36: return "R_LARCH_SOP_AND";
+		case 37: return "R_LARCH_SOP_IF_ELSE";
+		case 38: return "R_LARCH_SOP_POP_32_S_10_5";
+		case 39: return "R_LARCH_SOP_POP_32_U_10_12";
+		case 40: return "R_LARCH_SOP_POP_32_S_10_12";
+		case 41: return "R_LARCH_SOP_POP_32_S_10_16";
+		case 42: return "R_LARCH_SOP_POP_32_S_10_16_S2";
+		case 43: return "R_LARCH_SOP_POP_32_S_5_20";
+		case 44: return "R_LARCH_SOP_POP_32_S_0_5_10_16_S2";
+		case 45: return "R_LARCH_SOP_POP_32_S_0_10_10_16_S2";
+		case 46: return "R_LARCH_SOP_POP_32_U";
+		case 47: return "R_LARCH_ADD8";
+		case 48: return "R_LARCH_ADD16";
+		case 49: return "R_LARCH_ADD24";
+		case 50: return "R_LARCH_ADD32";
+		case 51: return "R_LARCH_ADD64";
+		case 52: return "R_LARCH_SUB8";
+		case 53: return "R_LARCH_SUB16";
+		case 54: return "R_LARCH_SUB24";
+		case 55: return "R_LARCH_SUB32";
+		case 56: return "R_LARCH_SUB64";
+		case 57: return "R_LARCH_GNU_VTINHERIT";
+		case 58: return "R_LARCH_GNU_VTENTRY";
+		case 64: return "R_LARCH_B16";
+		case 65: return "R_LARCH_B21";
+		case 66: return "R_LARCH_B26";
+		case 67: return "R_LARCH_ABS_HI20";
+		case 68: return "R_LARCH_ABS_LO12";
+		case 69: return "R_LARCH_ABS64_LO20";
+		case 70: return "R_LARCH_ABS64_HI12";
+		case 71: return "R_LARCH_PCALA_HI20";
+		case 72: return "R_LARCH_PCALA_LO12";
+		case 73: return "R_LARCH_PCALA64_LO20";
+		case 74: return "R_LARCH_PCALA64_HI12";
+		case 75: return "R_LARCH_GOT_PC_HI20";
+		case 76: return "R_LARCH_GOT_PC_LO12";
+		case 77: return "R_LARCH_GOT64_PC_LO20";
+		case 78: return "R_LARCH_GOT64_PC_HI12";
+		case 79: return "R_LARCH_GOT_HI20";
+		case 80: return "R_LARCH_GOT_LO12";
+		case 81: return "R_LARCH_GOT64_LO20";
+		case 82: return "R_LARCH_GOT64_HI12";
+		case 83: return "R_LARCH_TLS_LE_HI20";
+		case 84: return "R_LARCH_TLS_LE_LO12";
+		case 85: return "R_LARCH_TLS_LE64_LO20";
+		case 86: return "R_LARCH_TLS_LE64_HI12";
+		case 87: return "R_LARCH_TLS_IE_PC_HI20";
+		case 88: return "R_LARCH_TLS_IE_PC_LO12";
+		case 89: return "R_LARCH_TLS_IE64_PC_LO20";
+		case 90: return "R_LARCH_TLS_IE64_PC_HI12";
+		case 91: return "R_LARCH_TLS_IE_HI20";
+		case 92: return "R_LARCH_TLS_IE_LO12";
+		case 93: return "R_LARCH_TLS_IE64_LO20";
+		case 94: return "R_LARCH_TLS_IE64_HI12";
+		case 95: return "R_LARCH_TLS_LD_PC_HI20";
+		case 96: return "R_LARCH_TLS_LD_HI20";
+		case 97: return "R_LARCH_TLS_GD_PC_HI20";
+		case 98: return "R_LARCH_TLS_GD_HI20";
+		case 99: return "R_LARCH_32_PCREL";
+		case 100: return "R_LARCH_RELAX";
+		case 102: return "R_LARCH_ALIGN";
+		case 103: return "R_LARCH_PCREL20_S2";
+		case 105: return "R_LARCH_ADD6";
+		case 106: return "R_LARCH_SUB6";
+		case 107: return "R_LARCH_ADD_ULEB128";
+		case 108: return "R_LARCH_SUB_ULEB128";
+		case 109: return "R_LARCH_64_PCREL";
+		case 110: return "R_LARCH_CALL36";
+		case 111: return "R_LARCH_TLS_DESC_PC_HI20";
+		case 112: return "R_LARCH_TLS_DESC_PC_LO12";
+		case 113: return "R_LARCH_TLS_DESC64_PC_LO20";
+		case 114: return "R_LARCH_TLS_DESC64_PC_HI12";
+		case 115: return "R_LARCH_TLS_DESC_HI20";
+		case 116: return "R_LARCH_TLS_DESC_LO12";
+		case 117: return "R_LARCH_TLS_DESC64_LO20";
+		case 118: return "R_LARCH_TLS_DESC64_HI12";
+		case 119: return "R_LARCH_TLS_DESC_LD";
+		case 120: return "R_LARCH_TLS_DESC_CALL";
+		case 121: return "R_LARCH_TLS_LE_HI20_R";
+		case 122: return "R_LARCH_TLS_LE_ADD_R";
+		case 123: return "R_LARCH_TLS_LE_LO12_R";
+		case 124: return "R_LARCH_TLS_LD_PCREL20_S2";
+		case 125: return "R_LARCH_TLS_GD_PCREL20_S2";
+		case 126: return "R_LARCH_TLS_DESC_PCREL20_S2";
+		}
+		break;
 	case EM_S390:
 		switch (type) {
 		case 0: return "R_390_NONE";
diff --git a/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c b/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c
index 3f2c23708549..8aa9e1f90f44 100644
--- a/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c
+++ b/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c
@@ -340,6 +340,31 @@ struct _Elftc_Bfd_Target _libelftc_targets[] = {
 		.bt_osabi     = ELFOSABI_FREEBSD,
 	},
 
+	{
+		.bt_name      = "elf32-loongarch",
+		.bt_type      = ETF_ELF,
+		.bt_byteorder = ELFDATA2LSB,
+		.bt_elfclass  = ELFCLASS32,
+		.bt_machine   = EM_LOONGARCH,
+	},
+
+	{
+		.bt_name      = "elf64-loongarch",
+		.bt_type      = ETF_ELF,
+		.bt_byteorder = ELFDATA2LSB,
+		.bt_elfclass  = ELFCLASS64,
+		.bt_machine   = EM_LOONGARCH,
+	},
+
+	{
+		.bt_name      = "elf64-loongarch-freebsd",
+		.bt_type      = ETF_ELF,
+		.bt_byteorder = ELFDATA2LSB,
+		.bt_elfclass  = ELFCLASS64,
+		.bt_machine   = EM_LOONGARCH,
+		.bt_osabi     = ELFOSABI_FREEBSD,
+	},
+
 	{
 		.bt_name      = "elf64-sh64",
 		.bt_type      = ETF_ELF,
@@ -469,6 +494,12 @@ struct _Elftc_Bfd_Target _libelftc_targets[] = {
 		.bt_machine = EM_X86_64,
 	},
 
+	{
+		.bt_name    = "efi-app-loongarch64",
+		.bt_type    = ETF_EFI,
+		.bt_machine = EM_LOONGARCH,
+	},
+
 	{
 		.bt_name    = "pei-i386",
 		.bt_type    = ETF_PE,
diff --git a/contrib/elftoolchain/libpe/pe.h b/contrib/elftoolchain/libpe/pe.h
index 33969ed8a3e1..b2719d403518 100644
--- a/contrib/elftoolchain/libpe/pe.h
+++ b/contrib/elftoolchain/libpe/pe.h
@@ -81,6 +81,8 @@ typedef struct _PE_RichHdr {
 #define	IMAGE_FILE_MACHINE_EBC		0xebc	/* EFI byte code */
 #define	IMAGE_FILE_MACHINE_I386		0x14c	/* x86 */
 #define	IMAGE_FILE_MACHINE_IA64		0x200	/* IA64 */
+#define IMAGE_FILE_MACHINE_LOONGARCH32  0x6232  /* LoongArch 32-bit */
+#define IMAGE_FILE_MACHINE_LOONGARCH64  0x6264  /* LoongArch 64-bit */
 #define	IMAGE_FILE_MACHINE_M32R		0x9041	/* Mitsubishi M32R LE */
 #define	IMAGE_FILE_MACHINE_MIPS16	0x266	/* MIPS16 */
 #define	IMAGE_FILE_MACHINE_MIPSFPU	0x366	/* MIPS with FPU */