[PATCH] Teach Clang how to use response files when calling other tools
Rafael Auler
rafaelauler at gmail.com
Fri Aug 29 15:03:49 PDT 2014
Hi Rafael,
I have answered your comments below, thanks. I will upload a patch fixing your concerns shortly after this message.
Sean, regarding the change to llvm::sys::argumentsFitWithinSystemLimits() to avoid code duplication, I am afraid it is not necessary after my new patch. I will send it now.
Regards,
Rafael
================
Comment at: include/clang/Driver/Job.h:87
@@ +86,3 @@
+ /// file, when it is used.
+ void PrintArgsWithRespFile(llvm::raw_ostream &OS,
+ const char *Terminator, bool Quote,
----------------
rafael wrote:
> printArgsWithRespFile
changed
================
Comment at: include/clang/Driver/Job.h:100
@@ +99,3 @@
+ /// limits (the maximum command line length).
+ bool NeedsResponseFile() const { return needsResponseFile; }
+
----------------
rafael wrote:
> The function should be lowercase, the variable Uppercase.
changed
================
Comment at: lib/Driver/Job.cpp:32
@@ +31,3 @@
+ Executable(_Executable), Arguments(_Arguments),
+ needsResponseFile(
+ !llvm::sys::argumentsFitWithinSystemLimits(_Arguments) &&
----------------
rafael wrote:
> I wonder if we should say that the job needs a response file based only on llvm::sys::argumentsFitWithinSystemLimits and then emit an error if Creator.getResponseFilesSupport() says it is not supported.
The problem is that llvm::sys::argumentsFitWithinSystemLimits() is not exact, see:
bool llvm::sys::argumentsFitWithinSystemLimits(ArrayRef<const char*> Args) {
static long ArgMax = sysconf(_SC_ARG_MAX);
// System says no practical limit.
if (ArgMax == -1)
return true;
// Conservatively account for space required by environment variables.
ArgMax /= 2;
...
Thus, sometimes it may say that you need a response file but, when building the argv vector, you discover that it actually fits in system limits. Therefore, I think that our best action is to silently try to pass the arguments without a response file because it may actually work.
================
Comment at: lib/Driver/Job.cpp:279
@@ +278,3 @@
+ if (needsResponseFile && ResponseFile.data() != nullptr) {
+ PrintArgsWithRespFile(OS, Terminator, Quote, CrashReport);
+ return;
----------------
rafael wrote:
> The code in PrintArgsWithRespFile looks fairly duplicated with what just follows. Couldn't this just patch Arguments and use the existing code path?
>
Done.
http://reviews.llvm.org/D4897
More information about the cfe-commits
mailing list