#include "lld/Common/Args.h"
#include "lld/Common/Driver.h"
#include "lld/Common/ErrorHandler.h"
+#include "lld/Common/Filesystem.h"
#include "lld/Common/Memory.h"
#include "lld/Common/Threads.h"
#include "lld/Common/Timer.h"
getOutputPath((*Args.filtered(OPT_INPUT).begin())->getValue());
}
+ // Fail early if an output file is not writable.
+ if (auto E = tryCreateFile(Config->OutputFile)) {
+ error("cannot open output file " + Config->OutputFile + ": " + E.message());
+ return;
+ }
+
if (ShouldCreatePDB) {
// Put the PDB next to the image if no /pdb flag was passed.
if (Config->PDBPath.empty()) {
add_lld_library(lldCommon
Args.cpp
ErrorHandler.cpp
+ Filesystem.cpp
Memory.cpp
Reproduce.cpp
Strings.cpp
//
//===----------------------------------------------------------------------===//
-#include "Filesystem.h"
-#include "Config.h"
+#include "lld/Common/Filesystem.h"
#include "lld/Common/Threads.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/Support/FileOutputBuffer.h"
#include <thread>
using namespace llvm;
-
using namespace lld;
-using namespace lld::elf;
// Removes a given file asynchronously. This is a performance hack,
// so remove this when operating systems are improved.
//
// This function spawns a background thread to remove the file.
// The calling thread returns almost immediately.
-void elf::unlinkAsync(StringRef Path) {
+void lld::unlinkAsync(StringRef Path) {
// Removing a file is async on windows.
#if defined(_WIN32)
sys::fs::remove(Path);
// FileOutputBuffer doesn't touch a desitnation file until commit()
// is called. We use that class without calling commit() to predict
// if the given file is writable.
-std::error_code elf::tryCreateFile(StringRef Path) {
+std::error_code lld::tryCreateFile(StringRef Path) {
if (Path.empty())
return std::error_code();
if (Path == "-")
Driver.cpp
DriverUtils.cpp
EhFrame.cpp
- Filesystem.cpp
ICF.cpp
InputFiles.cpp
InputSection.cpp
#include "Driver.h"
#include "Config.h"
-#include "Filesystem.h"
#include "ICF.h"
#include "InputFiles.h"
#include "InputSection.h"
#include "lld/Common/Args.h"
#include "lld/Common/Driver.h"
#include "lld/Common/ErrorHandler.h"
+#include "lld/Common/Filesystem.h"
#include "lld/Common/Memory.h"
#include "lld/Common/Strings.h"
#include "lld/Common/TargetOptionsCommandFlags.h"
#include "AArch64ErrataFix.h"
#include "CallGraphSort.h"
#include "Config.h"
-#include "Filesystem.h"
#include "LinkerScript.h"
#include "MapFile.h"
#include "OutputSections.h"
#include "Symbols.h"
#include "SyntheticSections.h"
#include "Target.h"
+#include "lld/Common/Filesystem.h"
#include "lld/Common/Memory.h"
#include "lld/Common/Strings.h"
#include "lld/Common/Threads.h"
//
//===----------------------------------------------------------------------===//
-#ifndef LLD_ELF_FILESYSTEM_H
-#define LLD_ELF_FILESYSTEM_H
+#ifndef LLD_FILESYSTEM_H
+#define LLD_FILESYSTEM_H
#include "lld/Common/LLVM.h"
#include <system_error>
namespace lld {
-namespace elf {
void unlinkAsync(StringRef Path);
std::error_code tryCreateFile(StringRef Path);
-} // namespace elf
} // namespace lld
#endif
# RUN: not lld-link /WX /lib 2>&1 | FileCheck -check-prefix=LIBBAD %s
LIBBAD: ignoring /lib since it's not the first argument
+
+# RUN: yaml2obj < %p/Inputs/hello32.yaml > %t.obj
+# RUN: not lld-link /out:/ %t.obj 2>&1 | FileCheck -check-prefix=DIR %s
+DIR: cannot open output file