[pkg-d-commits] [ldc] 118/149: Fix LDMD regression when generating response file
Matthias Klumpp
mak at moszumanska.debian.org
Sun Apr 23 22:37:04 UTC 2017
This is an automated email from the git hooks/post-receive script.
mak pushed a commit to annotated tag v1.2.0
in repository ldc.
commit de360802b10af4195b8f22b618de59b8f869b458
Author: Martin <noone at nowhere.com>
Date: Tue Mar 7 01:59:16 2017 +0100
Fix LDMD regression when generating response file
It wrongly started with argv[0] (path to ldc2 binary).
---
driver/ldmd.cpp | 61 +++++++++++++++++++++++++-------------------------
tests/d2/dmd-testsuite | 2 +-
2 files changed, 31 insertions(+), 32 deletions(-)
diff --git a/driver/ldmd.cpp b/driver/ldmd.cpp
index 863c8cf..e6e7d21 100644
--- a/driver/ldmd.cpp
+++ b/driver/ldmd.cpp
@@ -576,7 +576,7 @@ void translateArgs(size_t originalArgc, char **originalArgv,
}
} else {
const auto ext = ls::path::extension(p);
- if (ext.equals_lower("exe")) {
+ if (ext.equals_lower(".exe")) {
// should be for Windows targets only
ldcArgs.push_back(concat("-of=", p));
continue;
@@ -650,10 +650,6 @@ std::string locateBinary(std::string exeName) {
return "";
}
-static size_t addStrlen(size_t acc, const char *str) {
- return acc + (str ? strlen(str) : 0);
-}
-
// In driver/main.d
int main(int argc, char **argv);
@@ -677,38 +673,41 @@ int cppmain(int argc, char **argv) {
args.push_back(nullptr);
- // Check if we need to write out a response file.
- size_t totalLen = std::accumulate(args.begin(), args.end(), 0, addStrlen);
- if (totalLen > maxCommandLineLen()) {
- int rspFd;
- llvm::SmallString<128> rspPath;
- if (ls::fs::createUniqueFile("ldmd-%%-%%-%%-%%.rsp", rspFd, rspPath)) {
- error("Could not open temporary response file.");
- }
+ // Check if we can get away without a response file.
+ const size_t totalLen = std::accumulate(
+ args.begin(), args.end() - 1,
+ args.size() * 3, // quotes + space
+ [](size_t acc, const char *arg) { return acc + strlen(arg); });
+ if (totalLen <= maxCommandLineLen()) {
+ return execute(ldcPath, args.data());
+ }
- {
- llvm::raw_fd_ostream rspOut(rspFd, /*shouldClose=*/true);
- for (auto arg : args) {
- rspOut << arg << '\n';
- }
- }
+ int rspFd;
+ llvm::SmallString<128> rspPath;
+ if (ls::fs::createUniqueFile("ldmd-%%-%%-%%-%%.rsp", rspFd, rspPath)) {
+ error("Could not open temporary response file.");
+ }
- std::string rspArg = "@";
- rspArg += rspPath.str();
+ {
+ llvm::raw_fd_ostream rspOut(rspFd, /*shouldClose=*/true);
+ // skip argv[0] and terminating NULL
+ for (auto it = args.begin() + 1, end = args.end() - 1; it != end; ++it) {
+ rspOut << *it << '\n';
+ }
+ }
- std::vector<const char *> newArgs;
- newArgs.push_back(argv[0]);
- newArgs.push_back(rspArg.c_str());
- newArgs.push_back(nullptr);
+ std::string rspArg = "@";
+ rspArg += rspPath.str();
- int rc = execute(ldcPath, &newArgs[0]);
+ args.resize(1);
+ args.push_back(rspArg.c_str());
+ args.push_back(nullptr);
- if (ls::fs::remove(rspPath.str())) {
- warning("Could not remove response file.");
- }
+ int rc = execute(ldcPath, args.data());
- return rc;
+ if (ls::fs::remove(rspPath.str())) {
+ warning("Could not remove response file.");
}
- return execute(ldcPath, &args[0]);
+ return rc;
}
diff --git a/tests/d2/dmd-testsuite b/tests/d2/dmd-testsuite
index e677829..6add0c4 160000
--- a/tests/d2/dmd-testsuite
+++ b/tests/d2/dmd-testsuite
@@ -1 +1 @@
-Subproject commit e677829f5167a95565e0af234e46e730deec7346
+Subproject commit 6add0c447d6be7ec66b6bf3f1b210142a9b930bf
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-d/ldc.git
More information about the pkg-d-commits
mailing list