[llvm] Add overload of DIBuilder::createArrayType (PR #125229)
Tom Tromey via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 31 06:12:53 PST 2025
https://github.com/tromey created https://github.com/llvm/llvm-project/pull/125229
DICompositeType has an attribute representing the name of a type, but currently it isn't possible to set this for array types via the DIBuilder method. This patch adds a new overload of DIBuilder::createArrayType that allows "full" construction of an array type. This is useful for Ada, where arrays are a bit more first-class than C.
>From 3851c22c0f8e27121d9f4b8a7fab0ef94221555c Mon Sep 17 00:00:00 2001
From: Tom Tromey <tromey at adacore.com>
Date: Mon, 27 Jan 2025 12:45:14 -0700
Subject: [PATCH] Add overload of DIBuilder::createArrayType
DICompositeType has an attribute representing the name of a type, but
currently it isn't possible to set this for array types via the
DIBuilder method. This patch adds a new overload of
DIBuilder::createArrayType that allows "full" construction of an array
type. This is useful for Ada, where arrays are a bit more first-class
than C.
---
llvm/include/llvm/IR/DIBuilder.h | 29 +++++++++++++++++++++++++++++
llvm/lib/IR/DIBuilder.cpp | 23 +++++++++++++++++++++++
llvm/unittests/IR/DebugInfoTest.cpp | 6 ++++++
3 files changed, 58 insertions(+)
diff --git a/llvm/include/llvm/IR/DIBuilder.h b/llvm/include/llvm/IR/DIBuilder.h
index 6c479415b9ed27..c587cc61d83ca3 100644
--- a/llvm/include/llvm/IR/DIBuilder.h
+++ b/llvm/include/llvm/IR/DIBuilder.h
@@ -606,6 +606,35 @@ namespace llvm {
PointerUnion<DIExpression *, DIVariable *> Allocated = nullptr,
PointerUnion<DIExpression *, DIVariable *> Rank = nullptr);
+ /// Create debugging information entry for an array.
+ /// \param Scope Scope in which this enumeration is defined.
+ /// \param Name Union name.
+ /// \param File File where this member is defined.
+ /// \param LineNumber Line number.
+ /// \param Size Array size.
+ /// \param AlignInBits Alignment.
+ /// \param Ty Element type.
+ /// \param Subscripts Subscripts.
+ /// \param DataLocation The location of the raw data of a descriptor-based
+ /// Fortran array, either a DIExpression* or
+ /// a DIVariable*.
+ /// \param Associated The associated attribute of a descriptor-based
+ /// Fortran array, either a DIExpression* or
+ /// a DIVariable*.
+ /// \param Allocated The allocated attribute of a descriptor-based
+ /// Fortran array, either a DIExpression* or
+ /// a DIVariable*.
+ /// \param Rank The rank attribute of a descriptor-based
+ /// Fortran array, either a DIExpression* or
+ /// a DIVariable*.
+ DICompositeType *createArrayType(
+ DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
+ uint64_t Size, uint32_t AlignInBits, DIType *Ty, DINodeArray Subscripts,
+ PointerUnion<DIExpression *, DIVariable *> DataLocation = nullptr,
+ PointerUnion<DIExpression *, DIVariable *> Associated = nullptr,
+ PointerUnion<DIExpression *, DIVariable *> Allocated = nullptr,
+ PointerUnion<DIExpression *, DIVariable *> Rank = nullptr);
+
/// Create debugging information entry for a vector type.
/// \param Size Array size.
/// \param AlignInBits Alignment.
diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp
index 8f9462ab46d885..6b3e3c5c5eea9f 100644
--- a/llvm/lib/IR/DIBuilder.cpp
+++ b/llvm/lib/IR/DIBuilder.cpp
@@ -616,6 +616,29 @@ DIBuilder::createArrayType(uint64_t Size, uint32_t AlignInBits, DIType *Ty,
return R;
}
+DICompositeType *DIBuilder::createArrayType(
+ DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
+ uint64_t Size, uint32_t AlignInBits, DIType *Ty, DINodeArray Subscripts,
+ PointerUnion<DIExpression *, DIVariable *> DL,
+ PointerUnion<DIExpression *, DIVariable *> AS,
+ PointerUnion<DIExpression *, DIVariable *> AL,
+ PointerUnion<DIExpression *, DIVariable *> RK) {
+ auto *R = DICompositeType::get(
+ VMContext, dwarf::DW_TAG_array_type, Name, File, LineNumber,
+ getNonCompileUnitScope(Scope), Ty, Size, AlignInBits, 0, DINode::FlagZero,
+ Subscripts, 0, nullptr, nullptr, "", nullptr,
+ isa<DIExpression *>(DL) ? (Metadata *)cast<DIExpression *>(DL)
+ : (Metadata *)cast<DIVariable *>(DL),
+ isa<DIExpression *>(AS) ? (Metadata *)cast<DIExpression *>(AS)
+ : (Metadata *)cast<DIVariable *>(AS),
+ isa<DIExpression *>(AL) ? (Metadata *)cast<DIExpression *>(AL)
+ : (Metadata *)cast<DIVariable *>(AL),
+ isa<DIExpression *>(RK) ? (Metadata *)cast<DIExpression *>(RK)
+ : (Metadata *)cast<DIVariable *>(RK));
+ trackIfUnresolved(R);
+ return R;
+}
+
DICompositeType *DIBuilder::createVectorType(uint64_t Size,
uint32_t AlignInBits, DIType *Ty,
DINodeArray Subscripts) {
diff --git a/llvm/unittests/IR/DebugInfoTest.cpp b/llvm/unittests/IR/DebugInfoTest.cpp
index 4283ba7a8f8236..c632bd6d3cbb54 100644
--- a/llvm/unittests/IR/DebugInfoTest.cpp
+++ b/llvm/unittests/IR/DebugInfoTest.cpp
@@ -1270,6 +1270,12 @@ TEST(DIBuilder, CompositeTypes) {
DICompositeType *Array = DIB.createArrayType(8, 8, nullptr, {});
EXPECT_EQ(Array->getTag(), dwarf::DW_TAG_array_type);
+ StringRef ArrayNameExp = "AnArray";
+ DICompositeType *NamedArray =
+ DIB.createArrayType(nullptr, ArrayNameExp, nullptr, 0, 8, 8, nullptr, {});
+ EXPECT_EQ(NamedArray->getTag(), dwarf::DW_TAG_array_type);
+ EXPECT_EQ(NamedArray->getName(), ArrayNameExp);
+
DICompositeType *Vector = DIB.createVectorType(8, 8, nullptr, {});
EXPECT_EQ(Vector->getTag(), dwarf::DW_TAG_array_type);
More information about the llvm-commits
mailing list