The branch main has been updated by imp:

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

commit 1ae6faf1645516bbb97eaf2a43d867b59b22309b
Author:     yu shan wei <mp...@vip.163.com>
AuthorDate: 2025-04-29 02:08:12 +0000
Commit:     Warner Losh <i...@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 <geha...@bitmoe.com>
    Co-authored-by: xiaoqiang zhao <zxq_yx_...@163.com>
    Signed-off-by: yu shan wei <mp...@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 */

Reply via email to