clang  13.0.0git
ExpandResponseFilesCompilationDatabase.cpp
Go to the documentation of this file.
1 //===- ExpandResponseFileCompilationDataBase.cpp --------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
10 #include "llvm/ADT/StringRef.h"
11 #include "llvm/ADT/Triple.h"
12 #include "llvm/Support/CommandLine.h"
13 #include "llvm/Support/ConvertUTF.h"
14 #include "llvm/Support/ErrorOr.h"
15 #include "llvm/Support/Host.h"
16 #include "llvm/Support/MemoryBuffer.h"
17 #include "llvm/Support/Path.h"
18 #include "llvm/Support/StringSaver.h"
19 
20 namespace clang {
21 namespace tooling {
22 namespace {
23 
24 class ExpandResponseFilesDatabase : public CompilationDatabase {
25 public:
26  ExpandResponseFilesDatabase(
27  std::unique_ptr<CompilationDatabase> Base,
28  llvm::cl::TokenizerCallback Tokenizer,
30  : Base(std::move(Base)), Tokenizer(Tokenizer), FS(std::move(FS)) {
31  assert(this->Base != nullptr);
32  assert(this->Tokenizer != nullptr);
33  assert(this->FS != nullptr);
34  }
35 
36  std::vector<std::string> getAllFiles() const override {
37  return Base->getAllFiles();
38  }
39 
40  std::vector<CompileCommand>
41  getCompileCommands(StringRef FilePath) const override {
42  return expand(Base->getCompileCommands(FilePath));
43  }
44 
45  std::vector<CompileCommand> getAllCompileCommands() const override {
46  return expand(Base->getAllCompileCommands());
47  }
48 
49 private:
50  std::vector<CompileCommand> expand(std::vector<CompileCommand> Cmds) const {
51  for (auto &Cmd : Cmds) {
52  bool SeenRSPFile = false;
54  Argv.reserve(Cmd.CommandLine.size());
55  for (auto &Arg : Cmd.CommandLine) {
56  Argv.push_back(Arg.c_str());
57  SeenRSPFile |= Arg.front() == '@';
58  }
59  if (!SeenRSPFile)
60  continue;
61  llvm::BumpPtrAllocator Alloc;
62  llvm::StringSaver Saver(Alloc);
63  llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Argv, false, false, *FS,
64  llvm::StringRef(Cmd.Directory));
65  // Don't assign directly, Argv aliases CommandLine.
66  std::vector<std::string> ExpandedArgv(Argv.begin(), Argv.end());
67  Cmd.CommandLine = std::move(ExpandedArgv);
68  }
69  return Cmds;
70  }
71 
72 private:
73  std::unique_ptr<CompilationDatabase> Base;
74  llvm::cl::TokenizerCallback Tokenizer;
76 };
77 
78 } // namespace
79 
80 std::unique_ptr<CompilationDatabase>
81 expandResponseFiles(std::unique_ptr<CompilationDatabase> Base,
83  auto Tokenizer = llvm::Triple(llvm::sys::getProcessTriple()).isOSWindows()
84  ? llvm::cl::TokenizeWindowsCommandLine
85  : llvm::cl::TokenizeGNUCommandLine;
86  return std::make_unique<ExpandResponseFilesDatabase>(
87  std::move(Base), Tokenizer, std::move(FS));
88 }
89 
90 } // namespace tooling
91 } // namespace clang
clang::tooling::expandResponseFiles
std::unique_ptr< CompilationDatabase > expandResponseFiles(std::unique_ptr< CompilationDatabase > Base, llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS)
Returns a wrapped CompilationDatabase that will expand all rsp(response) files on commandline returne...
Definition: ExpandResponseFilesCompilationDatabase.cpp:81
llvm::SmallVector
Definition: LLVM.h:38
Base
Cmd
CompileCommand Cmd
Definition: InterpolatingCompilationDatabase.cpp:128
std
Definition: Format.h:3629
clang
Dataflow Directional Tag Classes.
Definition: CalledOnceCheck.h:17
CompilationDatabase.h
llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem >