@@ -1579,6 +1579,21 @@ static void forward_refs(insn *instruction)
15791579    }
15801580}
15811581
1582+ static  void  print_pass_report (bool  failure )
1583+ {
1584+     /* This test is here to reduce the likelihood of a recursive failure */ 
1585+     if  (unlikely (opt_verbose_info  >= 1 )) {
1586+         enum  pass_type  t  =  pass_type ();
1587+ 
1588+         if  (t  >= PASS_FIRST ) {
1589+             unsigned int   end_passes  =  t  >  PASS_OPT  ? t  -  PASS_OPT  : 0 ;
1590+             nasm_info (1 , "assembly %s after 1+%" PRId64 "+%u passes" ,
1591+                       failure  ? "failed"  : "completed" ,
1592+                       pass_count ()- 1 - end_passes , end_passes );
1593+         }
1594+     }
1595+ }
1596+ 
15821597static  void  assemble_file (const  char  * fname , struct  strlist  * depend_list )
15831598{
15841599    char  * line ;
@@ -1758,10 +1773,8 @@ static void assemble_file(const char *fname, struct strlist *depend_list)
17581773        reset_warnings ();
17591774    }
17601775
1761-     if  (pass_final ()) {
1762-         /*  -On and -Ov switches */ 
1763-         nasm_info (1 , "assembly required 1+%" PRId64 "+2 passes\n" , pass_count ()- 3 );
1764-     }
1776+     if  (terminate_after_phase  ||  pass_final ())
1777+         print_pass_report (terminate_after_phase );
17651778
17661779    lfmt -> cleanup ();
17671780    strlist_free (& warn_list );
@@ -1871,10 +1884,24 @@ static const char no_file_name[] = "nasm"; /* What to print if no file name */
18711884
18721885/* 
18731886 * For fatal/critical/panic errors, kill this process. 
1887+  * 
1888+  * For FATAL errors doing cleanups, tidying up the list process, 
1889+  * and so in is acceptable. 
1890+  * 
1891+  * For CRITICAL errors, minimize dependencies on memory allocation 
1892+  * and/or having a system valid state. 
1893+  * 
1894+  * For PANIC, if abort_on_panic is set, abort without any other action. 
18741895 */ 
18751896static_fatal_func  die_hard (errflags  true_type , errflags  severity )
18761897{
18771898    if  (true_type  <  ERR_PANIC  ||  !abort_on_panic ) {
1899+         if  (true_type  <  ERR_CRITICAL ) {
1900+             /* FATAL shutdown, general cleanup actions are valid */ 
1901+             print_pass_report (true);
1902+             lfmt -> cleanup ();
1903+         }
1904+ 
18781905        fflush (NULL );
18791906
18801907        if  (ofile ) {
@@ -1887,10 +1914,15 @@ static_fatal_func die_hard(errflags true_type, errflags severity)
18871914        if  (severity  &  ERR_USAGE )
18881915            usage ();
18891916
1890-         /* Terminate immediately */ 
1917+         /* Terminate immediately (exit closes any still open files)  */ 
18911918        exit (true_type  -  ERR_FATAL  +  1 );
18921919    }
18931920
1921+     /* 
1922+      * abort() shouldn't ever return, but be paranoid about this, 
1923+      * plus it helps some compilers clue in to the fact that this 
1924+      * function can never, ever return. 
1925+      */ 
18941926    while  (1 )
18951927        abort ();
18961928}
@@ -1932,8 +1964,8 @@ fatal_func nasm_verror_critical(errflags severity, const char *fmt, va_list args
19321964    errflags  true_type  =  severity  &  ERR_MASK ;
19331965    static  bool  been_here  =  false;
19341966
1935-     if  (unlikely (been_here ))
1936-         abort ();                /* Recursive error... just die */ 
1967+     while  (unlikely (been_here ))
1968+         abort ();                /* Recursive critical  error... just die */ 
19371969
19381970    been_here  =  true;
19391971
0 commit comments