llvm-project/lldb/unittests/Core/SourceManagerTest.cpp
Jonas Devlieghere ca7914564e
[lldb] Avoid FileSystem::Resolve for cached files in the SourceManager
Currently, source files are cached by their resolved path. This means
that before we can query the cache, we potentially have to resolve the
path, which can be slow. This patch avoids the call to FileSystem::Resolve
by caching both the resolved and unresolved path. We now only resolve
the path once when we create and cache a new file.

rdar://110787562

Differential revision: https://reviews.llvm.org/D153726
2023-06-27 14:19:02 -07:00

77 lines
2.4 KiB
C++

//===-- SourceManagerTest.cpp ---------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "lldb/Core/SourceManager.h"
#include "lldb/Host/FileSystem.h"
#include "gtest/gtest.h"
#include "TestingSupport/MockTildeExpressionResolver.h"
using namespace lldb;
using namespace lldb_private;
class SourceFileCache : public ::testing::Test {
public:
void SetUp() override {
FileSystem::Initialize(std::unique_ptr<TildeExpressionResolver>(
new MockTildeExpressionResolver("Jonas", "/jonas")));
}
void TearDown() override { FileSystem::Terminate(); }
};
TEST_F(SourceFileCache, FindSourceFileFound) {
SourceManager::SourceFileCache cache;
// Insert: foo
FileSpec foo_file_spec("foo");
auto foo_file_sp =
std::make_shared<SourceManager::File>(foo_file_spec, nullptr);
cache.AddSourceFile(foo_file_spec, foo_file_sp);
// Query: foo, expect found.
FileSpec another_foo_file_spec("foo");
ASSERT_EQ(cache.FindSourceFile(another_foo_file_spec), foo_file_sp);
}
TEST_F(SourceFileCache, FindSourceFileNotFound) {
SourceManager::SourceFileCache cache;
// Insert: foo
FileSpec foo_file_spec("foo");
auto foo_file_sp =
std::make_shared<SourceManager::File>(foo_file_spec, nullptr);
cache.AddSourceFile(foo_file_spec, foo_file_sp);
// Query: bar, expect not found.
FileSpec bar_file_spec("bar");
ASSERT_EQ(cache.FindSourceFile(bar_file_spec), nullptr);
}
TEST_F(SourceFileCache, FindSourceFileByUnresolvedPath) {
SourceManager::SourceFileCache cache;
FileSpec foo_file_spec("~/foo");
// Mimic the resolution in SourceManager::GetFile.
FileSpec resolved_foo_file_spec = foo_file_spec;
FileSystem::Instance().Resolve(resolved_foo_file_spec);
// Create the file with the resolved file spec.
auto foo_file_sp =
std::make_shared<SourceManager::File>(resolved_foo_file_spec, nullptr);
// Cache the result with the unresolved file spec.
cache.AddSourceFile(foo_file_spec, foo_file_sp);
// Query the unresolved path.
EXPECT_EQ(cache.FindSourceFile(FileSpec("~/foo")), foo_file_sp);
// Query the resolved path.
EXPECT_EQ(cache.FindSourceFile(FileSpec("/jonas/foo")), foo_file_sp);
}