From vvm at tut.by Sun Jan 20 11:16:45 2019 From: vvm at tut.by (vvm at tut.by) Date: Sun, 20 Jan 2019 13:16:45 +0300 Subject: [M3devel] It's time to AMD_64. Modula-3 for Windows x64 Message-ID: <17924821547979405@sas2-857317bd6599.qloud-c.yandex.net> Hi! It's time to AMD_64 I started from https://modula3.elegosoft.com/cm3/uploaded-archives/ cm3-min-AMD64_NT-d5.9.0-VC110-20131012.msi cm3-all-AMD64_NT-d5.9.0-VC110-20131012.zip I have worked Modula-3 for Windows x64 There some must important patches: == --- RTExFrame.m3 cm3-4e08861fd36f23dcfac6e50e157b36eddf3989b7 Fri Jul 01 10:29:12 2016 +++ RTExFrame.m3 Tue Jun 21 11:59:05 2016 @@ -10,17 +10,17 @@ (*----------------------------------------- compiler generated descriptors --*) (* This defines the low-level routines and data structures used by the exception runtime. See also m3middle/src/M3RT, which also describes these structures. *) (* RTExFrame.Alloca_jmpbuf and Target.Alloca_jmpbuf must match. *) -CONST Alloca_jmpbuf = TRUE; +CONST Alloca_jmpbuf = FALSE; TYPE ScopeKind = { Except, ExceptElse, Finally, FinallyProc, Raises, RaisesNone, Lock }; TYPE == == --- Target.m3 cm3-4e08861fd36f23dcfac6e50e157b36eddf3989b7 Fri Jul 01 10:29:12 2016 +++ Target.m3 Tue Jun 21 11:59:05 2016 @@ -59,37 +59,37 @@ System_name := SystemNames[sys]; OS_name := in_OS_name; (* common values *) Atomic_lock_free := ARRAY [CGType.Word8..CGType.Addr] OF BOOLEAN { TRUE, .. }; (* this is overly optimistic... *) Allow_packed_byte_aligned := FALSE; All_floats_legal := TRUE; PCC_bitfield_type_matters := TRUE; Structure_size_boundary := 8; Little_endian := TRUE; Setjmp := "_setjmp"; (* RTExFrame.Alloca_jmpbuf and Target.Alloca_jmpbuf must match. *) - Alloca_jmpbuf := TRUE; + Alloca_jmpbuf := FALSE; (* There is no portable stack walker, and therefore few systems have one. Having a stack walker theoretically speeds up everything nicely. If you are familiar with NT exception handling, all but x86 have a stack walker. Not having a stack walker means that functions that have try/except/finally/raise incur a codegen cost even if there is never a raise -- for having the try. Having a stack walker means "zero cost" for exception handling code that does not actually raise an exception. If there is NOT a stack walker, prologues/epilogues for functions that try/except/finally/raise call PushEFrame / PopEFrame, essentially to build a walkable parallel stack. If there is a stack walker, then raise can discover what PushEFrame / PopEFrame effectively recorded. NT/x86 has a highly optimized equivalent of PushEFrame / PopEFrame, not currently used by Modula-3. *) == == --- LazyConsole.i3 000 Thu Nov 01 00:26:16 2018 +++ LazyConsole.i3 Thu Jan 17 13:19:20 2019 @@ -5,7 +5,7 @@ IMPORT File, FileWin32, WinDef; -PROCEDURE New (hd: WinDef.DWORD; ds: FileWin32.DirectionSet): File.T; +PROCEDURE New (hd: WinDef.INT32; ds: FileWin32.DirectionSet): File.T; (* Returns a file that if ever written to or read from will allocate a fresh Windows console for the I/O. *) == == --- LazyConsole.m3 000 Thu Nov 01 00:26:16 2018 +++ LazyConsole.m3 Thu Jan 17 13:20:54 2019 @@ -7,7 +7,7 @@ TYPE T = Terminal.T OBJECT - hd : WinDef.DWORD; + hd : WinDef.INT32; setup : BOOLEAN := FALSE; OVERRIDES read := Read; @@ -16,7 +16,7 @@ status := Status; END; -PROCEDURE New (hd: WinDef.DWORD; ds: FileWin32.DirectionSet): File.T = +PROCEDURE New (hd: WinDef.INT32; ds: FileWin32.DirectionSet): File.T = BEGIN RETURN NEW (T, ds := ds, hd := hd); END New; == == --- m3makefile 000 Thu Nov 01 00:26:16 2018 +++ m3makefile Thu Jan 17 14:09:22 2019 @@ -15,7 +15,7 @@ cp_if(Name & ".i3.tmp", Name & ".i3") end -if equal(TARGET, "NT386") +if equal(TARGET, "AMD64_NT") MakeGrisuDisable("GrisuDisable", "TRUE") else MakeGrisuDisable("GrisuDisable", "FALSE") == Best regards, Victor Miasnikov P.S. For best working with debugger: --- RTOS.m3 000 Sun Jan 03 11:17:00 2016 +++ RTOS.m3 Fri Jan 04 13:15:50 2019 @@ -23,10 +23,12 @@ IF WinBase.IsDebuggerPresent () # 0 THEN WinBase.DebugBreak (); END; - RTThread.SuspendOthers (); - RTMachInfo.DumpStack (LOOPHOLE (Crash, ADDRESS), fp); + (* RTThread.SuspendOthers (); + RTMachInfo.DumpStack (LOOPHOLE (Crash, ADDRESS), fp); *) + (** RTThread.ResumeOthers (); RTSignal.RestoreHandlers (); (* so we really do crash... *) - Exit (-1); + ***) + Exit (4000); (*** 0 not -1 ***) END Crash; (********************* Some trivial patches to .cmd: --- cm3CommandShell.CMD-000 Sun Jan 03 11:17:00 2016 +++ cm3CommandShell.CMD Wed Jan 02 15:24:30 2019 @@ -96,2 +96,3 @@ echo %_cm3_ThisOS_Long% | (find /I "Windows 7" >NUL:) && ((set _cm3_ThisOS=Win7) & goto ver_7) +echo %_cm3_ThisOS_Long% | (find /I "Windows 10" >NUL:) && ((set _cm3_ThisOS=Win7) & goto ver_7) echo %_cm3_ThisOS_Long% | (find /I "Windows Server 2008" >NUL:) && ((set _cm3_ThisOS=2008) & goto ver_2008) [/code] --- do-cm3.cmd 000 Sun Jan 03 11:17:00 2016 +++ do-cm3.cmd Sat Dec 29 11:46:06 2018 @@ -85,6 +85,7 @@ if NOT exist %SystemRoot%\system32\systeminfo.exe goto ver_NoSysInfo FOR /F "usebackq tokens=3* delims=: " %%i IN (`systeminfo ^| find /I "OS Name"`) DO set _cm3_ThisOS_Long=%%i %%j echo %_cm3_ThisOS_Long% | (find /I "Windows Vista" >NUL:) && ((set _cm3_ThisOS=Vista) & goto ver_Vista) +echo %_cm3_ThisOS_Long% | (find /I "Windows 10" >NUL:) && ((set _cm3_ThisOS=Win7) & goto ver_7) echo %_cm3_ThisOS_Long% | (find /I "Windows 7" >NUL:) && ((set _cm3_ThisOS=Win7) & goto ver_7) echo %_cm3_ThisOS_Long% | (find /I "Windows Server 2008" >NUL:) && ((set _cm3_ThisOS=2008) & goto ver_2008) --- RCC_upgradeCM3.cmd 000 Sun Jan 03 11:17:00 2016 +++ RCC_upgradeCM3.cmd Wed Jan 02 16:45:50 2019 @@ -48,7 +48,7 @@ set _cm3_Repeat=1 set _cm3_DO= set _z_ctrlArgs= -set _z_Stage3=min +set _z_Stage3=all @@ -113,7 +113,7 @@ if exist "bin\cm3.exe" if exist "pkg" set CM3_ROOT=%CD%& popd & goto FoundRoot cd .. if exist "bin\cm3.exe" if exist "pkg" set CM3_ROOT=%CD%& popd & goto FoundRoot -if exist "C:\cm3\bin\cm3.exe" if exist "C:\cm3\pkg" set CM3_ROOT=C:\cm3& popd & goto FoundRoot +if exist "D:\cm3\bin\cm3.exe" if exist "D:\cm3\pkg" set CM3_ROOT=D:\cm3& popd & goto FoundRoot popd rem otherwise, search the existing PATH environment variable to try and find the root of the cm3 installation for %%F in (cm3.exe) do set CM3_ROOT=%%~dp$PATH:F.. @@ -138,7 +138,7 @@ if /I "%_cm3_CommandReady%"=="TRUE" goto FindPkgInfo echo Setting up environment variables for CM3 ... echo. -call c:\cm3\bin\cm3CommandShell.CMD SameWindow +call d:\cm3\bin\cm3CommandShell.CMD SameWindow @echo off if /I not "%_cm3_CommandReady%"=="TRUE" goto FatalSetupCM3 @@ -237,7 +237,7 @@ echo Creating "%CM3_ROOT%\bin\cm3.cfg" ... if exist "%CM3_ROOT%\bin\cm3.cfg" del /f %CM3_ROOT%\bin\cm3.cfg REM OLD: echo INSTALL_ROOT = path() ^& "/..">%CM3_ROOT%\bin\cm3.cfg -REM OLD: echo include(path() ^& "/config/NT386")>>%CM3_ROOT%\bin\cm3.cfg +REM OLD: echo include(path() ^& "/config/AMD64_NT")>>%CM3_ROOT%\bin\cm3.cfg copy /y %_cm3_PkgTree%m3-sys\cminstall\src\config-no-install\cm3.cfg %CM3_ROOT%\bin\cm3.cfg if errorlevel 1 echo ERROR: Problem copying files. & (set _cm3_ExitCode=5) & goto END if not exist "%CM3_ROOT%\bin\cm3.cfg" echo ERROR: Problem copying files. & (set _cm3_ExitCode=5) & goto END @@ -287,12 +287,12 @@ :FN_FinishStage :-------------- if "%_cm3_CM3Failure%"=="TRUE" echo ...skipping installation of cm3.exe due to errors... & goto :EOF -if not exist "%_cm3_PkgTree%m3-sys\cm3\NT386\cm3.exe" goto StageFailure +if not exist "%_cm3_PkgTree%m3-sys\cm3\AMD64_NT\cm3.exe" goto StageFailure echo ...installing new cm3.exe as "%CM3_ROOT%\bin\cm3.exe" ... if exist "%CM3_ROOT%\bin\cm3.exe" del /f "%CM3_ROOT%\bin\cm3.exe" if exist "%CM3_ROOT%\bin\cm3.pdb" del /f "%CM3_ROOT%\bin\cm3.pdb" -copy "%_cm3_PkgTree%m3-sys\cm3\NT386\cm3.exe" "%CM3_ROOT%\bin\cm3.exe" -if exist "%_cm3_PkgTree%m3-sys\cm3\NT386\cm3.pdb" copy "%_cm3_PkgTree%m3-sys\cm3\NT386\cm3.pdb" "%CM3_ROOT%\bin\cm3.pdb" +copy "%_cm3_PkgTree%m3-sys\cm3\AMD64_NT\cm3.exe" "%CM3_ROOT%\bin\cm3.exe" +if exist "%_cm3_PkgTree%m3-sys\cm3\AMD64_NT\cm3.pdb" copy "%_cm3_PkgTree%m3-sys\cm3\AMD64_NT\cm3.pdb" "%CM3_ROOT%\bin\cm3.pdb" if not exist "%CM3_ROOT%\bin\cm3.exe" goto StageFailure goto :EOF