Browse Source

Add loongarch64 packages support

Jinyang He 2 years ago
parent
commit
7cde8df8c7

+ 10 - 1
packages/fcl-res/src/elfconsts.pp

@@ -23,7 +23,7 @@ type
   TElfMachineType = (emtnone, emtsparc, emti386, emtm68k, emtppc, emtppc64,
                      emtarm, emtarmeb, emtia64, emtx86_64, emtalpha,
                      emtmips, emtmipsel, emtppc64le, emtaarch64,
-                     emtriscv32, emtriscv64);
+                     emtriscv32, emtriscv64, emtloongarch64);
 const
   ELFMAGIC     = chr($7f)+'ELF';
 
@@ -75,6 +75,7 @@ const
   EM_AARCH64     = 183;
   EM_ALPHA       = $9026; //unofficial, but used by gnu toolchain
   EM_RISCV       = 243;
+  EM_LOONGARCH   = 258;
   
   //machine-specific flags
   EF_IA_64_ABI64 = $10;  //wow, this is really a 64-bit object file!
@@ -89,6 +90,13 @@ const
   EF_RISCV_FLOAT_ABI_SINGLE = 2;
   EF_RISCV_FLOAT_ABI_DOUBLE = 4;
 
+  // loongarch flags
+  EF_LOONGARCH_ABI_ILP32 = $1;
+  EF_LOONGARCH_ABI_LP64 = $3;
+  EF_LOONGARCH_FLOAT_ABI_SOFT = $c;
+  EF_LOONGARCH_FLOAT_ABI_SINGLE = $8;
+  EF_LOONGARCH_FLOAT_ABI_DOUBLE = $0;
+
   //section type
   SHT_NULL     =  0;
   SHT_PROGBITS =  1;
@@ -151,6 +159,7 @@ const
   R_MIPS_32       =   2;
   R_RISCV_32      =   1;
   R_RISCV_64      =   2;
+  R_LARCH_64      =   2;
 
 
   //fpc resource constants

+ 2 - 0
packages/fcl-res/src/elfreader.pp

@@ -294,6 +294,8 @@ begin
                     fMachineType:=emtriscv32
                   else
                     fMachineType:=emtriscv64;
+      EM_LOONGARCH : if fBits=ELFCLASS64 then
+                       fMachineType:=emtloongarch64;
     end;
   finally
     subreader.Free;

+ 3 - 0
packages/fcl-res/src/elfsubwriter.inc

@@ -431,6 +431,7 @@ begin
       {$ELSE}
       EM_RISCV  : begin RelocType:=R_RISCV_32;      SectionType:=SHT_RELA; end;
       {$ENDIF}
+      EM_LOONGARCH: begin RelocType:=R_LARCH_64;    SectionType:=SHT_RELA; end;
       else
         raise EElfResourceWriterUnknownMachineException.Create('');
     end;
@@ -448,6 +449,8 @@ begin
       fMachineFlags:=EF_RISCV_FLOAT_ABI_DOUBLE or EF_RISCV_RVC; // This is the default class for now;
     EM_ARM:
       fMachineFlags:=EF_ARM_ABI5;
+    EM_LOONGARCH:
+      fMachineFlags:=EF_LOONGARCH_ABI_LP64 or EF_LOONGARCH_FLOAT_ABI_DOUBLE;
     else
       fMachineFlags:=0;
   end;

+ 2 - 1
packages/fcl-res/src/elfwriter.pp

@@ -559,7 +559,8 @@ begin
     emtmips   : begin fMachineTypeInt:=EM_MIPS; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
     emtmipsel : begin fMachineTypeInt:=EM_MIPS; fBits:=ELFCLASS32; fOrder:=ELFDATA2LSB; end;
     emtriscv32: begin fMachineTypeInt:=EM_RISCV; fBits:=ELFCLASS32; fOrder:=ELFDATA2LSB; end;
-    emtriscv64: begin fMachineTypeInt:=EM_RISCV; fBits:=ELFCLASS64; fOrder:=ELFDATA2LSB; end
+    emtriscv64: begin fMachineTypeInt:=EM_RISCV; fBits:=ELFCLASS64; fOrder:=ELFDATA2LSB; end;
+    emtloongarch64: begin fMachineTypeInt:=EM_LOONGARCH; fBits:=ELFCLASS64; fOrder:=ELFDATA2LSB; end;
     else
       raise EElfResourceWriterUnknownMachineException.Create('');
   end;

+ 63 - 62
packages/fpmkunit/src/fpmkunit.pp

@@ -118,7 +118,7 @@ Type
   // Please keep this order, see OSCPUSupported below
   TCpu=(cpuNone,
     i386,m68k,powerpc,sparc,x86_64,arm,powerpc64,avr,armeb,
-    mips,mipsel,mips64,mips64el,jvm,i8086,aarch64,wasm32,sparc64,riscv32,riscv64,xtensa,z80
+    mips,mipsel,mips64,mips64el,jvm,i8086,aarch64,wasm32,sparc64,riscv32,riscv64,xtensa,z80,loongarch64
   );
   TCPUS = Set of TCPU;
 
@@ -194,53 +194,53 @@ Const
 
   { This table is kept OS,Cpu because it is easier to maintain (PFV) }
   OSCPUSupported : array[TOS,TCpu] of boolean = (
-    { os          none   i386    m68k  ppc    sparc  x86_64 arm    ppc64  avr    armeb  mips   mipsel mips64 mips64el jvm    i8086 aarch64 wasm32 sparc64 riscv32 riscv64  xtensa z80}
-    { none }    ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { linux }   ( false, true,  true,  true,  true,  true,  true,  true,  false, true , true , true , true , true ,   false, false, true , false, true ,  true ,  true,    true , false),
-    { go32v2 }  ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { win32 }   ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { os2 }     ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { freebsd } ( false, true,  true,  false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { beos }    ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { netbsd }  ( false, true,  true,  true,  true,  true,  true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { amiga }   ( false, false, true,  true,  false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { atari }   ( false, false, true,  false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { solaris } ( false, true,  false, false, true,  true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { qnx }     ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { netware } ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { openbsd } ( false, true,  true,  false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { wdosx }   ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { palmos }  ( false, false, true,  false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-{ macosclassic }( false, false, true,  true,  false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { darwin }  ( false, true,  false, true,  false, true,  false,  true, false, false, false, false, false, false,   false, false, true , false, false,  false,  false,   false, false),
-    { emx }     ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { watcom }  ( false, true,  false, false, false ,false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { morphos } ( false, false, false, true,  false ,false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { netwlibc }( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { win64   } ( false, false, false, false, false, true,  false, false, false, false, false, false, false, false,   false, false, true,  false, false,  false,  false,   false, false),
-    { wince    }( false, true,  false, false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { gba    }  ( false, false, false, false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { nds    }  ( false, false, false, false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { embedded }( false, true,  true,  true,  true,  true,  true,  true,  true,  true , false, true,  false, true,    false, true , false, true,  false,  true,   true,    true , false),
-    { symbian } ( false, true,  false, false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { haiku }   ( false, true,  false, false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { iphonesim}( false, true,  false, false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { aix    }  ( false, false, false, true,  false, false, false, true,  false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { java }    ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   true , false, false, false, false,  false,  false,   false, false),
-    { android } ( false, true,  false, false, false, true,  true,  false, false, false, false, true,  false, true,    true , false, true,  false, false,  false,  false,   false, false),
-    { nativent }( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { msdos }   ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, true , false, false, false,  false,  false,   false, false),
-    { wii }     ( false, false, false, true , false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { aros }    ( false, true,  false, false, false, true,  true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { dragonfly}( false, false, false, false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { win16 }   ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, true , false, false, false,  false,  false,   false, false),
-    { freertos }( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  true,   false,   true,  false),
-    {zxspectrum}( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, true ),
-    { msxdos }  ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, true ),
-    { ios }     ( false, false, false, false, false, false,  true, false, false, false, false, false, false, false,   false, false, true , false, false,  false,  false,   false, false),
-    {amstradcpc}( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, true ),
-    {sinclairql}( false, false, true,  false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false),
-    { wasi }    ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, true,  false,  false,  false,   false, false)
+    { os          none   i386    m68k  ppc    sparc  x86_64 arm    ppc64  avr    armeb  mips   mipsel mips64 mips64el jvm    i8086 aarch64 wasm32 sparc64 riscv32 riscv64  xtensa z80,   loongarch64}
+    { none }    ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { linux }   ( false, true,  true,  true,  true,  true,  true,  true,  false, true , true , true , true , true ,   false, false, true , false, true ,  true ,  true,    true , false, true),
+    { go32v2 }  ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { win32 }   ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { os2 }     ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { freebsd } ( false, true,  true,  false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { beos }    ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { netbsd }  ( false, true,  true,  true,  true,  true,  true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { amiga }   ( false, false, true,  true,  false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { atari }   ( false, false, true,  false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { solaris } ( false, true,  false, false, true,  true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { qnx }     ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { netware } ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { openbsd } ( false, true,  true,  false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { wdosx }   ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { palmos }  ( false, false, true,  false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+{ macosclassic }( false, false, true,  true,  false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { darwin }  ( false, true,  false, true,  false, true,  false,  true, false, false, false, false, false, false,   false, false, true , false, false,  false,  false,   false, false, false),
+    { emx }     ( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { watcom }  ( false, true,  false, false, false ,false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { morphos } ( false, false, false, true,  false ,false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { netwlibc }( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { win64   } ( false, false, false, false, false, true,  false, false, false, false, false, false, false, false,   false, false, true,  false, false,  false,  false,   false, false, false),
+    { wince    }( false, true,  false, false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { gba    }  ( false, false, false, false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { nds    }  ( false, false, false, false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { embedded }( false, true,  true,  true,  true,  true,  true,  true,  true,  true , false, true,  false, true,    false, true , false, true,  false,  true,   true,    true , false, false),
+    { symbian } ( false, true,  false, false, false, false, true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { haiku }   ( false, true,  false, false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { iphonesim}( false, true,  false, false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { aix    }  ( false, false, false, true,  false, false, false, true,  false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { java }    ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   true , false, false, false, false,  false,  false,   false, false, false),
+    { android } ( false, true,  false, false, false, true,  true,  false, false, false, false, true,  false, true,    true , false, true,  false, false,  false,  false,   false, false, false),
+    { nativent }( false, true,  false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { msdos }   ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, true , false, false, false,  false,  false,   false, false, false),
+    { wii }     ( false, false, false, true , false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { aros }    ( false, true,  false, false, false, true,  true,  false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { dragonfly}( false, false, false, false, false, true,  false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { win16 }   ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, true , false, false, false,  false,  false,   false, false, false),
+    { freertos }( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  true,   false,   true , false, false),
+    {zxspectrum}( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, true,  false),
+    { msxdos }  ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, true,  false),
+    { ios }     ( false, false, false, false, false, false,  true, false, false, false, false, false, false, false,   false, false, true , false, false,  false,  false,   false, false, false),
+    {amstradcpc}( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, true,  false),
+    {sinclairql}( false, false, true,  false, false, false, false, false, false, false, false, false, false, false,   false, false, false, false, false,  false,  false,   false, false, false),
+    { wasi }    ( false, false, false, false, false, false, false, false, false, false, false, false, false, false,   false, false, false, true,  false,  false,  false,   false, false, false)
   );
 
   // Useful
@@ -3053,20 +3053,21 @@ begin
     end
   else if OS = linux then
     case CPU of
-      i386:     result := GetGccDirArch('cpui386',['-m32']);
-      x86_64:   result := GetGccDirArch('cpux86_64',['-m64']);
-      powerpc:  result := GetGccDirArch('cpupowerpc',['-m32']);
-      powerpc64:result := GetGccDirArch('cpupowerpc64',['-m64']);
-      arm:      result := GetGccDirArch('cpuarm',['-marm','-march=armv2']);
-      aarch64:  result := GetGccDirArch('cpuaarch64',['-march=aarch64','-mcmodel=large']);
-      m68k:     result := GetGccDirArch('cpum68k',['-march=68020']);
-      mips:     result := GetGccDirArch('cpumips',['-mips32','-EB','-mabi=32']);
-      mipsel:   result := GetGccDirArch('cpumipsel',['-mips32','-EL','-mabi=32']);
-      riscv32:  result := GetGccDirArch('cpuriscv32',['-march=rv32imafdc']);
-      riscv64:  result := GetGccDirArch('cpuriscv64',['-march=rv64imafdc']);
-      sparc:    result := GetGccDirArch('cpusparc',['-m32']);
-      sparc64:  result := GetGccDirArch('cpusparc64',['-m64']);
-      xtensa:   result := GetGccDirArch('cpuxtensa',[]);
+      i386:         result := GetGccDirArch('cpui386',['-m32']);
+      x86_64:       result := GetGccDirArch('cpux86_64',['-m64']);
+      powerpc:      result := GetGccDirArch('cpupowerpc',['-m32']);
+      powerpc64:    result := GetGccDirArch('cpupowerpc64',['-m64']);
+      arm:          result := GetGccDirArch('cpuarm',['-marm','-march=armv2']);
+      aarch64:      result := GetGccDirArch('cpuaarch64',['-march=aarch64','-mcmodel=large']);
+      m68k:         result := GetGccDirArch('cpum68k',['-march=68020']);
+      mips:         result := GetGccDirArch('cpumips',['-mips32','-EB','-mabi=32']);
+      mipsel:       result := GetGccDirArch('cpumipsel',['-mips32','-EL','-mabi=32']);
+      riscv32:      result := GetGccDirArch('cpuriscv32',['-march=rv32imafdc']);
+      riscv64:      result := GetGccDirArch('cpuriscv64',['-march=rv64imafdc']);
+      sparc:        result := GetGccDirArch('cpusparc',['-m32']);
+      sparc64:      result := GetGccDirArch('cpusparc64',['-m64']);
+      xtensa:       result := GetGccDirArch('cpuxtensa',[]);
+      loongarch64:  result := GetGccDirArch('cpuloongarch64',[]);
     else
       ; // avoid compiler warning
     end {case}

+ 1 - 1
packages/gtk2/src/glib/glib2.pas

@@ -797,7 +797,7 @@ end;
 
 function g_rand_boolean(rand : PGRand) : gboolean;
 begin
-   g_rand_boolean:=((g_rand_int(rand)) and (1 shl 15)) <> 0;
+   g_rand_boolean:=g_rand_int(rand) <> 0;
 end;
 {
 function g_rand_boolean(rand : PGRand) :gboolean;

+ 3 - 0
packages/ide/fpmake.pp

@@ -285,6 +285,9 @@ begin
         if CompilerTarget = mipsel then
           P.Options.Add('-Fu'+CompilerDir+'/mips');
 
+        if CompilerTarget = loongarch64 then
+          P.Options.Add('-Fu'+CompilerDir+'/loongarch64');
+
         if llvm then
           begin
             P.Options.Add('-Fu'+CompilerDir+'/llvm');

+ 2 - 0
packages/libffi/src/ffi.pp

@@ -282,6 +282,8 @@ const
   FFI_TRAMPOLINE_SIZE = 56;
 {$elseif defined(CPUXTENSA)}
   FFI_TRAMPOLINE_SIZE = 24;
+{$elseif defined(CPULOONGARCH64)}
+  FFI_TRAMPOLINE_SIZE = 24;
 {$endif}
 
 {

+ 1 - 1
packages/rtl-extra/src/linux/unixsock.inc

@@ -13,7 +13,7 @@
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 }
 
-{$if not defined(cpux86_64) and not defined(cpuaarch64) and not defined(cpuriscv32) and not defined(cpuriscv64) and not defined(cpuxtensa) and not defined(NO_SYSCALL_SOCKETCALL)}
+{$if not defined(cpux86_64) and not defined(cpuaarch64) and not defined(cpuriscv32) and not defined(cpuriscv64) and not defined(cpuxtensa) and not defined(cpuloongarch64) and not defined(NO_SYSCALL_SOCKETCALL)}
   {$define NEED_SOCKETCALL}
 {$endif}
 

+ 1 - 1
packages/rtl-extra/src/unix/ipc.pp

@@ -888,7 +888,7 @@ uses Syscall;
 
 {$ifndef FPC_USE_LIBC}
  {$if defined(Linux)}
-  {$if defined(cpux86_64) or defined(cpuaarch64) or defined(cpuriscv32) or defined(cpuriscv64) or defined(cpuxtensa) or defined(NO_SYSCALL_IPC)}
+  {$if defined(cpux86_64) or defined(cpuaarch64) or defined(cpuriscv32) or defined(cpuriscv64) or defined(cpuxtensa) or defined(cpuloongarch64) or defined(NO_SYSCALL_IPC)}
     {$i ipcsys.inc}
   {$else}
     {$i ipccall.inc}

+ 56 - 0
packages/rtl-generics/src/generics.hashes.pas

@@ -1321,6 +1321,54 @@ end;
 
 {$endif CPUINTEL}
 
+{$ifdef CPULOONGARCH64}
+function crc32cloongarch(crc: cardinal; buf: Pointer; len: cardinal): cardinal; nostackframe; assembler;
+asm
+  nor $a0, $zero, $a0
+  beqz $a1, .Lret
+  beqz $a2, .Lret
+  andi $t0, $a1, 7
+  beqz $t0, .Lcrc1
+  xori $t0, $t0, 7
+.Lcrc0:
+  ld.b $t1, $a1, 0
+  addi.d $a1, $a1, 1
+  addi.d $t0, $t0, -1
+  addi.d $a2, $a2, -1
+  crcc.w.b.w $a0, $t1, $a0
+  beqz $a2, .Lret
+  bgez $t0, .Lcrc0
+.Lcrc1:
+  srli.d $t0, $a2, 3
+  andi $t1, $a2, 4
+  andi $t2, $a2, 2
+  andi $t3, $a2, 1
+  beqz $t0, .Lcrc3
+.Lcrc2:
+  ld.d $t4, $a1, 0
+  crcc.w.d.w $a0, $t4, $a0
+  addi.d $t0, $t0, -1
+  addi.d $a1, $a1, 8
+  bnez $t0, .Lcrc2
+.Lcrc3:
+  beqz $t1,.Lcrc4
+  ld.w $t4, $a1, 0
+  crcc.w.w.w $a0, $t4, $a0
+  addi.d $a1, $a1, 4
+.Lcrc4:
+  beqz $t2,.Lcrc5
+  ld.h $t4, $a1, 0
+  crcc.w.h.w $a0, $t4, $a0
+  addi.d $a1, $a1, 2
+.Lcrc5:
+  beqz $t3,.Lret
+  ld.b $t4, $a1, 0
+  crcc.w.b.w $a0, $t4, $a0
+.Lret:
+  nor $a0, $zero, $a0
+end;
+{$endif CPULOONGARCH64}
+
 var
   crc32ctab: array[0..{$ifdef PUREPASCAL}3{$else}7{$endif},byte] of cardinal;
 
@@ -1481,6 +1529,14 @@ begin
   end
   else
   {$endif CPUINTEL}
+  {$ifdef CPULOONGARCH64}
+  if True then
+  begin
+    crc32c := @crc32cloongarch;
+    mORMotHasher := @crc32cloongarch;
+  end
+  else
+  {$endif CPULOONGARCH64}
   begin
     InitializeCrc32ctab;
     crc32c := @crc32cfast;

+ 22 - 0
packages/rtl-objpas/src/inc/rtti.pp

@@ -1051,6 +1051,28 @@ asm
   .long RawThunkPlaceholderContext
 RawThunkEnd:
 end;
+{$elseif defined(cpuloongarch64)}
+const
+  RawThunkPlaceholderProc = $8765876587658765;
+  RawThunkPlaceholderContext = $4321432143214321;
+
+type
+  TRawThunkProc = PtrUInt;
+  TRawThunkContext = PtrUInt;
+
+procedure RawThunk; assembler; nostackframe;
+asm
+  move $t0, $ra
+  bl .Lreal
+  .quad RawThunkPlaceholderProc
+  .quad RawThunkPlaceholderContext
+.Lreal:
+  ld.d $a0, $ra, 8
+  ld.d $t1, $ra, 0
+  move $ra, $t0
+  jr $t1
+RawThunkEnd:
+end;
 {$endif}
 
 {$if declared(RawThunk)}

+ 1 - 0
utils/fpcres/fpcres.pas

@@ -263,6 +263,7 @@ begin
     mtaarch64 : Result.MachineType:=emtaarch64;
     mtriscv32 : Result.MachineType:=emtriscv32;
     mtriscv64 : Result.MachineType:=emtriscv64;
+    mtloongarch64 : Result.MachineType:=emtloongarch64;
   end;
 end;
 

+ 8 - 3
utils/fpcres/target.pas

@@ -23,7 +23,7 @@ interface
 type
   TMachineType = (mtnone, mti386,mtx86_64,mtppc,mtppc64,mtarm,mtarmeb,mtm68k,
                   mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
-                  mtriscv32,mtriscv64,
+                  mtriscv32,mtriscv64,mtloongarch64,
                   mtBigEndian,mtLittleEndian);
   TMachineTypes = set of TMachineType;
 
@@ -36,7 +36,7 @@ type
         (subarm: TSubMachineTypeArm);
       mtnone, mti386,mtx86_64,mtppc,mtppc64,mtm68k,
       mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
-      mtriscv32,mtriscv64,
+      mtriscv32,mtriscv64,mtloongarch64,
       mtBigEndian,mtLittleEndian:
         (subgen: TSubMachineTypeGeneric);
   end;
@@ -89,6 +89,7 @@ var
     (name : 'powerpc64le';  formats : [ofElf]),                   //mtppc64le
     (name : 'riscv32';      formats : [ofElf]),                   //mtriscv32
     (name : 'riscv64';      formats : [ofElf]),                   //mtriscv64
+    (name : 'loongarch64';  formats : [ofElf]),                   //mtloongarch64
     (name : 'bigendian';    formats : [ofExt]),                   //mtBigEndian
     (name : 'littleendian'; formats : [ofExt])                    //mtLittleEndian
   );
@@ -107,7 +108,8 @@ var
                                                      mtm68k,mtsparc,mtalpha,
                                                      mtia64,mtmips,mtmipsel,
                                                      mtppc64le,mtaarch64,
-                                                     mtriscv32,mtriscv64]),
+                                                     mtriscv32,mtriscv64,
+                                                     mtloongarch64]),
     (name : 'coff';     ext : '.o';      machines : [mti386,mtx86_64,mtarm,
                                                      mtaarch64,mtppc,mtppc64]),
     (name : 'xcoff';    ext : '.o';      machines : [mtppc{,mtppc64}]),
@@ -170,6 +172,9 @@ var
   {$elseif defined(CPURISCV64)}
     machine : mtriscv64;
     submachine : (subgen: smtgen_all);
+  {$elseif defined(CPULOONGARCH64)}
+    machine : mtloongarch64;
+    submachine : (subgen: smtgen_all);
   {$else}
     machine : mti386;  //default i386
     submachine : (subgen: smtgen_all);