[Lldb-commits] [lldb] aaa34bc - [lldb][NFC] Move utility functions from ClangASTImporter and ClangExpressionDeclMap to own header
Raphael Isemann via lldb-commits
lldb-commits at lists.llvm.org
Fri Dec 20 07:14:58 PST 2019
Author: Raphael Isemann
Date: 2019-12-20T16:13:24+01:00
New Revision: aaa34bc0bd1aeb7271ba0ce2c4f3dfba5dbae8e2
URL: https://github.com/llvm/llvm-project/commit/aaa34bc0bd1aeb7271ba0ce2c4f3dfba5dbae8e2
DIFF: https://github.com/llvm/llvm-project/commit/aaa34bc0bd1aeb7271ba0ce2c4f3dfba5dbae8e2.diff
LOG: [lldb][NFC] Move utility functions from ClangASTImporter and ClangExpressionDeclMap to own header
Added:
lldb/unittests/TestingSupport/Symbol/ClangTestUtils.h
Modified:
lldb/unittests/Expression/ClangExpressionDeclMapTest.cpp
lldb/unittests/Symbol/TestClangASTImporter.cpp
lldb/unittests/TestingSupport/module.modulemap
Removed:
################################################################################
diff --git a/lldb/unittests/Expression/ClangExpressionDeclMapTest.cpp b/lldb/unittests/Expression/ClangExpressionDeclMapTest.cpp
index 6fac168462b3..36d45fe5a58f 100644
--- a/lldb/unittests/Expression/ClangExpressionDeclMapTest.cpp
+++ b/lldb/unittests/Expression/ClangExpressionDeclMapTest.cpp
@@ -7,7 +7,7 @@
//===----------------------------------------------------------------------===//
#include "Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h"
-#include "TestingSupport/TestUtilities.h"
+#include "TestingSupport/Symbol/ClangTestUtils.h"
#include "lldb/Host/FileSystem.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Symbol/ClangASTContext.h"
@@ -78,7 +78,7 @@ struct ClangExpressionDeclMapTest : public testing::Test {
void SetUp() override {
importer = std::make_shared<ClangASTImporter>();
decl_map = std::make_unique<FakeClangExpressionDeclMap>(importer);
- target_ast = createAST();
+ target_ast = clang_utils::createAST();
decl_map->InstallASTContext(*target_ast, *target_ast->getFileManager());
}
@@ -87,21 +87,6 @@ struct ClangExpressionDeclMapTest : public testing::Test {
decl_map.reset();
target_ast.reset();
}
-
- clang::DeclarationName getDeclarationName(ClangASTContext &ast,
- llvm::StringRef name) {
- clang::IdentifierInfo &II = ast.getIdentifierTable()->get(name);
- return ast.getASTContext()->DeclarationNames.getIdentifier(&II);
- }
-
- CompilerType createRecord(ClangASTContext &ast, llvm::StringRef name) {
- CompilerType t = ast.CreateRecordType(ast.getASTContext()->getTranslationUnitDecl(),
- lldb::AccessType::eAccessPublic, name, 0,
- lldb::LanguageType::eLanguageTypeC);
- ClangASTContext::StartTagDeclarationDefinition(t);
- ClangASTContext::CompleteTagDeclarationDefinition(t);
- return t;
- }
};
} // namespace
@@ -110,7 +95,8 @@ TEST_F(ClangExpressionDeclMapTest, TestUnknownIdentifierLookup) {
// Setup a NameSearchContext for 'foo'.
llvm::SmallVector<clang::NamedDecl *, 16> decls;
- clang::DeclarationName name = getDeclarationName(*target_ast, "foo");
+ clang::DeclarationName name =
+ clang_utils::getDeclarationName(*target_ast, "foo");
const clang::DeclContext *dc = target_ast->GetTranslationUnitDecl();
NameSearchContext search(*decl_map, decls, name, dc);
@@ -127,12 +113,13 @@ TEST_F(ClangExpressionDeclMapTest, TestPersistentDeclLookup) {
// to the scratch AST context.
llvm::StringRef decl_name = "$persistent_class";
CompilerType persistent_type =
- createRecord(*decl_map->m_scratch_context, decl_name);
+ clang_utils::createRecord(*decl_map->m_scratch_context, decl_name);
decl_map->AddPersistentDeclForTest(ClangUtil::GetAsTagDecl(persistent_type));
// Setup a NameSearchContext for $persistent_class;
llvm::SmallVector<clang::NamedDecl *, 16> decls;
- clang::DeclarationName name = getDeclarationName(*target_ast, decl_name);
+ clang::DeclarationName name =
+ clang_utils::getDeclarationName(*target_ast, decl_name);
const clang::DeclContext *dc = target_ast->GetTranslationUnitDecl();
NameSearchContext search(*decl_map, decls, name, dc);
diff --git a/lldb/unittests/Symbol/TestClangASTImporter.cpp b/lldb/unittests/Symbol/TestClangASTImporter.cpp
index 11749a4189c3..126484e8d047 100644
--- a/lldb/unittests/Symbol/TestClangASTImporter.cpp
+++ b/lldb/unittests/Symbol/TestClangASTImporter.cpp
@@ -8,6 +8,7 @@
#include "gtest/gtest.h"
+#include "TestingSupport/Symbol/ClangTestUtils.h"
#include "lldb/Host/FileSystem.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Symbol/ClangASTContext.h"
@@ -73,22 +74,19 @@ TEST_F(TestClangASTImporter, ImportInvalidType) {
TEST_F(TestClangASTImporter, CopyDeclTagDecl) {
// Tests that the ClangASTImporter::CopyDecl can copy TagDecls.
- std::unique_ptr<ClangASTContext> source_ast = createAST();
- CompilerType source_type = createRecordWithField(
- *source_ast, "Source",
- source_ast->GetBasicType(lldb::BasicType::eBasicTypeChar), "a_field");
- clang::TagDecl *source = ClangUtil::GetAsTagDecl(source_type);
+ clang_utils::SourceASTWithRecord source;
std::unique_ptr<ClangASTContext> target_ast = createAST();
ClangASTImporter importer;
- clang::Decl *imported = importer.CopyDecl(
- target_ast->getASTContext(), source_ast->getASTContext(), source);
+ clang::Decl *imported =
+ importer.CopyDecl(target_ast->getASTContext(),
+ source.ast->getASTContext(), source.record_decl);
ASSERT_NE(nullptr, imported);
// Check that we got the correct decl by just comparing their qualified name.
clang::TagDecl *imported_tag_decl = llvm::cast<clang::TagDecl>(imported);
- EXPECT_EQ(source->getQualifiedNameAsString(),
+ EXPECT_EQ(source.record_decl->getQualifiedNameAsString(),
imported_tag_decl->getQualifiedNameAsString());
// We did a minimal import of the tag decl.
EXPECT_TRUE(imported_tag_decl->hasExternalLexicalStorage());
@@ -96,27 +94,23 @@ TEST_F(TestClangASTImporter, CopyDeclTagDecl) {
// Check that origin was set for the imported declaration.
ClangASTImporter::DeclOrigin origin = importer.GetDeclOrigin(imported);
EXPECT_TRUE(origin.Valid());
- EXPECT_EQ(origin.ctx, source_ast->getASTContext());
- EXPECT_EQ(origin.decl, source);
+ EXPECT_EQ(origin.ctx, source.ast->getASTContext());
+ EXPECT_EQ(origin.decl, source.record_decl);
}
TEST_F(TestClangASTImporter, CopyTypeTagDecl) {
// Tests that the ClangASTImporter::CopyType can copy TagDecls types.
- std::unique_ptr<ClangASTContext> source_ast = createAST();
- CompilerType source_type = createRecordWithField(
- *source_ast, "Source",
- source_ast->GetBasicType(lldb::BasicType::eBasicTypeChar), "a_field");
- clang::TagDecl *source = ClangUtil::GetAsTagDecl(source_type);
+ clang_utils::SourceASTWithRecord source;
std::unique_ptr<ClangASTContext> target_ast = createAST();
ClangASTImporter importer;
- CompilerType imported = importer.CopyType(*target_ast, source_type);
+ CompilerType imported = importer.CopyType(*target_ast, source.record_type);
ASSERT_TRUE(imported.IsValid());
// Check that we got the correct decl by just comparing their qualified name.
clang::TagDecl *imported_tag_decl = ClangUtil::GetAsTagDecl(imported);
- EXPECT_EQ(source->getQualifiedNameAsString(),
+ EXPECT_EQ(source.record_decl->getQualifiedNameAsString(),
imported_tag_decl->getQualifiedNameAsString());
// We did a minimal import of the tag decl.
EXPECT_TRUE(imported_tag_decl->hasExternalLexicalStorage());
@@ -125,28 +119,25 @@ TEST_F(TestClangASTImporter, CopyTypeTagDecl) {
ClangASTImporter::DeclOrigin origin =
importer.GetDeclOrigin(imported_tag_decl);
EXPECT_TRUE(origin.Valid());
- EXPECT_EQ(origin.ctx, source_ast->getASTContext());
- EXPECT_EQ(origin.decl, source);
+ EXPECT_EQ(origin.ctx, source.ast->getASTContext());
+ EXPECT_EQ(origin.decl, source.record_decl);
}
TEST_F(TestClangASTImporter, DeportDeclTagDecl) {
// Tests that the ClangASTImporter::DeportDecl completely copies TagDecls.
- std::unique_ptr<ClangASTContext> source_ast = createAST();
- CompilerType source_type = createRecordWithField(
- *source_ast, "Source",
- source_ast->GetBasicType(lldb::BasicType::eBasicTypeChar), "a_field");
- clang::TagDecl *source = ClangUtil::GetAsTagDecl(source_type);
+ clang_utils::SourceASTWithRecord source;
std::unique_ptr<ClangASTContext> target_ast = createAST();
ClangASTImporter importer;
- clang::Decl *imported = importer.DeportDecl(
- target_ast->getASTContext(), source_ast->getASTContext(), source);
+ clang::Decl *imported =
+ importer.DeportDecl(target_ast->getASTContext(),
+ source.ast->getASTContext(), source.record_decl);
ASSERT_NE(nullptr, imported);
// Check that we got the correct decl by just comparing their qualified name.
clang::TagDecl *imported_tag_decl = llvm::cast<clang::TagDecl>(imported);
- EXPECT_EQ(source->getQualifiedNameAsString(),
+ EXPECT_EQ(source.record_decl->getQualifiedNameAsString(),
imported_tag_decl->getQualifiedNameAsString());
// The record should be completed as we deported it.
EXPECT_FALSE(imported_tag_decl->hasExternalLexicalStorage());
@@ -157,21 +148,17 @@ TEST_F(TestClangASTImporter, DeportDeclTagDecl) {
TEST_F(TestClangASTImporter, DeportTypeTagDecl) {
// Tests that the ClangASTImporter::CopyType can deport TagDecl types.
- std::unique_ptr<ClangASTContext> source_ast = createAST();
- CompilerType source_type = createRecordWithField(
- *source_ast, "Source",
- source_ast->GetBasicType(lldb::BasicType::eBasicTypeChar), "a_field");
- clang::TagDecl *source = ClangUtil::GetAsTagDecl(source_type);
+ clang_utils::SourceASTWithRecord source;
std::unique_ptr<ClangASTContext> target_ast = createAST();
ClangASTImporter importer;
- CompilerType imported = importer.DeportType(*target_ast, source_type);
+ CompilerType imported = importer.DeportType(*target_ast, source.record_type);
ASSERT_TRUE(imported.IsValid());
// Check that we got the correct decl by just comparing their qualified name.
clang::TagDecl *imported_tag_decl = ClangUtil::GetAsTagDecl(imported);
- EXPECT_EQ(source->getQualifiedNameAsString(),
+ EXPECT_EQ(source.record_decl->getQualifiedNameAsString(),
imported_tag_decl->getQualifiedNameAsString());
// The record should be completed as we deported it.
EXPECT_FALSE(imported_tag_decl->hasExternalLexicalStorage());
@@ -183,17 +170,17 @@ TEST_F(TestClangASTImporter, DeportTypeTagDecl) {
TEST_F(TestClangASTImporter, MetadataPropagation) {
// Tests that AST metadata is propagated when copying declarations.
- std::unique_ptr<ClangASTContext> source_ast = createAST();
- CompilerType source_type = createRecord(*source_ast, "Source");
- clang::TagDecl *source = ClangUtil::GetAsTagDecl(source_type);
+ clang_utils::SourceASTWithRecord source;
+
const lldb::user_id_t metadata = 123456;
- source_ast->SetMetadataAsUserID(source, metadata);
+ source.ast->SetMetadataAsUserID(source.record_decl, metadata);
std::unique_ptr<ClangASTContext> target_ast = createAST();
ClangASTImporter importer;
- clang::Decl *imported = importer.CopyDecl(
- target_ast->getASTContext(), source_ast->getASTContext(), source);
+ clang::Decl *imported =
+ importer.CopyDecl(target_ast->getASTContext(),
+ source.ast->getASTContext(), source.record_decl);
ASSERT_NE(nullptr, imported);
// Check that we got the same Metadata.
@@ -206,17 +193,17 @@ TEST_F(TestClangASTImporter, MetadataPropagationIndirectImport) {
// importing one declaration into a temporary context and then to the
// actual destination context.
- std::unique_ptr<ClangASTContext> source_ast = createAST();
- CompilerType source_type = createRecord(*source_ast, "Source");
- clang::TagDecl *source = ClangUtil::GetAsTagDecl(source_type);
+ clang_utils::SourceASTWithRecord source;
+
const lldb::user_id_t metadata = 123456;
- source_ast->SetMetadataAsUserID(source, metadata);
+ source.ast->SetMetadataAsUserID(source.record_decl, metadata);
std::unique_ptr<ClangASTContext> temporary_ast = createAST();
ClangASTImporter importer;
- clang::Decl *temporary_imported = importer.CopyDecl(
- temporary_ast->getASTContext(), source_ast->getASTContext(), source);
+ clang::Decl *temporary_imported =
+ importer.CopyDecl(temporary_ast->getASTContext(),
+ source.ast->getASTContext(), source.record_decl);
ASSERT_NE(nullptr, temporary_imported);
std::unique_ptr<ClangASTContext> target_ast = createAST();
@@ -234,21 +221,20 @@ TEST_F(TestClangASTImporter, MetadataPropagationAfterCopying) {
// Tests that AST metadata is propagated when copying declarations even
// when the metadata was set after the declaration has already been copied.
- std::unique_ptr<ClangASTContext> source_ast = createAST();
- CompilerType source_type = createRecord(*source_ast, "Source");
- clang::TagDecl *source = ClangUtil::GetAsTagDecl(source_type);
+ clang_utils::SourceASTWithRecord source;
const lldb::user_id_t metadata = 123456;
std::unique_ptr<ClangASTContext> target_ast = createAST();
ClangASTImporter importer;
- clang::Decl *imported = importer.CopyDecl(
- target_ast->getASTContext(), source_ast->getASTContext(), source);
+ clang::Decl *imported =
+ importer.CopyDecl(target_ast->getASTContext(),
+ source.ast->getASTContext(), source.record_decl);
ASSERT_NE(nullptr, imported);
// The TagDecl has been imported. Now set the metadata of the source and
// make sure the imported one will directly see it.
- source_ast->SetMetadataAsUserID(source, metadata);
+ source.ast->SetMetadataAsUserID(source.record_decl, metadata);
// Check that we got the same Metadata.
ASSERT_NE(nullptr, importer.GetDeclMetadata(imported));
@@ -259,33 +245,27 @@ TEST_F(TestClangASTImporter, RecordLayout) {
// Test that it is possible to register RecordDecl layouts and then later
// correctly retrieve them.
- std::unique_ptr<ClangASTContext> source_ast = createAST();
- CompilerType source_type = createRecordWithField(
- *source_ast, "Source",
- source_ast->GetBasicType(lldb::BasicType::eBasicTypeChar), "a_field");
-
- clang::TagDecl *source_tag = ClangUtil::GetAsTagDecl(source_type);
- clang::RecordDecl *source_record = llvm::cast<clang::RecordDecl>(source_tag);
+ clang_utils::SourceASTWithRecord source;
ClangASTImporter importer;
ClangASTImporter::LayoutInfo layout_info;
layout_info.bit_size = 15;
layout_info.alignment = 2;
- layout_info.field_offsets[*source_record->fields().begin()] = 1;
- importer.SetRecordLayout(source_record, layout_info);
+ layout_info.field_offsets[source.field_decl] = 1;
+ importer.SetRecordLayout(source.record_decl, layout_info);
uint64_t bit_size;
uint64_t alignment;
llvm::DenseMap<const clang::FieldDecl *, uint64_t> field_offsets;
llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> base_offsets;
llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> vbase_offsets;
- importer.LayoutRecordType(source_record, bit_size, alignment, field_offsets,
- base_offsets, vbase_offsets);
+ importer.LayoutRecordType(source.record_decl, bit_size, alignment,
+ field_offsets, base_offsets, vbase_offsets);
EXPECT_EQ(15U, bit_size);
EXPECT_EQ(2U, alignment);
EXPECT_EQ(1U, field_offsets.size());
- EXPECT_EQ(1U, field_offsets[*source_record->fields().begin()]);
+ EXPECT_EQ(1U, field_offsets[source.field_decl]);
EXPECT_EQ(0U, base_offsets.size());
EXPECT_EQ(0U, vbase_offsets.size());
}
diff --git a/lldb/unittests/TestingSupport/Symbol/ClangTestUtils.h b/lldb/unittests/TestingSupport/Symbol/ClangTestUtils.h
new file mode 100644
index 000000000000..b1b1f30e2f6d
--- /dev/null
+++ b/lldb/unittests/TestingSupport/Symbol/ClangTestUtils.h
@@ -0,0 +1,73 @@
+//===- ClangTestUtils.h -----------------------------------------*- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_UNITTESTS_TESTINGSUPPORT_SYMBOL_CLANGTESTUTILS_H
+#define LLDB_UNITTESTS_TESTINGSUPPORT_SYMBOL_CLANGTESTUTILS_H
+
+#include "lldb/Host/HostInfo.h"
+#include "lldb/Symbol/ClangASTContext.h"
+#include "lldb/Symbol/ClangUtil.h"
+
+namespace lldb_private {
+namespace clang_utils {
+inline clang::DeclarationName getDeclarationName(ClangASTContext &ast,
+ llvm::StringRef name) {
+ clang::IdentifierInfo &II = ast.getIdentifierTable()->get(name);
+ return ast.getASTContext()->DeclarationNames.getIdentifier(&II);
+}
+
+inline std::unique_ptr<ClangASTContext> createAST() {
+ return std::make_unique<ClangASTContext>(HostInfo::GetTargetTriple());
+}
+
+inline CompilerType createRecord(ClangASTContext &ast, llvm::StringRef name) {
+ return ast.CreateRecordType(ast.getASTContext()->getTranslationUnitDecl(),
+ lldb::AccessType::eAccessPublic, name, 0,
+ lldb::LanguageType::eLanguageTypeC);
+}
+
+/// Create a record with the given name and a field with the given type
+/// and name.
+inline CompilerType createRecordWithField(ClangASTContext &ast,
+ llvm::StringRef record_name,
+ CompilerType field_type,
+ llvm::StringRef field_name) {
+ CompilerType t = createRecord(ast, record_name);
+
+ ClangASTContext::StartTagDeclarationDefinition(t);
+ ast.AddFieldToRecordType(t, field_name, field_type,
+ lldb::AccessType::eAccessPublic, 7);
+ ClangASTContext::CompleteTagDeclarationDefinition(t);
+
+ return t;
+}
+
+/// Constructs a ClangASTContext that contains a single RecordDecl that contains
+/// a single FieldDecl. Utility class as this setup is a common starting point
+/// for unit test that exercise the ASTImporter.
+struct SourceASTWithRecord {
+ std::unique_ptr<ClangASTContext> ast;
+ CompilerType record_type;
+ clang::RecordDecl *record_decl = nullptr;
+ clang::FieldDecl *field_decl = nullptr;
+ SourceASTWithRecord() {
+ ast = createAST();
+ record_type = createRecordWithField(
+ *ast, "Source", ast->GetBasicType(lldb::BasicType::eBasicTypeChar),
+ "a_field");
+ record_decl =
+ llvm::cast<clang::RecordDecl>(ClangUtil::GetAsTagDecl(record_type));
+ field_decl = *record_decl->fields().begin();
+ assert(field_decl);
+ }
+};
+
+} // namespace clang_utils
+} // namespace lldb_private
+
+#endif
diff --git a/lldb/unittests/TestingSupport/module.modulemap b/lldb/unittests/TestingSupport/module.modulemap
index 542c0b11c78f..b73ac2793278 100644
--- a/lldb/unittests/TestingSupport/module.modulemap
+++ b/lldb/unittests/TestingSupport/module.modulemap
@@ -9,3 +9,8 @@ module lldb_TestingSupport_Host {
requires cplusplus
module NativeProcessTestUtils { header "Host/NativeProcessTestUtils.h" export * }
}
+
+module lldb_TestingSupport_Symbol {
+ requires cplusplus
+ module ClangTestUtils { header "Symbol/ClangTestUtils.h" export * }
+}
More information about the lldb-commits
mailing list