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:
Jeppe Johansen 2018-07-20 10:40:28 +00:00
parent ceb38833f2
commit 6352328f3a
16 changed files with 3631 additions and 2669 deletions

2
.gitattributes vendored
View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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';

View File

@ -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.

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)}

View File

@ -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

View File

@ -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
View 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
View 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.
**********************************************************************}

View File

@ -1 +1 @@
'2018-04-29 rev 38866' '2018-07-20 rev 39474'