cm3/src/M3Backend.m3


 Copyright (C) 1994, Digital Equipment Corporation           
 All rights reserved.                                        
 See the file COPYRIGHT for a full description.              
                                                             
 Last modified on Wed Oct 12 16:12:57 PDT 1994 by kalsow     

MODULE M3Backend;

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 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;

PROCEDURE Close (<*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.

interface Msg is in: