Index: lld/trunk/COFF/DriverUtils.cpp =================================================================== --- lld/trunk/COFF/DriverUtils.cpp +++ lld/trunk/COFF/DriverUtils.cpp @@ -20,7 +20,6 @@ #include "Symbols.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/StringSwitch.h" -#include "llvm/ADT/Triple.h" #include "llvm/BinaryFormat/COFF.h" #include "llvm/Object/COFF.h" #include "llvm/Object/WindowsResource.h" @@ -58,7 +57,7 @@ void run() { ErrorOr ExeOrErr = sys::findProgramByName(Prog); if (auto EC = ExeOrErr.getError()) - fatal(EC, "unable to find " + Prog + " in PATH: "); + fatal(EC, "unable to find " + Prog + " in PATH"); StringRef Exe = Saver.save(*ExeOrErr); Args.insert(Args.begin(), Exe); @@ -358,32 +357,25 @@ return OS.str(); } -static Expected> -createManifestXmlWithInternalMt(std::string &DefaultXml) { +static std::string createManifestXmlWithInternalMt(StringRef DefaultXml) { std::unique_ptr DefaultXmlCopy = MemoryBuffer::getMemBufferCopy(DefaultXml); windows_manifest::WindowsManifestMerger Merger; if (auto E = Merger.merge(*DefaultXmlCopy.get())) - return std::move(E); + fatal(E, "internal manifest tool failed on default xml"); for (StringRef Filename : Config->ManifestInput) { std::unique_ptr Manifest = check(MemoryBuffer::getFile(Filename)); - if (auto E = Merger.merge(*Manifest.get())) { - warn("internal manifest tool failed on file " + Filename); - return std::move(E); - } + if (auto E = Merger.merge(*Manifest.get())) + fatal(E, "internal manifest tool failed on file " + Filename); } - return Merger.getMergedManifest(); + return Merger.getMergedManifest().get()->getBuffer(); } -static std::unique_ptr -createManifestXmlWithExternalMt(std::string &DefaultXml) { - const Triple HostTriple(Triple::normalize(LLVM_HOST_TRIPLE)); - if (!HostTriple.isOSWindows()) - fatal("manifest ignored because no external manifest tool available"); +static std::string createManifestXmlWithExternalMt(StringRef DefaultXml) { // Create the default manifest file as a temporary file. TemporaryFile Default("defaultxml", "manifest"); std::error_code EC; @@ -408,7 +400,9 @@ E.add("/out:" + StringRef(User.Path)); E.run(); - return check(MemoryBuffer::getFile(User.Path), "could not open " + User.Path); + return check(MemoryBuffer::getFile(User.Path), "could not open " + User.Path) + .get() + ->getBuffer(); } static std::string createManifestXml() { @@ -416,22 +410,10 @@ if (Config->ManifestInput.empty()) return DefaultXml; - // If manifest files are supplied by the user using /MANIFESTINPUT - // option, we need to merge them with the default manifest. If libxml2 - // is enabled, we may merge them with LLVM's own library. - Expected> OutputBufferOrError = - createManifestXmlWithInternalMt(DefaultXml); - if (OutputBufferOrError) - return OutputBufferOrError.get()->getBuffer(); - // Using built-in library failed, possibly because libxml2 is not installed. - // Shell out to mt.exe instead. - handleAllErrors(OutputBufferOrError.takeError(), - [&](ErrorInfoBase &EIB) { - warn("error with internal manifest tool: " + EIB.message()); - }); - std::unique_ptr OutputBuffer; - OutputBuffer = createManifestXmlWithExternalMt(DefaultXml); - return OutputBuffer->getBuffer(); + if (windows_manifest::isAvailable()) + return createManifestXmlWithInternalMt(DefaultXml); + + return createManifestXmlWithExternalMt(DefaultXml); } static std::unique_ptr Index: lld/trunk/test/COFF/manifestinput-error.test =================================================================== --- lld/trunk/test/COFF/manifestinput-error.test +++ lld/trunk/test/COFF/manifestinput-error.test @@ -0,0 +1,10 @@ +# UNSUPPORTED: manifest_tool +# UNSUPPORTED: libxml2 + +# RUN: yaml2obj %p/Inputs/ret42.yaml > %t.obj +# RUN: not lld-link /out:%t.exe /entry:main \ +# RUN: /manifest:embed \ +# RUN: /manifestuac:"level='requireAdministrator'" \ +# RUN: /manifestinput:%p/Inputs/manifestinput.test %t.obj 2>&1 | FileCheck %s + +# CHECK: error: unable to find mt.exe in PATH: No such file or directory Index: lld/trunk/test/COFF/manifestinput-nowarning.test =================================================================== --- lld/trunk/test/COFF/manifestinput-nowarning.test +++ lld/trunk/test/COFF/manifestinput-nowarning.test @@ -0,0 +1,11 @@ +# UNSUPPORTED: libxml2 +# REQUIRES: manifest_tool + +# RUN: yaml2obj %p/Inputs/ret42.yaml > %t.obj +# RUN: lld-link /out:%t.exe /entry:main \ +# RUN: /manifest:embed \ +# RUN: /manifestuac:"level='requireAdministrator'" \ +# RUN: /manifestinput:%p/Inputs/manifestinput.test %t.obj | \ +# RUN: FileCheck -allow-empty %s + +# CHECK-NOT: warning: error with internal manifest tool: no libxml2 Index: lld/trunk/test/lit.cfg =================================================================== --- lld/trunk/test/lit.cfg +++ lld/trunk/test/lit.cfg @@ -270,3 +270,7 @@ if (lit.util.which('cvtres', config.environment['PATH'])) or \ (config.llvm_libxml2_enabled == "1"): config.available_features.add('manifest_tool') + +if (config.llvm_libxml2_enabled == "1"): + config.available_features.add('libxml2') + \ No newline at end of file Index: llvm/trunk/include/llvm/WindowsManifest/WindowsManifestMerger.h =================================================================== --- llvm/trunk/include/llvm/WindowsManifest/WindowsManifestMerger.h +++ llvm/trunk/include/llvm/WindowsManifest/WindowsManifestMerger.h @@ -35,6 +35,8 @@ namespace windows_manifest { +bool isAvailable(); + class WindowsManifestError : public ErrorInfo { public: static char ID; Index: llvm/trunk/lib/WindowsManifest/WindowsManifestMerger.cpp =================================================================== --- llvm/trunk/lib/WindowsManifest/WindowsManifestMerger.cpp +++ llvm/trunk/lib/WindowsManifest/WindowsManifestMerger.cpp @@ -682,6 +682,8 @@ : nullptr; } +bool windows_manifest::isAvailable() { return true; } + #else WindowsManifestMerger::WindowsManifestMergerImpl::~WindowsManifestMergerImpl() { @@ -697,6 +699,8 @@ return nullptr; } +bool windows_manifest::isAvailable() { return false; } + #endif WindowsManifestMerger::WindowsManifestMerger()