Index: flang/test/Driver/response-file.f90 =================================================================== --- /dev/null +++ flang/test/Driver/response-file.f90 @@ -0,0 +1,15 @@ +! 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 + +! 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 Index: flang/tools/flang-driver/driver.cpp =================================================================== --- flang/tools/flang-driver/driver.cpp +++ flang/tools/flang-driver/driver.cpp @@ -20,6 +20,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" @@ -66,6 +67,13 @@ return 1; } +static void ExpandResponseFiles( + llvm::StringSaver &saver, llvm::SmallVectorImpl &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 @@ -75,6 +83,10 @@ 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; });