morphos: new pascal-written internal startup code. also refactored the rtl build process for morphos

git-svn-id: trunk@35054 -
This commit is contained in:
Károly Balogh 2016-12-04 00:15:41 +00:00
parent 7956cb5d48
commit f3e33a9dde
9 changed files with 341 additions and 633 deletions

2
.gitattributes vendored
View File

@ -9298,12 +9298,14 @@ rtl/mipsel/strings.inc svneol=native#text/plain
rtl/mipsel/stringss.inc svneol=native#text/plain
rtl/morphos/Makefile svneol=native#text/plain
rtl/morphos/Makefile.fpc svneol=native#text/plain
rtl/morphos/buildrtl.pp svneol=native#text/plain
rtl/morphos/doslibd.inc svneol=native#text/plain
rtl/morphos/doslibf.inc svneol=native#text/plain
rtl/morphos/emuld.inc svneol=native#text/plain
rtl/morphos/execd.inc svneol=native#text/plain
rtl/morphos/execf.inc svneol=native#text/plain
rtl/morphos/prt0.as svneol=native#text/plain
rtl/morphos/si_prc.pp svneol=native#text/plain
rtl/morphos/system.pp svneol=native#text/plain
rtl/morphos/timerd.inc svneol=native#text/plain
rtl/morphos/timerf.inc svneol=native#text/plain

View File

@ -326,7 +326,7 @@ interface
systems_weak_linking = systems_darwin + systems_solaris + systems_linux + systems_android;
systems_internal_sysinit = [system_i386_linux,system_i386_win32,system_x86_64_win64,
system_powerpc64_linux]+systems_darwin;
system_powerpc64_linux,system_powerpc_morphos]+systems_darwin;
{ all systems that use garbage collection for reference-counted types }
systems_garbage_collected_managed_types = [

View File

@ -43,6 +43,7 @@ implementation
public
constructor Create; override;
procedure SetDefaultInfo; override;
procedure InitSysInitUnitName; override;
function MakeExecutable:boolean; override;
end;
@ -79,6 +80,12 @@ begin
end;
Procedure TLinkerMorphOS.InitSysInitUnitName;
begin
sysinitunit:='si_prc';
end;
Function TLinkerMorphOS.WriteResponseFile(isdll:boolean) : Boolean;
Var
linkres : TLinkRes;
@ -113,8 +120,11 @@ begin
LinkRes.Add('INPUT (');
{ add objectfiles, start with prt0 always }
s:=FindObjectFile('prt0','',false);
LinkRes.AddFileName(s);
if not (target_info.system in systems_internal_sysinit) then
begin
s:=FindObjectFile('prt0','',false);
LinkRes.AddFileName(Unix2AmigaPath(maybequoted(s)));
end;
while not ObjectFiles.Empty do
begin
s:=ObjectFiles.GetFirst;

File diff suppressed because it is too large Load Diff

View File

@ -6,23 +6,20 @@
main=rtl
[target]
loaders=prt0
units=$(SYSTEMUNIT) uuchar objpas macpas iso7185 extpas strings \
fpintres dos heaptrc ctypes \
sysutils classes fgl math typinfo \
charset cpall getopts \
types rtlconsts sysconst \
character athreads
# exec timer doslib utility hardware inputevent keymap graphics layers
# intuition aboxlib mui
# these units are here, because they depend on system interface units above
# kvm \
# disabled temporarily because it doesn't build
# sockets \
# these can be moved to packages later
# clipboard datatypes asl ahi tinygl get9 muihelper
#implicitunits=exeinfo\
implicitunits=cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 \
#loaders=prt0
units=$(SYSTEMUNIT) heaptrc uuchar objpas macpas iso7185 extpas buildrtl cpall
# fpintres dos heaptrc ctypes \
# sysutils classes fgl math typinfo \
# charset cpall getopts \
# types rtlconsts sysconst \
# character athreads
implicitunits=$(SYSINITUNITS) athreads dos sysutils \
ctypes strings rtlconsts sysconst math types \
typinfo fgl classes charset character getopts \
fpintres \
cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 \
cp437 cp646 cp850 cp856 cp866 cp874 cp8859_1 cp8859_5 cp8859_2 cp852 \
unicodedata unicodenumtable
@ -33,6 +30,7 @@ nortl=y
[install]
fpcpackage=y
buildunit=buildrtl
[default]
fpcdir=../..
@ -52,6 +50,7 @@ PROCINC=$(RTL)/$(CPU_TARGET)
AMIINC=$(RTL)/amicommon
UNITPREFIX=rtl
SYSTEMUNIT=system
SYSINITUNITS=si_prc
# Use new feature from 1.0.5 version
# that generates release PPU files
@ -62,7 +61,6 @@ endif
# Paths
OBJPASDIR=$(RTL)/objpas
GRAPHDIR=$(INC)/graph
[rules]
.NOTPARALLEL:
@ -96,133 +94,26 @@ SYSDEPS=$(SYSINCDEPS) $(SYSCPUDEPS)
$(SYSTEMUNIT)$(PPUEXT) : $(SYSTEMUNIT).pp $(SYSDEPS)
$(COMPILER) -Us -Sg $(SYSTEMUNIT).pp $(REDIR)
objpas$(PPUEXT): $(OBJPASDIR)/objpas.pp $(INC)/except.inc $(SYSTEMUNIT)$(PPUEXT)
$(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/objpas.pp $(REDIR)
strings$(PPUEXT) : $(INC)/strings.pp $(INC)/stringsi.inc \
$(PROCINC)/strings.inc $(PROCINC)/stringss.inc \
$(SYSTEMUNIT)$(PPUEXT)
#
# System Dependent Units
#
#ports$(PPUEXT) : ports.pas objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
#doscalls$(PPUEXT) : doscalls.pas strings$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
#
# TP7 Compatible RTL Units
#
dos$(PPUEXT) : dos.pp $(INC)/filerec.inc $(INC)/textrec.inc strings$(PPUEXT) \
$(SYSTEMUNIT)$(PPUEXT)
#
# Delphi Compatible Units
#
sysutils$(PPUEXT) : sysutils.pp $(wildcard $(OBJPASDIR)/sysutils/*.inc) \
objpas$(PPUEXT) dos$(PPUEXT) sysconst$(PPUEXT)
$(COMPILER) -Fi$(OBJPASDIR)/sysutils $(AMIINC)/sysutils.pp
classes$(PPUEXT) : classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
sysutils$(PPUEXT) rtlconsts$(PPUEXT) typinfo$(PPUEXT) types$(PPUEXT) fgl$(PPUEXT)
$(COMPILER) -Fi$(OBJPASDIR)/classes $(AMIINC)/classes.pp
character$(PPUEXT) : sysutils$(PPUEXT) $(OBJPASDIR)/character.pas objpas$(PPUEXT) rtlconsts$(PPUEXT)
$(COMPILER) $(OBJPASDIR)/character.pas
fgl$(PPUEXT) : $(OBJPASDIR)/fgl.pp objpas$(PPUEXT) types$(PPUEXT) system$(PPUEXT) sysutils$(PPUEXT)
$(COMPILER) $(OBJPASDIR)/fgl.pp
typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT)
$(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp $(REDIR)
math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT)
$(COMPILER) $(OBJPASDIR)/math.pp $(REDIR)
types$(PPUEXT) : $(OBJPASDIR/types.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
$(COMPILER) $(OBJPASDIR)/types.pp
rtlconsts$(PPUEXT) : $(OBJPASDIR)/rtlconsts.pp
$(COMPILER) $(OBJPASDIR)/rtlconsts.pp
sysconst$(PPUEXT) : $(OBJPASDIR)/sysconst.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
$(COMPILER) $(OBJPASDIR)/sysconst.pp
#
# Mac Pascal Model
#
macpas$(PPUEXT) : $(INC)/macpas.pp objpas$(PPUEXT) math$(PPUEXT)
$(COMPILER) $(INC)/macpas.pp $(REDIR)
#
# Other system-independent RTL Units
#
getopts$(PPUEXT) : $(INC)/getopts.pp $(SYSTEMUNIT)$(PPUEXT)
heaptrc$(PPUEXT) : $(INC)/heaptrc.pp $(SYSTEMUNIT)$(PPUEXT)
$(COMPILER) -Sg $(INC)/heaptrc.pp $(REDIR)
#lineinfo$(PPUEXT) : $(INC)/lineinfo.pp $(SYSTEMUNIT)$(PPUEXT)
#lnfodwrf$(PPUEXT) : $(INC)/lnfodwrf.pp $(SYSTEMUNIT)$(PPUEXT)
uuchar$(PPUEXT): $(SYSTEMUNIT)$(PPUEXT) $(INC)/uuchar.pp heaptrc$(PPUEXT)
$(COMPILER) $(INC)/uuchar.pp
charset$(PPUEXT) : $(INC)/charset.pp $(SYSTEMUNIT)$(PPUEXT)
objpas$(PPUEXT): $(OBJPASDIR)/objpas.pp $(INC)/except.inc $(SYSTEMUNIT)$(PPUEXT)
$(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/objpas.pp $(REDIR)
cpall$(PPUEXT): $(RTL)/charmaps/cpall.pas system$(PPUEXT) charset$(PPUEXT)
macpas$(PPUEXT) : $(INC)/macpas.pp objpas$(PPUEXT) buildrtl$(PPUEXT) heaptrc$(PPUEXT)
$(COMPILER) $(INC)/macpas.pp
iso7185$(PPUEXT) : $(INC)/iso7185.pp buildrtl$(PPUEXT) heaptrc$(PPUEXT)
$(COMPILER) $(INC)/iso7185.pp
extpas$(PPUEXT) : $(INC)/extpas.pp dos$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) heaptrc$(PPUEXT)
$(COMPILER) $(INC)/extpas.pp
buildrtl$(PPUEXT): buildrtl.pp system$(PPUEXT) objpas$(PPUEXT) heaptrc$(PPUEXT)
$(COMPILER) -Fi$(OBJPASDIR)/sysutils -Fi$(OBJPASDIR)/classes -Fu$(PROCINC) -Fu$(AMIINC) -I$(INC) -Fu$(INC) -Fu$(OBJPASDIR) buildrtl
cpall$(PPUEXT): $(RTL)/charmaps/cpall.pas system$(PPUEXT) objpas$(PPUEXT) heaptrc$(PPUEXT)
$(COMPILER) -Fu$(INC) -Fi$(RTL)/charmaps $(RTL)/charmaps/cpall.pas
fpintres$(PPUEXT) : $(INC)/fpintres.pp $(SYSTEMUNIT)$(PPUEXT)
$(COMPILER) $(INC)/fpintres.pp
#
# Other system-dependent RTL Units
#
athreadss$(PPUEXT) : $(AMIINC)/athreads.pp $(SYSTEMUNIT)$(PPUEXT)
#exec$(PPUEXT) : exec.pp execf.inc execd.inc
#timer$(PPUEXT) : timer.pp timerd.inc timerf.inc
#utility$(PPUEXT) : utility.pp exec$(PPUEXT) utilf.inc utild1.inc utild2.inc
#doslib$(PPUEXT) : doslib.pp exec$(PPUEXT) timer$(PPUEXT) doslibd.inc doslibf.inc
#hardware$(PPUEXT): hardware.pas exec$(PPUEXT)
#inputevent$(PPUEXT): inputevent.pas exec$(PPUEXT) timer$(PPUEXT) utility$(PPUEXT)
#graphics$(PPUEXT): graphics.pas exec$(PPUEXT) utility$(PPUEXT) hardware$(PPUEXT)
#layers$(PPUEXT) : layers.pas exec$(PPUEXT) graphics$(PPUEXT) utility$(PPUEXT)
#intuition$(PPUEXT): intuition.pas exec$(PPUEXT) graphics$(PPUEXT) utility$(PPUEXT) \
# inputevent$(PPUEXT) timer$(PPUEXT) layers$(PPUEXT)
#aboxlib$(PPUEXT): aboxlib.pas
#clipboard$(PPUEXT): clipboard.pas exec$(PPUEXT)
#datatype$(PPUEXT): datatypes.pas exec$(PPUEXT) doslib$(PPUEXT) intuition$(PPUEXT) \
# utility$(PPUEXT) graphics$(PPUEXT)
#asl$(PPUEXT): asl.pas exec$(PPUEXT) graphics$(PPUEXT) utility$(PPUEXT)
#ahi$(PPUEXT): ahi.pas exec$(PPUEXT) utility$(PPUEXT)
#mui$(PPUEXT): mui.pas exec$(PPUEXT) utility$(PPUEXT) intuition$(PPUEXT) graphics$(PPUEXT)
#tinygl$(PPUEXT): tinygl.pp exec$(PPUEXT)
#get9$(PPUEXT): get9.pas exec$(PPUEXT)
#muihelper$(PPUEXT): muihelper.pas intuition$(PPUEXT) mui$(PPUEXT) doslib$(PPUEXT) utility$(PPUEXT)
#kvm$(PPUEXT) : kvm.pp
ctypes$(PPUEXT) : $(INC)/ctypes.pp $(SYSTEMUNIT)$(PPUEXT)

17
rtl/morphos/buildrtl.pp Normal file
View File

@ -0,0 +1,17 @@
unit buildrtl;
interface
uses
si_prc,
athreads, dos, sysutils,
ctypes, strings,
rtlconsts, sysconst, math, types,
typinfo, fgl, classes,
charset, character, getopts,
fpintres;
implementation
end.

View File

@ -76,7 +76,7 @@ _exit:
_initproc:
mflr 0
stw 0,4(1)
stw 0,4(1)
stwu 1,-128(1)
stw 13,52(1)
stw 14,56(1)
@ -150,11 +150,6 @@ _ExecBase:
OriginalStkPtr:
.long 0
.globl OriginalLinkRegister
.align 4
OriginalLinkRegister:
.long 0
.globl returnValue
.align 4
returnValue:
@ -180,4 +175,3 @@ stackSwap:
.size __abox__,4
__abox__:
.long 1

37
rtl/morphos/si_prc.pp Normal file
View File

@ -0,0 +1,37 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 2016 by the Free Pascal development team
System Entry point for MorphOS, Pascal only programs
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.
**********************************************************************}
unit si_prc;
interface
implementation
const
abox_signature: dword = 1; public name '__abox__';
var
ExecBase: Pointer; public name '_ExecBase';
realExecBase: Pointer absolute $4;
function PascalSysInit: longint; external name 'PASCALSYSINIT';
function _FPC_proc_start: longint; public name '_start';
begin
ExecBase:=realExecBase;
_FPC_proc_start:=PascalSysInit;
end;
end.

View File

@ -24,6 +24,7 @@ unit System;
interface
{$define FPC_IS_SYSTEM}
{$define PASCAL_SYSINIT}
{$I systemh.inc}
{$I osdebugh.inc}
@ -114,7 +115,18 @@ type
Misc. System Dependent Functions
*****************************************************************************}
{$IFDEF PASCAL_SYSINIT}
var
sysinit_jmpbuf: jmp_buf;
procedure haltproc(e:longint);
begin
longjmp(sysinit_jmpbuf,1);
end;
{$ELSE}
procedure haltproc(e:longint);cdecl;external name '_haltproc';
{$ENDIF}
procedure System_exit;
var
@ -241,6 +253,34 @@ begin
result := stklen;
end;
{$IFDEF PASCAL_SYSINIT}
procedure PascalMain; external name 'PASCALMAIN';
procedure PascalSysInitCallMain;
begin
if setjmp(sysinit_jmpbuf) = 0 then
PascalMain;
end;
function PascalSysInit: LongInt; public name 'PASCALSYSINIT';
var
sst: TStackSwapStruct;
newStack: Pointer;
newStackAligned: Pointer;
begin
newStack:=AllocVecTaskPooled(InitialStkLen+16);
newStackAligned:=align(newStack,16);
sst.stk_Lower:=newStackAligned;
sst.stk_Upper:=newStackAligned+InitialStkLen;
sst.stk_Pointer:=newStackAligned+InitialStkLen;
NewPPCStackSwap(@sst,@PascalSysInitCallMain,nil);
FreeVecTaskPooled(newStack);
result:=ExitCode;
end;
{$ENDIF}
begin
IsConsole := TRUE;