summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Beckmann <ecbeckmann@google.com>2017-07-05 23:46:06 +0000
committerEric Beckmann <ecbeckmann@google.com>2017-07-05 23:46:06 +0000
commitf6090b620e4070ff0b5cbc670b3d8664e76a4d70 (patch)
treea15b1ec572a4b51649527fa87ca768d4394b6aec
parent81979b038f540eed8766ddfc42dd15cdb8b6a72b (diff)
downloadbcm5719-llvm-f6090b620e4070ff0b5cbc670b3d8664e76a4d70.tar.gz
bcm5719-llvm-f6090b620e4070ff0b5cbc670b3d8664e76a4d70.zip
Revert "Revert "Revert "Switch external cvtres.exe for llvm's own resource library."""
This reverts commit ae21ee0b6cacbc1efaf4d42502e71da2f0eb45c3. The initial revert was done in order to prevent ongoing errors on chromium bots such as CrWinClangLLD. However, this was done haphazardly and I didn't realize there were test and compilation failures, so this revert was reverted. Now that those have been fixed, we can revert the revert of the revert. llvm-svn: 307227
-rw-r--r--lld/COFF/DriverUtils.cpp43
-rw-r--r--lld/test/COFF/combined-resources.test2
-rw-r--r--lld/test/COFF/def-name.test2
-rw-r--r--lld/test/COFF/dll.test2
-rw-r--r--lld/test/COFF/dllimport-gc.test2
-rw-r--r--lld/test/COFF/manifestinput.test2
-rw-r--r--lld/test/COFF/noentry.test2
-rw-r--r--lld/test/COFF/out.test1
-rw-r--r--lld/test/COFF/resource.test2
-rw-r--r--lld/test/lit.cfg8
-rw-r--r--llvm/include/llvm/Object/WindowsResource.h3
-rw-r--r--llvm/lib/Object/WindowsResource.cpp1
-rw-r--r--llvm/tools/llvm-cvtres/llvm-cvtres.cpp1
13 files changed, 52 insertions, 19 deletions
diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp
index 1d2c8811386..d4c72e7c1ca 100644
--- a/lld/COFF/DriverUtils.cpp
+++ b/lld/COFF/DriverUtils.cpp
@@ -21,7 +21,6 @@
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Object/COFF.h"
-#include "llvm/Object/WindowsResource.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Option/Option.h"
@@ -596,22 +595,40 @@ void checkFailIfMismatch(StringRef Arg) {
// using cvtres.exe.
std::unique_ptr<MemoryBuffer>
convertResToCOFF(const std::vector<MemoryBufferRef> &MBs) {
- object::WindowsResourceParser Parser;
+ // Create an output file path.
+ TemporaryFile File("resource-file", "obj");
+ // Execute cvtres.exe.
+ Executor E("cvtres.exe");
+ E.add("/machine:" + machineToStr(Config->Machine));
+ E.add("/readonly");
+ E.add("/nologo");
+ E.add("/out:" + Twine(File.Path));
+
+ // We must create new files because the memory buffers we have may have no
+ // underlying file still existing on the disk.
+ // It happens if it was created from a TemporaryFile, which usually delete
+ // the file just after creating the MemoryBuffer.
+ std::vector<TemporaryFile> ResFiles;
+ ResFiles.reserve(MBs.size());
for (MemoryBufferRef MB : MBs) {
- std::unique_ptr<object::Binary> Bin = check(object::createBinary(MB));
- object::WindowsResource *RF = dyn_cast<object::WindowsResource>(Bin.get());
- if (!RF)
- fatal("cannot compile non-resource file as resource");
- if (auto EC = Parser.parse(RF))
- fatal(EC, "failed to parse .res file");
+ // We store the temporary file in a vector to avoid deletion
+ // before running cvtres
+ ResFiles.emplace_back("resource-file", "res");
+ TemporaryFile& ResFile = ResFiles.back();
+ // Write the content of the resource in a temporary file
+ std::error_code EC;
+ raw_fd_ostream OS(ResFile.Path, EC, sys::fs::F_None);
+ if (EC)
+ fatal(EC, "failed to open " + ResFile.Path);
+ OS << MB.getBuffer();
+ OS.close();
+
+ E.add(ResFile.Path);
}
- Expected<std::unique_ptr<MemoryBuffer>> E =
- llvm::object::writeWindowsResourceCOFF(Config->Machine, Parser);
- if (!E)
- fatal(errorToErrorCode(E.takeError()), "failed to write .res to COFF");
- return std::move(E.get());
+ E.run();
+ return File.getMemoryBuffer();
}
// Run MSVC link.exe for given in-memory object files.
diff --git a/lld/test/COFF/combined-resources.test b/lld/test/COFF/combined-resources.test
index dc6c87af0f7..7526bf1804b 100644
--- a/lld/test/COFF/combined-resources.test
+++ b/lld/test/COFF/combined-resources.test
@@ -4,6 +4,8 @@
// > rc /fo combined-resources.res /nologo combined-resources.rc
// > rc /fo combined-resources-2.res /nologo combined-resources-2.rc
+# REQUIRES: winres
+
# RUN: yaml2obj < %p/Inputs/ret42.yaml > %t.obj
# RUN: lld-link /out:%t.exe /entry:main %t.obj %p/Inputs/resource.res \
# RUN: %p/Inputs/combined-resources.res %p/Inputs/combined-resources-2.res
diff --git a/lld/test/COFF/def-name.test b/lld/test/COFF/def-name.test
index b971007eda3..c48424a1bff 100644
--- a/lld/test/COFF/def-name.test
+++ b/lld/test/COFF/def-name.test
@@ -1,3 +1,5 @@
+# REQUIRES: winres
+
# RUN: rm -rf %t
# RUN: mkdir -p %t
# RUN: cd %t
diff --git a/lld/test/COFF/dll.test b/lld/test/COFF/dll.test
index abd39f4eeb2..db4b4056552 100644
--- a/lld/test/COFF/dll.test
+++ b/lld/test/COFF/dll.test
@@ -1,3 +1,5 @@
+# REQUIRES: winres
+
# RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj
# RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1 /export:exportfn2 \
# RUN: /export:mangled
diff --git a/lld/test/COFF/dllimport-gc.test b/lld/test/COFF/dllimport-gc.test
index d8523fbc7da..54ae773e793 100644
--- a/lld/test/COFF/dllimport-gc.test
+++ b/lld/test/COFF/dllimport-gc.test
@@ -1,3 +1,5 @@
+# REQUIRES: winres
+
# RUN: yaml2obj < %p/Inputs/export.yaml > %t-lib.obj
# RUN: lld-link /out:%t.dll /dll %t-lib.obj /implib:%t.lib /export:exportfn1
diff --git a/lld/test/COFF/manifestinput.test b/lld/test/COFF/manifestinput.test
index 7fc37c98fc5..376d404d604 100644
--- a/lld/test/COFF/manifestinput.test
+++ b/lld/test/COFF/manifestinput.test
@@ -1,4 +1,4 @@
-# REQUIRES: win_mt
+# REQUIRES: winres
# RUN: yaml2obj %p/Inputs/ret42.yaml > %t.obj
# RUN: lld-link /out:%t.exe /entry:main \
diff --git a/lld/test/COFF/noentry.test b/lld/test/COFF/noentry.test
index cc02c85e701..5e241e46e89 100644
--- a/lld/test/COFF/noentry.test
+++ b/lld/test/COFF/noentry.test
@@ -1,3 +1,5 @@
+# REQUIRES: winres
+
# RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj
# RUN: lld-link /out:%t.dll /dll %t.obj
# RUN: llvm-readobj -file-headers %t.dll | FileCheck -check-prefix=ENTRY %s
diff --git a/lld/test/COFF/out.test b/lld/test/COFF/out.test
index a7b56145996..67b2ef01b71 100644
--- a/lld/test/COFF/out.test
+++ b/lld/test/COFF/out.test
@@ -1,3 +1,4 @@
+# REQUIRES: winres
# RUN: yaml2obj < %p/Inputs/ret42.yaml > %t.obj
# RUN: mkdir -p %T/out/tmp
diff --git a/lld/test/COFF/resource.test b/lld/test/COFF/resource.test
index 53242cdcb63..1d5219b0d9f 100644
--- a/lld/test/COFF/resource.test
+++ b/lld/test/COFF/resource.test
@@ -1,3 +1,5 @@
+# REQUIRES: winres
+
# RUN: yaml2obj < %p/Inputs/ret42.yaml > %t.obj
# RUN: lld-link /out:%t.exe /entry:main %t.obj %p/Inputs/resource.res
diff --git a/lld/test/lit.cfg b/lld/test/lit.cfg
index 83df50957be..486e83eb29e 100644
--- a/lld/test/lit.cfg
+++ b/lld/test/lit.cfg
@@ -264,6 +264,8 @@ llvm_config_cmd.wait()
# Set a fake constant version so that we get consitent output.
config.environment['LLD_VERSION'] = 'LLD 1.0'
-# Check if the mt.exe Microsoft utility exists.
-if lit.util.which('mt.exe', config.environment['PATH']):
- config.available_features.add('win_mt')
+# Check if Windows resource file compiler exists.
+cvtres = lit.util.which('cvtres', config.environment['PATH'])
+rc = lit.util.which('rc', config.environment['PATH'])
+if cvtres and rc:
+ config.available_features.add('winres')
diff --git a/llvm/include/llvm/Object/WindowsResource.h b/llvm/include/llvm/Object/WindowsResource.h
index 844256478cf..1ef00e2909f 100644
--- a/llvm/include/llvm/Object/WindowsResource.h
+++ b/llvm/include/llvm/Object/WindowsResource.h
@@ -43,10 +43,13 @@
#include <map>
namespace llvm {
+
namespace object {
class WindowsResource;
+enum class Machine { UNKNOWN, ARM, X64, X86 };
+
class ResourceEntryRef {
public:
Error moveNext(bool &End);
diff --git a/llvm/lib/Object/WindowsResource.cpp b/llvm/lib/Object/WindowsResource.cpp
index f675a8389e6..b0cd6c8ebda 100644
--- a/llvm/lib/Object/WindowsResource.cpp
+++ b/llvm/lib/Object/WindowsResource.cpp
@@ -350,7 +350,6 @@ WindowsResourceCOFFWriter::WindowsResourceCOFFWriter(
: MachineType(MachineType), Resources(Parser.getTree()),
Data(Parser.getData()), StringTable(Parser.getStringTable()) {
performFileLayout();
-
OutputBuffer = MemoryBuffer::getNewMemBuffer(FileSize);
}
diff --git a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp
index 36c15925e84..3430b0ab3ad 100644
--- a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp
+++ b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp
@@ -207,7 +207,6 @@ int main(int argc_, const char *argv_[]) {
std::copy(OutputBuffer->getBufferStart(), OutputBuffer->getBufferEnd(),
FileBuffer->getBufferStart());
error(FileBuffer->commit());
-
if (Verbose) {
Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(OutputFile);
if (!BinaryOrErr)
OpenPOWER on IntegriCloud