ELF: Do not exit if it cannot open an output file.
authorRui Ueyama <ruiu@google.com>
Tue, 2 Feb 2016 22:48:04 +0000 (22:48 +0000)
committerRui Ueyama <ruiu@google.com>
Tue, 2 Feb 2016 22:48:04 +0000 (22:48 +0000)
It can fail to open an output file for various reasons, including
lack of permission, too long filename, or the output file is not
a mmap'able file.

llvm-svn: 259596

lld/ELF/Writer.cpp
lld/test/ELF/driver.test

index 3a317b3..1e94b03 100644 (file)
@@ -56,7 +56,7 @@ private:
   void assignAddresses();
   void buildSectionMap();
   void fixAbsoluteSymbols();
-  void openFile(StringRef OutputPath);
+  bool openFile();
   void writeHeader();
   void writeSections();
   bool isDiscarded(InputSectionBase<ELFT> *IS) const;
@@ -172,7 +172,8 @@ template <class ELFT> void Writer<ELFT>::run() {
     return;
   assignAddresses();
   fixAbsoluteSymbols();
-  openFile(Config->OutputFile);
+  if (!openFile())
+    return;
   writeHeader();
   writeSections();
   if (HasError)
@@ -1384,11 +1385,14 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
     Sec->writeHeaderTo(++SHdrs);
 }
 
-template <class ELFT> void Writer<ELFT>::openFile(StringRef Path) {
+template <class ELFT> bool Writer<ELFT>::openFile() {
   ErrorOr<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
-      FileOutputBuffer::create(Path, FileSize, FileOutputBuffer::F_executable);
-  fatal(BufferOrErr, "failed to open " + Path);
+      FileOutputBuffer::create(Config->OutputFile, FileSize,
+                               FileOutputBuffer::F_executable);
+  if (error(BufferOrErr, "failed to open " + Config->OutputFile))
+    return false;
   Buffer = std::move(*BufferOrErr);
+  return true;
 }
 
 // Write section contents to a mmap'ed file.
index 13f040e..70fe7ba 100644 (file)
@@ -1,3 +1,5 @@
+# REQUIRES: x86
+
 # RUN: not ld.lld -unknown1 -unknown2 -m foo /no/such/file -lnosuchlib \
 # RUN:   2>&1 | FileCheck %s
 
@@ -7,3 +9,12 @@
 # CHECK: Unknown emulation: foo
 # CHECK: cannot open /no/such/file
 # CHECK: Unable to find library -lnosuchlib
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: not ld.lld %t -o /dev/null 2>&1 | FileCheck -check-prefix=CHECK2 %s
+
+# CHECK2: failed to open
+
+.globl _start
+_start:
+  nop