mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 18:49:16 +02:00
Update packages with information about RiscV.
Fix g_external_wrapper, since it uses a register. Fixed calling of gas. Ported cprt0. git-svn-id: branches/laksen/riscv_new@39475 -
This commit is contained in:
parent
ceb38833f2
commit
6352328f3a
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -10315,6 +10315,7 @@ rtl/qnx/qnx.inc svneol=native#text/plain
|
|||||||
rtl/qnx/rtldefs.inc svneol=native#text/plain
|
rtl/qnx/rtldefs.inc svneol=native#text/plain
|
||||||
rtl/qnx/signal.inc svneol=native#text/plain
|
rtl/qnx/signal.inc svneol=native#text/plain
|
||||||
rtl/qnx/system.pp svneol=native#text/plain
|
rtl/qnx/system.pp svneol=native#text/plain
|
||||||
|
rtl/riscv32/cpuh.inc svneol=native#text/plain
|
||||||
rtl/riscv32/int64p.inc svneol=native#text/plain
|
rtl/riscv32/int64p.inc svneol=native#text/plain
|
||||||
rtl/riscv32/makefile.cpu svneol=native#text/plain
|
rtl/riscv32/makefile.cpu svneol=native#text/plain
|
||||||
rtl/riscv32/math.inc svneol=native#text/plain
|
rtl/riscv32/math.inc svneol=native#text/plain
|
||||||
@ -10324,6 +10325,7 @@ rtl/riscv32/setjump.inc svneol=native#text/plain
|
|||||||
rtl/riscv32/setjumph.inc svneol=native#text/plain
|
rtl/riscv32/setjumph.inc svneol=native#text/plain
|
||||||
rtl/riscv32/strings.inc svneol=native#text/plain
|
rtl/riscv32/strings.inc svneol=native#text/plain
|
||||||
rtl/riscv32/stringss.inc svneol=native#text/plain
|
rtl/riscv32/stringss.inc svneol=native#text/plain
|
||||||
|
rtl/riscv64/cpuh.inc svneol=native#text/plain
|
||||||
rtl/riscv64/int64p.inc svneol=native#text/plain
|
rtl/riscv64/int64p.inc svneol=native#text/plain
|
||||||
rtl/riscv64/makefile.cpu svneol=native#text/plain
|
rtl/riscv64/makefile.cpu svneol=native#text/plain
|
||||||
rtl/riscv64/math.inc svneol=native#text/plain
|
rtl/riscv64/math.inc svneol=native#text/plain
|
||||||
|
@ -85,6 +85,12 @@ endif
|
|||||||
ifeq ($(CPU_TARGET),aarch64)
|
ifeq ($(CPU_TARGET),aarch64)
|
||||||
PPSUF=a64
|
PPSUF=a64
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(CPU_TARGET),riscv32)
|
||||||
|
PPSUF=rv32
|
||||||
|
endif
|
||||||
|
ifeq ($(CPU_TARGET),riscv64)
|
||||||
|
PPSUF=rv64
|
||||||
|
endif
|
||||||
|
|
||||||
# cross compilers uses full cpu_target, not just ppc-suffix
|
# cross compilers uses full cpu_target, not just ppc-suffix
|
||||||
# (except if the target cannot run a native compiler)
|
# (except if the target cannot run a native compiler)
|
||||||
|
@ -32,7 +32,7 @@ fpcdir=..
|
|||||||
unexport FPC_VERSION FPC_COMPILERINFO
|
unexport FPC_VERSION FPC_COMPILERINFO
|
||||||
|
|
||||||
# Which platforms are ready for inclusion in the cycle
|
# Which platforms are ready for inclusion in the cycle
|
||||||
CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb mipsel mips avr jvm i8086 aarch64 sparc64
|
CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb mipsel mips avr jvm i8086 aarch64 sparc64 riscv32 riscv64
|
||||||
|
|
||||||
# All supported targets used for clean
|
# All supported targets used for clean
|
||||||
ALLTARGETS=$(CYCLETARGETS)
|
ALLTARGETS=$(CYCLETARGETS)
|
||||||
@ -83,6 +83,12 @@ endif
|
|||||||
ifdef AARCH64
|
ifdef AARCH64
|
||||||
PPC_TARGET=aarch64
|
PPC_TARGET=aarch64
|
||||||
endif
|
endif
|
||||||
|
ifdef RISCV32
|
||||||
|
PPC_TARGET=riscv32
|
||||||
|
endif
|
||||||
|
ifdef RISCV64
|
||||||
|
PPC_TARGET=riscv64
|
||||||
|
endif
|
||||||
|
|
||||||
# Default is to generate a compiler for the same
|
# Default is to generate a compiler for the same
|
||||||
# platform as CPU_TARGET (a native compiler)
|
# platform as CPU_TARGET (a native compiler)
|
||||||
@ -213,6 +219,12 @@ endif
|
|||||||
ifeq ($(CPC_TARGET),aarch64)
|
ifeq ($(CPC_TARGET),aarch64)
|
||||||
CPUSUF=a64
|
CPUSUF=a64
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(CPC_TARGET),riscv32)
|
||||||
|
CPUSUF=rv32
|
||||||
|
endif
|
||||||
|
ifeq ($(CPC_TARGET),riscv64)
|
||||||
|
CPUSUF=rv64
|
||||||
|
endif
|
||||||
|
|
||||||
# Do not define the default -d$(CPU_TARGET) because that
|
# Do not define the default -d$(CPU_TARGET) because that
|
||||||
# will conflict with our -d$(CPC_TARGET)
|
# will conflict with our -d$(CPC_TARGET)
|
||||||
@ -315,6 +327,16 @@ ifeq ($(PPC_TARGET),i8086)
|
|||||||
override LOCALOPT+=-Fux86
|
override LOCALOPT+=-Fux86
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# RiscV32 specific
|
||||||
|
ifeq ($(PPC_TARGET),riscv32)
|
||||||
|
override LOCALOPT+=-Furiscv
|
||||||
|
endif
|
||||||
|
|
||||||
|
# RiscV64 specific
|
||||||
|
ifeq ($(PPC_TARGET),riscv64)
|
||||||
|
override LOCALOPT+=-Furiscv
|
||||||
|
endif
|
||||||
|
|
||||||
OPTWPOCOLLECT=-OWdevirtcalls,optvmts -FW$(BASEDIR)/pp1.wpo
|
OPTWPOCOLLECT=-OWdevirtcalls,optvmts -FW$(BASEDIR)/pp1.wpo
|
||||||
OPTWPOPERFORM=-Owdevirtcalls,optvmts -Fw$(BASEDIR)/pp1.wpo
|
OPTWPOPERFORM=-Owdevirtcalls,optvmts -Fw$(BASEDIR)/pp1.wpo
|
||||||
# symbol liveness WPO requires nm, smart linking and no stripping (the latter
|
# symbol liveness WPO requires nm, smart linking and no stripping (the latter
|
||||||
@ -432,7 +454,7 @@ endif
|
|||||||
# CPU targets
|
# CPU targets
|
||||||
#####################################################################
|
#####################################################################
|
||||||
|
|
||||||
PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 mips mipsel avr jvm i8086 aarch64 sparc64
|
PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 mips mipsel avr jvm i8086 aarch64 sparc64 riscv32 riscv64
|
||||||
INSTALL_TARGETS=$(addsuffix _exe_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
INSTALL_TARGETS=$(addsuffix _exe_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
||||||
SYMLINKINSTALL_TARGETS=$(addsuffix _symlink_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
SYMLINKINSTALL_TARGETS=$(addsuffix _symlink_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
||||||
|
|
||||||
@ -802,7 +824,7 @@ ifeq ($(OS_SOURCE),win64)
|
|||||||
EXCLUDE_80BIT_TARGETS=1
|
EXCLUDE_80BIT_TARGETS=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring $(CPU_SOURCE),aarch64 arm avr jvm m68k mips mipsel powerpc powerpc64 sparc sparc64),)
|
ifneq ($(findstring $(CPU_SOURCE),aarch64 arm avr jvm m68k mips mipsel powerpc powerpc64 sparc sparc64 riscv32 riscv64),)
|
||||||
EXCLUDE_80BIT_TARGETS=1
|
EXCLUDE_80BIT_TARGETS=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -212,11 +212,7 @@ unit agrvgas;
|
|||||||
function TRVGNUAssembler.MakeCmdLine: TCmdStr;
|
function TRVGNUAssembler.MakeCmdLine: TCmdStr;
|
||||||
begin
|
begin
|
||||||
result := inherited MakeCmdLine;
|
result := inherited MakeCmdLine;
|
||||||
{$ifdef cpu64bitaddr}
|
Replace(result,'$ARCH',lower(cputypestr[current_settings.cputype]));
|
||||||
Replace(result,'$ARCH','-m64')
|
|
||||||
{$else cpu64bitaddr}
|
|
||||||
Replace(result,'$ARCH','-m32');
|
|
||||||
{$endif cpu64bitaddr}
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -227,7 +223,7 @@ unit agrvgas;
|
|||||||
|
|
||||||
idtxt : 'AS';
|
idtxt : 'AS';
|
||||||
asmbin : 'as';
|
asmbin : 'as';
|
||||||
asmcmd : '-o $OBJ $EXTRAOPT $ARCH $ASM';
|
asmcmd : '-o $OBJ $EXTRAOPT -march=$ARCH $ASM';
|
||||||
supported_targets : [system_riscv32_linux,system_riscv64_linux];
|
supported_targets : [system_riscv32_linux,system_riscv64_linux];
|
||||||
flags : [af_needar,af_smartlink_sections];
|
flags : [af_needar,af_smartlink_sections];
|
||||||
labelprefix : '.L';
|
labelprefix : '.L';
|
||||||
|
@ -34,11 +34,15 @@ uses
|
|||||||
cgbase,cgutils,hlcgobj,hlcg2ll, parabase;
|
cgbase,cgutils,hlcgobj,hlcg2ll, parabase;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
{ thlcgriscv }
|
||||||
|
|
||||||
thlcgriscv = class(thlcg2ll)
|
thlcgriscv = class(thlcg2ll)
|
||||||
protected
|
protected
|
||||||
procedure a_load_subsetref_regs_noindex(list: TAsmList; subsetsize: tdef; loadbitsize: byte; const sref: tsubsetreference; valuereg, extra_value_reg: tregister); override;
|
procedure a_load_subsetref_regs_noindex(list: TAsmList; subsetsize: tdef; loadbitsize: byte; const sref: tsubsetreference; valuereg, extra_value_reg: tregister); override;
|
||||||
public
|
public
|
||||||
procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
|
procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
|
||||||
|
procedure g_external_wrapper(list: TAsmList; procdef: tprocdef; const wrappername, externalname: string; global: boolean); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -213,5 +217,44 @@ implementation
|
|||||||
list.concat(Tai_symbol_end.Createname(labelname));
|
list.concat(Tai_symbol_end.Createname(labelname));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure thlcgriscv.g_external_wrapper(list: TAsmList; procdef: tprocdef; const wrappername, externalname: string; global: boolean);
|
||||||
|
var
|
||||||
|
sym: tasmsymbol;
|
||||||
|
ai: taicpu;
|
||||||
|
href: treference;
|
||||||
|
tmpreg: TRegister;
|
||||||
|
l: TAsmLabel;
|
||||||
|
begin
|
||||||
|
maybe_new_object_file(list);
|
||||||
|
new_section(list,sec_code,wrappername,target_info.alignment.procalign);
|
||||||
|
if global then
|
||||||
|
begin
|
||||||
|
sym:=current_asmdata.DefineAsmSymbol(wrappername,AB_GLOBAL,AT_FUNCTION,procdef);
|
||||||
|
list.concat(Tai_symbol.Create_global(sym,0));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
sym:=current_asmdata.DefineAsmSymbol(wrappername,AB_LOCAL,AT_FUNCTION,procdef);
|
||||||
|
list.concat(Tai_symbol.Create(sym,0));
|
||||||
|
end;
|
||||||
|
|
||||||
|
reference_reset_symbol(href,current_asmdata.RefAsmSymbol(externalname,AT_FUNCTION),0,0,[]);
|
||||||
|
|
||||||
|
tmpreg:=NR_X5;
|
||||||
|
|
||||||
|
current_asmdata.getjumplabel(l);
|
||||||
|
a_label(list,l);
|
||||||
|
|
||||||
|
href.refaddr:=addr_pcrel_hi20;
|
||||||
|
list.concat(taicpu.op_reg_ref(A_AUIPC,tmpreg,href));
|
||||||
|
reference_reset_symbol(href,l,0,0,[]);
|
||||||
|
href.refaddr:=addr_pcrel_lo12;
|
||||||
|
ai:=taicpu.op_reg_reg_ref(A_JALR,NR_X0,tmpreg,href);
|
||||||
|
ai.is_jmp:=true;
|
||||||
|
list.concat(ai);
|
||||||
|
|
||||||
|
list.concat(Tai_symbol_end.Create(sym));
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -31,6 +31,9 @@ unit cpunode;
|
|||||||
{ generic nodes }
|
{ generic nodes }
|
||||||
ncgbas,ncgld,ncgflw,ncgcnv,ncgmem,ncgcon,ncgcal,ncgset,ncginl,ncgopt,
|
ncgbas,ncgld,ncgflw,ncgcnv,ncgmem,ncgcon,ncgcal,ncgset,ncginl,ncgopt,
|
||||||
ncgobjc,
|
ncgobjc,
|
||||||
|
{ symtable }
|
||||||
|
symcpu,
|
||||||
|
aasmdef,
|
||||||
{ to be able to only parts of the generic code,
|
{ to be able to only parts of the generic code,
|
||||||
the processor specific nodes must be included
|
the processor specific nodes must be included
|
||||||
after the generic one (FK)
|
after the generic one (FK)
|
||||||
|
@ -32,7 +32,8 @@ uses
|
|||||||
ncgbas, ncgld, ncgflw, ncgcnv, ncgmem, ncgcon, ncgcal, ncgset, ncginl, ncgopt,
|
ncgbas, ncgld, ncgflw, ncgcnv, ncgmem, ncgcon, ncgcal, ncgset, ncginl, ncgopt,
|
||||||
ncgobjc,
|
ncgobjc,
|
||||||
{ symtable }
|
{ symtable }
|
||||||
symcpu,
|
symcpu,
|
||||||
|
aasmdef,
|
||||||
{ to be able to only parts of the generic code,
|
{ to be able to only parts of the generic code,
|
||||||
the processor specific nodes must be included
|
the processor specific nodes must be included
|
||||||
after the generic one (FK)
|
after the generic one (FK)
|
||||||
|
@ -110,7 +110,7 @@ Type
|
|||||||
// Please keep this order, see OSCPUSupported below
|
// Please keep this order, see OSCPUSupported below
|
||||||
TCpu=(cpuNone,
|
TCpu=(cpuNone,
|
||||||
i386,m68k,powerpc,sparc,x86_64,arm,powerpc64,avr,armeb,
|
i386,m68k,powerpc,sparc,x86_64,arm,powerpc64,avr,armeb,
|
||||||
mips,mipsel,jvm,i8086,aarch64,sparc64
|
mips,mipsel,jvm,i8086,aarch64,sparc64,riscv32,riscv64
|
||||||
);
|
);
|
||||||
TCPUS = Set of TCPU;
|
TCPUS = Set of TCPU;
|
||||||
|
|
||||||
@ -185,46 +185,46 @@ Const
|
|||||||
|
|
||||||
{ This table is kept OS,Cpu because it is easier to maintain (PFV) }
|
{ This table is kept OS,Cpu because it is easier to maintain (PFV) }
|
||||||
OSCPUSupported : array[TOS,TCpu] of boolean = (
|
OSCPUSupported : array[TOS,TCpu] of boolean = (
|
||||||
{ os none i386 m68k ppc sparc x86_64 arm ppc64 avr armeb mips mipsel jvm i8086 aarch64 sparc64}
|
{ os none i386 m68k ppc sparc x86_64 arm ppc64 avr armeb mips mipsel jvm i8086 aarch64 sparc64 riscv32 riscv64}
|
||||||
{ none } ( false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
{ none } ( 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 , false, false, true , true ),
|
{ linux } ( false, true, true, true, true, true, true, true, false, true , true , true , false, false, true , true , true , true ),
|
||||||
{ go32v2 } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
{ go32v2 } ( false, true, 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),
|
{ win32 } ( false, true, 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),
|
{ os2 } ( false, true, 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),
|
{ freebsd } ( false, true, true, false, false, true, 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),
|
{ beos } ( false, true, 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),
|
{ netbsd } ( false, true, true, true, true, true, true, 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),
|
{ amiga } ( false, false, true, true, 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),
|
{ atari } ( false, false, true, 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),
|
{ solaris } ( false, true, false, false, true, true, 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),
|
{ qnx } ( false, true, 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),
|
{ netware } ( false, true, 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),
|
{ openbsd } ( false, true, true, false, false, true, 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),
|
{ wdosx } ( false, true, 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),
|
{ palmos } ( false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false),
|
||||||
{ macos } ( false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false),
|
{ macos } ( false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||||
{ darwin } ( false, true, false, true, false, true, true, true, false, false, false, false, false, false, true , false),
|
{ darwin } ( false, true, false, true, false, true, true, true, false, false, false, false, false, false, true , false, false, false),
|
||||||
{ emx } ( false, true, false, false, false, false, false, false, false, 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),
|
||||||
{ watcom } ( false, true, 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),
|
||||||
{ morphos } ( false, false, false, true, 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),
|
||||||
{ netwlibc }( false, true, 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),
|
||||||
{ win64 } ( false, false, false, false, false, true, 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, false, false),
|
||||||
{ wince }( false, true, false, false, false, false, true, false, false, 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),
|
||||||
{ gba } ( false, false, false, false, false, false, true, 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),
|
||||||
{ nds } ( false, false, false, false, false, false, true, 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),
|
||||||
{ embedded }( false, true, true, true, true, true, true, true, true, true , false, false, false, true , false, false),
|
{ embedded }( false, true, true, true, true, true, true, true, true, true , false, false, false, true , false, false, true , true ),
|
||||||
{ symbian } ( false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false),
|
{ symbian } ( false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false),
|
||||||
{ haiku } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
{ haiku } ( false, true, 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),
|
{ iphonesim}( false, true, false, false, false, true, 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),
|
{ aix } ( false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false),
|
||||||
{ java } ( false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false),
|
{ java } ( false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false, false, false),
|
||||||
{ android } ( false, true, false, false, false, false, true, false, false, false, false, true, true , false, false, false),
|
{ android } ( false, true, false, false, false, false, true, false, false, false, false, true, true , false, false, false, false, false),
|
||||||
{ nativent }( false, true, false, false, false, false, false, false, false, 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),
|
||||||
{ msdos } ( false, false, false, false, false, false, false, false, false, false, false, false, false, true , false, false),
|
{ msdos } ( false, false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false, false),
|
||||||
{ wii } ( false, false, false, true , false, false, false, false, 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),
|
||||||
{ aros } ( true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false),
|
{ aros } ( true, false, false, false, false, false, true, 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),
|
{ dragonfly}( false, false, false, false, false, true, 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, true , false, false)
|
{ win16 } ( false, false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false, false)
|
||||||
);
|
);
|
||||||
|
|
||||||
// Useful
|
// Useful
|
||||||
@ -2784,6 +2784,8 @@ begin
|
|||||||
powerpc: result := GetGccDirArch('cpupowerpc','-m32');
|
powerpc: result := GetGccDirArch('cpupowerpc','-m32');
|
||||||
powerpc64:result := GetGccDirArch('cpupowerpc64','-m64');
|
powerpc64:result := GetGccDirArch('cpupowerpc64','-m64');
|
||||||
aarch64: result := GetGccDirArch('cpuaarch64','');
|
aarch64: result := GetGccDirArch('cpuaarch64','');
|
||||||
|
riscv32: result := GetGccDirArch('cpuriscv64','-march=rv32imafdc');
|
||||||
|
riscv64: result := GetGccDirArch('cpuriscv64','-march=rv64imafdc');
|
||||||
end {case}
|
end {case}
|
||||||
else if OS = darwin then
|
else if OS = darwin then
|
||||||
case CPU of
|
case CPU of
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -90,6 +90,10 @@ override LOADERS=
|
|||||||
SYSINIT_UNITS=si_prc si_c si_g si_dll
|
SYSINIT_UNITS=si_prc si_c si_g si_dll
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(ARCH),riscv64)
|
||||||
|
override LOADERS=prt0 cprt0
|
||||||
|
endif
|
||||||
|
|
||||||
# mipsel reuses mips files by including so some file names exist
|
# mipsel reuses mips files by including so some file names exist
|
||||||
# twice, this causes the compiler to find sometimes wrong files and it tries
|
# twice, this causes the compiler to find sometimes wrong files and it tries
|
||||||
# to recompile rtl units. To prevent this, compile always as release PPUs, this
|
# to recompile rtl units. To prevent this, compile always as release PPUs, this
|
||||||
@ -196,6 +200,13 @@ ifeq ($(ARCH),sparc64)
|
|||||||
ASSHAREDOPT=-KPIC
|
ASSHAREDOPT=-KPIC
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(ARCH),riscv32)
|
||||||
|
ASTARGET=-march=rv32imafdc
|
||||||
|
endif
|
||||||
|
ifeq ($(ARCH),riscv64)
|
||||||
|
ASTARGET=-march=rv64imafdc
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(ARCH),arm)
|
ifeq ($(ARCH),arm)
|
||||||
ifeq ($(SUBARCH),armv6m)
|
ifeq ($(SUBARCH),armv6m)
|
||||||
ASTARGET+=-mthumb --def __thumb__=1
|
ASTARGET+=-mthumb --def __thumb__=1
|
||||||
|
@ -296,7 +296,7 @@ CONST
|
|||||||
clone_flags_fork = $01200011;
|
clone_flags_fork = $01200011;
|
||||||
{ SIGCHLD | CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID }
|
{ SIGCHLD | CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID }
|
||||||
|
|
||||||
{$if defined(cpuarm) or defined(cpualpha) or defined(cpublackfin) or defined(cpum68k) or defined(aarch64)}
|
{$if defined(cpuarm) or defined(cpualpha) or defined(cpublackfin) or defined(cpum68k) or defined(aarch64) or defined(riscv32) or defined(riscv64)}
|
||||||
O_LARGEFILE = $20000;
|
O_LARGEFILE = $20000;
|
||||||
{$endif}
|
{$endif}
|
||||||
{$if defined(cpusparc) or defined(cpusparc64)}
|
{$if defined(cpusparc) or defined(cpusparc64)}
|
||||||
|
@ -45,63 +45,79 @@
|
|||||||
.globl _start
|
.globl _start
|
||||||
.type _start,function
|
.type _start,function
|
||||||
_start:
|
_start:
|
||||||
|
.option push
|
||||||
|
.option norelax
|
||||||
|
1:auipc gp, %pcrel_hi(__global_pointer$)
|
||||||
|
addi gp, gp, %pcrel_lo(1b)
|
||||||
|
.option pop
|
||||||
|
|
||||||
/* Clear the frame pointer since this is the outermost frame. */
|
/* Clear the frame pointer since this is the outermost frame. */
|
||||||
mov fp, #0
|
addi fp, x0, 0
|
||||||
ldmia sp!, {a2}
|
ld a2, 0(sp)
|
||||||
|
addi sp, sp, 8
|
||||||
|
|
||||||
/* Pop argc off the stack and save a pointer to argv */
|
/* Pop argc off the stack and save a pointer to argv */
|
||||||
ldr ip,=operatingsystem_parameter_argc
|
1:auipc x8,%pcrel_hi(operatingsystem_parameter_argc)
|
||||||
ldr a3,=operatingsystem_parameter_argv
|
sd a2,%pcrel_lo(1b)(x8)
|
||||||
str a2,[ip]
|
1:auipc x8,%pcrel_hi(operatingsystem_parameter_argv)
|
||||||
|
sd sp,%pcrel_lo(1b)(x8)
|
||||||
|
|
||||||
/* calc envp */
|
addi a4, a2, 1
|
||||||
add a4,a2,#1
|
slli a4, a4, 3
|
||||||
add a4,sp,a4,LSL #2
|
add a4, sp, a4
|
||||||
ldr ip,=operatingsystem_parameter_envp
|
|
||||||
|
|
||||||
str sp,[a3]
|
1:auipc x8,%pcrel_hi(operatingsystem_parameter_envp)
|
||||||
str a4,[ip]
|
sd a4,%pcrel_lo(1b)(x8)
|
||||||
|
|
||||||
/* Save initial stackpointer */
|
/* Save initial stackpointer */
|
||||||
ldr ip,=__stkptr
|
1:auipc x8,%pcrel_hi(__stkptr)
|
||||||
str sp,[ip]
|
sd sp,%pcrel_lo(1b)(x8)
|
||||||
|
|
||||||
/* Fetch address of fini */
|
/* Fetch address of fini */
|
||||||
ldr ip, =_fini
|
1:auipc x8,%pcrel_hi(_fini)
|
||||||
|
addi a2,x8,%pcrel_lo(1b)
|
||||||
|
|
||||||
/* argc already loaded to a2*/
|
/* argc already loaded to a2*/
|
||||||
|
|
||||||
/* load argv */
|
/* load argv */
|
||||||
mov a3, sp
|
addi a3, sp, 0
|
||||||
|
|
||||||
/* Push stack limit */
|
/* Push stack limit */
|
||||||
str a3, [sp, #-4]!
|
sd a3, -8(sp)
|
||||||
|
addi sp, sp, -8
|
||||||
|
|
||||||
/* Push rtld_fini */
|
/* Push rtld_fini */
|
||||||
str a1, [sp, #-4]!
|
sd a1, -8(sp)
|
||||||
|
addi sp, sp, -8
|
||||||
|
|
||||||
/* Set up the other arguments in registers */
|
/* Set up the other arguments in registers */
|
||||||
ldr a1, =PASCALMAIN
|
1:auipc x8,%pcrel_hi(PASCALMAIN)
|
||||||
ldr a4, =_init
|
addi a1, x8, %pcrel_lo(1b)
|
||||||
|
1:auipc x8,%pcrel_hi(_init)
|
||||||
|
addi a4, x8, %pcrel_lo(1b)
|
||||||
|
|
||||||
/* Push fini */
|
/* Push fini */
|
||||||
str ip, [sp, #-4]!
|
sd a2, -8(sp)
|
||||||
|
addi sp, sp, -8
|
||||||
|
|
||||||
/* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
|
/* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
|
||||||
|
|
||||||
/* Let the libc call main and exit with its return code. */
|
/* Let the libc call main and exit with its return code. */
|
||||||
bl __libc_start_main
|
1:auipc x8,%pcrel_hi(__libc_start_main)
|
||||||
|
jalr ra, x8, %pcrel_lo(1b)
|
||||||
|
|
||||||
/* should never get here....*/
|
/* should never get here....*/
|
||||||
bl abort
|
1:auipc x8,%pcrel_hi(abort)
|
||||||
|
jalr ra, x8, %pcrel_lo(1b)
|
||||||
|
|
||||||
.globl _haltproc
|
.globl _haltproc
|
||||||
.type _haltproc,function
|
.type _haltproc,function
|
||||||
_haltproc:
|
_haltproc:
|
||||||
ldr r0,=operatingsystem_result
|
1:auipc x8,%pcrel_hi(operatingsystem_result)
|
||||||
ldrb r0,[r0]
|
lbu x1,%pcrel_lo(1b)(x8)
|
||||||
swi 0x900001
|
addi x17, x0, 94
|
||||||
b _haltproc
|
ecall
|
||||||
|
jal x0, _haltproc
|
||||||
|
|
||||||
/* Define a symbol for the first piece of initialized data. */
|
/* Define a symbol for the first piece of initialized data. */
|
||||||
.data
|
.data
|
||||||
|
@ -20,14 +20,14 @@ _dynamic_start:
|
|||||||
.type _start, function
|
.type _start, function
|
||||||
_start:
|
_start:
|
||||||
1:
|
1:
|
||||||
auipc gp, %pcrel_hi(__bss_start+0x800)
|
auipc gp, %pcrel_hi(__bss_start+0x800)
|
||||||
addi gp, gp, %pcrel_lo(1b)
|
addi gp, gp, %pcrel_lo(1b)
|
||||||
|
|
||||||
/* Get argc, argv, envp */
|
/* Get argc, argv, envp */
|
||||||
ld x5,(x2)
|
ld x5,(x2)
|
||||||
addi x6,x2,8
|
addi x6,x2,8
|
||||||
addi x7,x5,1
|
addi x7,x5,1
|
||||||
slli x7,x7,3
|
slli x7,x7,3
|
||||||
add x7,x6,x7
|
add x7,x6,x7
|
||||||
|
|
||||||
/* Save argc, argv, envp, and initial stack pointer */
|
/* Save argc, argv, envp, and initial stack pointer */
|
||||||
|
15
rtl/riscv32/cpuh.inc
Normal file
15
rtl/riscv32/cpuh.inc
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
|
||||||
|
This file is part of the Free Pascal run time library.
|
||||||
|
Copyright (c) 2016 by the Free Pascal development team.
|
||||||
|
|
||||||
|
CPU specific system unit header file
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
**********************************************************************}
|
15
rtl/riscv64/cpuh.inc
Normal file
15
rtl/riscv64/cpuh.inc
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
|
||||||
|
This file is part of the Free Pascal run time library.
|
||||||
|
Copyright (c) 2016 by the Free Pascal development team.
|
||||||
|
|
||||||
|
CPU specific system unit header file
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
**********************************************************************}
|
@ -1 +1 @@
|
|||||||
'2018-04-29 rev 38866'
|
'2018-07-20 rev 39474'
|
||||||
|
Loading…
Reference in New Issue
Block a user