Skip to content

Commit

Permalink
[lldb] Fix SourceManager::SourceFileCache insertion
Browse files Browse the repository at this point in the history
Summary:
Lookup and subsequent insert was done using uninitialized
FileSpec object, which caused the cache to be a no-op.

Bug: llvm.org/PR45310

Depends on D76804.

Reviewers: labath, JDevlieghere

Reviewed By: labath

Subscribers: mgorny, jingham, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D76805
  • Loading branch information
emrekultursay authored and labath committed Apr 20, 2020
1 parent acae69d commit 1f820fa
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lldb/source/Core/SourceManager.cpp
Expand Up @@ -696,7 +696,7 @@ bool SourceManager::File::GetLine(uint32_t line_no, std::string &buffer) {
}

void SourceManager::SourceFileCache::AddSourceFile(const FileSP &file_sp) {
FileSpec file_spec;
FileSpec file_spec = file_sp->GetFileSpec();
FileCache::iterator pos = m_file_cache.find(file_spec);
if (pos == m_file_cache.end())
m_file_cache[file_spec] = file_sp;
Expand Down
1 change: 1 addition & 0 deletions lldb/unittests/Core/CMakeLists.txt
Expand Up @@ -2,6 +2,7 @@ add_lldb_unittest(LLDBCoreTests
CommunicationTest.cpp
MangledTest.cpp
RichManglingContextTest.cpp
SourceManagerTest.cpp
StreamCallbackTest.cpp
UniqueCStringMapTest.cpp

Expand Down
48 changes: 48 additions & 0 deletions lldb/unittests/Core/SourceManagerTest.cpp
@@ -0,0 +1,48 @@
//===-- 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"

using namespace lldb;
using namespace lldb_private;

class SourceFileCache : public ::testing::Test {
public:
void SetUp() override { FileSystem::Initialize(); }
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_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_sp);

// Query: bar, expect not found.
FileSpec bar_file_spec("bar");
ASSERT_EQ(cache.FindSourceFile(bar_file_spec), nullptr);
}

0 comments on commit 1f820fa

Please sign in to comment.