mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-31 12:50:28 +02:00
# revisions: 41710,41711,41733,41734,41735,41736,41737,41738,41739,41740,41741,41743,41744,41745,41746,41750,41751,41752,41753,41754,41755,41757,41758,41759
git-svn-id: branches/fixes_3_2@41988 -
This commit is contained in:
parent
be1b562472
commit
abccef11e0
7
.gitattributes
vendored
7
.gitattributes
vendored
@ -10111,10 +10111,11 @@ rtl/openbsd/errnostr.inc svneol=native#text/plain
|
|||||||
rtl/openbsd/i386/bsyscall.inc svneol=native#text/plain
|
rtl/openbsd/i386/bsyscall.inc svneol=native#text/plain
|
||||||
rtl/openbsd/i386/cprt0.as svneol=native#text/plain
|
rtl/openbsd/i386/cprt0.as svneol=native#text/plain
|
||||||
rtl/openbsd/i386/dllprt0.as svneol=native#text/plain
|
rtl/openbsd/i386/dllprt0.as svneol=native#text/plain
|
||||||
rtl/openbsd/i386/openbsd_ident.as svneol=native#text/plain
|
rtl/openbsd/i386/openbsd_ident.inc svneol=native#text/plain
|
||||||
rtl/openbsd/i386/prt0.as svneol=native#text/plain
|
rtl/openbsd/i386/prt0.as svneol=native#text/plain
|
||||||
rtl/openbsd/i386/si_c.inc svneol=native#text/plain
|
rtl/openbsd/i386/si_c.inc svneol=native#text/plain
|
||||||
rtl/openbsd/i386/si_dll.inc svneol=native#text/plain
|
rtl/openbsd/i386/si_dll.inc svneol=native#text/plain
|
||||||
|
rtl/openbsd/i386/si_g.inc svneol=native#text/plain
|
||||||
rtl/openbsd/i386/si_prc.inc svneol=native#text/plain
|
rtl/openbsd/i386/si_prc.inc svneol=native#text/plain
|
||||||
rtl/openbsd/i386/sighnd.inc svneol=native#text/plain
|
rtl/openbsd/i386/sighnd.inc svneol=native#text/plain
|
||||||
rtl/openbsd/osdefs.inc svneol=native#text/plain
|
rtl/openbsd/osdefs.inc svneol=native#text/plain
|
||||||
@ -10125,6 +10126,7 @@ rtl/openbsd/rtldefs.inc svneol=native#text/plain
|
|||||||
rtl/openbsd/setsysnr.inc svneol=native#text/plain
|
rtl/openbsd/setsysnr.inc svneol=native#text/plain
|
||||||
rtl/openbsd/si_c.pp svneol=native#text/plain
|
rtl/openbsd/si_c.pp svneol=native#text/plain
|
||||||
rtl/openbsd/si_dll.pp svneol=native#text/plain
|
rtl/openbsd/si_dll.pp svneol=native#text/plain
|
||||||
|
rtl/openbsd/si_g.pp svneol=native#text/plain
|
||||||
rtl/openbsd/si_impl.inc svneol=native#text/plain
|
rtl/openbsd/si_impl.inc svneol=native#text/plain
|
||||||
rtl/openbsd/si_intf.inc svneol=native#text/plain
|
rtl/openbsd/si_intf.inc svneol=native#text/plain
|
||||||
rtl/openbsd/si_prc.pp svneol=native#text/plain
|
rtl/openbsd/si_prc.pp svneol=native#text/plain
|
||||||
@ -10147,10 +10149,11 @@ rtl/openbsd/x86_64/cprt0.as svneol=native#text/plain
|
|||||||
rtl/openbsd/x86_64/crt0.s svneol=native#text/plain
|
rtl/openbsd/x86_64/crt0.s svneol=native#text/plain
|
||||||
rtl/openbsd/x86_64/dllprt0.as svneol=native#text/plain
|
rtl/openbsd/x86_64/dllprt0.as svneol=native#text/plain
|
||||||
rtl/openbsd/x86_64/gprt0.as svneol=native#text/plain
|
rtl/openbsd/x86_64/gprt0.as svneol=native#text/plain
|
||||||
rtl/openbsd/x86_64/openbsd_ident.as svneol=native#text/plain
|
rtl/openbsd/x86_64/openbsd_ident.inc svneol=native#text/plain
|
||||||
rtl/openbsd/x86_64/prt0.as svneol=native#text/plain
|
rtl/openbsd/x86_64/prt0.as svneol=native#text/plain
|
||||||
rtl/openbsd/x86_64/si_c.inc svneol=native#text/plain
|
rtl/openbsd/x86_64/si_c.inc svneol=native#text/plain
|
||||||
rtl/openbsd/x86_64/si_dll.inc svneol=native#text/plain
|
rtl/openbsd/x86_64/si_dll.inc svneol=native#text/plain
|
||||||
|
rtl/openbsd/x86_64/si_g.inc svneol=native#text/plain
|
||||||
rtl/openbsd/x86_64/si_prc.inc svneol=native#text/plain
|
rtl/openbsd/x86_64/si_prc.inc svneol=native#text/plain
|
||||||
rtl/openbsd/x86_64/sighnd.inc svneol=native#text/plain
|
rtl/openbsd/x86_64/sighnd.inc svneol=native#text/plain
|
||||||
rtl/os2/Makefile svneol=native#text/plain
|
rtl/os2/Makefile svneol=native#text/plain
|
||||||
|
@ -873,6 +873,30 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{$endif mswindows}
|
{$endif mswindows}
|
||||||
|
{$ifdef openbsd}
|
||||||
|
function GetOpenBSDLocalBase: ansistring;
|
||||||
|
var
|
||||||
|
envvalue: pchar;
|
||||||
|
begin
|
||||||
|
envvalue := GetEnvPChar('LOCALBASE');
|
||||||
|
if assigned(envvalue) then
|
||||||
|
Result:=envvalue
|
||||||
|
else
|
||||||
|
Result:='/usr/local';
|
||||||
|
FreeEnvPChar(envvalue);
|
||||||
|
end;
|
||||||
|
function GetOpenBSDX11Base: ansistring;
|
||||||
|
var
|
||||||
|
envvalue: pchar;
|
||||||
|
begin
|
||||||
|
envvalue := GetEnvPChar('X11BASE');
|
||||||
|
if assigned(envvalue) then
|
||||||
|
Result:=envvalue
|
||||||
|
else
|
||||||
|
Result:='/usr/X11R6';
|
||||||
|
FreeEnvPChar(envvalue);
|
||||||
|
end;
|
||||||
|
{$endif openbsd}
|
||||||
var
|
var
|
||||||
envstr: string;
|
envstr: string;
|
||||||
envvalue: pchar;
|
envvalue: pchar;
|
||||||
@ -905,6 +929,10 @@ implementation
|
|||||||
ReplaceSpecialFolder('$PROGRAM_FILES_COMMON',CSIDL_PROGRAM_FILES_COMMON);
|
ReplaceSpecialFolder('$PROGRAM_FILES_COMMON',CSIDL_PROGRAM_FILES_COMMON);
|
||||||
ReplaceSpecialFolder('$PROFILE',CSIDL_PROFILE);
|
ReplaceSpecialFolder('$PROFILE',CSIDL_PROFILE);
|
||||||
{$endif mswindows}
|
{$endif mswindows}
|
||||||
|
{$ifdef openbsd}
|
||||||
|
Replace(s,'$OPENBSD_LOCALBASE',GetOpenBSDLocalBase);
|
||||||
|
Replace(s,'$OPENBSD_X11BASE',GetOpenBSDX11Base);
|
||||||
|
{$endif openbsd}
|
||||||
{ Replace environment variables between dollar signs }
|
{ Replace environment variables between dollar signs }
|
||||||
i := pos('$',s);
|
i := pos('$',s);
|
||||||
while i>0 do
|
while i>0 do
|
||||||
|
@ -334,7 +334,7 @@ interface
|
|||||||
systems_indirect_entry_information = systems_darwin+[system_i386_win32,system_x86_64_win64,system_x86_64_linux];
|
systems_indirect_entry_information = systems_darwin+[system_i386_win32,system_x86_64_win64,system_x86_64_linux];
|
||||||
|
|
||||||
{ all systems for which weak linking has been tested/is supported }
|
{ all systems for which weak linking has been tested/is supported }
|
||||||
systems_weak_linking = systems_darwin + systems_solaris + systems_linux + systems_android;
|
systems_weak_linking = systems_darwin + systems_solaris + systems_linux + systems_android + systems_openbsd;
|
||||||
|
|
||||||
systems_internal_sysinit = [system_i386_win32,system_x86_64_win64,
|
systems_internal_sysinit = [system_i386_win32,system_x86_64_win64,
|
||||||
system_i386_linux,system_powerpc64_linux,system_sparc64_linux,system_x86_64_linux,
|
system_i386_linux,system_powerpc64_linux,system_sparc64_linux,system_x86_64_linux,
|
||||||
|
@ -154,7 +154,7 @@ begin
|
|||||||
{ Mac OS X doesn't have a /lib }
|
{ Mac OS X doesn't have a /lib }
|
||||||
LibrarySearchPath.AddPath(sysrootpath,'/usr/lib',true)
|
LibrarySearchPath.AddPath(sysrootpath,'/usr/lib',true)
|
||||||
else if target_info.system in systems_openbsd then
|
else if target_info.system in systems_openbsd then
|
||||||
LibrarySearchPath.AddPath(sysrootpath,'/usr/lib;${X11BASE}/lib;${LOCALBASE}/lib',true)
|
LibrarySearchPath.AddPath(sysrootpath,'/usr/lib;$OPENBSD_X11BASE/lib;$OPENBSD_LOCALBASE/lib',true)
|
||||||
else
|
else
|
||||||
LibrarySearchPath.AddPath(sysrootpath,'/lib;/usr/lib;/usr/X11R6/lib',true);
|
LibrarySearchPath.AddPath(sysrootpath,'/lib;/usr/lib;/usr/X11R6/lib',true);
|
||||||
end;
|
end;
|
||||||
@ -173,8 +173,8 @@ begin
|
|||||||
begin
|
begin
|
||||||
if not(target_info.system in systems_darwin) then
|
if not(target_info.system in systems_darwin) then
|
||||||
begin
|
begin
|
||||||
ExeCmd[1]:='ld $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP -L. -o $EXE $CATRES $FILELIST';
|
ExeCmd[1]:='ld $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE $CATRES $FILELIST';
|
||||||
DllCmd[1]:='ld $TARGET $EMUL $OPT -shared -L. -o $EXE $CATRES $FILELIST'
|
DllCmd[1]:='ld $TARGET $EMUL $OPT $MAP -shared -L. -o $EXE $CATRES $FILELIST'
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
@ -193,22 +193,22 @@ begin
|
|||||||
programs with problems that require Valgrind will have more
|
programs with problems that require Valgrind will have more
|
||||||
than 60KB of data (first 4KB of address space is always invalid)
|
than 60KB of data (first 4KB of address space is always invalid)
|
||||||
}
|
}
|
||||||
ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
|
ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
|
||||||
if not(cs_gdb_valgrind in current_settings.globalswitches) then
|
if not(cs_gdb_valgrind in current_settings.globalswitches) then
|
||||||
ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
|
ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
|
||||||
{$else ndef cpu64bitaddr}
|
{$else ndef cpu64bitaddr}
|
||||||
ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
|
ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
|
||||||
{$endif ndef cpu64bitaddr}
|
{$endif ndef cpu64bitaddr}
|
||||||
if (apptype<>app_bundle) then
|
if (apptype<>app_bundle) then
|
||||||
DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS -dynamic -dylib -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
|
DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP -dynamic -dylib -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
|
||||||
else
|
else
|
||||||
DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS -dynamic -bundle -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
|
DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP -dynamic -bundle -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
ExeCmd[1]:='ld $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP -L. -o $EXE $RES';
|
ExeCmd[1]:='ld $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE $RES';
|
||||||
DllCmd[1]:='ld $TARGET $EMUL $OPT $INIT $FINI $SONAME -shared -L. -o $EXE $RES';
|
DllCmd[1]:='ld $TARGET $EMUL $OPT $INIT $FINI $SONAME $MAP -shared -L. -o $EXE $RES';
|
||||||
end;
|
end;
|
||||||
if not(target_info.system in systems_darwin) then
|
if not(target_info.system in systems_darwin) then
|
||||||
DllCmd[2]:='strip --strip-unneeded $EXE'
|
DllCmd[2]:='strip --strip-unneeded $EXE'
|
||||||
@ -616,7 +616,10 @@ begin
|
|||||||
begin
|
begin
|
||||||
if librarysearchpath.FindFile('crti.o',false,s) then
|
if librarysearchpath.FindFile('crti.o',false,s) then
|
||||||
LinkRes.AddFileName(s);
|
LinkRes.AddFileName(s);
|
||||||
if cs_create_pic in current_settings.moduleswitches then
|
if ((cs_create_pic in current_settings.moduleswitches) and
|
||||||
|
not (target_info.system in systems_openbsd)) or
|
||||||
|
(current_module.islibrary and
|
||||||
|
(target_info.system in systems_openbsd)) then
|
||||||
begin
|
begin
|
||||||
if librarysearchpath.FindFile('crtbeginS.o',false,s) then
|
if librarysearchpath.FindFile('crtbeginS.o',false,s) then
|
||||||
LinkRes.AddFileName(s);
|
LinkRes.AddFileName(s);
|
||||||
@ -740,7 +743,10 @@ begin
|
|||||||
if linklibc and
|
if linklibc and
|
||||||
not IsDarwin Then
|
not IsDarwin Then
|
||||||
begin
|
begin
|
||||||
if cs_create_pic in current_settings.moduleswitches then
|
if ((cs_create_pic in current_settings.moduleswitches) and
|
||||||
|
not (target_info.system in systems_openbsd)) or
|
||||||
|
(current_module.islibrary and
|
||||||
|
(target_info.system in systems_openbsd)) then
|
||||||
Fl1:=librarysearchpath.FindFile('crtendS.o',false,s1)
|
Fl1:=librarysearchpath.FindFile('crtendS.o',false,s1)
|
||||||
else
|
else
|
||||||
Fl1:=librarysearchpath.FindFile('crtend.o',false,s1);
|
Fl1:=librarysearchpath.FindFile('crtend.o',false,s1);
|
||||||
@ -767,6 +773,7 @@ function TLinkerBSD.MakeExecutable:boolean;
|
|||||||
var
|
var
|
||||||
binstr,
|
binstr,
|
||||||
cmdstr,
|
cmdstr,
|
||||||
|
mapstr,
|
||||||
targetstr,
|
targetstr,
|
||||||
emulstr,
|
emulstr,
|
||||||
extdbgbinstr,
|
extdbgbinstr,
|
||||||
@ -788,6 +795,9 @@ begin
|
|||||||
DynLinkStr:='';
|
DynLinkStr:='';
|
||||||
GCSectionsStr:='';
|
GCSectionsStr:='';
|
||||||
linkscript:=nil;
|
linkscript:=nil;
|
||||||
|
mapstr:='';
|
||||||
|
if (cs_link_map in current_settings.globalswitches) then
|
||||||
|
mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
|
||||||
{ i386_freebsd needs -b elf32-i386-freebsd and -m elf_i386_fbsd
|
{ i386_freebsd needs -b elf32-i386-freebsd and -m elf_i386_fbsd
|
||||||
to avoid creation of a i386:x86_64 arch binary }
|
to avoid creation of a i386:x86_64 arch binary }
|
||||||
|
|
||||||
@ -857,6 +867,7 @@ begin
|
|||||||
Replace(cmdstr,'$OPT',Info.ExtraOptions);
|
Replace(cmdstr,'$OPT',Info.ExtraOptions);
|
||||||
Replace(cmdstr,'$TARGET',targetstr);
|
Replace(cmdstr,'$TARGET',targetstr);
|
||||||
Replace(cmdstr,'$EMUL',EmulStr);
|
Replace(cmdstr,'$EMUL',EmulStr);
|
||||||
|
Replace(cmdstr,'$MAP',mapstr);
|
||||||
Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
|
Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
|
||||||
Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
|
Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
|
||||||
if (LdSupportsNoResponseFile) and (source_info.system in systems_all_windows) then
|
if (LdSupportsNoResponseFile) and (source_info.system in systems_all_windows) then
|
||||||
@ -934,6 +945,7 @@ var
|
|||||||
linkscript: TAsmScript;
|
linkscript: TAsmScript;
|
||||||
binstr,
|
binstr,
|
||||||
cmdstr,
|
cmdstr,
|
||||||
|
mapstr,
|
||||||
targetstr,
|
targetstr,
|
||||||
emulstr,
|
emulstr,
|
||||||
extdbgbinstr,
|
extdbgbinstr,
|
||||||
@ -944,6 +956,7 @@ var
|
|||||||
begin
|
begin
|
||||||
MakeSharedLibrary:=false;
|
MakeSharedLibrary:=false;
|
||||||
GCSectionsStr:='';
|
GCSectionsStr:='';
|
||||||
|
mapstr:='';
|
||||||
linkscript:=nil;
|
linkscript:=nil;
|
||||||
if not(cs_link_nolink in current_settings.globalswitches) then
|
if not(cs_link_nolink in current_settings.globalswitches) then
|
||||||
Message1(exec_i_linking,current_module.sharedlibfilename);
|
Message1(exec_i_linking,current_module.sharedlibfilename);
|
||||||
@ -959,6 +972,9 @@ begin
|
|||||||
else
|
else
|
||||||
GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
|
GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
|
||||||
|
|
||||||
|
if (cs_link_map in current_settings.globalswitches) then
|
||||||
|
mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.sharedlibfilename,'.map'));
|
||||||
|
|
||||||
{ i386_freebsd needs -b elf32-i386-freebsd and -m elf_i386_fbsd
|
{ i386_freebsd needs -b elf32-i386-freebsd and -m elf_i386_fbsd
|
||||||
to avoid creation of a i386:x86_64 arch binary }
|
to avoid creation of a i386:x86_64 arch binary }
|
||||||
|
|
||||||
@ -997,6 +1013,7 @@ begin
|
|||||||
Replace(cmdstr,'$FINI',FiniStr);
|
Replace(cmdstr,'$FINI',FiniStr);
|
||||||
Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
|
Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
|
||||||
Replace(cmdstr,'$SONAME',SoNameStr);
|
Replace(cmdstr,'$SONAME',SoNameStr);
|
||||||
|
Replace(cmdstr,'$MAP',mapstr);
|
||||||
if (target_info.system in systems_darwin) then
|
if (target_info.system in systems_darwin) then
|
||||||
Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
|
Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
|
||||||
BinStr:=FindUtil(utilsprefix+BinStr);
|
BinStr:=FindUtil(utilsprefix+BinStr);
|
||||||
|
@ -355,14 +355,14 @@ override FPCOPT+=-Ur
|
|||||||
endif
|
endif
|
||||||
CPU_UNITS=
|
CPU_UNITS=
|
||||||
SYSINIT_UNITS=
|
SYSINIT_UNITS=
|
||||||
LOADERS=prt0 cprt0 dllprt0 openbsd_ident
|
LOADERS=prt0 cprt0 dllprt0
|
||||||
ifeq ($(ARCH),x86_64)
|
ifeq ($(ARCH),x86_64)
|
||||||
CPU_UNITS=x86 ports cpu
|
CPU_UNITS=x86 ports cpu
|
||||||
SYSINIT_UNITS=si_prc si_c si_dll
|
SYSINIT_UNITS=si_prc si_c si_dll si_g
|
||||||
endif
|
endif
|
||||||
ifeq ($(ARCH),i386)
|
ifeq ($(ARCH),i386)
|
||||||
CPU_UNITS=x86 ports cpu mmx
|
CPU_UNITS=x86 ports cpu mmx
|
||||||
SYSINIT_UNITS=si_prc si_c si_dll
|
SYSINIT_UNITS=si_prc si_c si_dll si_g
|
||||||
endif
|
endif
|
||||||
OBJPASDIR=$(RTL)/objpas
|
OBJPASDIR=$(RTL)/objpas
|
||||||
GRAPHDIR=$(INC)/graph
|
GRAPHDIR=$(INC)/graph
|
||||||
@ -3014,7 +3014,6 @@ ifdef CLEAN_FILES
|
|||||||
-$(DEL) $(CLEAN_FILES)
|
-$(DEL) $(CLEAN_FILES)
|
||||||
endif
|
endif
|
||||||
-$(DELTREE) units
|
-$(DELTREE) units
|
||||||
-$(DELTREE) bin
|
|
||||||
-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
|
-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
|
||||||
ifneq ($(PPUEXT),.ppu)
|
ifneq ($(PPUEXT),.ppu)
|
||||||
-$(DEL) *.o *.ppu *.a
|
-$(DEL) *.o *.ppu *.a
|
||||||
@ -3176,13 +3175,13 @@ cprt0$(OEXT) : $(CPU_TARGET)/cprt0.as
|
|||||||
$(AS) -o $(UNITTARGETDIRPREFIX)cprt0$(OEXT) $(CPU_TARGET)/cprt0.as
|
$(AS) -o $(UNITTARGETDIRPREFIX)cprt0$(OEXT) $(CPU_TARGET)/cprt0.as
|
||||||
dllprt0$(OEXT) : $(CPU_TARGET)/dllprt0.as
|
dllprt0$(OEXT) : $(CPU_TARGET)/dllprt0.as
|
||||||
$(AS) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(CPU_TARGET)/dllprt0.as
|
$(AS) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(CPU_TARGET)/dllprt0.as
|
||||||
openbsd_ident$(OEXT) : $(CPU_TARGET)/openbsd_ident.as
|
si_prc$(PPUEXT) : si_prc.pp si_intf.inc si_impl.inc $(ARCH)/openbsd_ident.inc $(ARCH)/si_prc.inc $(SYSTEMUNIT)$(PPUEXT)
|
||||||
$(AS) -o $(UNITTARGETDIRPREFIX)openbsd_ident$(OEXT) $(CPU_TARGET)/openbsd_ident.as
|
|
||||||
si_prc$(PPUEXT) : si_prc.pp si_intf.inc $(ARCH)/si_prc.inc $(SYSTEMUNIT)$(PPUEXT)
|
|
||||||
$(COMPILER) $<
|
$(COMPILER) $<
|
||||||
si_c$(PPUEXT) : si_c.pp si_intf.inc $(ARCH)/si_c.inc $(SYSTEMUNIT)$(PPUEXT)
|
si_c$(PPUEXT) : si_c.pp si_intf.inc si_impl.inc $(ARCH)/openbsd_ident.inc $(ARCH)/si_c.inc $(SYSTEMUNIT)$(PPUEXT)
|
||||||
$(COMPILER) $<
|
$(COMPILER) $<
|
||||||
si_dll$(PPUEXT) : si_dll.pp si_intf.inc $(ARCH)/si_dll.inc $(SYSTEMUNIT)$(PPUEXT)
|
si_dll$(PPUEXT) : si_dll.pp si_intf.inc si_impl.inc $(ARCH)/openbsd_ident.inc $(ARCH)/si_dll.inc $(SYSTEMUNIT)$(PPUEXT)
|
||||||
|
$(COMPILER) $<
|
||||||
|
si_g$(PPUEXT) : si_g.pp si_intf.inc si_impl.inc $(ARCH)/openbsd_ident.inc $(ARCH)/si_g.inc $(SYSTEMUNIT)$(PPUEXT)
|
||||||
$(COMPILER) $<
|
$(COMPILER) $<
|
||||||
$(SYSTEMUNIT)$(PPUEXT) : $(BSDINC)/$(SYSTEMUNIT).pp sysconst.inc systypes.inc syscalls.inc $(SYSDEPS)
|
$(SYSTEMUNIT)$(PPUEXT) : $(BSDINC)/$(SYSTEMUNIT).pp sysconst.inc systypes.inc syscalls.inc $(SYSDEPS)
|
||||||
$(COMPILER) $(FPC_SYSTEM_OPT) -Us -Sg $(BSDINC)/$(SYSTEMUNIT).pp
|
$(COMPILER) $(FPC_SYSTEM_OPT) -Us -Sg $(BSDINC)/$(SYSTEMUNIT).pp
|
||||||
|
@ -85,15 +85,15 @@ endif
|
|||||||
CPU_UNITS=
|
CPU_UNITS=
|
||||||
SYSINIT_UNITS=
|
SYSINIT_UNITS=
|
||||||
|
|
||||||
LOADERS=prt0 cprt0 dllprt0 openbsd_ident
|
LOADERS=prt0 cprt0 dllprt0
|
||||||
|
|
||||||
ifeq ($(ARCH),x86_64)
|
ifeq ($(ARCH),x86_64)
|
||||||
CPU_UNITS=x86 ports cpu
|
CPU_UNITS=x86 ports cpu
|
||||||
SYSINIT_UNITS=si_prc si_c si_dll
|
SYSINIT_UNITS=si_prc si_c si_dll si_g
|
||||||
endif
|
endif
|
||||||
ifeq ($(ARCH),i386)
|
ifeq ($(ARCH),i386)
|
||||||
CPU_UNITS=x86 ports cpu mmx
|
CPU_UNITS=x86 ports cpu mmx
|
||||||
SYSINIT_UNITS=si_prc si_c si_dll
|
SYSINIT_UNITS=si_prc si_c si_dll si_g
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Paths
|
# Paths
|
||||||
@ -141,20 +141,20 @@ cprt0$(OEXT) : $(CPU_TARGET)/cprt0.as
|
|||||||
dllprt0$(OEXT) : $(CPU_TARGET)/dllprt0.as
|
dllprt0$(OEXT) : $(CPU_TARGET)/dllprt0.as
|
||||||
$(AS) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(CPU_TARGET)/dllprt0.as
|
$(AS) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(CPU_TARGET)/dllprt0.as
|
||||||
|
|
||||||
openbsd_ident$(OEXT) : $(CPU_TARGET)/openbsd_ident.as
|
|
||||||
$(AS) -o $(UNITTARGETDIRPREFIX)openbsd_ident$(OEXT) $(CPU_TARGET)/openbsd_ident.as
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# $(SYSINIT_UNITS) Units
|
# $(SYSINIT_UNITS) Units
|
||||||
#
|
#
|
||||||
si_prc$(PPUEXT) : si_prc.pp si_intf.inc $(ARCH)/si_prc.inc $(SYSTEMUNIT)$(PPUEXT)
|
si_prc$(PPUEXT) : si_prc.pp si_intf.inc si_impl.inc $(ARCH)/openbsd_ident.inc $(ARCH)/si_prc.inc $(SYSTEMUNIT)$(PPUEXT)
|
||||||
$(COMPILER) $<
|
$(COMPILER) $<
|
||||||
|
|
||||||
si_c$(PPUEXT) : si_c.pp si_intf.inc $(ARCH)/si_c.inc $(SYSTEMUNIT)$(PPUEXT)
|
si_c$(PPUEXT) : si_c.pp si_intf.inc si_impl.inc $(ARCH)/openbsd_ident.inc $(ARCH)/si_c.inc $(SYSTEMUNIT)$(PPUEXT)
|
||||||
$(COMPILER) $<
|
$(COMPILER) $<
|
||||||
|
|
||||||
si_dll$(PPUEXT) : si_dll.pp si_intf.inc $(ARCH)/si_dll.inc $(SYSTEMUNIT)$(PPUEXT)
|
si_dll$(PPUEXT) : si_dll.pp si_intf.inc si_impl.inc $(ARCH)/openbsd_ident.inc $(ARCH)/si_dll.inc $(SYSTEMUNIT)$(PPUEXT)
|
||||||
|
$(COMPILER) $<
|
||||||
|
|
||||||
|
si_g$(PPUEXT) : si_g.pp si_intf.inc si_impl.inc $(ARCH)/openbsd_ident.inc $(ARCH)/si_g.inc $(SYSTEMUNIT)$(PPUEXT)
|
||||||
$(COMPILER) $<
|
$(COMPILER) $<
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
.section ".note.openbsd.ident", "a"
|
|
||||||
.p2align 2
|
|
||||||
.long 8
|
|
||||||
.long 4
|
|
||||||
.long 1
|
|
||||||
.ascii "OpenBSD\0"
|
|
||||||
.long 0
|
|
14
rtl/openbsd/i386/openbsd_ident.inc
Normal file
14
rtl/openbsd/i386/openbsd_ident.inc
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{$asmmode att}
|
||||||
|
|
||||||
|
procedure OpenBSDIdentTag;nostackframe;assembler;
|
||||||
|
asm
|
||||||
|
.section ".note.openbsd.ident", "a"
|
||||||
|
.p2align 2
|
||||||
|
.long 8
|
||||||
|
.long 4
|
||||||
|
.long 1
|
||||||
|
.asciz "OpenBSD"
|
||||||
|
.long 0
|
||||||
|
|
||||||
|
.text
|
||||||
|
end;
|
16
rtl/openbsd/i386/si_g.inc
Normal file
16
rtl/openbsd/i386/si_g.inc
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
This file is part of the Free Pascal run time library.
|
||||||
|
Copyright (c) 2019 by Free Pascal development team
|
||||||
|
|
||||||
|
This file implements parts of the startup code for OpenBSD
|
||||||
|
programs, compiled with gprof support.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
**********************************************************************}
|
||||||
|
|
28
rtl/openbsd/si_g.pp
Normal file
28
rtl/openbsd/si_g.pp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
This file is part of the Free Pascal run time library.
|
||||||
|
Copyright (c) 2019 by Free Pascal development team
|
||||||
|
|
||||||
|
This file implements parts of the startup code for OpenBSD
|
||||||
|
programs, compiled with gprof support.
|
||||||
|
|
||||||
|
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_g;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
{$i si_intf.inc}
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$i si_impl.inc}
|
||||||
|
{$i si_g.inc}
|
||||||
|
|
||||||
|
end.
|
@ -12,7 +12,9 @@
|
|||||||
|
|
||||||
**********************************************************************}
|
**********************************************************************}
|
||||||
|
|
||||||
{$LINK openbsd_ident}
|
{$IFNDEF VER3_0}
|
||||||
|
{$I openbsd_ident.inc}
|
||||||
|
{$ENDIF VER3_0}
|
||||||
|
|
||||||
procedure PascalMain; external name 'PASCALMAIN';
|
procedure PascalMain; external name 'PASCALMAIN';
|
||||||
|
|
||||||
|
@ -17,6 +17,16 @@
|
|||||||
{$SMARTLINK OFF}
|
{$SMARTLINK OFF}
|
||||||
{$GOTO ON}
|
{$GOTO ON}
|
||||||
|
|
||||||
|
type
|
||||||
|
cint = LongInt;
|
||||||
|
{$if defined(cpu64)}
|
||||||
|
culong = QWord;
|
||||||
|
{$else}
|
||||||
|
culong = LongWord;
|
||||||
|
{$endif}
|
||||||
|
u_long = culong;
|
||||||
|
TCdeclProcedure = procedure; cdecl;
|
||||||
|
|
||||||
var
|
var
|
||||||
operatingsystem_parameter_envp: ppchar; public name 'operatingsystem_parameter_envp';
|
operatingsystem_parameter_envp: ppchar; public name 'operatingsystem_parameter_envp';
|
||||||
operatingsystem_parameter_argc: longint; public name 'operatingsystem_parameter_argc';
|
operatingsystem_parameter_argc: longint; public name 'operatingsystem_parameter_argc';
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
.section ".note.openbsd.ident", "a"
|
|
||||||
.p2align 2
|
|
||||||
.long 8
|
|
||||||
.long 4
|
|
||||||
.long 1
|
|
||||||
.ascii "OpenBSD\0"
|
|
||||||
.long 0
|
|
14
rtl/openbsd/x86_64/openbsd_ident.inc
Normal file
14
rtl/openbsd/x86_64/openbsd_ident.inc
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{$asmmode gas}
|
||||||
|
|
||||||
|
procedure OpenBSDIdentTag;nostackframe;assembler;
|
||||||
|
asm
|
||||||
|
.section ".note.openbsd.ident", "a"
|
||||||
|
.p2align 2
|
||||||
|
.long 8
|
||||||
|
.long 4
|
||||||
|
.long 1
|
||||||
|
.asciz "OpenBSD"
|
||||||
|
.long 0
|
||||||
|
|
||||||
|
.text
|
||||||
|
end;
|
@ -16,16 +16,17 @@
|
|||||||
|
|
||||||
{$asmmode gas}
|
{$asmmode gas}
|
||||||
|
|
||||||
var
|
{var
|
||||||
_etext: Byte; external name '_etext';
|
_etext: Byte; external name '_etext';
|
||||||
_eprol: Byte; external name '_eprol';
|
_eprol: Byte; external name '_eprol';}
|
||||||
|
|
||||||
procedure _mcleanup; external name '_mcleanup';
|
{procedure _mcleanup; cdecl; external name '_mcleanup';
|
||||||
procedure atexit; external name 'atexit';
|
function atexit(proc: TCdeclProcedure): cint; cdecl; external name 'atexit';
|
||||||
procedure monstartup; external name 'monstartup';
|
procedure monstartup(lowpc, highpc: u_long); cdecl; external name 'monstartup';}
|
||||||
procedure _init; external name '_init';
|
procedure __init; cdecl; external name '__init';
|
||||||
|
procedure c_exit(exit_code: cint); cdecl; noreturn; external name 'exit';
|
||||||
|
|
||||||
procedure _FPC_proc___start; forward;
|
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); forward;
|
||||||
|
|
||||||
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
|
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
|
||||||
asm
|
asm
|
||||||
@ -41,136 +42,56 @@ procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public
|
|||||||
jmp _FPC_proc___start
|
jmp _FPC_proc___start
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _FPC_proc_haltproc; forward;
|
procedure _FPC_proc_haltproc; noreturn; forward;
|
||||||
function _strrchr(str: PChar; character: LongInt): PChar; forward;
|
function _strrchr(str: PChar; character: LongInt): PChar; forward;
|
||||||
|
|
||||||
procedure _FPC_proc___start; assembler; nostackframe; public name '___start';
|
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord);
|
||||||
asm
|
var
|
||||||
pushq %rbp
|
I: SizeUInt;
|
||||||
movq %rsp, %rbp
|
begin
|
||||||
subq $64, %rsp
|
environ:=envp;
|
||||||
movl %edi, -20(%rbp)
|
operatingsystem_parameter_envp:=envp;
|
||||||
movq %rsi, -32(%rbp)
|
operatingsystem_parameter_argc:=argc;
|
||||||
movq %rdx, -40(%rbp)
|
operatingsystem_parameter_argv:=argv;
|
||||||
movq %rcx, -48(%rbp)
|
if argv[0]<>nil then
|
||||||
movq %r8, -56(%rbp)
|
begin
|
||||||
movq %r9, -64(%rbp)
|
__progname:=_strrchr(argv[0], Ord('/'));
|
||||||
movq -40(%rbp), %rax
|
if __progname<>nil then
|
||||||
movq %rax, environ(%rip)
|
Inc(__progname)
|
||||||
movq %rax,operatingsystem_parameter_envp(%rip)
|
else
|
||||||
movq -32(%rbp), %rax
|
__progname:=argv[0];
|
||||||
movq (%rax), %rax
|
I:=Low(__progname_storage);
|
||||||
movq %rax, -8(%rbp)
|
while (I<High(__progname_storage)) and (__progname[I]<>#0) do
|
||||||
cmpq $0, -8(%rbp)
|
begin
|
||||||
je .L2
|
__progname_storage[I]:=__progname[I-Low(__progname_storage)];
|
||||||
movq -8(%rbp), %rdi
|
Inc(I);
|
||||||
movl $47, %esi
|
end;
|
||||||
call _strrchr
|
__progname_storage[I]:=#0;
|
||||||
movq %rax, __progname(%rip)
|
__progname:=@__progname_storage;
|
||||||
movq __progname(%rip), %rax
|
end;
|
||||||
testq %rax, %rax
|
{ atexit(@_mcleanup);
|
||||||
jne .L4
|
monstartup(u_long(@_eprol),u_long(@_etext));}
|
||||||
movq -8(%rbp), %rax
|
__init;
|
||||||
movq %rax, __progname(%rip)
|
PascalMain;
|
||||||
jmp .L6
|
c_exit(operatingsystem_result);
|
||||||
.L4:
|
|
||||||
movq __progname(%rip), %rax
|
|
||||||
addq $1, %rax
|
|
||||||
movq %rax, __progname(%rip)
|
|
||||||
.L6:
|
|
||||||
leaq __progname_storage(%rip), %rax
|
|
||||||
movq %rax, -16(%rbp)
|
|
||||||
jmp .L7
|
|
||||||
.L8:
|
|
||||||
movq __progname(%rip), %rcx
|
|
||||||
movzbl (%rcx), %edx
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
movb %dl, (%rax)
|
|
||||||
addq $1, -16(%rbp)
|
|
||||||
leaq 1(%rcx), %rax
|
|
||||||
movq %rax, __progname(%rip)
|
|
||||||
.L7:
|
|
||||||
movq __progname(%rip), %rax
|
|
||||||
movzbl (%rax), %eax
|
|
||||||
testb %al, %al
|
|
||||||
je .L9
|
|
||||||
leaq __progname_storage+255(%rip), %rax
|
|
||||||
cmpq %rax, -16(%rbp)
|
|
||||||
jb .L8
|
|
||||||
.L9:
|
|
||||||
leaq __progname_storage(%rip), %rax
|
|
||||||
movq %rax, __progname(%rip)
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
movb $0, (%rax)
|
|
||||||
.L2:
|
|
||||||
movq _mcleanup@GOTPCREL(%rip), %rdi
|
|
||||||
call atexit
|
|
||||||
movq _etext@GOTPCREL(%rip), %rsi
|
|
||||||
movq _eprol(%rip), %rdi
|
|
||||||
call monstartup@plt
|
|
||||||
movl $0, %eax
|
|
||||||
call _init
|
|
||||||
movq environ(%rip), %rdx
|
|
||||||
movq -32(%rbp), %rsi
|
|
||||||
movl -20(%rbp), %edi
|
|
||||||
movq %rdi,operatingsystem_parameter_argc(%rip)
|
|
||||||
movq %rsi,operatingsystem_parameter_argv(%rip)
|
|
||||||
movl $0, %eax
|
|
||||||
call PASCALMAIN
|
|
||||||
// movl %eax, %edi
|
|
||||||
// call exit
|
|
||||||
jmp _FPC_proc_haltproc
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
|
procedure _FPC_proc_haltproc; noreturn; public name '_haltproc';
|
||||||
asm
|
begin
|
||||||
movq $1,%rax
|
c_exit(operatingsystem_result);
|
||||||
movl operatingsystem_result(%rip),%ebx
|
|
||||||
pushq %rbx
|
|
||||||
call .Lactualsyscall
|
|
||||||
addq $8,%rsp
|
|
||||||
jmp _FPC_proc_haltproc
|
|
||||||
|
|
||||||
.Lactualsyscall:
|
|
||||||
int $0x80
|
|
||||||
jb .LErrorcode
|
|
||||||
xor %rbx,%rbx
|
|
||||||
ret
|
|
||||||
.LErrorcode:
|
|
||||||
movq %rax,%rbx
|
|
||||||
movq $-1,%rax
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _strrchr(str: PChar; character: LongInt): PChar; assembler; nostackframe; public name '_strrchr';
|
function _strrchr(str: PChar; character: LongInt): PChar; public name '_strrchr';
|
||||||
asm
|
begin
|
||||||
pushq %rbp
|
_strrchr:=nil;
|
||||||
movq %rsp, %rbp
|
repeat
|
||||||
movq %rdi, -24(%rbp)
|
if str^=Chr(character) then
|
||||||
movb %sil, -25(%rbp)
|
_strrchr:=str;
|
||||||
movq $0, -8(%rbp)
|
if str^<>#0 then
|
||||||
.L13:
|
Inc(str);
|
||||||
movq -24(%rbp), %rdx
|
until str^=#0;
|
||||||
movzbl (%rdx), %eax
|
|
||||||
cmpb -25(%rbp), %al
|
|
||||||
jne .L14
|
|
||||||
movq -24(%rbp), %rax
|
|
||||||
movq %rax, -8(%rbp)
|
|
||||||
.L14:
|
|
||||||
movq -24(%rbp), %rdx
|
|
||||||
movzbl (%rdx), %eax
|
|
||||||
testb %al, %al
|
|
||||||
jne .L16
|
|
||||||
movq -8(%rbp), %rax
|
|
||||||
movq %rax, -16(%rbp)
|
|
||||||
jmp .L12
|
|
||||||
.L16:
|
|
||||||
addq $1, -24(%rbp)
|
|
||||||
jmp .L13
|
|
||||||
.L12:
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
leave
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure MD_EPROL_LABEL; assembler; nostackframe; public name '_eprol';
|
{procedure MD_EPROL_LABEL; assembler; nostackframe; public name '_eprol';
|
||||||
asm
|
asm
|
||||||
end;
|
end;}
|
||||||
|
@ -16,119 +16,22 @@
|
|||||||
|
|
||||||
{$asmmode gas}
|
{$asmmode gas}
|
||||||
|
|
||||||
|
{$ifdef VER3_0}
|
||||||
procedure _init; external name '_init';
|
procedure _init; external name '_init';
|
||||||
|
{$else VER3_0}
|
||||||
|
procedure _init; weakexternal name '_init';
|
||||||
|
{$endif VER3_0}
|
||||||
|
|
||||||
procedure _FPC_proc___start; forward;
|
procedure _FPC_shared_lib_start; cdecl; public name 'FPC_LIB_START';
|
||||||
|
begin
|
||||||
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
|
{ todo: figure out if there's any way to obtain these in OpenBSD shared libraries }
|
||||||
asm
|
environ:=nil;
|
||||||
movq %rbx,%r9
|
operatingsystem_parameter_envp:=nil;
|
||||||
movq %rcx,%r8
|
operatingsystem_parameter_argc:=0;
|
||||||
movq %rdx,%rcx
|
operatingsystem_parameter_argv:=nil;
|
||||||
movq (%rsp),%rdi
|
if Assigned(@_init) then
|
||||||
leaq 16(%rsp,%rdi,8),%rdx
|
_init;
|
||||||
leaq 8(%rsp),%rsi
|
PascalMain;
|
||||||
subq $8,%rsp
|
|
||||||
andq $0xFFFFFFFFFFFFFFF0,%rsp
|
|
||||||
addq $8,%rsp
|
|
||||||
jmp _FPC_proc___start
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure _FPC_proc_haltproc; forward;
|
|
||||||
function _strrchr(str: PChar; character: LongInt): PChar; forward;
|
|
||||||
|
|
||||||
procedure _FPC_proc___start; assembler; nostackframe; public name '___start';
|
|
||||||
asm
|
|
||||||
pushq %rbp
|
|
||||||
movq %rsp, %rbp
|
|
||||||
subq $64, %rsp
|
|
||||||
movl %edi, -20(%rbp)
|
|
||||||
movq %rsi, -32(%rbp)
|
|
||||||
movq %rdx, -40(%rbp)
|
|
||||||
movq %rcx, -48(%rbp)
|
|
||||||
movq %r8, -56(%rbp)
|
|
||||||
movq %r9, -64(%rbp)
|
|
||||||
movq environ@GOTPCREL(%rip), %rdx
|
|
||||||
movq -40(%rbp), %rax
|
|
||||||
movq %rax, (%rdx)
|
|
||||||
movq operatingsystem_parameter_envp@GOTPCREL(%rip), %rdx
|
|
||||||
movq -40(%rbp), %rax
|
|
||||||
movq %rax, (%rdx)
|
|
||||||
|
|
||||||
movl -20(%rbp), %eax
|
|
||||||
movslq %eax,%rdx
|
|
||||||
movq operatingsystem_parameter_argc@GOTPCREL(%rip), %rax
|
|
||||||
movq %rdx, (%rax)
|
|
||||||
movq operatingsystem_parameter_argv@GOTPCREL(%rip), %rdx
|
|
||||||
movq -32(%rbp), %rax
|
|
||||||
movq %rax, (%rdx)
|
|
||||||
movq -32(%rbp), %rax
|
|
||||||
movq (%rax), %rax
|
|
||||||
movq %rax, -8(%rbp)
|
|
||||||
cmpq $0, -8(%rbp)
|
|
||||||
je .L2
|
|
||||||
movq -8(%rbp), %rdi
|
|
||||||
movl $47, %esi
|
|
||||||
call _strrchr
|
|
||||||
movq %rax, %rdx
|
|
||||||
movq __progname@GOTPCREL(%rip), %rax
|
|
||||||
movq %rdx, (%rax)
|
|
||||||
movq __progname@GOTPCREL(%rip), %rax
|
|
||||||
movq (%rax), %rax
|
|
||||||
testq %rax, %rax
|
|
||||||
jne .L4
|
|
||||||
movq __progname@GOTPCREL(%rip), %rdx
|
|
||||||
movq -8(%rbp), %rax
|
|
||||||
movq %rax, (%rdx)
|
|
||||||
jmp .L6
|
|
||||||
.L4:
|
|
||||||
movq __progname@GOTPCREL(%rip), %rax
|
|
||||||
movq (%rax), %rax
|
|
||||||
leaq 1(%rax), %rdx
|
|
||||||
movq __progname@GOTPCREL(%rip), %rax
|
|
||||||
movq %rdx, (%rax)
|
|
||||||
.L6:
|
|
||||||
movq __progname_storage@GOTPCREL(%rip), %rax
|
|
||||||
movq %rax, -16(%rbp)
|
|
||||||
jmp .L7
|
|
||||||
.L8:
|
|
||||||
movq __progname@GOTPCREL(%rip), %rax
|
|
||||||
movq (%rax), %rcx
|
|
||||||
movzbl (%rcx), %edx
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
movb %dl, (%rax)
|
|
||||||
addq $1, -16(%rbp)
|
|
||||||
leaq 1(%rcx), %rdx
|
|
||||||
movq __progname@GOTPCREL(%rip), %rax
|
|
||||||
movq %rdx, (%rax)
|
|
||||||
.L7:
|
|
||||||
movq __progname@GOTPCREL(%rip), %rax
|
|
||||||
movq (%rax), %rax
|
|
||||||
movzbl (%rax), %eax
|
|
||||||
testb %al, %al
|
|
||||||
je .L9
|
|
||||||
movq __progname_storage@GOTPCREL(%rip), %rax
|
|
||||||
leaq 255(%rax), %rax
|
|
||||||
cmpq %rax, -16(%rbp)
|
|
||||||
jb .L8
|
|
||||||
.L9:
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
movb $0, (%rax)
|
|
||||||
movq __progname@GOTPCREL(%rip), %rdx
|
|
||||||
movq __progname_storage@GOTPCREL(%rip), %rax
|
|
||||||
movq %rax, (%rdx)
|
|
||||||
.L2:
|
|
||||||
movl $0, %eax
|
|
||||||
call _init@PLT
|
|
||||||
movq environ@GOTPCREL(%rip), %rax
|
|
||||||
movq (%rax), %rdx
|
|
||||||
movq -32(%rbp), %rsi
|
|
||||||
movl -20(%rbp), %edi
|
|
||||||
movl $0, %eax
|
|
||||||
call PASCALMAIN@PLT
|
|
||||||
// movl %eax, %edi
|
|
||||||
// call exit
|
|
||||||
jmp _FPC_proc_haltproc@PLT
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
|
procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
|
||||||
@ -149,34 +52,3 @@ procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
|
|||||||
movq %rax,%rbx
|
movq %rax,%rbx
|
||||||
movq $-1,%rax
|
movq $-1,%rax
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _strrchr(str: PChar; character: LongInt): PChar; assembler; nostackframe; public name '_strrchr';
|
|
||||||
asm
|
|
||||||
pushq %rbp
|
|
||||||
movq %rsp, %rbp
|
|
||||||
movq %rdi, -24(%rbp)
|
|
||||||
movb %sil, -25(%rbp)
|
|
||||||
movq $0, -8(%rbp)
|
|
||||||
.L13:
|
|
||||||
movq -24(%rbp), %rdx
|
|
||||||
movzbl (%rdx), %eax
|
|
||||||
cmpb -25(%rbp), %al
|
|
||||||
jne .L14
|
|
||||||
movq -24(%rbp), %rax
|
|
||||||
movq %rax, -8(%rbp)
|
|
||||||
.L14:
|
|
||||||
movq -24(%rbp), %rdx
|
|
||||||
movzbl (%rdx), %eax
|
|
||||||
testb %al, %al
|
|
||||||
jne .L16
|
|
||||||
movq -8(%rbp), %rax
|
|
||||||
movq %rax, -16(%rbp)
|
|
||||||
jmp .L12
|
|
||||||
.L16:
|
|
||||||
addq $1, -24(%rbp)
|
|
||||||
jmp .L13
|
|
||||||
.L12:
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
leave
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
97
rtl/openbsd/x86_64/si_g.inc
Normal file
97
rtl/openbsd/x86_64/si_g.inc
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
{
|
||||||
|
This file is part of the Free Pascal run time library.
|
||||||
|
Copyright (c) 2019 by Free Pascal development team
|
||||||
|
|
||||||
|
This file implements parts of the startup code for OpenBSD
|
||||||
|
programs, compiled with gprof support.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
**********************************************************************}
|
||||||
|
|
||||||
|
{$asmmode gas}
|
||||||
|
|
||||||
|
var
|
||||||
|
_etext: Byte; external name '_etext';
|
||||||
|
_eprol: Byte; external name '_eprol';
|
||||||
|
|
||||||
|
procedure _mcleanup; cdecl; external name '_mcleanup';
|
||||||
|
function atexit(proc: TCdeclProcedure): cint; cdecl; external name 'atexit';
|
||||||
|
procedure _monstartup(lowpc, highpc: u_long); cdecl; external name '_monstartup';
|
||||||
|
procedure __init; cdecl; external name '__init';
|
||||||
|
procedure c_exit(exit_code: cint); cdecl; noreturn; external name 'exit';
|
||||||
|
|
||||||
|
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); forward;
|
||||||
|
|
||||||
|
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
|
||||||
|
asm
|
||||||
|
movq %rbx,%r9
|
||||||
|
movq %rcx,%r8
|
||||||
|
movq %rdx,%rcx
|
||||||
|
movq (%rsp),%rdi
|
||||||
|
leaq 16(%rsp,%rdi,8),%rdx
|
||||||
|
leaq 8(%rsp),%rsi
|
||||||
|
subq $8,%rsp
|
||||||
|
andq $0xFFFFFFFFFFFFFFF0,%rsp
|
||||||
|
addq $8,%rsp
|
||||||
|
jmp _FPC_proc___start
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure _FPC_proc_haltproc; noreturn; forward;
|
||||||
|
function _strrchr(str: PChar; character: LongInt): PChar; forward;
|
||||||
|
|
||||||
|
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord);
|
||||||
|
var
|
||||||
|
I: SizeUInt;
|
||||||
|
begin
|
||||||
|
environ:=envp;
|
||||||
|
operatingsystem_parameter_envp:=envp;
|
||||||
|
operatingsystem_parameter_argc:=argc;
|
||||||
|
operatingsystem_parameter_argv:=argv;
|
||||||
|
if argv[0]<>nil then
|
||||||
|
begin
|
||||||
|
__progname:=_strrchr(argv[0], Ord('/'));
|
||||||
|
if __progname<>nil then
|
||||||
|
Inc(__progname)
|
||||||
|
else
|
||||||
|
__progname:=argv[0];
|
||||||
|
I:=Low(__progname_storage);
|
||||||
|
while (I<High(__progname_storage)) and (__progname[I]<>#0) do
|
||||||
|
begin
|
||||||
|
__progname_storage[I]:=__progname[I-Low(__progname_storage)];
|
||||||
|
Inc(I);
|
||||||
|
end;
|
||||||
|
__progname_storage[I]:=#0;
|
||||||
|
__progname:=@__progname_storage;
|
||||||
|
end;
|
||||||
|
atexit(@_mcleanup);
|
||||||
|
_monstartup(u_long(@_eprol),u_long(@_etext));
|
||||||
|
__init;
|
||||||
|
PascalMain;
|
||||||
|
c_exit(operatingsystem_result);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure _FPC_proc_haltproc; noreturn; public name '_haltproc';
|
||||||
|
begin
|
||||||
|
c_exit(operatingsystem_result);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function _strrchr(str: PChar; character: LongInt): PChar; public name '_strrchr';
|
||||||
|
begin
|
||||||
|
_strrchr:=nil;
|
||||||
|
repeat
|
||||||
|
if str^=Chr(character) then
|
||||||
|
_strrchr:=str;
|
||||||
|
if str^<>#0 then
|
||||||
|
Inc(str);
|
||||||
|
until str^=#0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MD_EPROL_LABEL; assembler; nostackframe; public name '_eprol';
|
||||||
|
asm
|
||||||
|
end;
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
{$asmmode gas}
|
{$asmmode gas}
|
||||||
|
|
||||||
procedure _FPC_proc___start; forward;
|
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); forward;
|
||||||
|
|
||||||
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
|
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
|
||||||
asm
|
asm
|
||||||
@ -35,84 +35,34 @@ procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public
|
|||||||
procedure _FPC_proc_haltproc; forward;
|
procedure _FPC_proc_haltproc; forward;
|
||||||
function _strrchr(str: PChar; character: LongInt): PChar; forward;
|
function _strrchr(str: PChar; character: LongInt): PChar; forward;
|
||||||
|
|
||||||
procedure _FPC_proc___start; assembler; nostackframe; public name '___start';
|
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord);
|
||||||
asm
|
var
|
||||||
pushq %rbp
|
I: SizeUInt;
|
||||||
movq %rsp, %rbp
|
begin
|
||||||
subq $64, %rsp
|
environ:=envp;
|
||||||
movl %edi, -20(%rbp)
|
operatingsystem_parameter_envp:=envp;
|
||||||
movq %rsi, -32(%rbp)
|
operatingsystem_parameter_argc:=argc;
|
||||||
movq %rdx, -40(%rbp)
|
operatingsystem_parameter_argv:=argv;
|
||||||
movq %rcx, -48(%rbp)
|
if argv[0]<>nil then
|
||||||
movq %r8, -56(%rbp)
|
begin
|
||||||
movq %r9, -64(%rbp)
|
__progname:=_strrchr(argv[0], Ord('/'));
|
||||||
movq -40(%rbp), %rax
|
if __progname<>nil then
|
||||||
movq %rax, environ(%rip)
|
Inc(__progname)
|
||||||
movq %rax,operatingsystem_parameter_envp(%rip)
|
else
|
||||||
movq -32(%rbp), %rax
|
__progname:=argv[0];
|
||||||
movq (%rax), %rax
|
I:=Low(__progname_storage);
|
||||||
movq %rax, -8(%rbp)
|
while (I<High(__progname_storage)) and (__progname[I]<>#0) do
|
||||||
cmpq $0, -8(%rbp)
|
begin
|
||||||
je .L2
|
__progname_storage[I]:=__progname[I-Low(__progname_storage)];
|
||||||
movq -8(%rbp), %rdi
|
Inc(I);
|
||||||
movl $47, %esi
|
end;
|
||||||
call _strrchr
|
__progname_storage[I]:=#0;
|
||||||
movq %rax, __progname(%rip)
|
__progname:=@__progname_storage;
|
||||||
movq __progname(%rip), %rax
|
end;
|
||||||
testq %rax, %rax
|
PascalMain;
|
||||||
jne .L4
|
asm
|
||||||
movq -8(%rbp), %rax
|
jmp _FPC_proc_haltproc
|
||||||
movq %rax, __progname(%rip)
|
end;
|
||||||
jmp .L6
|
|
||||||
.L4:
|
|
||||||
movq __progname(%rip), %rax
|
|
||||||
addq $1, %rax
|
|
||||||
movq %rax, __progname(%rip)
|
|
||||||
.L6:
|
|
||||||
leaq __progname_storage(%rip), %rax
|
|
||||||
movq %rax, -16(%rbp)
|
|
||||||
jmp .L7
|
|
||||||
.L8:
|
|
||||||
movq __progname(%rip), %rcx
|
|
||||||
movzbl (%rcx), %edx
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
movb %dl, (%rax)
|
|
||||||
addq $1, -16(%rbp)
|
|
||||||
leaq 1(%rcx), %rax
|
|
||||||
movq %rax, __progname(%rip)
|
|
||||||
.L7:
|
|
||||||
movq __progname(%rip), %rax
|
|
||||||
movzbl (%rax), %eax
|
|
||||||
testb %al, %al
|
|
||||||
je .L9
|
|
||||||
leaq __progname_storage+255(%rip), %rax
|
|
||||||
cmpq %rax, -16(%rbp)
|
|
||||||
jb .L8
|
|
||||||
.L9:
|
|
||||||
leaq __progname_storage(%rip), %rax
|
|
||||||
movq %rax, __progname(%rip)
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
movb $0, (%rax)
|
|
||||||
.L2:
|
|
||||||
// movl $_mcleanup, %edi
|
|
||||||
// call atexit
|
|
||||||
// movl $_etext, %eax
|
|
||||||
// movq %rax, %rsi
|
|
||||||
// movl $_eprol, %eax
|
|
||||||
// movq %rax, %rdi
|
|
||||||
// call monstartup
|
|
||||||
// movl $0, %eax
|
|
||||||
// call __init
|
|
||||||
movq environ(%rip), %rdx
|
|
||||||
movq -32(%rbp), %rsi
|
|
||||||
movl -20(%rbp), %edi
|
|
||||||
movq %rdi,operatingsystem_parameter_argc(%rip)
|
|
||||||
movq %rsi,operatingsystem_parameter_argv(%rip)
|
|
||||||
movl $0, %eax
|
|
||||||
call PASCALMAIN
|
|
||||||
// movl %eax, %edi
|
|
||||||
// call exit
|
|
||||||
jmp _FPC_proc_haltproc
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
|
procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
|
||||||
@ -134,32 +84,13 @@ procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
|
|||||||
movq $-1,%rax
|
movq $-1,%rax
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _strrchr(str: PChar; character: LongInt): PChar; assembler; nostackframe; public name '_strrchr';
|
function _strrchr(str: PChar; character: LongInt): PChar; public name '_strrchr';
|
||||||
asm
|
begin
|
||||||
pushq %rbp
|
_strrchr:=nil;
|
||||||
movq %rsp, %rbp
|
repeat
|
||||||
movq %rdi, -24(%rbp)
|
if str^=Chr(character) then
|
||||||
movb %sil, -25(%rbp)
|
_strrchr:=str;
|
||||||
movq $0, -8(%rbp)
|
if str^<>#0 then
|
||||||
.L13:
|
Inc(str);
|
||||||
movq -24(%rbp), %rdx
|
until str^=#0;
|
||||||
movzbl (%rdx), %eax
|
|
||||||
cmpb -25(%rbp), %al
|
|
||||||
jne .L14
|
|
||||||
movq -24(%rbp), %rax
|
|
||||||
movq %rax, -8(%rbp)
|
|
||||||
.L14:
|
|
||||||
movq -24(%rbp), %rdx
|
|
||||||
movzbl (%rdx), %eax
|
|
||||||
testb %al, %al
|
|
||||||
jne .L16
|
|
||||||
movq -8(%rbp), %rax
|
|
||||||
movq %rax, -16(%rbp)
|
|
||||||
jmp .L12
|
|
||||||
.L16:
|
|
||||||
addq $1, -24(%rbp)
|
|
||||||
jmp .L13
|
|
||||||
.L12:
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
leave
|
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user