Skip to content

Commit

Permalink
[flang][driver] Support parsing response files
Browse files Browse the repository at this point in the history
Add support for reading response files in the flang driver. Response
files contain command line arguments and are used whenever a command
becomes longer than the shell/environment limit. Response files are
recognized via the special "@path/to/response/file.rsp" syntax, which
distinguishes them from other file inputs.

This patch hardcodes GNU tokenization, since we don't have a CL mode for
the driver. In the future we might want to add a --rsp-quoting command
line option, like clang has, to accommodate Windows platforms.

Differential Revision: https://reviews.llvm.org/D124846
  • Loading branch information
rovka committed May 18, 2022
1 parent 00999fb commit 1c0b03f
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
17 changes: 17 additions & 0 deletions flang/test/Driver/response-file.f90
@@ -0,0 +1,17 @@
! Test that the driver can process response files.

! RUN: echo "-DTEST" > %basename_t.rsp
! RUN: %flang -E -cpp @%basename_t.rsp %s -o - | FileCheck %s
! RUN: %flang_fc1 -E -cpp @%basename_t.rsp %s -o - | FileCheck %s
! RUN: not %flang %basename_t.rsp %s -o /dev/null
! RUN: not %flang_fc1 %basenamt_t.rsp %s -o /dev/null

! CHECK-LABEL: program test
! CHECK: end program

#ifdef TEST
program test
end program
#else
We should have read the define from the response file.
#endif
12 changes: 12 additions & 0 deletions flang/tools/flang-driver/driver.cpp
Expand Up @@ -25,6 +25,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Host.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/VirtualFileSystem.h"
Expand Down Expand Up @@ -71,6 +72,13 @@ static int executeFC1Tool(llvm::SmallVectorImpl<const char *> &argV) {
return 1;
}

static void ExpandResponseFiles(
llvm::StringSaver &saver, llvm::SmallVectorImpl<const char *> &args) {
// We're defaulting to the GNU syntax, since we don't have a CL mode.
llvm::cl::TokenizerCallback tokenizer = &llvm::cl::TokenizeGNUCommandLine;
llvm::cl::ExpandResponseFiles(saver, tokenizer, args, /* MarkEOLs=*/false);
}

int main(int argc, const char **argv) {

// Initialize variables to call the driver
Expand All @@ -80,6 +88,10 @@ int main(int argc, const char **argv) {
clang::driver::ParsedClangName targetandMode("flang", "--driver-mode=flang");
std::string driverPath = getExecutablePath(args[0]);

llvm::BumpPtrAllocator a;
llvm::StringSaver saver(a);
ExpandResponseFiles(saver, args);

// Check if flang-new is in the frontend mode
auto firstArg = std::find_if(
args.begin() + 1, args.end(), [](const char *a) { return a != nullptr; });
Expand Down

0 comments on commit 1c0b03f

Please sign in to comment.