Skip to content

Commit 5babde6

Browse files
authored
Merge pull request #5090 from akyrtzi/pr/stable-picks-depscanning
Cherry-picks from upstream llvm.org related to clang dependency scanning
2 parents e03a684 + 0f1ddae commit 5babde6

File tree

6 files changed

+56
-20
lines changed

6 files changed

+56
-20
lines changed

clang/include/clang/Tooling/DependencyScanning/DependencyScanningTool.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ struct FullDependenciesResult {
7878
class DependencyScanningTool {
7979
public:
8080
/// Construct a dependency scanning tool.
81-
DependencyScanningTool(DependencyScanningService &Service);
81+
DependencyScanningTool(DependencyScanningService &Service,
82+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS =
83+
llvm::vfs::createPhysicalFileSystem());
8284

8385
/// Print out the dependency information into a string using the dependency
8486
/// file format that is specified in the options (-MD is the default) and

clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ class DependencyConsumer {
5353
/// using the regular processing run.
5454
class DependencyScanningWorker {
5555
public:
56-
DependencyScanningWorker(DependencyScanningService &Service);
56+
DependencyScanningWorker(DependencyScanningService &Service,
57+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS);
5758

5859
/// Run the dependency scanning tool for a given clang driver command-line,
5960
/// and report the discovered dependencies to the provided consumer. If \p

clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
#include "llvm/CAS/CASDB.h"
1212
#include "llvm/CAS/CachingOnDiskFileSystem.h"
1313

14-
namespace clang {
15-
namespace tooling {
16-
namespace dependencies {
14+
using namespace clang;
15+
using namespace tooling;
16+
using namespace dependencies;
1717

1818
std::vector<std::string> FullDependencies::getCommandLine(
1919
llvm::function_ref<std::string(const ModuleID &, ModuleOutputKind)>
@@ -52,8 +52,9 @@ FullDependencies::getCommandLineWithoutModulePaths() const {
5252
}
5353

5454
DependencyScanningTool::DependencyScanningTool(
55-
DependencyScanningService &Service)
56-
: Worker(Service) {}
55+
DependencyScanningService &Service,
56+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
57+
: Worker(Service, std::move(FS)) {}
5758

5859
llvm::Expected<std::string> DependencyScanningTool::getDependencyFile(
5960
const std::vector<std::string> &CommandLine, StringRef CWD,
@@ -295,7 +296,3 @@ DependencyScanningTool::getFullDependencies(
295296

296297
return Consumer.getFullDependencies(CommandLine, FS);
297298
}
298-
299-
} // end namespace dependencies
300-
} // end namespace tooling
301-
} // end namespace clang

clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,8 @@ class DependencyScanningAction : public tooling::ToolAction {
310310
} // end anonymous namespace
311311

312312
DependencyScanningWorker::DependencyScanningWorker(
313-
DependencyScanningService &Service)
313+
DependencyScanningService &Service,
314+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
314315
: Format(Service.getFormat()), OptimizeArgs(Service.canOptimizeArgs()),
315316
CASOpts(Service.getCASOpts()), UseCAS(Service.useCASScanning()) {
316317
PCHContainerOps = std::make_shared<PCHContainerOperations>();
@@ -322,8 +323,8 @@ DependencyScanningWorker::DependencyScanningWorker(
322323
std::make_unique<ObjectFilePCHContainerWriter>());
323324

324325
if (!Service.useCASScanning()) {
325-
auto OverlayFS = llvm::makeIntrusiveRefCnt<llvm::vfs::OverlayFileSystem>(
326-
llvm::vfs::createPhysicalFileSystem());
326+
auto OverlayFS =
327+
llvm::makeIntrusiveRefCnt<llvm::vfs::OverlayFileSystem>(std::move(FS));
327328
InMemoryFS = llvm::makeIntrusiveRefCnt<llvm::vfs::InMemoryFileSystem>();
328329
OverlayFS->pushOverlay(InMemoryFS);
329330
RealFS = OverlayFS;

clang/tools/libclang/CDependencies.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ void clang_experimental_FileDependencies_dispose(CXFileDependencies *ID) {
8989

9090
CXDependencyScannerWorker clang_experimental_DependencyScannerWorker_create_v0(
9191
CXDependencyScannerService Service) {
92-
return wrap(new DependencyScanningWorker(*unwrap(Service)));
92+
return wrap(new DependencyScanningWorker(
93+
*unwrap(Service), llvm::vfs::createPhysicalFileSystem()));
9394
}
9495

9596
void clang_experimental_DependencyScannerWorker_dispose_v0(

clang/unittests/Tooling/DependencyScannerTest.cpp

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,21 @@
1414
#include "clang/Frontend/FrontendAction.h"
1515
#include "clang/Frontend/FrontendActions.h"
1616
#include "clang/Tooling/CompilationDatabase.h"
17-
#include "clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h"
17+
#include "clang/Tooling/DependencyScanning/DependencyScanningTool.h"
1818
#include "clang/Tooling/Tooling.h"
1919
#include "llvm/ADT/STLExtras.h"
2020
#include "llvm/MC/TargetRegistry.h"
2121
#include "llvm/Support/FormatVariadic.h"
2222
#include "llvm/Support/Path.h"
2323
#include "llvm/Support/TargetSelect.h"
24+
#include "llvm/Testing/Support/Error.h"
2425
#include "gtest/gtest.h"
2526
#include <algorithm>
2627
#include <string>
2728

28-
namespace clang {
29-
namespace tooling {
29+
using namespace clang;
30+
using namespace tooling;
31+
using namespace dependencies;
3032

3133
namespace {
3234

@@ -204,5 +206,37 @@ TEST(DependencyScanner, ScanDepsReuseFilemanagerHasInclude) {
204206
EXPECT_EQ(convert_to_slash(Deps[5]), "/root/symlink.h");
205207
}
206208

207-
} // end namespace tooling
208-
} // end namespace clang
209+
TEST(DependencyScanner, ScanDepsWithFS) {
210+
std::vector<std::string> CommandLine = {"clang",
211+
"-target",
212+
"x86_64-apple-macosx10.7",
213+
"-c",
214+
"test.cpp",
215+
"-o"
216+
"test.cpp.o"};
217+
StringRef CWD = "/root";
218+
219+
auto VFS = new llvm::vfs::InMemoryFileSystem();
220+
VFS->setCurrentWorkingDirectory(CWD);
221+
auto Sept = llvm::sys::path::get_separator();
222+
std::string HeaderPath =
223+
std::string(llvm::formatv("{0}root{0}header.h", Sept));
224+
std::string TestPath = std::string(llvm::formatv("{0}root{0}test.cpp", Sept));
225+
226+
VFS->addFile(HeaderPath, 0, llvm::MemoryBuffer::getMemBuffer("\n"));
227+
VFS->addFile(TestPath, 0,
228+
llvm::MemoryBuffer::getMemBuffer("#include \"header.h\"\n"));
229+
230+
DependencyScanningService Service(ScanningMode::DependencyDirectivesScan,
231+
ScanningOutputFormat::Make, CASOptions(),
232+
nullptr);
233+
DependencyScanningTool ScanTool(Service, VFS);
234+
235+
std::string DepFile;
236+
ASSERT_THAT_ERROR(
237+
ScanTool.getDependencyFile(CommandLine, CWD).moveInto(DepFile),
238+
llvm::Succeeded());
239+
using llvm::sys::path::convert_to_slash;
240+
EXPECT_EQ(convert_to_slash(DepFile),
241+
"test.cpp.o: /root/test.cpp /root/header.h\n");
242+
}

0 commit comments

Comments
 (0)