Index: cm3/src/Builder.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/cm3/src/Builder.m3,v retrieving revision 1.37 diff -u -w -r1.37 Builder.m3 --- cm3/src/Builder.m3 15 Feb 2011 03:02:58 -0000 1.37 +++ cm3/src/Builder.m3 14 Sep 2012 13:19:07 -0000 @@ -1182,7 +1182,7 @@ Utils.NoteNewFile (u.object); ELSIF s.bootstrap_mode THEN CASE s.m3backend_mode OF - | M3BackendMode_t.IntegratedObject, M3BackendMode_t.IntegratedAssembly => + | M3BackendMode_t.IntegratedObject, M3BackendMode_t.IntegratedAssembly, M3BackendMode_t.C => Msg.FatalError (NIL, "this compiler cannot compile .ic or .mc files"); | M3BackendMode_t.ExternalObject, M3BackendMode_t.ExternalAssembly => EVAL RunM3Back (s, UnitPath (u), u.object, u.debug, u.optimize); @@ -1190,7 +1190,7 @@ END; ELSE (* UK.IC or UK.MC *) CASE s.m3backend_mode OF - | M3BackendMode_t.IntegratedObject, M3BackendMode_t.IntegratedAssembly => + | M3BackendMode_t.IntegratedObject, M3BackendMode_t.IntegratedAssembly, M3BackendMode_t.C => Msg.FatalError (NIL, "this compiler cannot compile .ic or .mc files"); | M3BackendMode_t.ExternalObject => EVAL RunM3Back (s, UnitPath (u), u.object, u.debug, u.optimize); @@ -1269,16 +1269,28 @@ VAR tmpC, tmpS: TEXT; need_merge := FALSE; - plan: [0..7] := ORD(s.m3backend_mode); + plan: [0..9] := ORD(s.m3backend_mode); BEGIN u.link_info := NIL; ResetExports (s, u); - IF (s.bootstrap_mode) THEN INC (plan, 4) END; + IF (s.bootstrap_mode) THEN INC (plan, 5) END; CASE plan OF + | 4, (* -bootstrap, C *) + 9 => (* +bootstrap, C *) + tmpC := M3Unit.FileName (u) & ".c"; (* FUTURE: .cpp *) + (*IF (NOT s.keep_files) THEN Utils.NoteTempFile (tmpC) END;*) + IF RunM3 (s, u, tmpC) THEN + RunCC (s, tmpC, u.object, TRUE, FALSE); + need_merge := TRUE; + ELSE + Msg.FatalError (NIL, "failed compiling: "); + END; + (*IF (NOT s.keep_files) THEN Utils.Remove (tmpC) END;*) + | 0, (* -bootstrap, -m3back, -asm *) - 4, (* +bootstrap, -m3back, -asm *) - 5 => (* +bootstrap, -m3back, +asm *) + 5, (* +bootstrap, -m3back, -asm *) + 6 => (* +bootstrap, -m3back, +asm *) IF RunM3 (s, u, u.object) THEN need_merge := TRUE; ELSE @@ -1286,6 +1298,7 @@ END; | 1 => (* -bootstrap, -m3back, +asm *) + <* ASSERT FALSE *> tmpS := TempSName (u); IF (NOT s.keep_files) THEN Utils.NoteTempFile (tmpS) END; IF RunM3 (s, u, tmpS) THEN @@ -1295,6 +1308,7 @@ IF (NOT s.keep_files) THEN Utils.Remove (tmpS) END; | 2 => (* -bootstrap, +m3back, -asm *) + <* ASSERT FALSE *> tmpC := TempCName (u); IF (NOT s.keep_files) THEN Utils.NoteTempFile (tmpC) END; IF RunM3 (s, u, tmpC) THEN @@ -1303,7 +1317,6 @@ END; IF (NOT s.keep_files) THEN Utils.Remove (tmpC) END; - | 3 => (* -bootstrap, +m3back, +asm *) IF s.delayBackend THEN (* parallel/delayed version of back-end code *) @@ -1350,8 +1363,9 @@ IF (NOT s.keep_files) THEN Utils.Remove (tmpS) END; END - | 6, (* +bootstrap, +m3back, -asm *) - 7 => (* +bootstrap, +m3back, +asm *) + | 7, (* +bootstrap, +m3back, -asm *) + 8 => (* +bootstrap, +m3back, +asm *) + <* ASSERT plan = 8 *> tmpC := TempCName (u); IF (NOT s.keep_files) THEN Utils.NoteTempFile (tmpC) END; IF RunM3 (s, u, tmpC) THEN @@ -2039,8 +2053,8 @@ PushBool (s, debug); IF CallProc (s, s.c_compiler) THEN s.compile_failed := TRUE; - Msg.Error (NIL, "C compiler failed compiling: ", source); Utils.Remove (object); + Msg.FatalError (NIL, "C compiler failed compiling: ", source); END; ETimer.Pop (); END RunCC; @@ -2148,9 +2162,12 @@ plan : [0..3] := 0; BEGIN CASE s.m3backend_mode OF + + | M3BackendMode_t.C => + Msg.FatalError (NIL, "use 'main_in_c' with C backend "); + | M3BackendMode_t.IntegratedObject => (* -m3back, -asm => cg produces object code *) GenCGMain (s, Main_O); - Utils.NoteNewFile (Main_O); | M3BackendMode_t.IntegratedAssembly => (* -m3back, +asm => cg produces assembly code *) (* don't mess with a file comparison, just build the stupid thing... *) @@ -2160,7 +2177,6 @@ Msg.Debug ("assembling ", Main_MC, " ...", Wr.EOL); EVAL RunAsm (s, Main_MS, Main_O); IF (NOT s.keep_files) THEN Utils.Remove (Main_MS); END; - Utils.NoteNewFile (Main_O); | M3BackendMode_t.ExternalObject, (* +m3back, -asm => cg produces il, m3back produces object *) M3BackendMode_t.ExternalAssembly => (* +m3back, +asm => cg produces il, m3back produces assembly *) @@ -2188,6 +2204,7 @@ END; Msg.Debug ("compiling ", Main_MC, " ...", Wr.EOL); IF (plan = 2) THEN + <* ASSERT FALSE *> EVAL RunM3Back (s, Main_MC, Main_O, debug := TRUE, optimize := FALSE); ELSE IF RunM3Back (s, Main_MC, Main_MS, debug := TRUE, optimize := FALSE) @@ -2195,11 +2212,11 @@ END; IF (NOT s.keep_files) THEN Utils.Remove (Main_MS); END; END; - Utils.NoteNewFile (Main_O); Utils.NoteNewFile (Main_MC); END; END; (* CASE plan *) + Utils.NoteNewFile (Main_O); END GenerateCGMain; PROCEDURE GenCGMain (s: State; object: TEXT) = Index: cm3/src/M3Backend.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/cm3/src/M3Backend.m3,v retrieving revision 1.4 diff -u -w -r1.4 M3Backend.m3 --- cm3/src/M3Backend.m3 4 Apr 2010 08:37:37 -0000 1.4 +++ cm3/src/M3Backend.m3 14 Sep 2012 13:19:07 -0000 @@ -6,7 +6,7 @@ MODULE M3Backend; -IMPORT Wr, Thread; +IMPORT Wr, Thread, M3C; IMPORT M3CG, Msg, Utils, NTObjFile, M3x86, M3ObjFile; IMPORT M3CG_BinWr; FROM Target IMPORT M3BackendMode_t, BackendIntegrated; @@ -20,9 +20,12 @@ PROCEDURE Open (target: Wr.T; target_name: TEXT; backend_mode: M3BackendMode_t): M3CG.T = BEGIN + IF backend_mode = M3BackendMode_t.C THEN + RETURN M3C.New (target); + END; IF NOT BackendIntegrated[backend_mode] THEN RETURN M3CG_BinWr.New (target); - ELSE + END; <*ASSERT obj_file = NIL *> obj_file := NTObjFile.New (); obj_wr := target; @@ -32,7 +35,6 @@ log := Utils.OpenWriter (log_name, fatal := TRUE); END; RETURN M3x86.New (log, obj_file); - END; END Open; PROCEDURE Close (<*UNUSED*> cg: M3CG.T) = Index: m3middle/src/Target.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/Target.i3,v retrieving revision 1.70 diff -u -w -r1.70 Target.i3 --- m3middle/src/Target.i3 4 Sep 2012 15:11:09 -0000 1.70 +++ m3middle/src/Target.i3 14 Sep 2012 13:19:08 -0000 @@ -136,7 +136,8 @@ IntegratedObject, (* "0" -- don't call m3_backend, M3CG produces object code *) IntegratedAssembly, (* "1" -- don't call m3_backend, M3CG produces assembly code *) ExternalObject, (* "2" -- call m3_backend, it produces object code *) - ExternalAssembly (* "3" -- call m3_backend, it produces assembly code *) + ExternalAssembly, (* "3" -- call m3_backend, it produces assembly code *) + C (* -- don't call m3_backend, call compile_c, M3CG produces C *) }; CONST @@ -144,10 +145,11 @@ { "IntegratedObject", "IntegratedAssembly", "ExternalObject", - "ExternalAssembly" }; + "ExternalAssembly", + "C" }; - BackendIntegrated = ARRAY M3BackendMode_t OF BOOLEAN { TRUE, TRUE, FALSE, FALSE }; - BackendAssembly = ARRAY M3BackendMode_t OF BOOLEAN { FALSE, TRUE, FALSE, TRUE }; + BackendIntegrated = ARRAY M3BackendMode_t OF BOOLEAN { TRUE, TRUE, FALSE, FALSE, TRUE }; + BackendAssembly = ARRAY M3BackendMode_t OF BOOLEAN { FALSE, TRUE, FALSE, TRUE, FALSE }; (*-------------------------------------------------------- initialization ---*) Index: m3middle/src/Target.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/Target.m3,v retrieving revision 1.126 diff -u -w -r1.126 Target.m3 --- m3middle/src/Target.m3 4 Sep 2012 15:11:09 -0000 1.126 +++ m3middle/src/Target.m3 14 Sep 2012 13:19:08 -0000 @@ -440,20 +440,25 @@ END Init; PROCEDURE InitCallingConventions(backend_mode: M3BackendMode_t; - calling_conventions: BOOLEAN) = + target_has_calling_conventions: BOOLEAN) = PROCEDURE New(name: TEXT; id: [0..1]): CallingConvention = VAR cc := NEW(CallingConvention, name := name); BEGIN - (* The external backend handles more calling convention details than the - integrated backend -- reversing parameter order and knowing how to - return structs. *) - IF calling_conventions THEN + (* This stuff seems messed up. *) + IF backend_mode = M3BackendMode_t.C OR target_has_calling_conventions THEN cc.m3cg_id := id; - cc.args_left_to_right := NOT integrated; - cc.results_on_left := TRUE; - cc.standard_structs := NOT integrated; ELSE cc.m3cg_id := 0; + END; + IF backend_mode = M3BackendMode_t.C THEN + cc.args_left_to_right := TRUE; + cc.results_on_left := TRUE; + cc.standard_structs := TRUE; + ELSIF integrated THEN + cc.args_left_to_right := FALSE; + cc.results_on_left := TRUE; + cc.standard_structs := FALSE; + ELSE cc.args_left_to_right := TRUE; cc.results_on_left := FALSE; cc.standard_structs := TRUE; Index: cminstall/src/config-no-install/PPC_DARWIN =================================================================== RCS file: /usr/cvs/cm3/m3-sys/cminstall/src/config-no-install/PPC_DARWIN,v retrieving revision 1.30 diff -u -w -r1.30 PPC_DARWIN --- cminstall/src/config-no-install/PPC_DARWIN 13 May 2010 09:24:17 -0000 1.30 +++ cminstall/src/config-no-install/PPC_DARWIN 14 Sep 2012 13:19:08 -0000 @@ -6,5 +6,7 @@ readonly GNU_PLATFORM = "powerpc-darwin6" % "cpu-os" string for GNU DarwinArch = "ppc" +M3_BACKEND_MODE = "C" + include("PPC.common") include("Darwin.common") Index: cminstall/src/config-no-install/Unix.common =================================================================== RCS file: /usr/cvs/cm3/m3-sys/cminstall/src/config-no-install/Unix.common,v retrieving revision 1.74 diff -u -w -r1.74 Unix.common --- cminstall/src/config-no-install/Unix.common 24 Jun 2012 11:00:06 -0000 1.74 +++ cminstall/src/config-no-install/Unix.common 14 Sep 2012 13:19:08 -0000 @@ -141,7 +141,7 @@ local args = options if M3_PROFILING args += "-pg" end - return try_exec ("@" & SYSTEM_CC, args, "-c", source) + return try_exec ("@" & SYSTEM_CC, args, "-c", source, "-o", object) end end Index: cminstall/src/config-no-install/cm3cfg.common =================================================================== RCS file: /usr/cvs/cm3/m3-sys/cminstall/src/config-no-install/cm3cfg.common,v retrieving revision 1.67 diff -u -w -r1.67 cm3cfg.common --- cminstall/src/config-no-install/cm3cfg.common 30 Sep 2010 10:06:57 -0000 1.67 +++ cminstall/src/config-no-install/cm3cfg.common 14 Sep 2012 13:19:08 -0000 @@ -419,11 +419,15 @@ % "1" -- don't call m3_backend, M3CG produces assembly code % "2" -- call m3_backend, it produces object code % "3" -- call m3_backend, it produces assembly code + % "C" -- use C backend, and then compile with compile_c() end % --- internal configuration options passed directly to the Modula-3 front-end if equal(M3_BACKEND_MODE, "0") or equal(M3_BACKEND_MODE, "1") - or equal(M3_BACKEND_MODE, "IntegratedObject") or equal(M3_BACKEND_MODE, "IntegratedAssembly") + or equal(M3_BACKEND_MODE, "IntegratedObject") + or equal(M3_BACKEND_MODE, "IntegratedAssembly") + or equal(M3_BACKEND_MODE, "IntegratedC") + or equal(M3_BACKEND_MODE, "C") M3_FRONT_FLAGS = ["-unfold_nested_procs", "-check_procs"] else M3_FRONT_FLAGS = [ ]