-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[KeyInstr] Add fields to DILocation behind compile time flag #133477
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2235,44 +2235,70 @@ class DISubprogram : public DILocalScope { | |
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; | ||
#else | ||
return 0; | ||
#endif | ||
} | ||
uint8_t getAtomRank() const { | ||
#ifdef EXPERIMENTAL_KEY_INSTRUCTIONS | ||
return AtomRank; | ||
#else | ||
return 0; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ditto above. |
||
#endif | ||
} | ||
|
||
// 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(); } | ||
|
@@ -2647,7 +2673,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 { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5319,20 +5319,22 @@ bool LLParser::parseSpecializedMDNode(MDNode *&N, bool IsDistinct) { | |
|
||
/// parseDILocationFields: | ||
/// ::= !DILocation(line: 43, column: 8, scope: !5, inlinedAt: !6, | ||
/// isImplicitCode: true) | ||
/// isImplicitCode: true, atomGroup: 1, atomRank: 1) | ||
bool LLParser::parseDILocation(MDNode *&Result, bool IsDistinct) { | ||
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \ | ||
OPTIONAL(line, LineField, ); \ | ||
OPTIONAL(column, ColumnField, ); \ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can't comment on the comment 6 lines above, but it'll want updating. |
||
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; | ||
} | ||
|
||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I suspect that unconditionally including these in the MDNode key may be the problem. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
if not config.has_key_instructions: | ||
config.unsupported = True |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You need to use uint64_t for both to get actual bit packing with msvc (https://c.godbolt.org/z/1f556c1zb).