[AArch64] PR target/20667, fix disassembler for the "special" optional SYS_Rt operand...
[deliverable/binutils-gdb.git] / gas / output-file.c
index f94359ab6b0a50eedd77cfafaf22d13cca52bf8d..f2db85f0cd26e2624e30dc895936781e397e4465 100644 (file)
@@ -1,12 +1,11 @@
 /* output-file.c -  Deal with the output file
 /* output-file.c -  Deal with the output file
-   Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1996, 1998, 1999, 2001,
-   2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1987-2016 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
    GAS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This file is part of GAS, the GNU Assembler.
 
    GAS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    GAS is distributed in the hope that it will be useful,
    any later version.
 
    GAS is distributed in the hope that it will be useful,
    the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
    the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
-#include <stdio.h>
-
 #include "as.h"
 #include "as.h"
-
 #include "output-file.h"
 
 #ifndef TARGET_MACH
 #define TARGET_MACH 0
 #endif
 
 #include "output-file.h"
 
 #ifndef TARGET_MACH
 #define TARGET_MACH 0
 #endif
 
-#include "bfd.h"
 bfd *stdoutput;
 
 void
 bfd *stdoutput;
 
 void
-output_file_create (char *name)
+output_file_create (const char *name)
 {
   if (name[0] == '-' && name[1] == '\0')
     as_fatal (_("can't open a bfd on stdout %s"), name);
 
   else if (!(stdoutput = bfd_openw (name, TARGET_FORMAT)))
     {
 {
   if (name[0] == '-' && name[1] == '\0')
     as_fatal (_("can't open a bfd on stdout %s"), name);
 
   else if (!(stdoutput = bfd_openw (name, TARGET_FORMAT)))
     {
-      if (bfd_get_error () == bfd_error_invalid_target)
-       as_perror (_("Selected target format '%s' unknown"), TARGET_FORMAT);
+      bfd_error_type err = bfd_get_error ();
+
+      if (err == bfd_error_invalid_target)
+       as_fatal (_("selected target format '%s' unknown"), TARGET_FORMAT);
       else
       else
-       as_perror (_("FATAL: can't create %s"), name);
-      exit (EXIT_FAILURE);
+       as_fatal (_("can't create %s: %s"), name, bfd_errmsg (err));
     }
 
   bfd_set_format (stdoutput, bfd_object);
     }
 
   bfd_set_format (stdoutput, bfd_object);
@@ -54,14 +50,24 @@ output_file_create (char *name)
 }
 
 void
 }
 
 void
-output_file_close (char *filename)
+output_file_close (const char *filename)
 {
 {
+  bfd_boolean res;
+
+  if (stdoutput == NULL)
+    return;
+
   /* Close the bfd.  */
   /* Close the bfd.  */
-  if (bfd_close (stdoutput) == 0)
-    {
-      bfd_perror (filename);
-      as_perror (_("FATAL: can't close %s\n"), filename);
-      exit (EXIT_FAILURE);
-    }
-  stdoutput = NULL;            /* Trust nobody!  */
+  if (had_errors ())
+    res = bfd_cache_close_all ();
+  else
+    res = bfd_close (stdoutput);
+
+  /* Prevent an infinite loop - if the close failed we will call as_fatal
+     which will call xexit() which may call this function again...  */
+  stdoutput = NULL;
+
+  if (! res)
+    as_fatal (_("can't close %s: %s"), filename,
+             bfd_errmsg (bfd_get_error ()));
 }
 }
This page took 0.026877 seconds and 4 git commands to generate.