From 28f75840c73b826d3a9220a4c679a06cb60c50ff Mon Sep 17 00:00:00 2001 From: Jens Kallup Date: Thu, 17 Oct 2024 23:52:20 +0200 Subject: [PATCH] update --- build.bat | 463 ++++------------------------- src/sources/fpc-qt/symbols.asm | 1 - src/sources/fpc-rtl/RTL_List.pas | 18 ++ src/sources/fpc-rtl/RTL_Memory.pas | 301 ++----------------- src/sources/fpc-rtl/RTL_Object.pas | 6 + src/sources/fpc-rtl/vmt.asm | 33 ++ src/sources/fpc-sys/FPC_System.pas | 284 +++++++++++++++++- src/sources/fpc-sys/system.pas | 6 + src/test/fpc_rtl.def | 78 +---- src/test/fpc_rtl.dll | Bin 35566 -> 38400 bytes src/test/impFPC_RTL.def | 3 +- src/test/ppas.bat | 2 +- src/test/test1.exe | Bin 4608 -> 18944 bytes src/test/test1.pas | 12 +- src/test/test1.s | 173 +++++++++-- src/transform.py | 6 +- 16 files changed, 596 insertions(+), 790 deletions(-) create mode 100644 src/sources/fpc-rtl/RTL_List.pas create mode 100644 src/sources/fpc-rtl/vmt.asm diff --git a/build.bat b/build.bat index 1f90db8..f3c9837 100644 --- a/build.bat +++ b/build.bat @@ -214,11 +214,6 @@ echo. echo =[ create library files... ]= 5 %% done echo. -for %%A in (RTL_Memory) do ( - echo compile: %prjdir%\sources\fpc-rtl\%%A.pas - %fpcx64% -dwindll -CX -fPIC -st -Xe -XD -FE%prjdir%\units\fpc-rtl %prjdir%\sources\fpc-rtl\%%A.pas -) - for %%A in (Qt_String Qt_Dialogs) do ( echo compile: %prjdir%\sources\fpc-qt\%%A.pas %fpcx64% -dwindll -CX -fPIC -st -Xe -XD -FE%prjdir%\units\fpc-qt %prjdir%\sources\fpc-qt\%%A.pas @@ -226,38 +221,6 @@ for %%A in (Qt_String Qt_Dialogs) do ( :: ----------------------------------------------------------------- :: remove not wanted rtti information's ... :: ----------------------------------------------------------------- -for %%A in (RTL_Memory) do ( - echo sedding: %prjdir%\units\fpc-rtl\%%A.s - sed '/\; Begin asmlist al_rtti/,/\; End asmlist al_rtti/d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\; Begin asmlist al_dwarf_frame.*/,/\; End asmlist al_dwarf_frame.*/d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\.\.\@.*strlab\:/,+3d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\; Begin asmlist al_indirectglobals.*/,/\; End asmlist al_indirectglobals.*/d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\; Begin asmlist al_globals.*/,/\; End asmlist al_globals.*/d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/call\tfpc\_reraise/,/\t\tcall\tFPC\_DONEEXCEPTION/d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) -) for %%A in (Qt_String Qt_Dialogs) do ( echo sedding: %prjdir%\units\fpc-qt\%%A.s sed '/\; Begin asmlist al_rtti/,/\; End asmlist al_rtti/d' %prjdir%\units\fpc-qt\%%A.s > %prjdir%\units\fpc-qt\%%A.tmp @@ -301,10 +264,19 @@ echo. echo =[ assemble files... ]= 6 %% done echo. copy %prjdir%\sources\fpc-qt\symbols.asm %prjdir%\units\fpc-qt\symbols.s +copy %prjdir%\sources\fpc-rtl\vmt.asm %prjdir%\units\fpc-rtl\vmt.s + for %%A in (Qt_String Qt_Dialogs symbols) do ( echo assemble: %prjdir%\units\fpc-qt\%%A.s %asmx64% -o%prjdir%\units\fpc-qt\%%A.o %prjdir%\units\fpc-qt\%%A.s + if errorlevel 1 (goto buildError) +) +for %%A in (vmt) do ( + echo assemble: %prjdir%\units\fpc-rtl\%%A.s + %asmx64% -o%prjdir%\units\fpc-rtl\%%A.o %prjdir%\units\fpc-rtl\%%A.s + if errorlevel 1 (goto buildError) ) + echo compile: %prjdir%\test\fpc_rtl.pas %fpcx64% -dwindll -CX -fPIC -st -Xe -XD -FE%prjdir%\units\fpc-rtl %prjdir%\test\fpc_rtl.pas if errorlevel 1 (goto buildError) @@ -323,184 +295,26 @@ copy %punits%\fpc-rtl\rtl_utils.s %punits%\fpc-sys\rtl_utils.s > nul echo. echo =[ seeding asm files... ]= 12 %% done echo. -:: ----------------------------------------------------------------- -:: remove not wanted rtti information's ... -:: ----------------------------------------------------------------- -for %%A in (system rtl_utils fpc_rtl) do ( - echo sedding: %prjdir%\units\fpc-sys\%%A.s - sed '/\; Begin asmlist al_rtti/,/\; End asmlist al_rtti/d' %prjdir%\units\fpc-sys\%%A.s > %prjdir%\units\fpc-sys\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-sys\%%A.tmp" %prjdir%\units\fpc-sys\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\; Begin asmlist al_dwarf_frame.*/,/\; End asmlist al_dwarf_frame.*/d' %prjdir%\units\fpc-sys\%%A.s > %prjdir%\units\fpc-sys\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-sys\%%A.tmp" %prjdir%\units\fpc-sys\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\.\.\@.*strlab\:/,+3d' %prjdir%\units\fpc-sys\%%A.s > %prjdir%\units\fpc-sys\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-sys\%%A.tmp" %prjdir%\units\fpc-sys\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\; Begin asmlist al_indirectglobals.*/,/\; End asmlist al_indirectglobals.*/d' %prjdir%\units\fpc-sys\%%A.s > %prjdir%\units\fpc-sys\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-sys\%%A.tmp" %prjdir%\units\fpc-sys\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\; Begin asmlist al_globals.*/,/\; End asmlist al_globals.*/d' %prjdir%\units\fpc-sys\%%A.s > %prjdir%\units\fpc-sys\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-sys\%%A.tmp" %prjdir%\units\fpc-sys\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) -) -echo. -for %%A in (system rtl_utils fpc_rtl) do ( - echo sedding: %prjdir%\units\fpc-rtl\%%A.s - sed '/\; Begin asmlist al_rtti/,/\; End asmlist al_rtti/d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\; Begin asmlist al_dwarf_frame.*/,/\; End asmlist al_dwarf_frame.*/d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\.\.\@.*strlab\:/,+3d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\; Begin asmlist al_indirectglobals.*/,/\; End asmlist al_indirectglobals.*/d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) - - sed '/\; Begin asmlist al_globals.*/,/\; End asmlist al_globals.*/d' %prjdir%\units\fpc-rtl\%%A.s > %prjdir%\units\fpc-rtl\%%A.tmp - if errorlevel 1 (goto buildError) - move /Y "%prjdir%\units\fpc-rtl\%%A.tmp" %prjdir%\units\fpc-rtl\%%A.s >nul: 2>nul: - if errorlevel 1 (goto buildError) -) -echo. -:: ----------------------------------------------------------------- -:: patch with assembly code ... -:: ----------------------------------------------------------------- -::sed -i '/\tGLOBAL\s*SYSTEM\_\$\$\_MESSAGEBOX\$QSTRING\$PCHAR\$\$LONGDWORD/,/.*ret/d' %prjdir%\units\fpc-rtl\system.s - -::sed -i '/\tGLOBAL\s*SYSTEM\$\_\$QSTRING\_\$\_\_\$\$\_CREATE\$\$QSTRING/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s -::sed -i '/\tGLOBAL\s*SYSTEM\$\_\$QSTRING\_\$\_\_\$\$\_CREATE\$QSTRING\$\$QSTRING/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s - -:: ----------------------------------------------------------------- -:: there, we go furture with MinGW64 (sys2) console ... -:: ----------------------------------------------------------------- -::%BASHCO% --login -i -c "%SCRIPT_PATH%/script_sed.sh" - -echo seeding: units\fpc-rtl\system.s -sed '/\tGLOBAL SYSTEM\$\_\$QSTRING\_\$\_\_\$\$\_CREATE\$PCHAR\$\$QSTRING/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$QSTRING\_\$\_\_\$\$\_DESTROY/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$QSTRING\_\$\_\_\$\$\_APPEND\$PCHAR\$\$QSTRING/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$QSTRING\_\$\_\_\$\$\_APPEND\$QSTRING\$\$QSTRING/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) +goto skipseed -sed '/\tGLOBAL SYSTEM\$\_\$QOBJECT\_\$\_\_\$\$\_CREATE$$QOBJECT/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) -sed '/\tGLOBAL SYSTEM\$\_\$QOBJECT\_\$\_\_\$\$\_DESTROY/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) +echo section .data >> %prjdir%\units\fpc-rtl\fpc_rtl.s +echo global U_$P$FPC_RTL_$$_LIBRARYHDL >> %prjdir%\units\fpc-rtl\fpc_rtl.s +echo U_$P$FPC_RTL_$$_LIBRARYHDL: >> %prjdir%\units\fpc-rtl\fpc_rtl.s +echo dq 0 >> %prjdir%\units\fpc-rtl\fpc_rtl.s +echo. >> %prjdir%\units\fpc-rtl\fpc_rtl.s +echo section .data >> %prjdir%\units\fpc-rtl\fpc_rtl.s +echo global U_$P$TEST1_$$_MEMORYMANAGER >> %prjdir%\units\fpc-rtl\fpc_rtl.s +echo U_$P$TEST1_$$_MEMORYMANAGER: >> %prjdir%\units\fpc-rtl\fpc_rtl.s +echo dq 0 >> %prjdir%\units\fpc-rtl\fpc_rtl.s +echo. >> %prjdir%\units\fpc-rtl\fpc_rtl.s -sed '/\tGLOBAL SYSTEM\$\_\$TOBJECT\_\$\_\_\$\$\_AFTERCONSTRUCTION/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$TOBJECT\_\$\_\_\$\$\_BEFOREDESTRUCTION/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$TOBJECT\_\$\_\_\$\$\_CREATE\$\$TOBJECT/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$TOBJECT\_\$\_\_\$\$\_DESTROY/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$TOBJECT\_\$\_\_\$\$\_FREE/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$TOBJECT\_\$\_\_\$\$\_FREEINSTANCE/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$TOBJECT\_\$\_\_\$\$\_SAFECALLEXCEPTION$TOBJECT\$POINTER\$\$SHORTDWORD/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/\tGLOBAL SYSTEM\$\_\$TOBJECT\_\$\_\_\$\$\_DEFAULTHANDLER\$formal/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -::sed '/SYSTEM\$\_.*\_fin/{:a;N;/\t\tret/!ba;d}' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -::if errorlevel 1 (goto buildError) -::move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -::if errorlevel 1 (goto buildError) - -sed '/SYSTEM\$\_\$QSTRING\_\$\_\_\$\$\_CREATE\$\$QSTRING/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/GLOBAL SYSTEM\$\_\$QSTRING\_\$\_\_\$\$\_CREATE\$QSTRING\$\$QSTRING/,/\t\tret/d' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '0,/GLOBAL fpc_do_exit/s///' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '0,/fpc_do_exit\:/s///' %prjdir%\units\fpc-rtl\system.s > %prjdir%\units\fpc-rtl\system.tmp -if errorlevel 1 (goto buildError) -move /Y %prjdir%\units\fpc-rtl\system.tmp %prjdir%\units\fpc-rtl\system.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -echo section .data >> %prjdir%\units\fpc-rtl\fpc_rtl.s -echo global U_$P$FPC_RTL_$$_LIBRARYHDL >> %prjdir%\units\fpc-rtl\fpc_rtl.s -echo U_$P$FPC_RTL_$$_LIBRARYHDL: >> %prjdir%\units\fpc-rtl\fpc_rtl.s -echo dq 0 >> %prjdir%\units\fpc-rtl\fpc_rtl.s -echo. >> %prjdir%\units\fpc-rtl\fpc_rtl.s +:skipseed :: ----------------------------------------------------------------- :: assemble all new files for this build ... :: ----------------------------------------------------------------- -for %%A in (system rtl_utils fpc_rtl rtl_memory) do ( +for %%A in (system rtl_utils fpc_rtl) do ( echo assemble: %punits%\fpc-rtl\%%A.s %asmx64% -o %prjdir%\units\fpc-rtl\%%A.o %punits%\fpc-rtl\%%A.s if errorlevel 1 (goto buildError) @@ -513,159 +327,10 @@ echo. :: ----------------------------------------------------------------- echo =[ re-mapping symbols... ]= -:: ----------------------------------------------------------------- -:: shrink ,a archive file files, which is created by FPC ... -:: ----------------------------------------------------------------- -set decimal1=4f -set /a hex1=0x5a -set /a counter=21 -set "string1=%hex1% - -echo =[ patching lib symbols... ]= -echo. -:: ----------------------------------------------------------------- -:: remove previous libimpsystem.a archive .o files -:: ----------------------------------------------------------------- -rmdir -rf %prjdir%\units\merge >nul 2>nul -mkdir %prjdir%\units\merge >nul 2>nul -cd %prjdir%\units\merge - -echo extract: %prjdir%\units\fpc-rtl\libimpsystem.a -echo please wait... -ar x %prjdir%\units\fpc-rtl\libimpsystem.a -echo. - -::del import_funcs.map -::/Q /S /F >nul 2>nul - -:: ----------------------------------------------------------------- -:: collect file informations fron the import archive .o files ... -:: ----------------------------------------------------------------- -nm *.o | grep ".* T .*" | awk '{print $3}' > import.tx2 -for /f "usebackq delims=" %%A in (import.tx2) do ( - set "string2=!counter!" - printf "%%A \\x!string1!\\x!string2!\n" >> import_funcs.map - set /a counter+=1 -) -:: ----------------------------------------------------------------- -:: patch the de-packed object files ... -:: ----------------------------------------------------------------- -dir /b *.o > importFileList.txt -for /f "tokens=*" %%i in (importFileList.txt) do ( - objcopy --redefine-syms=import_funcs.map %%i - if errorlevel 1 (goto buildError) -) - -:: ----------------------------------------------------------------- -:: patch the project library files import data ... -:: ----------------------------------------------------------------- -for %%B in (%prjdir%\units\fpc-rtl\system.o %prjdir%\units\fpc-rtl\fpc_rtl.o) do ( - objcopy --redefine-syms=import_funcs.map %%B - if errorlevel 1 (goto buildError) -) - -echo =[ patching lib imports... ]= - -nm *.o | grep ".* I .*" | awk '{print $3}' > import.tx2 -for /f "usebackq delims=" %%A in (import.tx2) do ( - set "string2=!counter!" - printf "%%A \\x!string1!\\x!string2!\n" >> import_funcs.map - set /a counter+=1 -) -dir /b *.o > importFileList.txt -for /f "tokens=*" %%i in (importFileList.txt) do ( - objcopy --redefine-syms=import_funcs.map %%i - if errorlevel 1 (goto buildError) -) -for %%B in (%prjdir%\units\fpc-rtl\system.o %prjdir%\units\fpc-rtl\fpc_rtl.o) do ( - objcopy --redefine-syms=import_funcs.map %%B - if errorlevel 1 (goto buildError) -) - :cplusplus -::cd %prjdir%\sources\app-rtl -::echo build... -::call make.exe -::if errorlevel 1 (goto buildError) - -::cd %prjdir%\..\doc -::call build.bat -::if errorlevel 1 (goto buildError) cd %prjdir% -::call %prjdir%\test\test1.exe -::goto allok -%asmx64% -o %prjdir%\units\fpc-rtl\symbols.o %prjdir%\sources\fpc-qt\symbols.asm -if errorlevel 1 (goto buildError) - -echo =[ patching library... ]= - -:: ----------------------------------------------------------------- -:: patching the rest of the project files ... -:: ----------------------------------------------------------------- -set decimal1=4f -set /a hex1=0x4f -set /a counter=21 -set "string1=%hex1% - -goto bigskip -for %%B in (system.o fpc_rtl.o) do ( - del %prjdir%\units\func.tx1 /F /S /Q >nul 2>nul - del %prjdir%\units\func.tx2 /F /S /Q >nul 2>nul - del %prjdir%\units\func.map /F /S /Q >nul 2>nul - - nm %prjdir%\units\fpc-rtl\%%B > %prjdir%\units\func.tx1 - grep ".* T .*" %prjdir%\units\func.tx1 | awk '{print $3}' > %prjdir%\units\func.tx2 - - for /f "usebackq delims=" %%A in ("%prjdir%\units\func.tx2") do ( - set "string2=!counter!" - set flagged="F" - if "%%A"=="VMT_$SYSTEM_$$_QSTRING" ( set flagged="T" ) - if "%%A"=="FPC_EMPTYCHAR" ( set flagged="T" ) - if "%%A"=="fpc_libinitializeunits" ( set flagged="T" ) - if "%%A"=="fpc_ansistr_decr_ref" ( set flagged="T" ) - if "%%A"=="_DLLMainCRTStartup" ( set flagged="T" ) - - if "%%A"=="SYSTEM$_$QSTRING_$__$_QSTRING" ( set flagged="T" ) - if "%%A"=="SYSTEM$_$QSTRING_$__$$_APPEND$PCHAR$$QSTRING" ( set flagged="T" ) - - if "%%A"=="SYSTEM$_$QSTRING_$__$$_CREATE$$QSTRING" ( set flagged="T" ) - if "%%A"=="SYSTEM$_$QSTRING_$__$$_CREATE$PCHAR" ( set flagged="T" ) - - if "%%A"=="SYSTEM_$$_FREEMEM$POINTER" ( set flagged="T" ) - if "%%A"=="SYSTEM_$$_GETMEM$POINTER$LONGDWORD" ( set flagged="T" ) - - if "%%A"=="SYSTEM_$$_SHOWMESSAGE$PCHAR" ( set flagged="T" ) - if "%%A"=="SYSTEM_$$_SHOWINFO$PCHAR" ( set flagged="T" ) - if "%%A"=="SYSTEM_$$_SHOWWARN$PCHAR" ( set flagged="T" ) - if "%%A"=="SYSTEM_$$_SHOWERROR$PCHAR" ( set flagged="T" ) - - if "%%A"=="SYSTEM_$$_WRITEFILE$LONGWORD$POINTER$$QWORD" ( set flagged="T" ) - - if "%%A"=="SYSTEM_$$_WRITEFILE$LONGWORD$PCHAR$$BOOLEAN" ( set flagged="T" ) - if "%%A"=="SYSTEM_$$_WRITEFILE$LONGWORD$PCHAR$$QWORD" ( set flagged="T" ) - if "%%A"=="SYSTEM_$$_WRITEFILE$LONGWORD$formal$$QWORD" ( set flagged="T" ) - - if "%%A"=="SYSTEM_$$_WRITEFILE$POINTER$PCHAR$$BOOLEAN" ( set flagged="T" ) - - if "%%A"=="SYSTEM_$$_FILEDELETE$PCHAR$$BOOLEAN" ( set flagged="T" ) - if "%%A"=="SYSTEM_$$_FILECREATE$PCHAR$BOOLEAN$$LONGWORD" ( set flagged="T" ) - if "%%A"=="SYSTEM_$$_FILECREATE$PCHAR$BOOLEAN$$POINTER" ( set flagged="T" ) - - if "%%A"=="SYSTEM_$$_FILESEEK$POINTER$LONGDWORD$LONGDWORD$$LONGDWORD" ( set flagged="T" ) - if "%%A"=="SYSTEM_$$_FILEWRITE$POINTER$PCHAR$LONGDWORD$$LONGDWORD" ( set flagged="T" ) - - if !flagged!=="F" ( - printf "%%A \\x!string1!\\x!string2!\n" >> "%prjdir%\units\func.map" ^ - && set /a counter+=1 - ) ) - del %prjdir%\units\func.tx1 /F /S /Q >nul 2>nul - del %prjdir%\units\func.tx2 /F /S /Q >nul 2>nul - - objcopy --redefine-syms=%prjdir%\units\func.map %prjdir%\units\fpc-rtl\%%B - if errorlevel 1 (goto buildError) -) :bigskip ::g++ -m64 -O2 -fPIC -shared -Wno-write-strings -o ^ ::%prjdir%\test\app_rtl.dll ^ @@ -690,21 +355,20 @@ echo =[ Linking fpc_rtl.dll ... ]= 30 %% done ::if errorlevel 1 (goto buildError) gcc -fPIC -nostdlib -nostartfiles --shared -Wl,--entry=_DLLMainCRTStartup -o ^ -%prjdir%\test\fpc_rtl.dll ^ -%prjdir%\units\fpc-rtl\rtl_memory.o ^ -%prjdir%\units\fpc-rtl\system.o ^ -%prjdir%\units\fpc-rtl\fpc_rtl.o ^ -%prjdir%\units\fpc-qt\Qt_String.o ^ -%prjdir%\units\fpc-qt\symbols.o ^ -%prjdir%\units\merge\*.o ^ --L %prjdir%\units\fpc-rtl +%prjdir%\test\fpc_rtl.dll ^ +%prjdir%\units\fpc-rtl\system.o ^ +%prjdir%\units\fpc-rtl\fpc_rtl.o ^ +%prjdir%\units\fpc-qt\Qt_String.o ^ +%prjdir%\units\fpc-qt\symbols.o ^ +-L %prjdir%\units\fpc-rtl ^ +-l impsystem if errorlevel 1 (goto buildError) :: ----------------------------------------------------------------- :: discards all debug symbols - todo ! :: ----------------------------------------------------------------- -::strip %prjdir%\test\fpc_rtl.dll -::if errorlevel 1 (goto buildError) +strip %prjdir%\test\fpc_rtl.dll +if errorlevel 1 (goto buildError) ::strip %prjdir%\test\app_rtl.dll ::if errorlevel 1 (goto buildError) @@ -717,58 +381,38 @@ echo =[ build exe file... ]= 40 %% done %fpcx64% -dwinexe -Us %srcsys%\system.pas if errorlevel 1 (goto buildError) -%fpcx64% -dwindll %srcsys%\fpintres.pp +%fpcx64% -dwinexe %srcsys%\fpintres.pp if errorlevel 1 (goto buildError) :: for %%A in (fpcinit sysinit) do ( %fpcx64% -dwinexe %srcsys%\%%A.pas if errorlevel 1 (goto buildError) ) -%fpcx64% -dwinexe %srcrtl%\rtl_utils.pas -if errorlevel 1 (goto buildError) + +for %%A in (RTL_Utils) do ( + echo compile: %srcrtl%\%%A.pas + %fpcx64% -al -Anasm -Cn -dwinexe -CX -fPIC -st -Xe -XD -FE%prjdir%\units\fpc-rtl %prjdir%\sources\fpc-rtl\%%A.pas + if errorlevel 1 (goto buildError) +) %fpcx64% -al -Anasm -Cn -dwinexe -FE%prjdir%\test %prjdir%\test\test1.pas set temp=%prjdir%\test\test1 :: -sed -E '/\tGLOBAL PASCALMAIN/a GLOBAL _mainCRTStartup\n\t_mainCRTStartup\:' %temp%.s > %temp%.tmp -if errorlevel 1 (goto buildError) -move /Y %temp%.tmp %temp%.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed 's/call\tFPC\_DO\_EXIT/\n; [1]\nxor ecx, ecx\ncall _$dll$kernel32$ExitProcess\n; [1]/g' %temp%.s > %temp%.tmp -if errorlevel 1 (goto buildError) -move /Y %temp%.tmp %temp%.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed 's/call\tfpc_initializeunits//g' %temp%.s > %temp%.tmp -if errorlevel 1 (goto buildError) -move /Y %temp%.tmp %temp%.s >nul: 2>nul: -if errorlevel 1 (goto buildError) - -sed '/; Begin asmlist al_dwarf_frame/,/; End asmlist al_dwarf_frame/d' %temp%.s > %temp%.tmp -if errorlevel 1 (goto buildError) -move /Y %temp%.tmp %temp%.s >nul: 2>nul: +echo assemble: test1.s +%asmx64% -o %temp%.o %temp%.s if errorlevel 1 (goto buildError) -sed '/; Begin asmlist al_globals/,/; End asmlist al_globals/d' %temp%.s > %temp%.tmp -if errorlevel 1 (goto buildError) -move /Y %temp%.tmp %temp%.s >nul: 2>nul: -if errorlevel 1 (goto buildError) +for %%A in (RTL_Utils) do ( + echo assemble: %srcrtl%\%%A.s + %asmx64% -o %prjdir%\units\fpc-rtl\%%A.o %prjdir%\units\fpc-rtl\%%A.s + if errorlevel 1 (goto buildError) +) -sed 's/\tGLOBAL main/\tGLOBAL main\n\tglobal \_mainCRTStartup\n\_mainCRTStartup\:/g' %temp%.s > %temp%.tmp -if errorlevel 1 (goto buildError) -move /Y %temp%.tmp %temp%.s >nul: 2>nul: -if errorlevel 1 (goto buildError) -:: -python %prjdir%\transform.py %temp%.s -:: -echo assemble: test1.s -D:\a\TinyRTL\TinyRTL\nasm\nasm.exe -f win64 -w-orphan-labels -o %temp%.o %temp%.s -if errorlevel 1 (goto buildError) for %%A in (fpcinit sysinit) do ( %fpcx64% -dwinexe %srcsys%\%%A.pas if errorlevel 1 (goto buildError) ) + %fpcx64% -dwinexe %srcrtl%\rtl_utils.pas if errorlevel 1 (goto buildError) @@ -802,21 +446,18 @@ for %%A in (system test1) do ( ::echo mupso ::%asmx64% -o %prjdir%\units\fpc-rtl\symbols.o %prjdir%\sources\fpc-qt\symbols.asm -echo -[ create FPC_RTL.a ... ]- 65 %% done -dlltool -d %prjdir%\test\impFPC_RTL.def -l %prjdir%\test\libimpFPC_RTL.a +::echo -[ create FPC_RTL.a ... ]- 65 %% done +::dlltool -d %prjdir%\test\fpc_rtl.def -l %prjdir%\test\libimpfpc_rtl.a echo =[ linking test1.exe... ]= 70 %% done -%gcc64% -nostartfiles -nostdlib -Wl,--entry=_mainCRTStartup -o ^ +%gcc64% -nostartfiles -nostdlib -Wl,--entry=PASCALMAIN -o ^ %prjdir%\test\test1.exe ^ %prjdir%\test\test1.o ^ -%prjdir%\units\fpc-rtl\rtl_memory.o ^ -%prjdir%\units\fpc-rtl\rtl_utils.o ^ -%prjdir%\units\fpc-qt\Qt_String.o ^ -%prjdir%\units\fpc-qt\symbols.o ^ +%prjdir%\units\fpc-rtl\system.o ^ +%prjdir%\units\fpc-rtl\vmt.o ^ -L %prjdir%\test ^ --l impsystem ^ --l imptest1 +-l impsystem if errorlevel 1 (goto buildError) :: ----------------------------------------------------------------- diff --git a/src/sources/fpc-qt/symbols.asm b/src/sources/fpc-qt/symbols.asm index 715d127..4e4952f 100644 --- a/src/sources/fpc-qt/symbols.asm +++ b/src/sources/fpc-qt/symbols.asm @@ -10,7 +10,6 @@ extern QString_Create_PChar -section .data global VMT_$SYSTEM_$$_QSTRING VMT_$SYSTEM_$$_QSTRING: dq 0 diff --git a/src/sources/fpc-rtl/RTL_List.pas b/src/sources/fpc-rtl/RTL_List.pas new file mode 100644 index 0000000..8ded589 --- /dev/null +++ b/src/sources/fpc-rtl/RTL_List.pas @@ -0,0 +1,18 @@ +// --------------------------------------------------------------------------- +// File: FPC_List.pas +// Author: Jens Kallup - paule32 +// +// This file is part of RTL. +// +// (c) Copyright 2024 Jens Kallup - paule32 +// only for non-profit usage !!! +// --------------------------------------------------------------------------- +{$ifdef windows_header} +type + TList = class + end; + +{$endif} + +{$ifdef windows_source} +{$endif} \ No newline at end of file diff --git a/src/sources/fpc-rtl/RTL_Memory.pas b/src/sources/fpc-rtl/RTL_Memory.pas index 0dd197c..29d602c 100644 --- a/src/sources/fpc-rtl/RTL_Memory.pas +++ b/src/sources/fpc-rtl/RTL_Memory.pas @@ -1,272 +1,35 @@ -unit RTL_Memory; -interface -procedure move(const source; var dest; count: DWord); stdcall; export; -implementation - -procedure move(const source; var dest; count: DWord); [public, alias:'FPC_move']; assembler; nostackframe; stdcall; -asm - mov %r8, %rax - sub %rdx, %rcx { rcx = src - dest } - jz .Lquit { exit if src=dest } - jnb .L1 { src>dest => forward move } - - add %rcx, %rax { rcx is negative => r8+rcx > 0 if regions overlap } - jb .Lback { if no overlap, still do forward move } - -.L1: - cmp $8, %r8 - jl .Lless8f { signed compare, negative count not allowed } - test $7, %dl - je .Ldestaligned - - test $1, %dl { align dest by moving first 1+2+4 bytes } - je .L2f - mov (%rcx,%rdx,1),%al - dec %r8 - mov %al, (%rdx) - add $1, %rdx -.L2f: - test $2, %dl - je .L4f - mov (%rcx,%rdx,1),%ax - sub $2, %r8 - mov %ax, (%rdx) - add $2, %rdx -.L4f: - test $4, %dl - je .Ldestaligned - mov (%rcx,%rdx,1),%eax - sub $4, %r8 - mov %eax, (%rdx) - add $4, %rdx - -.Ldestaligned: - mov %r8, %r9 - shr $5, %r9 - jne .Lmore32 - -.Ltail: - mov %r8, %r9 - shr $3, %r9 - je .Lless8f - - .balign 16 -.Lloop8f: { max. 8 iterations } - mov (%rcx,%rdx,1),%rax - mov %rax, (%rdx) - add $8, %rdx - dec %r9 - jne .Lloop8f - and $7, %r8 - -.Lless8f: - test %r8, %r8 - jle .Lquit - - .balign 16 -.Lloop1f: - mov (%rcx,%rdx,1),%al - mov %al,(%rdx) - inc %rdx - dec %r8 - jne .Lloop1f -.Lquit: - retq - - -.Lmore32: - cmp $0x2000, %r9 { this limit must be processor-specific (1/2 L2 cache size) } - jnae .Lloop32 - cmp $0x1000, %rcx { but don't bother bypassing cache if src and dest } - jnb .Lntloopf { are close to each other} - - .balign 16 -.Lloop32: - add $32,%rdx - mov -32(%rcx,%rdx,1),%rax - mov -24(%rcx,%rdx,1),%r10 - mov %rax,-32(%rdx) - mov %r10,-24(%rdx) - dec %r9 - mov -16(%rcx,%rdx,1),%rax - mov -8(%rcx,%rdx,1),%r10 - mov %rax,-16(%rdx) - mov %r10,-8(%rdx) - jne .Lloop32 - - and $0x1f, %r8 - jmpq .Ltail - -.Lntloopf: - mov $32, %eax - - .balign 16 -.Lpref: - prefetchnta (%rcx,%rdx,1) - prefetchnta 0x40(%rcx,%rdx,1) - add $0x80, %rdx - dec %eax - jne .Lpref - - sub $0x1000, %rdx - mov $64, %eax - - .balign 16 -.Loop64: - add $64, %rdx - mov -64(%rcx,%rdx,1), %r9 - mov -56(%rcx,%rdx,1), %r10 - movnti %r9, -64(%rdx) - movnti %r10, -56(%rdx) - - mov -48(%rcx,%rdx,1), %r9 - mov -40(%rcx,%rdx,1), %r10 - movnti %r9, -48(%rdx) - movnti %r10, -40(%rdx) - dec %eax - mov -32(%rcx,%rdx,1), %r9 - mov -24(%rcx,%rdx,1), %r10 - movnti %r9, -32(%rdx) - movnti %r10, -24(%rdx) - - mov -16(%rcx,%rdx,1), %r9 - mov -8(%rcx,%rdx,1), %r10 - movnti %r9, -16(%rdx) - movnti %r10, -8(%rdx) - jne .Loop64 - - sub $0x1000, %r8 - cmp $0x1000, %r8 - jae .Lntloopf - - mfence - jmpq .Ldestaligned { go handle remaining bytes } - -{ backwards move } -.Lback: - add %r8, %rdx { points to the end of dest } - cmp $8, %r8 - jl .Lless8b { signed compare, negative count not allowed } - test $7, %dl - je .Ldestalignedb - test $1, %dl - je .L2b - dec %rdx - mov (%rcx,%rdx,1), %al - dec %r8 - mov %al, (%rdx) -.L2b: - test $2, %dl - je .L4b - sub $2, %rdx - mov (%rcx,%rdx,1), %ax - sub $2, %r8 - mov %ax, (%rdx) -.L4b: - test $4, %dl - je .Ldestalignedb - sub $4, %rdx - mov (%rcx,%rdx,1), %eax - sub $4, %r8 - mov %eax, (%rdx) - -.Ldestalignedb: - mov %r8, %r9 - shr $5, %r9 - jne .Lmore32b - -.Ltailb: - mov %r8, %r9 - shr $3, %r9 - je .Lless8b - -.Lloop8b: - sub $8, %rdx - mov (%rcx,%rdx,1), %rax - dec %r9 - mov %rax, (%rdx) - jne .Lloop8b - and $7, %r8 - -.Lless8b: - test %r8, %r8 - jle .Lquit2 - - .balign 16 -.Lsmallb: - dec %rdx - mov (%rcx,%rdx,1), %al - dec %r8 - mov %al,(%rdx) - jnz .Lsmallb -.Lquit2: - retq - -.Lmore32b: - cmp $0x2000, %r9 - jnae .Lloop32b - cmp $0xfffffffffffff000,%rcx - jb .Lntloopb - - .balign 16 -.Lloop32b: - sub $32, %rdx - mov 24(%rcx,%rdx,1), %rax - mov 16(%rcx,%rdx,1), %r10 - mov %rax, 24(%rdx) - mov %r10, 16(%rdx) - dec %r9 - mov 8(%rcx,%rdx,1),%rax - mov (%rcx,%rdx,1), %r10 - mov %rax, 8(%rdx) - mov %r10, (%rdx) - jne .Lloop32b - and $0x1f, %r8 - jmpq .Ltailb - -.Lntloopb: - mov $32, %eax - - .balign 16 -.Lprefb: - sub $0x80, %rdx - prefetchnta (%rcx,%rdx,1) - prefetchnta 0x40(%rcx,%rdx,1) - dec %eax - jnz .Lprefb - - add $0x1000, %rdx - mov $0x40, %eax - - .balign 16 -.Lloop64b: - sub $64, %rdx - mov 56(%rcx,%rdx,1), %r9 - mov 48(%rcx,%rdx,1), %r10 - movnti %r9, 56(%rdx) - movnti %r10, 48(%rdx) - - mov 40(%rcx,%rdx,1), %r9 - mov 32(%rcx,%rdx,1), %r10 - movnti %r9, 40(%rdx) - movnti %r10, 32(%rdx) - dec %eax - mov 24(%rcx,%rdx,1), %r9 - mov 16(%rcx,%rdx,1), %r10 - movnti %r9, 24(%rdx) - movnti %r10, 16(%rdx) - - mov 8(%rcx,%rdx,1), %r9 - mov (%rcx,%rdx,1), %r10 - movnti %r9, 8(%rdx) - movnti %r10, (%rdx) - jne .Lloop64b +// --------------------------------------------------------------------------- +// File: FPC_Memory.pas +// Author: Jens Kallup - paule32 +// +// This file is part of RTL. +// +// (c) Copyright 2024 Jens Kallup - paule32 +// only for non-profit usage !!! +// --------------------------------------------------------------------------- +{$ifdef windows_header} + TAnsiStringMemoryManager = class + private + FMemoryPool: TList; + public + constructor Create; + destructor Destroy; + end; +{$endif} + +{$ifdef windows_source} +constructor TAnsiStringMemoryManager.Create; +begin + MessageBox(0,'AnsiManager create','info',0); + inherited Create; + FMemoryPool := TList.Create; +end; - sub $0x1000, %r8 - cmp $0x1000, %r8 - jae .Lntloopb - mfence - jmpq .Ldestalignedb +destructor TAnsiStringMemoryManager.Destroy; +begin + MessageBox(0,'AnsiManager destroy','info',0); + FMemoryPool.Free; + inherited Destroy; end; -end. +{$endif} diff --git a/src/sources/fpc-rtl/RTL_Object.pas b/src/sources/fpc-rtl/RTL_Object.pas index 82c8db5..28e92ae 100644 --- a/src/sources/fpc-rtl/RTL_Object.pas +++ b/src/sources/fpc-rtl/RTL_Object.pas @@ -35,10 +35,12 @@ TObject = class // --------------------------------------------------------------------------- constructor TObject.Create; begin + MessageBox(0,'tobject create','info',0); end; destructor TObject.Destroy; begin + MessageBox(0,'tobject destroy','info',0); end; procedure TObject.AfterConstruction; begin @@ -61,6 +63,10 @@ procedure TObject.FreeInstance; begin end; +function SafeCallException( obj: codepointer; exceptaddr: codepointer ): HResult; +begin +end; + function TObject.SafeCallException(exceptobject : tobject; exceptaddr : codepointer) : HResult; begin result := 1; diff --git a/src/sources/fpc-rtl/vmt.asm b/src/sources/fpc-rtl/vmt.asm new file mode 100644 index 0000000..1194a13 --- /dev/null +++ b/src/sources/fpc-rtl/vmt.asm @@ -0,0 +1,33 @@ +; --------------------------------------------------------------------------- +; File: vmt.asm +; Author: Jens Kallup - paule32 +; +; This file is part of Qt RTL. +; +; (c) Copyright 2024 Jens Kallup - paule32 +; only for non-profit usage !!! +; --------------------------------------------------------------------------- + +section .data + +;global VMT_$SYSTEM_$$_TLIST +;VMT_$SYSTEM_$$_TLIST: +; dq 0 + +global VMT_$QT_STRING_$$_QSTRING +VMT_$QT_STRING_$$_QSTRING: + dq 0 + +;global VMT_$SYSTEM_$$_TANSISTRINGMEMORYMANAGER +;VMT_$SYSTEM_$$_TANSISTRINGMEMORYMANAGER: +; dq 0 + + +section .code +global QT_STRING$_$QSTRING_$__$$_CREATE$PCHAR$$QSTRING +QT_STRING$_$QSTRING_$__$$_CREATE$PCHAR$$QSTRING: + ret + +;global SYSTEM$_$TANSISTRINGMEMORYMANAGER_$__$$_CREATE$$TANSISTRINGMEMORYMANAGER +;SYSTEM$_$TANSISTRINGMEMORYMANAGER_$__$$_CREATE$$TANSISTRINGMEMORYMANAGER: +; ret diff --git a/src/sources/fpc-sys/FPC_System.pas b/src/sources/fpc-sys/FPC_System.pas index 110e3ea..b5d5180 100644 --- a/src/sources/fpc-sys/FPC_System.pas +++ b/src/sources/fpc-sys/FPC_System.pas @@ -33,7 +33,7 @@ procedure fpc_help_destructor (_self, _vmt: pointer; vmt_pos: car procedure fpc_doneexception; compilerproc; -procedure fpc_ReRaise; compilerproc; +procedure fpc_reraise; compilerproc; procedure fpc_initializeunits; compilerproc; procedure fpc_libinitializeunits; compilerproc; @@ -44,7 +44,7 @@ procedure fpc_do_exit; external name 'FPC_DO_EXIT'; compilerproc; procedure EmptyMethod; external name 'FPC_EMPTYMETHOD'; -procedure move(const source; var dest; count: DWord); stdcall; external 'fpc_rtl.dll'; +procedure move(const source; var dest; count: DWord); stdcall; {$endif} {$ifdef windows_source} @@ -56,6 +56,7 @@ function sizeQWord: Byte; inline; begin result := 16; end; procedure fpc_doneexception; [public, alias: 'FPC_DONEEXCEPTION'] compilerproc; begin + MessageBox(0,'fpc_doneexceptions','system.pas',0); end; procedure fpc_emptymethod; [public, alias : 'FPC_EMPTYMETHOD']; @@ -153,7 +154,6 @@ function fpc_pchar_to_ansistr(const p: PAnsiChar): AnsiString; result := a; end; - procedure fpc_ansistr_assign(var DestS: Pointer; S2: Pointer); [public, alias: 'FPC_ANSISTR_ASSIGN']; compilerproc; var SLen: SIZE_T; @@ -227,6 +227,7 @@ function fpc_AnsiStr_Compare_Equal (const S1, S2: Pointer): BOOL; [public, alia function TVmt.GetvParent: PVMT; begin + MessageBox(0,'getparent','system',0); result := nil; end; @@ -240,7 +241,8 @@ procedure fpc_readln_end(var f: Text); [public,alias:'FPC_READLN_END']; iocheck; procedure fpc_do_exit; [public,alias: 'FPC_DO_EXIT']; compilerproc; begin - ExitProcess(0); + MessageBox(0,'fpc_do_exit','system.pas',0); + ExitProcess(0); end; procedure fpc_iocheck; compilerproc; @@ -258,16 +260,284 @@ procedure fpc_help_destructor(_self,_vmt:pointer;vmt_pos:cardinal);compilerproc; procedure fpc_help_fail(_self:pointer;var _vmt:pointer;vmt_pos:cardinal);compilerproc; begin end; -procedure fpc_ReRaise; compilerproc; -begin end; +procedure fpc_ReRaise; [public, alias:'fpc_reraise']; compilerproc; +begin + MessageBox(0,'fpc_ReRaise','inform',0) +end; procedure fpc_finalize(Data,TypeInfo: Pointer); compilerproc; begin end; -procedure fpc_initializeunits; [public, alias:'FPC_INITIALIZEUNITS']; compilerproc; +procedure fpc_initializeunits; [public, alias:'FPC_INITIALIZEUNITS']; compilerproc; begin MessageBox(0,'uzy','2121212',0); end; procedure fpc_libinitializeunits; [public, alias:'FPC_LIBINITIALIZEUNITS']; compilerproc; begin end; +procedure move(const source; var dest; count: DWord); [public, alias:'FPC_move']; assembler; nostackframe; stdcall; +asm + mov %r8, %rax + sub %rdx, %rcx { rcx = src - dest } + jz .Lquit { exit if src=dest } + jnb .L1 { src>dest => forward move } + + add %rcx, %rax { rcx is negative => r8+rcx > 0 if regions overlap } + jb .Lback { if no overlap, still do forward move } + +.L1: + cmp $8, %r8 + jl .Lless8f { signed compare, negative count not allowed } + test $7, %dl + je .Ldestaligned + + test $1, %dl { align dest by moving first 1+2+4 bytes } + je .L2f + mov (%rcx,%rdx,1),%al + dec %r8 + mov %al, (%rdx) + add $1, %rdx +.L2f: + test $2, %dl + je .L4f + mov (%rcx,%rdx,1),%ax + sub $2, %r8 + mov %ax, (%rdx) + add $2, %rdx +.L4f: + test $4, %dl + je .Ldestaligned + mov (%rcx,%rdx,1),%eax + sub $4, %r8 + mov %eax, (%rdx) + add $4, %rdx + +.Ldestaligned: + mov %r8, %r9 + shr $5, %r9 + jne .Lmore32 + +.Ltail: + mov %r8, %r9 + shr $3, %r9 + je .Lless8f + + .balign 16 +.Lloop8f: { max. 8 iterations } + mov (%rcx,%rdx,1),%rax + mov %rax, (%rdx) + add $8, %rdx + dec %r9 + jne .Lloop8f + and $7, %r8 + +.Lless8f: + test %r8, %r8 + jle .Lquit + + .balign 16 +.Lloop1f: + mov (%rcx,%rdx,1),%al + mov %al,(%rdx) + inc %rdx + dec %r8 + jne .Lloop1f +.Lquit: + retq + + +.Lmore32: + cmp $0x2000, %r9 { this limit must be processor-specific (1/2 L2 cache size) } + jnae .Lloop32 + cmp $0x1000, %rcx { but don't bother bypassing cache if src and dest } + jnb .Lntloopf { are close to each other} + + .balign 16 +.Lloop32: + add $32,%rdx + mov -32(%rcx,%rdx,1),%rax + mov -24(%rcx,%rdx,1),%r10 + mov %rax,-32(%rdx) + mov %r10,-24(%rdx) + dec %r9 + mov -16(%rcx,%rdx,1),%rax + mov -8(%rcx,%rdx,1),%r10 + mov %rax,-16(%rdx) + mov %r10,-8(%rdx) + jne .Lloop32 + + and $0x1f, %r8 + jmpq .Ltail + +.Lntloopf: + mov $32, %eax + + .balign 16 +.Lpref: + prefetchnta (%rcx,%rdx,1) + prefetchnta 0x40(%rcx,%rdx,1) + add $0x80, %rdx + dec %eax + jne .Lpref + + sub $0x1000, %rdx + mov $64, %eax + + .balign 16 +.Loop64: + add $64, %rdx + mov -64(%rcx,%rdx,1), %r9 + mov -56(%rcx,%rdx,1), %r10 + movnti %r9, -64(%rdx) + movnti %r10, -56(%rdx) + + mov -48(%rcx,%rdx,1), %r9 + mov -40(%rcx,%rdx,1), %r10 + movnti %r9, -48(%rdx) + movnti %r10, -40(%rdx) + dec %eax + mov -32(%rcx,%rdx,1), %r9 + mov -24(%rcx,%rdx,1), %r10 + movnti %r9, -32(%rdx) + movnti %r10, -24(%rdx) + + mov -16(%rcx,%rdx,1), %r9 + mov -8(%rcx,%rdx,1), %r10 + movnti %r9, -16(%rdx) + movnti %r10, -8(%rdx) + jne .Loop64 + + sub $0x1000, %r8 + cmp $0x1000, %r8 + jae .Lntloopf + + mfence + jmpq .Ldestaligned { go handle remaining bytes } + +{ backwards move } +.Lback: + add %r8, %rdx { points to the end of dest } + cmp $8, %r8 + jl .Lless8b { signed compare, negative count not allowed } + test $7, %dl + je .Ldestalignedb + test $1, %dl + je .L2b + dec %rdx + mov (%rcx,%rdx,1), %al + dec %r8 + mov %al, (%rdx) +.L2b: + test $2, %dl + je .L4b + sub $2, %rdx + mov (%rcx,%rdx,1), %ax + sub $2, %r8 + mov %ax, (%rdx) +.L4b: + test $4, %dl + je .Ldestalignedb + sub $4, %rdx + mov (%rcx,%rdx,1), %eax + sub $4, %r8 + mov %eax, (%rdx) + +.Ldestalignedb: + mov %r8, %r9 + shr $5, %r9 + jne .Lmore32b + +.Ltailb: + mov %r8, %r9 + shr $3, %r9 + je .Lless8b + +.Lloop8b: + sub $8, %rdx + mov (%rcx,%rdx,1), %rax + dec %r9 + mov %rax, (%rdx) + jne .Lloop8b + and $7, %r8 + +.Lless8b: + test %r8, %r8 + jle .Lquit2 + + .balign 16 +.Lsmallb: + dec %rdx + mov (%rcx,%rdx,1), %al + dec %r8 + mov %al,(%rdx) + jnz .Lsmallb +.Lquit2: + retq + +.Lmore32b: + cmp $0x2000, %r9 + jnae .Lloop32b + cmp $0xfffffffffffff000,%rcx + jb .Lntloopb + + .balign 16 +.Lloop32b: + sub $32, %rdx + mov 24(%rcx,%rdx,1), %rax + mov 16(%rcx,%rdx,1), %r10 + mov %rax, 24(%rdx) + mov %r10, 16(%rdx) + dec %r9 + mov 8(%rcx,%rdx,1),%rax + mov (%rcx,%rdx,1), %r10 + mov %rax, 8(%rdx) + mov %r10, (%rdx) + jne .Lloop32b + and $0x1f, %r8 + jmpq .Ltailb + +.Lntloopb: + mov $32, %eax + + .balign 16 +.Lprefb: + sub $0x80, %rdx + prefetchnta (%rcx,%rdx,1) + prefetchnta 0x40(%rcx,%rdx,1) + dec %eax + jnz .Lprefb + + add $0x1000, %rdx + mov $0x40, %eax + + .balign 16 +.Lloop64b: + sub $64, %rdx + mov 56(%rcx,%rdx,1), %r9 + mov 48(%rcx,%rdx,1), %r10 + movnti %r9, 56(%rdx) + movnti %r10, 48(%rdx) + + mov 40(%rcx,%rdx,1), %r9 + mov 32(%rcx,%rdx,1), %r10 + movnti %r9, 40(%rdx) + movnti %r10, 32(%rdx) + dec %eax + mov 24(%rcx,%rdx,1), %r9 + mov 16(%rcx,%rdx,1), %r10 + movnti %r9, 24(%rdx) + movnti %r10, 16(%rdx) + + mov 8(%rcx,%rdx,1), %r9 + mov (%rcx,%rdx,1), %r10 + movnti %r9, 8(%rdx) + movnti %r10, (%rdx) + jne .Lloop64b + + sub $0x1000, %r8 + cmp $0x1000, %r8 + jae .Lntloopb + mfence + jmpq .Ldestalignedb +end; + {$endif} diff --git a/src/sources/fpc-sys/system.pas b/src/sources/fpc-sys/system.pas index 35c2d99..6278943 100644 --- a/src/sources/fpc-sys/system.pas +++ b/src/sources/fpc-sys/system.pas @@ -39,6 +39,9 @@ interface // TObject Framework - win32api ... // --------------------------------------------------------------------------- {$I RTL_Object.pas} +{$I RTL_List.pas} +{$I RTL_Memory.pas} + { $ I R T L_Queue.pas} // --------------------------------------------------------------------------- @@ -66,6 +69,9 @@ implementation {$I FPC_SysUtils.pas} {$I RTL_Object.pas} +{$I RTL_List.pas} +{$I RTL_Memory.pas} + { $ I R T L_Queue.pas} // --------------------------------------------------------------------------- diff --git a/src/test/fpc_rtl.def b/src/test/fpc_rtl.def index c86deac..f6c29b3 100644 --- a/src/test/fpc_rtl.def +++ b/src/test/fpc_rtl.def @@ -5,79 +5,5 @@ ; LIBRARY "fpc_rtl.dll" EXPORTS -FPC_ANSISTR_ASSIGN -FPC_ANSISTR_COMPARE_EQUAL -FPC_ANSISTR_DECR_REF -FPC_ANSISTR_INCR_REF -FPC_DONEEXCEPTION -FPC_DO_EXIT -FPC_EMPTYCHAR -FPC_EMPTYMETHOD -FPC_INITIALIZEUNITS -FPC_LIBINITIALIZEUNITS -FPC_READLN_END -FPC_move -P$FPC_RTL_$$_DLLENTRY$POINTER$LONGDWORD$POINTER$$QWORD -P$FPC_RTL_$$_INITIALIZE$$QWORD -P$FPC_RTL_$$_PUTTOFILE$PCHAR$PCHAR$$BOOLEAN -P$FPC_RTL_$$_main -PASCALMAIN -QString_Create_PChar -QT_STRING$_$QSTRING_$__$$_APPEND$PCHAR$$QSTRING -QT_STRING$_$QSTRING_$__$$_APPEND$QSTRING$$QSTRING -QT_STRING$_$QSTRING_$__$$_CREATE$$QSTRING -QT_STRING$_$QSTRING_$__$$_CREATE$PCHAR$$QSTRING -QT_STRING$_$QSTRING_$__$$_CREATE$QSTRING$$QSTRING -QT_STRING$_$QSTRING_$__$$_DESTROY -QT_STRING$_$QSTRING_$__$$_GETTEXT$$PCHAR -QT_STRING$_$QSTRING_$__$$_SETTEXT$PCHAR -QT_STRING$_$QSTRING_$__$$_SETTEXT$QSTRING -QT_STRING_$$_QSTRING_CREATE_PCHAR$POINTER$PCHAR -SYSTEM$_$QSTRING_$__$$_CREATE$PCHAR$$QSTRING -SYSTEM$_$TOBJECT_$__$$_NEWINSTANCE$$TOBJECT -SYSTEM$_$TVMT_$__$$_GETVPARENT$$PVMT -SYSTEM_$$_FILECREATE$RAWBYTESTRING$BOOLEAN$$POINTER -SYSTEM_$$_FILEDELETE$PCHAR$$BOOLEAN -SYSTEM_$$_FILEDELETE$RAWBYTESTRING$$BOOLEAN -SYSTEM_$$_FILESEEK$LONGWORD$LONGDWORD$LONGDWORD$$LONGDWORD -SYSTEM_$$_FILESEEK$POINTER$LONGDWORD$LONGDWORD$$LONGDWORD -SYSTEM_$$_FILLCHAR$formal$QWORD$CHAR -SYSTEM_$$_FPC_EMPTYMETHOD -SYSTEM_$$_FREEMEM$POINTER -SYSTEM_$$_GETMEM$POINTER$LONGDWORD -SYSTEM_$$_LOCKFILE$POINTER$$BOOLEAN -SYSTEM_$$_MESSAGEBOX$ANSISTRING$ANSISTRING$$LONGDWORD -SYSTEM_$$_MOVE$formal$formal$LONGDWORD -SYSTEM_$$_Q_NULLPTR$$POINTER -SYSTEM_$$_SHOWERROR$PCHAR -SYSTEM_$$_SHOWINFO$PCHAR -SYSTEM_$$_SHOWMESSAGE$PCHAR -SYSTEM_$$_SHOWWARN$PCHAR -SYSTEM_$$_TSYSTEMCODEPAGE$$LONGDWORD -SYSTEM_$$_WRITEFILE$LONGWORD$PCHAR$$QWORD -SYSTEM_$$_WRITEFILE$LONGWORD$POINTER$$QWORD -U_$P$FPC_RTL_$$_LIBRARYHDL DATA -VMT_$QT_STRING_$$_QSTRING DATA -VMT_$SYSTEM_$$_QSTRING DATA -_DLLMainCRTStartup -fpc_ansistr_assign -fpc_ansistr_compare_equal -fpc_ansistr_concat -fpc_ansistr_decr_ref -fpc_ansistr_incr_ref -fpc_ansistr_unique -fpc_char_to_ansistr -fpc_copy_proc -fpc_doneexception -fpc_emptychar -fpc_finalize -fpc_get_input -fpc_help_constructor -fpc_help_destructor -fpc_help_fail -fpc_initializeunits -fpc_iocheck -fpc_libinitializeunits -fpc_pchar_to_ansistr -fpc_readln_end -fpc_reraise +FPU_move +move diff --git a/src/test/fpc_rtl.dll b/src/test/fpc_rtl.dll index 373f50db397abd92699f81964de0053a02d8f626..2e9cab6229a615a38e8e66b4190ddf1def84941c 100644 GIT binary patch literal 38400 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 Av;Y7A literal 35566 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 CVMz1< diff --git a/src/test/impFPC_RTL.def b/src/test/impFPC_RTL.def index bac2187..01d988d 100644 --- a/src/test/impFPC_RTL.def +++ b/src/test/impFPC_RTL.def @@ -1,3 +1,4 @@ LIBRARY impFPC_RTL EXPORTS - move=SYSTEM_$$_MOVE$formal$formal$LONGDWORD + FPU_move + move diff --git a/src/test/ppas.bat b/src/test/ppas.bat index 0e413cf..218ae54 100644 --- a/src/test/ppas.bat +++ b/src/test/ppas.bat @@ -1,7 +1,7 @@ @echo off SET THEFILE=D:\a\TinyRTL\TinyRTL\src\test\test1.exe echo Linking %THEFILE% -D:\a\TinyRTL\TinyRTL\fpc\3.2.2\bin\i386-win32\ld.exe -b pei-x86-64 --entry=_mainCRTStartup -o D:\a\TinyRTL\TinyRTL\src\test\test1.exe D:\a\TinyRTL\TinyRTL\src\test\link8152.res +D:\a\TinyRTL\TinyRTL\fpc\3.2.2\bin\i386-win32\ld.exe -b pei-x86-64 --entry=_mainCRTStartup -o D:\a\TinyRTL\TinyRTL\src\test\test1.exe D:\a\TinyRTL\TinyRTL\src\test\link21232.res if errorlevel 1 goto linkend goto end :asmend diff --git a/src/test/test1.exe b/src/test/test1.exe index e0fe14994668f0d48cfb205df1e273de260c6060..24fccb3df79ca2ded203bb21cd6d2fd7f5f2c393 100644 GIT binary patch literal 18944 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 e#ztvGj+CuKxy;l{@(W delta 1132 zcmcIj&ubG=5T3U*HLYz^A*~@6nqZXbVKE9?6lww~yhDVowKoeXX4?isTaqpGwt-l2 z2@9L1e}Dxq9%U~%c(ANsbE}@jv#r4d5j+_5u+C)Tx_FTu9GLfJzWKH9d;3betQ0dI zpZ7ss53E2>zJe&67KBSMh(MnM-mE^K8pt^Q@%`$D8+{UhReLMU`!Z-ns?l>Zq9Si8 zn6m1_WfZmF$;Z`|2tY$B?uFW00^jqwJ$8JPNM}^de9I#efjBN_7QNH~Sw*g*Zw($hv z)|i6~^U6Y}i>gl%HVm%IuxL>w>Hi<=PE}7j_O^T46Q9)`>Y1q$y&a?%RG}3hdMjs$ z;T;2ca9A96IO`|Aqz$Ah8}nOSJ9M;?BnNLr!W~2JyFKpuu}SkI-3ftHZi-=FxO@x1 zy=NZ~P}>c@+zEwEVd9ugciAtuLuu@A_Q`oKTx%~{-q=rU?~R%9@dM^RH8-ym za%(Flo9M8M3Hr%<@(gWyl#&OlqrD+jqv1Ox4@w2bU;e-1_zJdiid0yCAQy|Zy;LxY e4IavcH93Fns+i5^sc8_g&7xdz5c5TFhW!HlJ5~Mw diff --git a/src/test/test1.pas b/src/test/test1.pas index a43e70a..c14cbd6 100644 --- a/src/test/test1.pas +++ b/src/test/test1.pas @@ -8,7 +8,7 @@ {$mode delphi} program test1; -uses RTL_Memory, Qt_String; +uses Qt_String; procedure ExitProcess(AValue: Integer); external 'kernel32.dll'; @@ -18,12 +18,20 @@ procedure Entry; qs: QString; begin qs := QString.Create('one string'); - move(qs, qs, 4); + //move(qs, qs, 4); MessageBox(0,'qs','Information',0); ExitProcess(0); end; +var + MemoryManager: TAnsiStringMemoryManager; begin + MemoryManager := TAnsiStringMemoryManager.Create; + try + finally + MemoryManager.Free; + end; + Entry; end. diff --git a/src/test/test1.s b/src/test/test1.s index 6928ee3..f4eef32 100644 --- a/src/test/test1.s +++ b/src/test/test1.s @@ -2,63 +2,198 @@ BITS 64 default rel CPU x64 - -EXTERN RTL_MEMORY_$$_MOVE$formal$formal$LONGDWORD +EXTERN VMT_$QT_STRING_$$_QSTRING +EXTERN QT_STRING$_$QSTRING_$__$$_CREATE$PCHAR$$QSTRING EXTERN _$dll$user32$MessageBoxA EXTERN _$dll$kernel32$ExitProcess +EXTERN VMT_$SYSTEM_$$_TANSISTRINGMEMORYMANAGER +EXTERN SYSTEM$_$TANSISTRINGMEMORYMANAGER_$__$$_CREATE$$TANSISTRINGMEMORYMANAGER +EXTERN SYSTEM$_$TOBJECT_$__$$_FREE +EXTERN fpc_initializeunits +EXTERN FPC_DO_EXIT +; Begin asmlist al_procedures SECTION .text GLOBAL P$TEST1_$$_ENTRY P$TEST1_$$_ENTRY: ..@c1: - +; [test1.pas] +; [19] begin +%LINE 19+0 test1.pas + lea rsp,[rsp-40] ..@c3: - mov qword [rsp+32],rax - lea rdx,[rsp+32] - lea rcx,[rsp+32] - mov r8d,4 - call RTL_MEMORY_$$_MOVE$formal$formal$LONGDWORD +; Var hm located in register rax +; Var qs located in register rax +; [20] qs := QString.Create('one string'); +%LINE 20+0 + lea r8,[_$TEST1$_Ld1] + mov edx,1 + lea rcx,[VMT_$QT_STRING_$$_QSTRING] + call QT_STRING$_$QSTRING_$__$$_CREATE$PCHAR$$QSTRING +; Var qs located in register rax +; [23] MessageBox(0,'qs','Information',0); +%LINE 23+0 xor r9d,r9d lea r8,[_$TEST1$_Ld2] lea rdx,[_$TEST1$_Ld3] xor ecx,ecx call _$dll$user32$MessageBoxA +; [24] ExitProcess(0); +%LINE 24+0 xor ecx,ecx call _$dll$kernel32$ExitProcess - +; [25] end; +%LINE 25+0 + nop + lea rsp,[rsp+40] ret ..@c2: SECTION .text GLOBAL PASCALMAIN -GLOBAL _mainCRTStartup - _mainCRTStartup: PASCALMAIN: GLOBAL main - global _mainCRTStartup -_mainCRTStartup: main: ..@c4: - +; [29] begin +%LINE 29+0 + push rbp ..@c6: - +..@c7: + mov rbp,rsp +..@c8: + lea rsp,[rsp-32] + call fpc_initializeunits +; [30] MemoryManager := TAnsiStringMemoryManager.Create; +%LINE 30+0 + mov eax,1 + lea rcx,[VMT_$SYSTEM_$$_TANSISTRINGMEMORYMANAGER] + mov rdx,rax + call SYSTEM$_$TANSISTRINGMEMORYMANAGER_$__$$_CREATE$$TANSISTRINGMEMORYMANAGER + mov qword [U_$P$TEST1_$$_MEMORYMANAGER],rax +; [33] MemoryManager.Free; +%LINE 33+0 + mov rcx,rax + call SYSTEM$_$TOBJECT_$__$$_FREE +; [36] Entry; +%LINE 36+0 call P$TEST1_$$_ENTRY - -xor ecx, ecx -call _$dll$kernel32$ExitProcess - +; [37] end. +%LINE 37+0 + call FPC_DO_EXIT + nop + lea rsp,[rbp] + pop rbp ret ..@c5: +; End asmlist al_procedures +; Begin asmlist al_globals + +SECTION .bss + ALIGNB 8 +; [28] MemoryManager: TAnsiStringMemoryManager; +%LINE 28+0 test1.pas +U_$P$TEST1_$$_MEMORYMANAGER: RESB 8 + +SECTION .data + ALIGN 8,DB 0 + GLOBAL INITFINAL +INITFINAL DQ 0,0 +%LINE 0+0 + +SECTION .data + ALIGN 8,DB 0 + GLOBAL FPC_THREADVARTABLES +FPC_THREADVARTABLES DD 0 + +SECTION .data + ALIGN 8,DB 0 + GLOBAL FPC_RESOURCESTRINGTABLES +FPC_RESOURCESTRINGTABLES DQ 0 + +SECTION .data + ALIGN 8,DB 0 + GLOBAL FPC_WIDEINITTABLES +FPC_WIDEINITTABLES DQ 0 + +SECTION .data + ALIGN 8,DB 0 + GLOBAL FPC_RESSTRINITTABLES +FPC_RESSTRINITTABLES DQ 0 + +SECTION .fpc +__fpc_ident DB "FPC 3.2.2 [2021/05/15] for x86_64 - Win64" + +SECTION .data + ALIGN 8,DB 0 + GLOBAL __heapsize +__heapsize DQ 0 + +SECTION .data + ALIGN 8,DB 0 + GLOBAL __fpc_valgrind +__fpc_valgrind DB 0 +; End asmlist al_globals +; Begin asmlist al_typedconsts SECTION .rodata _$TEST1$_Ld1: +%LINE 20+0 test1.pas DB "one string",0 SECTION .rodata _$TEST1$_Ld2: +%LINE 23+0 DB "Information",0 SECTION .rodata _$TEST1$_Ld3: DB "qs",0 +; End asmlist al_typedconsts +; Begin asmlist al_dwarf_frame + +SECTION .debug_frame +..@c9: + DD ..@c11-..@c10 +..@c10: + DD -1 + DB 1,0 +; Unsupported const type FIXME_ULEB128BIT +; Unsupported const type FIXME_SLEB128BIT + DB 16,12 +; Unsupported const type FIXME_ULEB128BIT +; Unsupported const type FIXME_ULEB128BIT + DB 5 +; Unsupported const type FIXME_ULEB128BIT +; Unsupported const type FIXME_ULEB128BIT + ALIGN 4,DB 0 +..@c11: + DD ..@c13-..@c12 +..@c12: + DQ ..@c1,..@c2-..@c1 + DB 4 + DD ..@c3-..@c1 + DB 14 +; Unsupported const type FIXME_ULEB128BIT + ALIGN 4,DB 0 +..@c13: + DD ..@c15-..@c14 +..@c14: + DQ ..@c4,..@c5-..@c4 + DB 4 + DD ..@c6-..@c4 + DB 14 +; Unsupported const type FIXME_ULEB128BIT + DB 4 + DD ..@c7-..@c6 + DB 5 +; Unsupported const type FIXME_ULEB128BIT +; Unsupported const type FIXME_ULEB128BIT + DB 4 + DD ..@c8-..@c7 + DB 13 +; Unsupported const type FIXME_ULEB128BIT + ALIGN 4,DB 0 +..@c15: +; End asmlist al_dwarf_frame diff --git a/src/transform.py b/src/transform.py index 53304a2..ce3f4ef 100644 --- a/src/transform.py +++ b/src/transform.py @@ -18,7 +18,7 @@ def delete_pattern(filename, pattern): if len(sys.argv) != 2: print("Usage: python script.py ") sys.exit(1) - + sys.exit(0) filename = sys.argv[1] # # delete comments @@ -28,8 +28,8 @@ def delete_pattern(filename, pattern): delete_pattern(filename, r"EXTERN\tFPC\_DO\_EXIT[\r\n]") delete_pattern(filename, r"EXTERN\tfpc\_initializeunits[\r\n]") # - delete_pattern(filename, - r"EXTERN[ \t]*VMT.*[\r\n]") + #delete_pattern(filename, + #r"EXTERN[ \t]*VMT.*[\r\n]") # delete_pattern(filename, r"EXTERN[ \t]*QT_STRING.*CREATE.*QSTRING")