[KeyInstr] Add fields to DILocation behind compile time flag

The definition EXPERIMENTAL_KEY_INSTRUCTIONS is controlled by cmake flag
LLVM_EXPERIMENTAL_KEY_INSTRUCTIONS.

Add IR read-write roundtrip test in a directory that is unsupported unless
the CMake flag is enabled.
This commit is contained in:
Orlando Cazalet-Hyams 2025-03-18 12:40:14 +00:00
parent 133c1afa8e
commit a124bd2afc
9 changed files with 95 additions and 27 deletions

View File

@ -2099,44 +2099,67 @@ public:
class DILocation : public MDNode {
friend class LLVMContextImpl;
friend class MDNode;
#ifdef EXPERIMENTAL_KEY_INSTRUCTIONS
uint64_t AtomGroup : 61;
uint8_t AtomRank : 3;
#endif
DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
unsigned Column, ArrayRef<Metadata *> MDs, bool ImplicitCode);
unsigned Column, uint64_t AtomGroup, uint8_t AtomRank,
ArrayRef<Metadata *> MDs, bool ImplicitCode);
~DILocation() { dropAllReferences(); }
static DILocation *getImpl(LLVMContext &Context, unsigned Line,
unsigned Column, Metadata *Scope,
Metadata *InlinedAt, bool ImplicitCode,
uint64_t AtomGroup, uint8_t AtomRank,
StorageType Storage, bool ShouldCreate = true);
static DILocation *getImpl(LLVMContext &Context, unsigned Line,
unsigned Column, DILocalScope *Scope,
DILocation *InlinedAt, bool ImplicitCode,
uint64_t AtomGroup, uint8_t AtomRank,
StorageType Storage, bool ShouldCreate = true) {
return getImpl(Context, Line, Column, static_cast<Metadata *>(Scope),
static_cast<Metadata *>(InlinedAt), ImplicitCode, Storage,
ShouldCreate);
static_cast<Metadata *>(InlinedAt), ImplicitCode, AtomGroup,
AtomRank, Storage, ShouldCreate);
}
TempDILocation cloneImpl() const {
// Get the raw scope/inlinedAt since it is possible to invoke this on
// a DILocation containing temporary metadata.
return getTemporary(getContext(), getLine(), getColumn(), getRawScope(),
getRawInlinedAt(), isImplicitCode());
getRawInlinedAt(), isImplicitCode(), getAtomGroup(),
getAtomRank());
}
public:
uint64_t getAtomGroup() const {
#ifdef EXPERIMENTAL_KEY_INSTRUCTIONS
return AtomGroup;
#endif
return 0;
}
uint8_t getAtomRank() const {
#ifdef EXPERIMENTAL_KEY_INSTRUCTIONS
return AtomRank;
#endif
return 0;
}
public:
// Disallow replacing operands.
void replaceOperandWith(unsigned I, Metadata *New) = delete;
DEFINE_MDNODE_GET(DILocation,
(unsigned Line, unsigned Column, Metadata *Scope,
Metadata *InlinedAt = nullptr, bool ImplicitCode = false),
(Line, Column, Scope, InlinedAt, ImplicitCode))
Metadata *InlinedAt = nullptr, bool ImplicitCode = false,
uint64_t AtomGroup = 0, uint8_t AtomRank = 0),
(Line, Column, Scope, InlinedAt, ImplicitCode, AtomGroup,
AtomRank))
DEFINE_MDNODE_GET(DILocation,
(unsigned Line, unsigned Column, DILocalScope *Scope,
DILocation *InlinedAt = nullptr,
bool ImplicitCode = false),
(Line, Column, Scope, InlinedAt, ImplicitCode))
DILocation *InlinedAt = nullptr, bool ImplicitCode = false,
uint64_t AtomGroup = 0, uint8_t AtomRank = 0),
(Line, Column, Scope, InlinedAt, ImplicitCode, AtomGroup,
AtomRank))
/// Return a (temporary) clone of this.
TempDILocation clone() const { return cloneImpl(); }
@ -2511,7 +2534,8 @@ DILocation::cloneWithDiscriminator(unsigned Discriminator) const {
DILexicalBlockFile *NewScope =
DILexicalBlockFile::get(getContext(), Scope, getFile(), Discriminator);
return DILocation::get(getContext(), getLine(), getColumn(), NewScope,
getInlinedAt());
getInlinedAt(), isImplicitCode(), getAtomGroup(),
getAtomRank());
}
unsigned DILocation::getBaseDiscriminator() const {

View File

@ -5312,13 +5312,15 @@ bool LLParser::parseDILocation(MDNode *&Result, bool IsDistinct) {
OPTIONAL(column, ColumnField, ); \
REQUIRED(scope, MDField, (/* AllowNull */ false)); \
OPTIONAL(inlinedAt, MDField, ); \
OPTIONAL(isImplicitCode, MDBoolField, (false));
OPTIONAL(isImplicitCode, MDBoolField, (false)); \
OPTIONAL(atomGroup, MDUnsignedField, (0, UINT64_MAX)); \
OPTIONAL(atomRank, MDUnsignedField, (0, UINT8_MAX));
PARSE_MD_FIELDS();
#undef VISIT_MD_FIELDS
Result =
GET_OR_DISTINCT(DILocation, (Context, line.Val, column.Val, scope.Val,
inlinedAt.Val, isImplicitCode.Val));
Result = GET_OR_DISTINCT(
DILocation, (Context, line.Val, column.Val, scope.Val, inlinedAt.Val,
isImplicitCode.Val, atomGroup.Val, atomRank.Val));
return false;
}

View File

@ -2073,6 +2073,8 @@ static void writeDILocation(raw_ostream &Out, const DILocation *DL,
Printer.printMetadata("inlinedAt", DL->getRawInlinedAt());
Printer.printBool("isImplicitCode", DL->isImplicitCode(),
/* Default */ false);
Printer.printInt("atomGroup", DL->getAtomGroup());
Printer.printInt<unsigned>("atomRank", DL->getAtomRank());
Out << ")";
}

View File

@ -56,12 +56,19 @@ DebugVariableAggregate::DebugVariableAggregate(const DbgVariableIntrinsic *DVI)
DVI->getDebugLoc()->getInlinedAt()) {}
DILocation::DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
unsigned Column, ArrayRef<Metadata *> MDs,
bool ImplicitCode)
: MDNode(C, DILocationKind, Storage, MDs) {
unsigned Column, uint64_t AtomGroup, uint8_t AtomRank,
ArrayRef<Metadata *> MDs, bool ImplicitCode)
: MDNode(C, DILocationKind, Storage, MDs)
#ifdef EXPERIMENTAL_KEY_INSTRUCTIONS
,
AtomGroup(AtomGroup), AtomRank(AtomRank)
#endif
{
#ifdef EXPERIMENTAL_KEY_INSTRUCTIONS
assert(AtomRank <= 7 && "AtomRank number should fit in 3 bits");
#endif
assert((MDs.size() == 1 || MDs.size() == 2) &&
"Expected a scope and optional inlined-at");
// Set line and column.
assert(Column < (1u << 16) && "Expected 16-bit column");
@ -80,6 +87,7 @@ static void adjustColumn(unsigned &Column) {
DILocation *DILocation::getImpl(LLVMContext &Context, unsigned Line,
unsigned Column, Metadata *Scope,
Metadata *InlinedAt, bool ImplicitCode,
uint64_t AtomGroup, uint8_t AtomRank,
StorageType Storage, bool ShouldCreate) {
// Fixup column.
adjustColumn(Column);
@ -87,7 +95,8 @@ DILocation *DILocation::getImpl(LLVMContext &Context, unsigned Line,
if (Storage == Uniqued) {
if (auto *N = getUniqued(Context.pImpl->DILocations,
DILocationInfo::KeyTy(Line, Column, Scope,
InlinedAt, ImplicitCode)))
InlinedAt, ImplicitCode,
AtomGroup, AtomRank)))
return N;
if (!ShouldCreate)
return nullptr;
@ -99,8 +108,9 @@ DILocation *DILocation::getImpl(LLVMContext &Context, unsigned Line,
Ops.push_back(Scope);
if (InlinedAt)
Ops.push_back(InlinedAt);
return storeImpl(new (Ops.size(), Storage) DILocation(
Context, Storage, Line, Column, Ops, ImplicitCode),
return storeImpl(new (Ops.size(), Storage)
DILocation(Context, Storage, Line, Column, AtomGroup,
AtomRank, Ops, ImplicitCode),
Storage, Context.pImpl->DILocations);
}

View File

@ -319,23 +319,30 @@ template <> struct MDNodeKeyImpl<DILocation> {
Metadata *Scope;
Metadata *InlinedAt;
bool ImplicitCode;
uint64_t AtomGroup : 61;
uint8_t AtomRank : 3;
MDNodeKeyImpl(unsigned Line, unsigned Column, Metadata *Scope,
Metadata *InlinedAt, bool ImplicitCode)
Metadata *InlinedAt, bool ImplicitCode, uint64_t AtomGroup,
uint8_t AtomRank)
: Line(Line), Column(Column), Scope(Scope), InlinedAt(InlinedAt),
ImplicitCode(ImplicitCode) {}
ImplicitCode(ImplicitCode), AtomGroup(AtomGroup), AtomRank(AtomRank) {}
MDNodeKeyImpl(const DILocation *L)
: Line(L->getLine()), Column(L->getColumn()), Scope(L->getRawScope()),
InlinedAt(L->getRawInlinedAt()), ImplicitCode(L->isImplicitCode()) {}
InlinedAt(L->getRawInlinedAt()), ImplicitCode(L->isImplicitCode()),
AtomGroup(L->getAtomGroup()), AtomRank(L->getAtomRank()) {}
bool isKeyOf(const DILocation *RHS) const {
return Line == RHS->getLine() && Column == RHS->getColumn() &&
Scope == RHS->getRawScope() && InlinedAt == RHS->getRawInlinedAt() &&
ImplicitCode == RHS->isImplicitCode();
ImplicitCode == RHS->isImplicitCode() &&
AtomGroup == RHS->getAtomGroup() && AtomRank == RHS->getAtomRank();
}
unsigned getHashValue() const {
return hash_combine(Line, Column, Scope, InlinedAt, ImplicitCode);
return hash_combine(Line, Column, Scope, InlinedAt, ImplicitCode, AtomGroup,
AtomRank);
}
};

View File

@ -29,6 +29,7 @@ llvm_canonicalize_cmake_booleans(
LLVM_INCLUDE_SPIRV_TOOLS_TESTS
LLVM_APPEND_VC_REV
LLVM_HAS_LOGF128
LLVM_EXPERIMENTAL_KEY_INSTRUCTIONS
)
configure_lit_site_cfg(

View File

@ -0,0 +1,19 @@
; RUN: opt %s -o - -S| FileCheck %s
; CHECK: !DILocation(line: 1, column: 11, scope: ![[#]], atomGroup: 1, atomRank: 1)
define dso_local void @f() !dbg !10 {
entry:
ret void, !dbg !13
}
!llvm.module.flags = !{!3}
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 21.0.0git", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
!1 = !DIFile(filename: "test.cpp", directory: "/")
!3 = !{i32 2, !"Debug Info Version", i32 3}
!9 = !{!"clang version 21.0.0git"}
!10 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !11, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0)
!11 = !DISubroutineType(types: !12)
!12 = !{null}
!13 = !DILocation(line: 1, column: 11, scope: !10, atomGroup: 1, atomRank: 1)

View File

@ -0,0 +1,2 @@
if not config.has_key_instructions:
config.unsupported = True

View File

@ -65,6 +65,7 @@ config.spirv_tools_tests = @LLVM_INCLUDE_SPIRV_TOOLS_TESTS@
config.have_vc_rev = @LLVM_APPEND_VC_REV@
config.force_vc_rev = "@LLVM_FORCE_VC_REVISION@"
config.has_logf128 = @LLVM_HAS_LOGF128@
config.has_key_instructions = @LLVM_EXPERIMENTAL_KEY_INSTRUCTIONS@
import lit.llvm
lit.llvm.initialize(lit_config, config)