85 changes: 59 additions & 26 deletions llvm/unittests/IR/MetadataTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ class MetadataTest : public testing::Test {
DIType *getDerivedType() {
return DIDerivedType::getDistinct(
Context, dwarf::DW_TAG_pointer_type, "", nullptr, 0, nullptr,
getBasicType("basictype"), 1, 2, 0, std::nullopt, DINode::FlagZero);
getBasicType("basictype"), 1, 2, 0, std::nullopt, {}, DINode::FlagZero);
}
Constant *getConstant() {
return ConstantInt::get(Type::getInt32Ty(Context), Counter++);
Expand Down Expand Up @@ -461,7 +461,7 @@ TEST_F(MDNodeTest, PrintTree) {
auto *StructTy = cast<DICompositeType>(getCompositeType());
DIType *PointerTy = DIDerivedType::getDistinct(
Context, dwarf::DW_TAG_pointer_type, "", nullptr, 0, nullptr, StructTy,
1, 2, 0, std::nullopt, DINode::FlagZero);
1, 2, 0, std::nullopt, {}, DINode::FlagZero);
StructTy->replaceElements(MDTuple::get(Context, PointerTy));

auto *Var = DILocalVariable::get(Context, Scope, "foo", File,
Expand Down Expand Up @@ -1864,13 +1864,17 @@ TEST_F(DIDerivedTypeTest, get) {
DIType *BaseType = getBasicType("basic");
MDTuple *ExtraData = getTuple();
unsigned DWARFAddressSpace = 8;
DIDerivedType::PtrAuthData PtrAuthData(1, false, 1234, true, true);
DIDerivedType::PtrAuthData PtrAuthData2(1, false, 1234, true, false);
DINode::DIFlags Flags5 = static_cast<DINode::DIFlags>(5);
DINode::DIFlags Flags4 = static_cast<DINode::DIFlags>(4);

auto *N =
DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something", File,
1, Scope, BaseType, 2, 3, 4, DWARFAddressSpace, Flags5,
ExtraData);
auto *N = DIDerivedType::get(
Context, dwarf::DW_TAG_pointer_type, "something", File, 1, Scope,
BaseType, 2, 3, 4, DWARFAddressSpace, std::nullopt, Flags5, ExtraData);
auto *N1 = DIDerivedType::get(Context, dwarf::DW_TAG_LLVM_ptrauth_type, "",
File, 1, Scope, N, 2, 3, 4, DWARFAddressSpace,
PtrAuthData, Flags5, ExtraData);
EXPECT_EQ(dwarf::DW_TAG_pointer_type, N->getTag());
EXPECT_EQ("something", N->getName());
EXPECT_EQ(File, N->getFile());
Expand All @@ -1881,53 +1885,73 @@ TEST_F(DIDerivedTypeTest, get) {
EXPECT_EQ(3u, N->getAlignInBits());
EXPECT_EQ(4u, N->getOffsetInBits());
EXPECT_EQ(DWARFAddressSpace, *N->getDWARFAddressSpace());
EXPECT_EQ(std::nullopt, N->getPtrAuthData());
EXPECT_EQ(PtrAuthData, N1->getPtrAuthData());
EXPECT_NE(PtrAuthData2, N1->getPtrAuthData());
EXPECT_EQ(5u, N->getFlags());
EXPECT_EQ(ExtraData, N->getExtraData());
EXPECT_EQ(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", File, 1, Scope, BaseType, 2, 3,
4, DWARFAddressSpace, Flags5, ExtraData));
4, DWARFAddressSpace, std::nullopt, Flags5,
ExtraData));

EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_reference_type,
"something", File, 1, Scope, BaseType, 2, 3,
4, DWARFAddressSpace, Flags5, ExtraData));
4, DWARFAddressSpace, std::nullopt, Flags5,
ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "else",
File, 1, Scope, BaseType, 2, 3,
4, DWARFAddressSpace, Flags5, ExtraData));
File, 1, Scope, BaseType, 2, 3, 4,
DWARFAddressSpace, std::nullopt, Flags5,
ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", getFile(), 1, Scope, BaseType, 2,
3, 4, DWARFAddressSpace, Flags5, ExtraData));
3, 4, DWARFAddressSpace, std::nullopt, Flags5,
ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", File, 2, Scope, BaseType, 2, 3,
4, DWARFAddressSpace, Flags5, ExtraData));
4, DWARFAddressSpace, std::nullopt, Flags5,
ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", File, 1, getSubprogram(),
BaseType, 2, 3, 4, DWARFAddressSpace, Flags5,
ExtraData));
BaseType, 2, 3, 4, DWARFAddressSpace,
std::nullopt, Flags5, ExtraData));
EXPECT_NE(N, DIDerivedType::get(
Context, dwarf::DW_TAG_pointer_type, "something", File, 1,
Scope, getBasicType("basic2"), 2, 3, 4, DWARFAddressSpace,
Flags5, ExtraData));
std::nullopt, Flags5, ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", File, 1, Scope, BaseType, 3, 3,
4, DWARFAddressSpace, Flags5, ExtraData));
4, DWARFAddressSpace, std::nullopt, Flags5,
ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", File, 1, Scope, BaseType, 2, 2,
4, DWARFAddressSpace, Flags5, ExtraData));
4, DWARFAddressSpace, std::nullopt, Flags5,
ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", File, 1, Scope, BaseType, 2, 3,
5, DWARFAddressSpace, Flags5, ExtraData));
5, DWARFAddressSpace, std::nullopt, Flags5,
ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", File, 1, Scope, BaseType, 2, 3,
4, DWARFAddressSpace + 1, Flags5, ExtraData));
4, DWARFAddressSpace + 1, std::nullopt,
Flags5, ExtraData));
EXPECT_NE(N1,
DIDerivedType::get(Context, dwarf::DW_TAG_LLVM_ptrauth_type, "",
File, 1, Scope, N, 2, 3, 4, DWARFAddressSpace,
std::nullopt, Flags5, ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", File, 1, Scope, BaseType, 2, 3,
4, DWARFAddressSpace, Flags4, ExtraData));
4, DWARFAddressSpace, std::nullopt, Flags4,
ExtraData));
EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
"something", File, 1, Scope, BaseType, 2, 3,
4, DWARFAddressSpace, Flags5, getTuple()));
4, DWARFAddressSpace, std::nullopt, Flags5,
getTuple()));

TempDIDerivedType Temp = N->clone();
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
TempDIDerivedType Temp1 = N1->clone();
EXPECT_EQ(N1, MDNode::replaceWithUniqued(std::move(Temp1)));
}

TEST_F(DIDerivedTypeTest, getWithLargeValues) {
Expand All @@ -1937,14 +1961,23 @@ TEST_F(DIDerivedTypeTest, getWithLargeValues) {
MDTuple *ExtraData = getTuple();
DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5);

auto *N = DIDerivedType::get(
Context, dwarf::DW_TAG_pointer_type, "something", File, 1, Scope,
BaseType, UINT64_MAX, UINT32_MAX - 1, UINT64_MAX - 2, UINT32_MAX - 3,
Flags, ExtraData);
auto *N = DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something",
File, 1, Scope, BaseType, UINT64_MAX,
UINT32_MAX - 1, UINT64_MAX - 2, UINT32_MAX - 3,
std::nullopt, Flags, ExtraData);
EXPECT_EQ(UINT64_MAX, N->getSizeInBits());
EXPECT_EQ(UINT32_MAX - 1, N->getAlignInBits());
EXPECT_EQ(UINT64_MAX - 2, N->getOffsetInBits());
EXPECT_EQ(UINT32_MAX - 3, *N->getDWARFAddressSpace());

auto *N1 = DIDerivedType::get(
Context, dwarf::DW_TAG_LLVM_ptrauth_type, "", File, 1, Scope, N,
UINT64_MAX, UINT32_MAX - 1, UINT64_MAX - 2, UINT32_MAX - 3,
DIDerivedType::PtrAuthData(7, true, 0xffff, true, false), Flags,
ExtraData);
EXPECT_EQ(7U, *N1->getPtrAuthKey());
EXPECT_EQ(true, *N1->isPtrAuthAddressDiscriminated());
EXPECT_EQ(0xffffU, *N1->getPtrAuthExtraDiscriminator());
}

typedef MetadataTest DICompositeTypeTest;
Expand Down Expand Up @@ -4268,7 +4301,7 @@ TEST_F(MDTupleAllocationTest, Tracking2) {
#if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG) && !defined(GTEST_HAS_SEH)
typedef MetadataTest MDTupleAllocationDeathTest;
TEST_F(MDTupleAllocationDeathTest, ResizeRejected) {
MDTuple *A = MDTuple::get(Context, None);
MDTuple *A = MDTuple::get(Context, std::nullopt);
auto *Value1 = getConstantAsMetadata();
EXPECT_DEATH(A->push_back(Value1),
"Resizing is not supported for uniqued nodes");
Expand Down
3 changes: 2 additions & 1 deletion mlir/lib/Target/LLVMIR/DebugTranslation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ llvm::DIDerivedType *DebugTranslation::translateImpl(DIDerivedTypeAttr attr) {
/*File=*/nullptr, /*Line=*/0,
/*Scope=*/nullptr, translate(attr.getBaseType()), attr.getSizeInBits(),
attr.getAlignInBits(), attr.getOffsetInBits(),
/*DWARFAddressSpace=*/std::nullopt, /*Flags=*/llvm::DINode::FlagZero);
/*DWARFAddressSpace=*/std::nullopt, /*PtrAuthData=*/std::nullopt,
/*Flags=*/llvm::DINode::FlagZero);
}

llvm::DIFile *DebugTranslation::translateImpl(DIFileAttr attr) {
Expand Down