[PATCH] D42326: [COFF] don't replace import library if contents are unchanged
Bob Haarman via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 19 18:27:57 PST 2018
inglorion updated this revision to Diff 130741.
inglorion marked 5 inline comments as done.
inglorion added a comment.
simplifications suggested by @ruiu
https://reviews.llvm.org/D42326
Files:
lld/COFF/Driver.cpp
lld/test/COFF/unchanged-importlib.test
Index: lld/test/COFF/unchanged-importlib.test
===================================================================
--- /dev/null
+++ lld/test/COFF/unchanged-importlib.test
@@ -0,0 +1,7 @@
+# RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj
+# RUN: lld-link -out:%t.dll -dll %t.obj
+# RUN: touch -t 198002011200.00 %t.lib
+# RUN: lld-link -out:%t.dll -dll %t.obj
+# RUN: ls -l %t.lib | FileCheck --check-prefix=CHECK %s
+
+# CHECK: Feb 1 1980
Index: lld/COFF/Driver.cpp
===================================================================
--- lld/COFF/Driver.cpp
+++ lld/COFF/Driver.cpp
@@ -533,10 +533,38 @@
Exports.push_back(E2);
}
- auto E = writeImportLibrary(getImportName(AsLib), getImplibPath(), Exports,
- Config->Machine, false);
- handleAllErrors(std::move(E),
- [&](ErrorInfoBase &EIB) { error(EIB.message()); });
+ auto HandleError = [](Error &&E) {
+ handleAllErrors(std::move(E),
+ [](ErrorInfoBase &EIB) { error(EIB.message()); });
+ };
+ auto LibName = getImportName(AsLib);
+ auto Path = getImplibPath();
+
+ // If the import library already exists, replace it only if the contents
+ // have changed.
+ ErrorOr<std::unique_ptr<MemoryBuffer>> OldBuf = MemoryBuffer::getFile(Path);
+ if (!OldBuf) {
+ HandleError(
+ writeImportLibrary(LibName, Path, Exports, Config->Machine, false));
+ return;
+ }
+
+ SmallString<128> TmpName;
+ if (auto EC = sys::fs::createUniqueFile(Path + ".tmp-%%%%%%%%.lib", TmpName))
+ fatal("cannot create temporary file for import library " + Path + ": " +
+ EC.message());
+
+ if (Error E = writeImportLibrary(LibName, TmpName, Exports, Config->Machine,
+ false)) {
+ HandleError(std::move(E));
+ return;
+ }
+
+ auto NewBuf = check(MemoryBuffer::getFile(TmpName));
+ if ((*OldBuf)->getBuffer() != NewBuf->getBuffer()) {
+ OldBuf->reset();
+ HandleError(errorCodeToError(sys::fs::rename(TmpName, Path)));
+ }
}
static void parseModuleDefs(StringRef Path) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42326.130741.patch
Type: text/x-patch
Size: 2066 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180120/a5a17326/attachment.bin>
More information about the llvm-commits
mailing list