diff options
Diffstat (limited to 'rtl')
44 files changed, 461 insertions, 11 deletions
diff --git a/rtl/Makefile b/rtl/Makefile index fd5ad7b82d..f674611cb9 100644 --- a/rtl/Makefile +++ b/rtl/Makefile @@ -912,10 +912,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif @@ -1523,7 +1531,7 @@ ifdef CREATESHARED override FPCOPT+=-Cg endif ifneq ($(findstring $(OS_TARGET),dragonfly freebsd openbsd netbsd linux solaris),) -ifneq ($(findstring $(CPU_TARGET),x86_64 mips mipsel),) +ifneq ($(findstring $(CPU_TARGET),x86_64 mips mipsel riscv64),) override FPCOPT+=-Cg endif endif diff --git a/rtl/aix/Makefile b/rtl/aix/Makefile index b42a8b6f8b..fcf9c0b289 100644 --- a/rtl/aix/Makefile +++ b/rtl/aix/Makefile @@ -2200,10 +2200,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/amiga/Makefile b/rtl/amiga/Makefile index b2aa554816..abefef6e2e 100644 --- a/rtl/amiga/Makefile +++ b/rtl/amiga/Makefile @@ -2514,10 +2514,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/android/Makefile b/rtl/android/Makefile index a821ab7477..588279ec22 100644 --- a/rtl/android/Makefile +++ b/rtl/android/Makefile @@ -2893,7 +2893,7 @@ endif ifeq ($(FULL_TARGET),z80-amstradcpc) override COMPILER_TARGETDIR+=. endif -override SHARED_LIBUNITS=$(SYSTEMUNIT) objpas strings dos unix baseunix unixtype unixutil sysutils typinfo math $(CPU_UNITS) getopts errors sockets sortbase classes fgl sysconst rtlconsts +override SHARED_LIBUNITS=$(SYSTEMUNIT) objpas strings dos unix baseunix unixtype unixutil sysutils typinfo math $(CPU_UNITS) getopts errors sockets sortbase classes fgl sysconst rtlconsts ifdef REQUIRE_UNITSDIR override UNITSDIR+=$(REQUIRE_UNITSDIR) endif @@ -3143,10 +3143,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/android/jvm/Makefile b/rtl/android/jvm/Makefile index 8f94b9a9af..6a42f30a57 100644 --- a/rtl/android/jvm/Makefile +++ b/rtl/android/jvm/Makefile @@ -1556,10 +1556,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/aros/Makefile b/rtl/aros/Makefile index 8cd0a2f9b5..0c0b595b58 100644 --- a/rtl/aros/Makefile +++ b/rtl/aros/Makefile @@ -2508,10 +2508,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/atari/Makefile b/rtl/atari/Makefile index 259c023e2d..1ba07a7167 100644 --- a/rtl/atari/Makefile +++ b/rtl/atari/Makefile @@ -2502,10 +2502,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/beos/Makefile b/rtl/beos/Makefile index dd8d179a88..a3a36ff2e2 100644 --- a/rtl/beos/Makefile +++ b/rtl/beos/Makefile @@ -2817,10 +2817,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/darwin/Makefile b/rtl/darwin/Makefile index db0cb98a43..5240dfc177 100644 --- a/rtl/darwin/Makefile +++ b/rtl/darwin/Makefile @@ -2204,10 +2204,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/dragonfly/Makefile b/rtl/dragonfly/Makefile index 60af0f32be..7f56af4881 100644 --- a/rtl/dragonfly/Makefile +++ b/rtl/dragonfly/Makefile @@ -2514,10 +2514,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/embedded/Makefile b/rtl/embedded/Makefile index acb5650df5..a27dfb032d 100644 --- a/rtl/embedded/Makefile +++ b/rtl/embedded/Makefile @@ -2041,10 +2041,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/emx/Makefile b/rtl/emx/Makefile index 4b87a872a9..95420fcce3 100644 --- a/rtl/emx/Makefile +++ b/rtl/emx/Makefile @@ -2506,10 +2506,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/freebsd/Makefile b/rtl/freebsd/Makefile index 68c7398d66..471da7dbb1 100644 --- a/rtl/freebsd/Makefile +++ b/rtl/freebsd/Makefile @@ -2519,10 +2519,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/freertos/Makefile b/rtl/freertos/Makefile index c861506a2e..3d2eb2c559 100644 --- a/rtl/freertos/Makefile +++ b/rtl/freertos/Makefile @@ -2355,10 +2355,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/gba/Makefile b/rtl/gba/Makefile index b15a524c4e..1dd205578d 100644 --- a/rtl/gba/Makefile +++ b/rtl/gba/Makefile @@ -2188,10 +2188,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/go32v2/Makefile b/rtl/go32v2/Makefile index ac215f6715..a728761e3a 100644 --- a/rtl/go32v2/Makefile +++ b/rtl/go32v2/Makefile @@ -2507,10 +2507,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/haiku/Makefile b/rtl/haiku/Makefile index b71195983d..435bb6e89b 100644 --- a/rtl/haiku/Makefile +++ b/rtl/haiku/Makefile @@ -2825,10 +2825,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/java/Makefile b/rtl/java/Makefile index 0bf77b9247..97299656c6 100644 --- a/rtl/java/Makefile +++ b/rtl/java/Makefile @@ -1560,10 +1560,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/linux/Makefile b/rtl/linux/Makefile index c8bcf0f398..7f5531f0b0 100644 --- a/rtl/linux/Makefile +++ b/rtl/linux/Makefile @@ -382,7 +382,7 @@ SYSINIT_UNITS=si_prc si_dll si_c endif ifeq ($(ARCH),riscv64) override LOADERS= -SYSINIT_UNITS=si_prc si_dll si_c +SYSINIT_UNITS=si_prc si_dll si_c si_g endif ifeq ($(ARCH),mipsel) override FPCOPT+=-Ur @@ -3177,10 +3177,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif @@ -3788,7 +3796,7 @@ ifdef CREATESHARED override FPCOPT+=-Cg endif ifneq ($(findstring $(OS_TARGET),dragonfly freebsd openbsd netbsd linux solaris),) -ifneq ($(findstring $(CPU_TARGET),x86_64 mips mipsel),) +ifneq ($(findstring $(CPU_TARGET),x86_64 mips mipsel riscv64),) override FPCOPT+=-Cg endif endif diff --git a/rtl/linux/Makefile.fpc b/rtl/linux/Makefile.fpc index 310d467d84..fca8b2ef55 100644 --- a/rtl/linux/Makefile.fpc +++ b/rtl/linux/Makefile.fpc @@ -98,7 +98,7 @@ endif ifeq ($(ARCH),riscv64) override LOADERS= -SYSINIT_UNITS=si_prc si_dll si_c +SYSINIT_UNITS=si_prc si_dll si_c si_g endif # mipsel reuses mips files by including so some file names exist diff --git a/rtl/linux/riscv64/si_c.inc b/rtl/linux/riscv64/si_c.inc index 942372e934..87dcd050b6 100644 --- a/rtl/linux/riscv64/si_c.inc +++ b/rtl/linux/riscv64/si_c.inc @@ -16,11 +16,7 @@ ******************************************************************************} var - dlexitproc : pointer; - -var BSS_START: record end; external name '__bss_start'; - STACK_PTR: record end; external name '__stkptr'; { as we do not call these procedures directly, calling conventions do not matter and even if we did, we use c calling conventions anyways } @@ -53,7 +49,7 @@ procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; .option push .option norelax .L1: - auipc gp, %pcrel_hi(BSS_START+0x7f8) + auipc gp, %pcrel_hi(BSS_START+0x800) addi gp, gp, %pcrel_lo(.L1) .option pop @@ -89,7 +85,7 @@ procedure _FPC_proc_haltproc(e:longint); cdecl; public name '_haltproc'; .option push .option norelax .L1: - auipc gp, %pcrel_hi(BSS_START+0x7f8) + auipc gp, %pcrel_hi(BSS_START+0x800) addi gp, gp, %pcrel_lo(.L1) .option pop jalr x0, x1 diff --git a/rtl/linux/riscv64/si_g.inc b/rtl/linux/riscv64/si_g.inc new file mode 100644 index 0000000000..64131f8948 --- /dev/null +++ b/rtl/linux/riscv64/si_g.inc @@ -0,0 +1,106 @@ +{ + This file is part of the Free Pascal run time library. + Copyright (c) 2019 by Jeppe Johansen. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} + +{****************************************************************************** + Process start/halt + ******************************************************************************} +{$linklib c} +{$linklib gcc} + +var + BSS_START: record end; external name '__bss_start'; + _etext: pointer; external name '_etext'; + +{ as we do not call these procedures directly, calling conventions do not matter and + even if we did, we use c calling conventions anyways } +procedure __libc_csu_init; external name '__libc_csu_init'; +procedure __libc_csu_fini; external name '__libc_csu_fini'; + +procedure libc_start_main(main: TProcedure; argc: ptruint; argv: ppchar; init, fini, rtld_fini: TProcedure; stack_end: pointer); cdecl; external name '__libc_start_main'; +procedure libc_exit(code: ptruint); cdecl; external name 'exit'; + +procedure monstartup(low_pc,high_pc: pointer); cdecl; external; +procedure _mcleanup; cdecl; external; +procedure atexit(p: pointer); cdecl; external; + +procedure _FPC_rv_enter(at_exit: TProcedure; sp: pptruint); + var + argc: ptruint; + argv: ppchar; + begin + argc:=sp[0]; + argv:=@sp[1]; + + initialstkptr:=sp; + operatingsystem_parameter_argc:=argc; + operatingsystem_parameter_argv:=argv; + operatingsystem_parameter_envp:=@sp[argc+2]; + + monstartup(@_FPC_rv_enter,@_etext); + atexit(@_mcleanup); + + libc_start_main(@PascalMain, argc, argv, @__libc_csu_init, @__libc_csu_fini, at_exit, sp); + end; + + +procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; + asm + { set up GP } + .option push + .option norelax +.L1: + auipc gp, %pcrel_hi(BSS_START+0x800) + addi gp, gp, %pcrel_lo(.L1) + .option pop + + { Initialise FP to zero } + addi fp, x0, 0 + + { atexit is in a0 } + addi a1, sp, 0 + jal x1, _FPC_rv_enter + end; + + +procedure _FPC_rv_exit(e:longint); assembler; nostackframe; + asm + addi a7, x0, 94 + ecall + end; + + +procedure _FPC_proc_haltproc(e:longint); cdecl; public name '_haltproc'; + begin + while true do + begin + libc_exit(e); + _FPC_rv_exit(e); + end; + end; + + + procedure initgp; assembler; nostackframe; + asm + .Linitgp: + .option push + .option norelax + .L1: + auipc gp, %pcrel_hi(BSS_START+0x800) + addi gp, gp, %pcrel_lo(.L1) + .option pop + jalr x0, x1 + + .section ".preinit_array","aw" + .dc.a .Linitgp + .text + end; diff --git a/rtl/macos/Makefile b/rtl/macos/Makefile index 5681fbefaf..6634aa920d 100644 --- a/rtl/macos/Makefile +++ b/rtl/macos/Makefile @@ -2191,10 +2191,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/morphos/Makefile b/rtl/morphos/Makefile index 76951f4959..2c21fb610e 100644 --- a/rtl/morphos/Makefile +++ b/rtl/morphos/Makefile @@ -2189,10 +2189,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/msdos/Makefile b/rtl/msdos/Makefile index 742e6201cc..b644658c6f 100644 --- a/rtl/msdos/Makefile +++ b/rtl/msdos/Makefile @@ -2189,10 +2189,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/msxdos/Makefile b/rtl/msxdos/Makefile index e39ff445a4..c462acc711 100644 --- a/rtl/msxdos/Makefile +++ b/rtl/msxdos/Makefile @@ -1874,10 +1874,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/nativent/Makefile b/rtl/nativent/Makefile index 70ef9d1b94..8f7148bed8 100644 --- a/rtl/nativent/Makefile +++ b/rtl/nativent/Makefile @@ -2197,10 +2197,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/nds/Makefile b/rtl/nds/Makefile index 3199fa41d2..c215edb37d 100644 --- a/rtl/nds/Makefile +++ b/rtl/nds/Makefile @@ -2188,10 +2188,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/netbsd/Makefile b/rtl/netbsd/Makefile index e9d7e101ec..b6d37d8b65 100644 --- a/rtl/netbsd/Makefile +++ b/rtl/netbsd/Makefile @@ -2516,10 +2516,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/netware/Makefile b/rtl/netware/Makefile index 9e7ed8f7b5..98de96a64b 100644 --- a/rtl/netware/Makefile +++ b/rtl/netware/Makefile @@ -2510,10 +2510,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/netwlibc/Makefile b/rtl/netwlibc/Makefile index 501176d8f7..981ba89934 100644 --- a/rtl/netwlibc/Makefile +++ b/rtl/netwlibc/Makefile @@ -2503,10 +2503,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/openbsd/Makefile b/rtl/openbsd/Makefile index 20f26e26e4..ff9a8e5bf5 100644 --- a/rtl/openbsd/Makefile +++ b/rtl/openbsd/Makefile @@ -2521,10 +2521,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/os2/Makefile b/rtl/os2/Makefile index a4c66cfa71..1abba18e7a 100644 --- a/rtl/os2/Makefile +++ b/rtl/os2/Makefile @@ -2506,10 +2506,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/palmos/Makefile b/rtl/palmos/Makefile index b649c56ed6..24dc3ab881 100644 --- a/rtl/palmos/Makefile +++ b/rtl/palmos/Makefile @@ -2187,10 +2187,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/solaris/Makefile b/rtl/solaris/Makefile index 623b1989cd..159a83f1d2 100644 --- a/rtl/solaris/Makefile +++ b/rtl/solaris/Makefile @@ -2200,10 +2200,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/symbian/Makefile b/rtl/symbian/Makefile index 5eccbbe1c8..9c0a7643ab 100644 --- a/rtl/symbian/Makefile +++ b/rtl/symbian/Makefile @@ -1870,10 +1870,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/unix/cthreads.pp b/rtl/unix/cthreads.pp index fe7ce7cfc9..58eab49fc1 100644 --- a/rtl/unix/cthreads.pp +++ b/rtl/unix/cthreads.pp @@ -116,41 +116,69 @@ Type PINTRTLEvent = ^TINTRTLEvent; procedure CInitThreadvar(var offset : dword;size : dword); begin {$ifdef cpusparc} + {$define threadvarblocksize_set} threadvarblocksize:=align(threadvarblocksize,16); {$endif cpusparc} {$ifdef cpusparc64} + {$define threadvarblocksize_set} threadvarblocksize:=align(threadvarblocksize,16); {$endif cpusparc64} {$ifdef cpupowerpc} + {$define threadvarblocksize_set} threadvarblocksize:=align(threadvarblocksize,8); {$endif cpupowerc} {$ifdef cpui386} + {$define threadvarblocksize_set} threadvarblocksize:=align(threadvarblocksize,8); {$endif cpui386} {$ifdef cpuarm} + {$define threadvarblocksize_set} threadvarblocksize:=align(threadvarblocksize,4); {$endif cpuarm} {$ifdef cpum68k} + {$define threadvarblocksize_set} threadvarblocksize:=align(threadvarblocksize,2); {$endif cpum68k} {$ifdef cpux86_64} + {$define threadvarblocksize_set} threadvarblocksize:=align(threadvarblocksize,16); {$endif cpux86_64} {$ifdef cpupowerpc64} + {$define threadvarblocksize_set} threadvarblocksize:=align(threadvarblocksize,16); {$endif cpupowerpc64} {$ifdef cpuaarch64} + {$define threadvarblocksize_set} threadvarblocksize:=align(threadvarblocksize,16); {$endif cpuaarch64} + {$ifdef cpuriscv} + {$define threadvarblocksize_set} + threadvarblocksize:=align(threadvarblocksize,16); + {$endif cpuriscv} + + {$ifdef cpumips} + {$define threadvarblocksize_set} + threadvarblocksize:=align(threadvarblocksize,16); + {$endif cpumips} + + {$ifdef cpuxtensa} + {$define threadvarblocksize_set} + threadvarblocksize:=align(threadvarblocksize,16); + {$endif cpuxtensa} + + {$ifndef threadvarblocksize_set} + {$error threadvarblocksize must be set! } + {$endif threadvarblocksize_set} + offset:=threadvarblocksize; inc(threadvarblocksize,size); diff --git a/rtl/watcom/Makefile b/rtl/watcom/Makefile index 9a8bd17a86..0d6bf3300f 100644 --- a/rtl/watcom/Makefile +++ b/rtl/watcom/Makefile @@ -2505,10 +2505,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/wii/Makefile b/rtl/wii/Makefile index 589103d26a..25f8f2713d 100644 --- a/rtl/wii/Makefile +++ b/rtl/wii/Makefile @@ -1873,10 +1873,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/win16/Makefile b/rtl/win16/Makefile index a8c7490a16..53c74158fd 100644 --- a/rtl/win16/Makefile +++ b/rtl/win16/Makefile @@ -1874,10 +1874,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/win32/Makefile b/rtl/win32/Makefile index 31d8b8dcf6..78237537b0 100644 --- a/rtl/win32/Makefile +++ b/rtl/win32/Makefile @@ -2503,10 +2503,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/win64/Makefile b/rtl/win64/Makefile index c7f4201f3a..809855dc2d 100644 --- a/rtl/win64/Makefile +++ b/rtl/win64/Makefile @@ -2507,10 +2507,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/wince/Makefile b/rtl/wince/Makefile index daddf45623..0555280094 100644 --- a/rtl/wince/Makefile +++ b/rtl/wince/Makefile @@ -1876,10 +1876,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif diff --git a/rtl/zxspectrum/Makefile b/rtl/zxspectrum/Makefile index c24011ad87..98c64fb8bc 100644 --- a/rtl/zxspectrum/Makefile +++ b/rtl/zxspectrum/Makefile @@ -1559,10 +1559,18 @@ else ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),mips mipsel),) FPCMAKE_CROSSGCCOPT=-mabi=32 else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv64),) +FPCMAKE_CROSSGCCOPT=-mabi=lp64 +else +ifneq ($(findstring $(FPCFPMAKE_CPU_OPT),riscv32),) +FPCMAKE_CROSSGCCOPT=-mabi=ilp32 +else FPCMAKE_CROSSGCCOPT=-m32 endif endif endif +endif +endif FPCMAKEGCCLIBDIR:=$(shell dirname `gcc $(FPCMAKE_CROSSGCCOPT) -print-libgcc-file-name`) endif endif |