MODULE; IMPORT Wr, Thread; IMPORT M3CG, Msg, Utils, NTObjFile, M3x86, M3ObjFile; IMPORT M3CG_BinWr; FROM Target IMPORT M3BackendMode_t, BackendIntegrated; VAR obj_file : M3ObjFile.T := NIL; obj_wr : Wr.T := NIL; obj_name : TEXT := NIL; log : Wr.T := NIL; log_name : TEXT := NIL; PROCEDURE M3Backend Open (target: Wr.T; target_name: TEXT; backend_mode: M3BackendMode_t): M3CG.T = BEGIN IF NOT BackendIntegrated[backend_mode] THEN RETURN M3CG_BinWr.New (target); ELSE <*ASSERT obj_file = NIL *> obj_file := NTObjFile.New (); obj_wr := target; obj_name := target_name; IF (Msg.level >= Msg.Level.Verbose) THEN log_name := target_name & "log"; log := Utils.OpenWriter (log_name, fatal := TRUE); END; RETURN M3x86.New (log, obj_file); END; END Open; PROCEDUREClose (<*UNUSED*> cg: M3CG.T) = BEGIN IF obj_file # NIL THEN TRY NTObjFile.Dump (obj_file, obj_wr); EXCEPT Wr.Failure, Thread.Alerted => Msg.FatalError (NIL, "problem writing object file: ", obj_name); END; Utils.CloseWriter (log, log_name); obj_file := NIL; obj_wr := NIL; obj_name := NIL; log := NIL; log_name := NIL; END; END Close; BEGIN END M3Backend.