diff --git a/lld/test/ELF/lto/resolution-err.ll b/lld/test/ELF/lto/resolution-err.ll new file mode 100644 --- /dev/null +++ b/lld/test/ELF/lto/resolution-err.ll @@ -0,0 +1,16 @@ +; UNSUPPORTED: system-windows +; REQUIRES: shell +; RUN: llvm-as %s -o %t.bc +; RUN: touch %t.resolution.txt +; RUN: chmod -w %t.resolution.txt +; RUN: not ld.lld -save-temps %t.bc -o %t 2>&1 | FileCheck %s +; RUN: rm -f %t.resolution.txt + +; CHECK: error: {{[Pp]}}ermission denied{{$}} + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @_start() { + ret void +} diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp --- a/llvm/lib/LTO/LTOBackend.cpp +++ b/llvm/lib/LTO/LTOBackend.cpp @@ -61,8 +61,10 @@ std::error_code EC; ResolutionFile = std::make_unique( OutputFileName + "resolution.txt", EC, sys::fs::OpenFlags::OF_Text); - if (EC) + if (EC) { + ResolutionFile.reset(); return errorCodeToError(EC); + } auto setHook = [&](std::string PathSuffix, ModuleHookFn &Hook) { // Keep track of the hook provided by the linker, which also needs to run.