Fixed by https://reviews.llvm.org/D71748. Will land this today.

> On 18. Dec 2019, at 23:03, Raphael “Teemperor” Isemann <teempe...@gmail.com> 
> wrote:
> 
> I’m actually already investigating that because I see the same failure when I 
> moved the ::Initialize and ::Terminate calls to SetUp and TearDown as part of 
> D71630. I’ll reply here when I have a fix, thanks!
> 
>> On Dec 18, 2019, at 10:54 PM, Jordan Rupprecht <ruppre...@google.com 
>> <mailto:ruppre...@google.com>> wrote:
>> 
>> We're seeing some odd test failures internally caused by this patch. For 
>> whatever reason (test ordering based on hashing, I guess), we're running the 
>> tests in a different order than upstream, and TestClangASTContext crashes 
>> when TestClangASTImporter runs first.
>> 
>> By default, it seems like TestClangASTContext happens to run first so the 
>> failure isn't usually seen, but the failure can be reproduced with 
>> --gtest_repeat=2
>> $ ninja SymbolTests && tools/lldb/unittests/Symbol/SymbolTests 
>> '--gtest_filter=TestClangAST*' --gtest_repeat=2
>> Repeating all tests (iteration 1) . . .
>> 
>> Note: Google Test filter = TestClangAST*
>> [[ TestClangASTContext passes ]]
>> [[ TestClangASTImporter passes ]]
>> 
>> Repeating all tests (iteration 2) . . .
>> 
>> Note: Google Test filter = TestClangAST*
>> [==========] Running 21 tests from 2 test cases.
>> [----------] Global test environment set-up.
>> [----------] 13 tests from TestClangASTContext
>> [ RUN      ] TestClangASTContext.TestGetBasicTypeFromEnum
>> SymbolTests: /src/llvm-project/llvm/../clang/include/clang/AST/Type.h:669: 
>> const clang::ExtQualsTypeCommonBase *clang::QualType::getCommonPtr() const: 
>> Assertion `!isNull() && "Cannot retrieve a NULL type pointer"' failed.
>>  #0 0x000000000215e5a7 llvm::sys::PrintStackTrace(llvm::raw_ostream&) 
>> /src/llvm-project/llvm/lib/Support/Unix/Signals.inc:548:11
>>  #1 0x000000000215e749 PrintStackTraceSignalHandler(void*) 
>> /src/llvm-project/llvm/lib/Support/Unix/Signals.inc:609:1
>>  #2 0x000000000215d02b llvm::sys::RunSignalHandlers() 
>> /src/llvm-project/llvm/lib/Support/Signals.cpp:67:5
>>  #3 0x000000000215eec5 SignalHandler(int) 
>> /src/llvm-project/llvm/lib/Support/Unix/Signals.inc:390:1
>>  #4 0x00007f819b4523a0 __restore_rt 
>> (/lib/x86_64-linux-gnu/libpthread.so.0+0x123a0)
>>  #5 0x00007f819a3decfb gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x36cfb)
>>  #6 0x00007f819a3c98ad abort (/lib/x86_64-linux-gnu/libc.so.6+0x218ad)
>>  #7 0x00007f819a3c977f __tls_get_addr 
>> (/lib/x86_64-linux-gnu/libc.so.6+0x2177f)
>>  #8 0x00007f819a3d7542 (/lib/x86_64-linux-gnu/libc.so.6+0x2f542)
>>  #9 0x00000000020531d7 clang::QualType::getCommonPtr() const 
>> /src/llvm-project/llvm/../clang/include/clang/AST/Type.h:0:5
>> #10 0x00000000020529cc clang::QualType::getCanonicalType() const 
>> /src/llvm-project/llvm/../clang/include/clang/AST/Type.h:6231:20
>> #11 0x0000000002052879 clang::ASTContext::getCanonicalType(clang::QualType) 
>> const /src/llvm-project/llvm/../clang/include/clang/AST/ASTContext.h:2296:40
>> #12 0x0000000002050960 clang::ASTContext::hasSameType(clang::QualType, 
>> clang::QualType) const 
>> /src/llvm-project/llvm/../clang/include/clang/AST/ASTContext.h:2312:12
>> #13 0x0000000002047365 
>> TestClangASTContext_TestGetBasicTypeFromEnum_Test::TestBody() 
>> /src/llvm-project/lldb/unittests/Symbol/TestClangASTContext.cpp:57:3
>> <...>
>> 
>> Does the failure make sense to you?
>> No need to revert the patch -- we already have the test disabled internally, 
>> though we would like to re-enable it
>> 
>> On Mon, Dec 16, 2019 at 3:44 AM Raphael Isemann via lldb-commits 
>> <lldb-commits@lists.llvm.org <mailto:lldb-commits@lists.llvm.org>> wrote:
>> 
>> Author: Raphael Isemann
>> Date: 2019-12-16T12:43:55+01:00
>> New Revision: 22caa3cfbcf5762a47acc40c425d9fe0c40da621
>> 
>> URL: 
>> https://github.com/llvm/llvm-project/commit/22caa3cfbcf5762a47acc40c425d9fe0c40da621
>>  
>> <https://github.com/llvm/llvm-project/commit/22caa3cfbcf5762a47acc40c425d9fe0c40da621>
>> DIFF: 
>> https://github.com/llvm/llvm-project/commit/22caa3cfbcf5762a47acc40c425d9fe0c40da621.diff
>>  
>> <https://github.com/llvm/llvm-project/commit/22caa3cfbcf5762a47acc40c425d9fe0c40da621.diff>
>> 
>> LOG: [lldb] Add unit test for ClangASTImporter
>> 
>> Added: 
>>     lldb/unittests/Symbol/TestClangASTImporter.cpp
>> 
>> Modified: 
>>     lldb/unittests/Symbol/CMakeLists.txt
>> 
>> Removed: 
>> 
>> 
>> 
>> ################################################################################
>> diff  --git a/lldb/unittests/Symbol/CMakeLists.txt 
>> b/lldb/unittests/Symbol/CMakeLists.txt
>> index aa86986f4e0e..02875b8b53c1 100644
>> --- a/lldb/unittests/Symbol/CMakeLists.txt
>> +++ b/lldb/unittests/Symbol/CMakeLists.txt
>> @@ -2,6 +2,7 @@ add_lldb_unittest(SymbolTests
>>    LocateSymbolFileTest.cpp
>>    PostfixExpressionTest.cpp
>>    TestClangASTContext.cpp
>> +  TestClangASTImporter.cpp
>>    TestDWARFCallFrameInfo.cpp
>>    TestType.cpp
>>    TestLineEntry.cpp
>> 
>> diff  --git a/lldb/unittests/Symbol/TestClangASTImporter.cpp 
>> b/lldb/unittests/Symbol/TestClangASTImporter.cpp
>> new file mode 100644
>> index 000000000000..17a0dfb6a348
>> --- /dev/null
>> +++ b/lldb/unittests/Symbol/TestClangASTImporter.cpp
>> @@ -0,0 +1,220 @@
>> +//===-- TestClangASTImporter.cpp --------------------------------*- C++ 
>> -*-===//
>> +//
>> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
>> Exceptions.
>> +// See https://llvm.org/LICENSE.txt <https://llvm.org/LICENSE.txt> for 
>> license information.
>> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "gtest/gtest.h"
>> +
>> +#include "lldb/Host/FileSystem.h"
>> +#include "lldb/Host/HostInfo.h"
>> +#include "lldb/Symbol/ClangASTContext.h"
>> +#include "lldb/Symbol/ClangASTImporter.h"
>> +#include "lldb/Symbol/ClangASTMetadata.h"
>> +#include "lldb/Symbol/ClangUtil.h"
>> +#include "lldb/Symbol/Declaration.h"
>> +#include "clang/AST/DeclCXX.h"
>> +
>> +using namespace clang;
>> +using namespace lldb;
>> +using namespace lldb_private;
>> +
>> +class TestClangASTImporter : public testing::Test {
>> +public:
>> +  static void SetUpTestCase() {
>> +    FileSystem::Initialize();
>> +    HostInfo::Initialize();
>> +  }
>> +
>> +  static void TearDownTestCase() {
>> +    HostInfo::Terminate();
>> +    FileSystem::Terminate();
>> +  }
>> +
>> +protected:
>> +  std::unique_ptr<ClangASTContext> createAST() {
>> +    return std::make_unique<ClangASTContext>(HostInfo::GetTargetTriple());
>> +  }
>> +
>> +  CompilerType createRecord(ClangASTContext &ast, const char *name) {
>> +    return 
>> ast.CreateRecordType(ast.getASTContext()->getTranslationUnitDecl(),
>> +                                lldb::AccessType::eAccessPublic, name, 0,
>> +                                lldb::LanguageType::eLanguageTypeC);
>> +  }
>> +};
>> +
>> +TEST_F(TestClangASTImporter, CanImportInvalidType) {
>> +  ClangASTImporter importer;
>> +  EXPECT_FALSE(importer.CanImport(CompilerType()));
>> +}
>> +
>> +TEST_F(TestClangASTImporter, ImportInvalidType) {
>> +  ClangASTImporter importer;
>> +  EXPECT_FALSE(importer.Import(CompilerType()));
>> +}
>> +
>> +TEST_F(TestClangASTImporter, CopyDeclTagDecl) {
>> +  // Tests that the ClangASTImporter::CopyDecl can copy TagDecls.
>> +  std::unique_ptr<ClangASTContext> source_ast = createAST();
>> +  CompilerType source_type = createRecord(*source_ast, "Source");
>> +  clang::TagDecl *source = ClangUtil::GetAsTagDecl(source_type);
>> +
>> +  std::unique_ptr<ClangASTContext> target_ast = createAST();
>> +
>> +  ClangASTImporter importer;
>> +  clang::Decl *imported = importer.CopyDecl(
>> +      target_ast->getASTContext(), source_ast->getASTContext(), source);
>> +  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(),
>> +            imported_tag_decl->getQualifiedNameAsString());
>> +
>> +  // 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);
>> +}
>> +
>> +TEST_F(TestClangASTImporter, CopyTypeTagDecl) {
>> +  // Tests that the ClangASTImporter::CopyType can copy TagDecls types.
>> +  std::unique_ptr<ClangASTContext> source_ast = createAST();
>> +  CompilerType source_type = createRecord(*source_ast, "Source");
>> +  clang::TagDecl *source = ClangUtil::GetAsTagDecl(source_type);
>> +
>> +  std::unique_ptr<ClangASTContext> target_ast = createAST();
>> +
>> +  ClangASTImporter importer;
>> +  CompilerType imported = importer.CopyType(*target_ast, source_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(),
>> +            imported_tag_decl->getQualifiedNameAsString());
>> +
>> +  // Check that origin was set for the imported declaration.
>> +  ClangASTImporter::DeclOrigin origin =
>> +      importer.GetDeclOrigin(imported_tag_decl);
>> +  EXPECT_TRUE(origin.Valid());
>> +  EXPECT_EQ(origin.ctx, source_ast->getASTContext());
>> +  EXPECT_EQ(origin.decl, source);
>> +}
>> +
>> +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);
>> +  const lldb::user_id_t metadata = 123456;
>> +  source_ast->SetMetadataAsUserID(source, metadata);
>> +
>> +  std::unique_ptr<ClangASTContext> target_ast = createAST();
>> +
>> +  ClangASTImporter importer;
>> +  clang::Decl *imported = importer.CopyDecl(
>> +      target_ast->getASTContext(), source_ast->getASTContext(), source);
>> +  ASSERT_NE(nullptr, imported);
>> +
>> +  // Check that we got the same Metadata.
>> +  ASSERT_NE(nullptr, importer.GetDeclMetadata(imported));
>> +  EXPECT_EQ(metadata, importer.GetDeclMetadata(imported)->GetUserID());
>> +}
>> +
>> +TEST_F(TestClangASTImporter, MetadataPropagationIndirectImport) {
>> +  // Tests that AST metadata is propagated when copying declarations when
>> +  // 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);
>> +  const lldb::user_id_t metadata = 123456;
>> +  source_ast->SetMetadataAsUserID(source, metadata);
>> +
>> +  std::unique_ptr<ClangASTContext> temporary_ast = createAST();
>> +
>> +  ClangASTImporter importer;
>> +  clang::Decl *temporary_imported = importer.CopyDecl(
>> +      temporary_ast->getASTContext(), source_ast->getASTContext(), source);
>> +  ASSERT_NE(nullptr, temporary_imported);
>> +
>> +  std::unique_ptr<ClangASTContext> target_ast = createAST();
>> +  clang::Decl *imported =
>> +      importer.CopyDecl(target_ast->getASTContext(),
>> +                        temporary_ast->getASTContext(), temporary_imported);
>> +  ASSERT_NE(nullptr, imported);
>> +
>> +  // Check that we got the same Metadata.
>> +  ASSERT_NE(nullptr, importer.GetDeclMetadata(imported));
>> +  EXPECT_EQ(metadata, importer.GetDeclMetadata(imported)->GetUserID());
>> +}
>> +
>> +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);
>> +  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);
>> +  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);
>> +
>> +  // Check that we got the same Metadata.
>> +  ASSERT_NE(nullptr, importer.GetDeclMetadata(imported));
>> +  EXPECT_EQ(metadata, importer.GetDeclMetadata(imported)->GetUserID());
>> +}
>> +
>> +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 = createRecord(*source_ast, "Source");
>> +  ClangASTContext::StartTagDeclarationDefinition(source_type);
>> +  clang::FieldDecl *field = source_ast->AddFieldToRecordType(
>> +      source_type, "a_field",
>> +      source_ast->GetBasicType(lldb::BasicType::eBasicTypeChar),
>> +      lldb::AccessType::eAccessPublic, 7);
>> +  ClangASTContext::CompleteTagDeclarationDefinition(source_type);
>> +
>> +  clang::TagDecl *source_tag = ClangUtil::GetAsTagDecl(source_type);
>> +  clang::RecordDecl *source_record = 
>> llvm::cast<clang::RecordDecl>(source_tag);
>> +
>> +  ClangASTImporter importer;
>> +  ClangASTImporter::LayoutInfo layout_info;
>> +  layout_info.bit_size = 15;
>> +  layout_info.alignment = 2;
>> +  layout_info.field_offsets[field] = 1;
>> +  importer.InsertRecordDecl(source_record, 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);
>> +
>> +  EXPECT_EQ(15U, bit_size);
>> +  EXPECT_EQ(2U, alignment);
>> +  EXPECT_EQ(1U, field_offsets.size());
>> +  EXPECT_EQ(1U, field_offsets[field]);
>> +  EXPECT_EQ(0U, base_offsets.size());
>> +  EXPECT_EQ(0U, vbase_offsets.size());
>> +}
>> 
>> 
>> 
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits@lists.llvm.org <mailto:lldb-commits@lists.llvm.org>
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits 
>> <https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits>
> 

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to