Skip to content

[DebugInfo][BPF] Add 'annotations' field for DIBasicType & DISubroutineType #91422

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 58 additions & 22 deletions llvm/include/llvm/IR/DebugInfoMetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -828,40 +828,45 @@ class DIBasicType : public DIType {
static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
StringRef Name, uint64_t SizeInBits,
uint32_t AlignInBits, unsigned Encoding,
DIFlags Flags, StorageType Storage,
bool ShouldCreate = true) {
DIFlags Flags, DINodeArray Annotations,
StorageType Storage, bool ShouldCreate = true) {
return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
SizeInBits, AlignInBits, Encoding, Flags, Storage,
ShouldCreate);
SizeInBits, AlignInBits, Encoding, Flags, Annotations.get(),
Storage, ShouldCreate);
}
static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
MDString *Name, uint64_t SizeInBits,
uint32_t AlignInBits, unsigned Encoding,
DIFlags Flags, StorageType Storage,
bool ShouldCreate = true);
DIFlags Flags, Metadata *Annotations,
StorageType Storage, bool ShouldCreate = true);

TempDIBasicType cloneImpl() const {
return getTemporary(getContext(), getTag(), getName(), getSizeInBits(),
getAlignInBits(), getEncoding(), getFlags());
getAlignInBits(), getEncoding(), getFlags(),
getAnnotations());
}

public:
DEFINE_MDNODE_GET(DIBasicType, (unsigned Tag, StringRef Name),
(Tag, Name, 0, 0, 0, FlagZero))
(Tag, Name, 0, 0, 0, FlagZero, {}))
DEFINE_MDNODE_GET(DIBasicType,
(unsigned Tag, StringRef Name, uint64_t SizeInBits),
(Tag, Name, SizeInBits, 0, 0, FlagZero))
(Tag, Name, SizeInBits, 0, 0, FlagZero, {}))
DEFINE_MDNODE_GET(DIBasicType,
(unsigned Tag, MDString *Name, uint64_t SizeInBits),
(Tag, Name, SizeInBits, 0, 0, FlagZero))
(Tag, Name, SizeInBits, 0, 0, FlagZero, {}))
DEFINE_MDNODE_GET(DIBasicType,
(unsigned Tag, StringRef Name, uint64_t SizeInBits,
uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags))
uint32_t AlignInBits, unsigned Encoding, DIFlags Flags,
DINodeArray Annotations = {}),
(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags,
Annotations))
DEFINE_MDNODE_GET(DIBasicType,
(unsigned Tag, MDString *Name, uint64_t SizeInBits,
uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags))
uint32_t AlignInBits, unsigned Encoding, DIFlags Flags,
Metadata *Annotations = nullptr),
(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags,
Annotations))

TempDIBasicType clone() const { return cloneImpl(); }

Expand All @@ -873,6 +878,16 @@ class DIBasicType : public DIType {
/// neither signed nor unsigned.
std::optional<Signedness> getSignedness() const;

Metadata *getRawAnnotations() const { return getOperand(3); }

DINodeArray getAnnotations() const {
return cast_or_null<MDTuple>(getRawAnnotations());
}

void replaceAnnotations(DINodeArray Annotations) {
replaceOperandWith(3, Annotations.get());
}

static bool classof(const Metadata *MD) {
return MD->getMetadataID() == DIBasicTypeKind;
}
Expand Down Expand Up @@ -1112,6 +1127,10 @@ class DIDerivedType : public DIType {
}
Metadata *getRawAnnotations() const { return getOperand(5); }

void replaceAnnotations(DINodeArray Annotations) {
replaceOperandWith(5, Annotations.get());
}

/// Get casted version of extra data.
/// @{
DIType *getClassType() const;
Expand Down Expand Up @@ -1339,6 +1358,10 @@ class DICompositeType : public DIType {
return cast_or_null<MDTuple>(getRawAnnotations());
}

void replaceAnnotations(DINodeArray Annotations) {
replaceOperandWith(13, Annotations.get());
}

/// Replace operands.
///
/// If this \a isUniqued() and not \a isResolved(), on a uniquing collision
Expand Down Expand Up @@ -1385,26 +1408,30 @@ class DISubroutineType : public DIType {

static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
uint8_t CC, DITypeRefArray TypeArray,
StorageType Storage,
DINodeArray Annotations, StorageType Storage,
bool ShouldCreate = true) {
return getImpl(Context, Flags, CC, TypeArray.get(), Storage, ShouldCreate);
return getImpl(Context, Flags, CC, TypeArray.get(), Annotations.get(),
Storage, ShouldCreate);
}
static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
uint8_t CC, Metadata *TypeArray,
StorageType Storage,
Metadata *Annotations, StorageType Storage,
bool ShouldCreate = true);

TempDISubroutineType cloneImpl() const {
return getTemporary(getContext(), getFlags(), getCC(), getTypeArray());
return getTemporary(getContext(), getFlags(), getCC(), getTypeArray(),
getAnnotations());
}

public:
DEFINE_MDNODE_GET(DISubroutineType,
(DIFlags Flags, uint8_t CC, DITypeRefArray TypeArray),
(Flags, CC, TypeArray))
(DIFlags Flags, uint8_t CC, DITypeRefArray TypeArray,
DINodeArray Annotations = nullptr),
(Flags, CC, TypeArray, Annotations))
DEFINE_MDNODE_GET(DISubroutineType,
(DIFlags Flags, uint8_t CC, Metadata *TypeArray),
(Flags, CC, TypeArray))
(DIFlags Flags, uint8_t CC, Metadata *TypeArray,
Metadata *Annotations = nullptr),
(Flags, CC, TypeArray, Annotations))

TempDISubroutineType clone() const { return cloneImpl(); }
// Returns a new temporary DISubroutineType with updated CC
Expand All @@ -1422,6 +1449,15 @@ class DISubroutineType : public DIType {

Metadata *getRawTypeArray() const { return getOperand(3); }

Metadata *getRawAnnotations() const { return getOperand(4); }
DINodeArray getAnnotations() const {
return cast_or_null<MDTuple>(getRawAnnotations());
}

void replaceAnnotations(DINodeArray Annotations) {
replaceOperandWith(4, Annotations.get());
}

static bool classof(const Metadata *MD) {
return MD->getMetadataID() == DISubroutineTypeKind;
}
Expand Down
17 changes: 10 additions & 7 deletions llvm/lib/AsmParser/LLParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5252,20 +5252,22 @@ bool LLParser::parseDIEnumerator(MDNode *&Result, bool IsDistinct) {

/// parseDIBasicType:
/// ::= !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32,
/// encoding: DW_ATE_encoding, flags: 0)
/// encoding: DW_ATE_encoding, flags: 0, annotations: !1)
bool LLParser::parseDIBasicType(MDNode *&Result, bool IsDistinct) {
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
OPTIONAL(name, MDStringField, ); \
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
OPTIONAL(encoding, DwarfAttEncodingField, ); \
OPTIONAL(flags, DIFlagField, );
OPTIONAL(flags, DIFlagField, ); \
OPTIONAL(annotations, MDField, );
PARSE_MD_FIELDS();
#undef VISIT_MD_FIELDS

Result = GET_OR_DISTINCT(DIBasicType, (Context, tag.Val, name.Val, size.Val,
align.Val, encoding.Val, flags.Val));
Result = GET_OR_DISTINCT(DIBasicType,
(Context, tag.Val, name.Val, size.Val, align.Val,
encoding.Val, flags.Val, annotations.Val));
return false;
}

Expand Down Expand Up @@ -5402,12 +5404,13 @@ bool LLParser::parseDISubroutineType(MDNode *&Result, bool IsDistinct) {
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
OPTIONAL(flags, DIFlagField, ); \
OPTIONAL(cc, DwarfCCField, ); \
REQUIRED(types, MDField, );
REQUIRED(types, MDField, ); \
OPTIONAL(annotations, MDField, );
PARSE_MD_FIELDS();
#undef VISIT_MD_FIELDS

Result = GET_OR_DISTINCT(DISubroutineType,
(Context, flags.Val, cc.Val, types.Val));
Result = GET_OR_DISTINCT(DISubroutineType, (Context, flags.Val, cc.Val,
types.Val, annotations.Val));
return false;
}

Expand Down
16 changes: 12 additions & 4 deletions llvm/lib/Bitcode/Reader/MetadataLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1527,18 +1527,22 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
break;
}
case bitc::METADATA_BASIC_TYPE: {
if (Record.size() < 6 || Record.size() > 7)
if (Record.size() < 6 || Record.size() > 8)
return error("Invalid record");

IsDistinct = Record[0];
DINode::DIFlags Flags = (Record.size() > 6)
? static_cast<DINode::DIFlags>(Record[6])
: DINode::FlagZero;

Metadata *Annotations = nullptr;
if (Record.size() > 7 && Record[7])
Annotations = getMDOrNull(Record[7]);

MetadataList.assignValue(
GET_OR_DISTINCT(DIBasicType,
(Context, Record[1], getMDString(Record[2]), Record[3],
Record[4], Record[5], Flags)),
Record[4], Record[5], Flags, Annotations)),
NextMetadataNo);
NextMetadataNo++;
break;
Expand Down Expand Up @@ -1703,7 +1707,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
break;
}
case bitc::METADATA_SUBROUTINE_TYPE: {
if (Record.size() < 3 || Record.size() > 4)
if (Record.size() < 3 || Record.size() > 5)
return error("Invalid record");
bool IsOldTypeRefArray = Record[0] < 2;
unsigned CC = (Record.size() > 3) ? Record[3] : 0;
Expand All @@ -1713,9 +1717,13 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
Metadata *Types = getMDOrNull(Record[2]);
if (LLVM_UNLIKELY(IsOldTypeRefArray))
Types = MetadataList.upgradeTypeRefArray(Types);
Metadata *Annotations = nullptr;
if (Record.size() > 4 && Record[4])
Annotations = getMDOrNull(Record[4]);

MetadataList.assignValue(
GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
GET_OR_DISTINCT(DISubroutineType,
(Context, Flags, CC, Types, Annotations)),
NextMetadataNo);
NextMetadataNo++;
break;
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1816,6 +1816,7 @@ void ModuleBitcodeWriter::writeDIBasicType(const DIBasicType *N,
Record.push_back(N->getAlignInBits());
Record.push_back(N->getEncoding());
Record.push_back(N->getFlags());
Record.push_back(VE.getMetadataOrNullID(N->getRawAnnotations()));

Stream.EmitRecord(bitc::METADATA_BASIC_TYPE, Record, Abbrev);
Record.clear();
Expand Down Expand Up @@ -1911,6 +1912,7 @@ void ModuleBitcodeWriter::writeDISubroutineType(
Record.push_back(N->getFlags());
Record.push_back(VE.getMetadataOrNullID(N->getTypeArray().get()));
Record.push_back(N->getCC());
Record.push_back(VE.getMetadataOrNullID(N->getRawAnnotations()));

Stream.EmitRecord(bitc::METADATA_SUBROUTINE_TYPE, Record, Abbrev);
Record.clear();
Expand Down
6 changes: 5 additions & 1 deletion llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -712,7 +712,9 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIBasicType *BTy) {
if (!Name.empty())
addString(Buffer, dwarf::DW_AT_name, Name);

// An unspecified type only has a name attribute.
addAnnotation(Buffer, BTy->getAnnotations());

// An unspecified type only has a name attribute & annotations.
if (BTy->getTag() == dwarf::DW_TAG_unspecified_type)
return;

Expand Down Expand Up @@ -881,6 +883,8 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DISubroutineType *CTy) {

if (CTy->isRValueReference())
addFlag(Buffer, dwarf::DW_AT_rvalue_reference);

addAnnotation(Buffer, CTy->getAnnotations());
}

void DwarfUnit::addAnnotation(DIE &Buffer, DINodeArray Annotations) {
Expand Down
6 changes: 4 additions & 2 deletions llvm/lib/IR/AsmWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2122,9 +2122,9 @@ static void writeDIEnumerator(raw_ostream &Out, const DIEnumerator *N,
}

static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N,
AsmWriterContext &) {
AsmWriterContext &WriterCtx) {
Out << "!DIBasicType(";
MDFieldPrinter Printer(Out);
MDFieldPrinter Printer(Out, WriterCtx);
if (N->getTag() != dwarf::DW_TAG_base_type)
Printer.printTag(N);
Printer.printString("name", N->getName());
Expand All @@ -2133,6 +2133,7 @@ static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N,
Printer.printDwarfEnum("encoding", N->getEncoding(),
dwarf::AttributeEncodingString);
Printer.printDIFlags("flags", N->getFlags());
Printer.printMetadata("annotations", N->getRawAnnotations());
Out << ")";
}

Expand Down Expand Up @@ -2228,6 +2229,7 @@ static void writeDISubroutineType(raw_ostream &Out, const DISubroutineType *N,
Printer.printDwarfEnum("cc", N->getCC(), dwarf::ConventionString);
Printer.printMetadata("types", N->getRawTypeArray(),
/* ShouldSkipNull */ false);
Printer.printMetadata("annotations", N->getRawAnnotations());
Out << ")";
}

Expand Down
15 changes: 8 additions & 7 deletions llvm/lib/IR/DebugInfoMetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -663,12 +663,12 @@ DIEnumerator *DIEnumerator::getImpl(LLVMContext &Context, const APInt &Value,
DIBasicType *DIBasicType::getImpl(LLVMContext &Context, unsigned Tag,
MDString *Name, uint64_t SizeInBits,
uint32_t AlignInBits, unsigned Encoding,
DIFlags Flags, StorageType Storage,
bool ShouldCreate) {
DIFlags Flags, Metadata *Annotations,
StorageType Storage, bool ShouldCreate) {
assert(isCanonical(Name) && "Expected canonical MDString");
DEFINE_GETIMPL_LOOKUP(DIBasicType,
(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags));
Metadata *Ops[] = {nullptr, nullptr, Name};
DEFINE_GETIMPL_LOOKUP(DIBasicType, (Tag, Name, SizeInBits, AlignInBits,
Encoding, Flags, Annotations));
Metadata *Ops[] = {nullptr, nullptr, Name, Annotations};
DEFINE_GETIMPL_STORE(DIBasicType,
(Tag, SizeInBits, AlignInBits, Encoding, Flags), Ops);
}
Expand Down Expand Up @@ -872,10 +872,11 @@ DISubroutineType::DISubroutineType(LLVMContext &C, StorageType Storage,

DISubroutineType *DISubroutineType::getImpl(LLVMContext &Context, DIFlags Flags,
uint8_t CC, Metadata *TypeArray,
Metadata *Annotations,
StorageType Storage,
bool ShouldCreate) {
DEFINE_GETIMPL_LOOKUP(DISubroutineType, (Flags, CC, TypeArray));
Metadata *Ops[] = {nullptr, nullptr, nullptr, TypeArray};
DEFINE_GETIMPL_LOOKUP(DISubroutineType, (Flags, CC, TypeArray, Annotations));
Metadata *Ops[] = {nullptr, nullptr, nullptr, TypeArray, Annotations};
DEFINE_GETIMPL_STORE(DISubroutineType, (Flags, CC), Ops);
}

Expand Down
Loading
Loading