[DI] Have createClassType create a class type. (#102624)

I was wondering why my use of createClassType was generating structure
reccords, and it turns out the code is wrong (or for some reason i don't
understand the intended use of the API).

clang itself does not use that part of the API, so this flew under the
radar.
This commit is contained in:
deadalnix 2024-08-13 12:12:29 +02:00 committed by GitHub
parent a9636b7f60
commit 3fa946a844
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 1 deletions

View File

@ -509,7 +509,7 @@ DICompositeType *DIBuilder::createClassType(
"createClassType should be called with a valid Context");
auto *R = DICompositeType::get(
VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
VMContext, dwarf::DW_TAG_class_type, Name, File, LineNumber,
getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits,
OffsetInBits, Flags, Elements, RunTimeLang, VTableHolder,
cast_or_null<MDTuple>(TemplateParams), UniqueIdentifier);

View File

@ -1244,4 +1244,37 @@ TEST(DIBuilder, HashingDISubprogram) {
EXPECT_EQ(HashDefinition, HashDefinitionAfter);
}
TEST(DIBuilder, CompositeTypes) {
LLVMContext Ctx;
std::unique_ptr<Module> M = std::make_unique<Module>("MyModule", Ctx);
DIBuilder DIB(*M);
DIFile *F = DIB.createFile("main.c", "/");
DICompileUnit *CU =
DIB.createCompileUnit(dwarf::DW_LANG_C, F, "Test", false, "", 0);
DICompositeType *Class =
DIB.createClassType(CU, "MyClass", F, 0, 8, 8, 0, {}, nullptr, {}, 0,
nullptr, nullptr, "ClassUniqueIdentifier");
EXPECT_EQ(Class->getTag(), dwarf::DW_TAG_class_type);
DICompositeType *Struct = DIB.createStructType(
CU, "MyStruct", F, 0, 8, 8, {}, {}, {}, 0, {}, "StructUniqueIdentifier");
EXPECT_EQ(Struct->getTag(), dwarf::DW_TAG_structure_type);
DICompositeType *Union = DIB.createUnionType(CU, "MyUnion", F, 0, 8, 8, {},
{}, 0, "UnionUniqueIdentifier");
EXPECT_EQ(Union->getTag(), dwarf::DW_TAG_union_type);
DICompositeType *Array = DIB.createArrayType(8, 8, nullptr, {});
EXPECT_EQ(Array->getTag(), dwarf::DW_TAG_array_type);
DICompositeType *Vector = DIB.createVectorType(8, 8, nullptr, {});
EXPECT_EQ(Vector->getTag(), dwarf::DW_TAG_array_type);
DICompositeType *Enum = DIB.createEnumerationType(
CU, "MyEnum", F, 0, 8, 8, {}, nullptr, 0, "EnumUniqueIdentifier");
EXPECT_EQ(Enum->getTag(), dwarf::DW_TAG_enumeration_type);
}
} // end namespace