2014-10-03 20:01:09 +00:00
//===- llvm/unittest/IR/DebugInfo.cpp - DebugInfo tests -------------------===//
//
2019-01-19 08:50:56 +00:00
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2014-10-03 20:01:09 +00:00
//
//===----------------------------------------------------------------------===//
2020-04-30 13:22:22 -07:00
# include "llvm/IR/DebugInfo.h"
2024-05-02 12:14:57 -07:00
# include "../lib/IR/LLVMContextImpl.h"
2021-12-03 11:01:25 -08:00
# include "llvm/ADT/APSInt.h"
2020-04-30 13:22:22 -07:00
# include "llvm/AsmParser/Parser.h"
2021-12-03 11:01:25 -08:00
# include "llvm/IR/DIBuilder.h"
2015-04-07 01:21:40 +00:00
# include "llvm/IR/DebugInfoMetadata.h"
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
# include "llvm/IR/DebugProgramInstruction.h"
2022-01-16 12:44:52 -08:00
# include "llvm/IR/IRBuilder.h"
[Instruction] Set metadata uses to undef on deletion
Summary:
Replace any extant metadata uses of a dying instruction with undef to
preserve debug info accuracy. Some alternatives include:
- Treat Instruction like any other Value, and point its extant metadata
uses to an empty ValueAsMetadata node. This makes extant dbg.value uses
trivially dead (i.e. fair game for deletion in many passes), leading to
stale dbg.values being in effect for too long.
- Call salvageDebugInfoOrMarkUndef. Not needed to make instruction removal
correct. OTOH results in wasted work in some common cases (e.g. when all
instructions in a BasicBlock are deleted).
This came up while discussing some basic cases in
https://reviews.llvm.org/D80052.
Reviewers: jmorse, TWeaver, aprantl, dexonsmith, jdoerfert
Subscribers: jholewinski, qcolombet, hiraditya, jfb, sstefan1, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D80264
2020-05-19 18:03:22 -07:00
# include "llvm/IR/IntrinsicInst.h"
2020-04-30 13:22:22 -07:00
# include "llvm/IR/LLVMContext.h"
2022-01-16 12:44:52 -08:00
# include "llvm/IR/Metadata.h"
2020-04-30 13:22:22 -07:00
# include "llvm/IR/Module.h"
# include "llvm/IR/Verifier.h"
# include "llvm/Support/SourceMgr.h"
[Instruction] Set metadata uses to undef on deletion
Summary:
Replace any extant metadata uses of a dying instruction with undef to
preserve debug info accuracy. Some alternatives include:
- Treat Instruction like any other Value, and point its extant metadata
uses to an empty ValueAsMetadata node. This makes extant dbg.value uses
trivially dead (i.e. fair game for deletion in many passes), leading to
stale dbg.values being in effect for too long.
- Call salvageDebugInfoOrMarkUndef. Not needed to make instruction removal
correct. OTOH results in wasted work in some common cases (e.g. when all
instructions in a BasicBlock are deleted).
This came up while discussing some basic cases in
https://reviews.llvm.org/D80052.
Reviewers: jmorse, TWeaver, aprantl, dexonsmith, jdoerfert
Subscribers: jholewinski, qcolombet, hiraditya, jfb, sstefan1, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D80264
2020-05-19 18:03:22 -07:00
# include "llvm/Transforms/Utils/Local.h"
2024-05-02 12:14:57 -07:00
2014-10-03 20:01:09 +00:00
# include "gtest/gtest.h"
using namespace llvm ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
extern cl : : opt < bool > UseNewDbgInfoFormat ;
2020-04-30 13:22:22 -07:00
static std : : unique_ptr < Module > parseIR ( LLVMContext & C , const char * IR ) {
SMDiagnostic Err ;
std : : unique_ptr < Module > Mod = parseAssemblyString ( IR , Err , C ) ;
if ( ! Mod )
Err . print ( " DebugInfoTest " , errs ( ) ) ;
return Mod ;
}
2014-10-03 20:01:09 +00:00
namespace {
2015-04-29 16:38:44 +00:00
TEST ( DINodeTest , getFlag ) {
2015-02-21 00:43:09 +00:00
// Some valid flags.
2015-04-29 16:38:44 +00:00
EXPECT_EQ ( DINode : : FlagPublic , DINode : : getFlag ( " DIFlagPublic " ) ) ;
EXPECT_EQ ( DINode : : FlagProtected , DINode : : getFlag ( " DIFlagProtected " ) ) ;
EXPECT_EQ ( DINode : : FlagPrivate , DINode : : getFlag ( " DIFlagPrivate " ) ) ;
EXPECT_EQ ( DINode : : FlagVector , DINode : : getFlag ( " DIFlagVector " ) ) ;
EXPECT_EQ ( DINode : : FlagRValueReference ,
DINode : : getFlag ( " DIFlagRValueReference " ) ) ;
2015-02-21 00:43:09 +00:00
// FlagAccessibility shouldn't work.
2015-04-29 16:38:44 +00:00
EXPECT_EQ ( 0u , DINode : : getFlag ( " DIFlagAccessibility " ) ) ;
2015-02-21 00:43:09 +00:00
// Some other invalid strings.
2015-04-29 16:38:44 +00:00
EXPECT_EQ ( 0u , DINode : : getFlag ( " FlagVector " ) ) ;
EXPECT_EQ ( 0u , DINode : : getFlag ( " Vector " ) ) ;
EXPECT_EQ ( 0u , DINode : : getFlag ( " other things " ) ) ;
EXPECT_EQ ( 0u , DINode : : getFlag ( " DIFlagOther " ) ) ;
2015-02-21 00:43:09 +00:00
}
2015-04-29 16:38:44 +00:00
TEST ( DINodeTest , getFlagString ) {
2015-02-21 00:43:09 +00:00
// Some valid flags.
EXPECT_EQ ( StringRef ( " DIFlagPublic " ) ,
2015-04-29 16:38:44 +00:00
DINode : : getFlagString ( DINode : : FlagPublic ) ) ;
2015-02-21 00:43:09 +00:00
EXPECT_EQ ( StringRef ( " DIFlagProtected " ) ,
2015-04-29 16:38:44 +00:00
DINode : : getFlagString ( DINode : : FlagProtected ) ) ;
2015-02-21 00:43:09 +00:00
EXPECT_EQ ( StringRef ( " DIFlagPrivate " ) ,
2015-04-29 16:38:44 +00:00
DINode : : getFlagString ( DINode : : FlagPrivate ) ) ;
2015-02-21 00:43:09 +00:00
EXPECT_EQ ( StringRef ( " DIFlagVector " ) ,
2015-04-29 16:38:44 +00:00
DINode : : getFlagString ( DINode : : FlagVector ) ) ;
2015-02-21 00:43:09 +00:00
EXPECT_EQ ( StringRef ( " DIFlagRValueReference " ) ,
2015-04-29 16:38:44 +00:00
DINode : : getFlagString ( DINode : : FlagRValueReference ) ) ;
2015-02-21 00:43:09 +00:00
// FlagAccessibility actually equals FlagPublic.
EXPECT_EQ ( StringRef ( " DIFlagPublic " ) ,
2015-04-29 16:38:44 +00:00
DINode : : getFlagString ( DINode : : FlagAccessibility ) ) ;
2015-02-21 00:43:09 +00:00
// Some other invalid flags.
2015-04-29 16:38:44 +00:00
EXPECT_EQ ( StringRef ( ) ,
DINode : : getFlagString ( DINode : : FlagPublic | DINode : : FlagVector ) ) ;
EXPECT_EQ ( StringRef ( ) , DINode : : getFlagString ( DINode : : FlagFwdDecl |
DINode : : FlagArtificial ) ) ;
2016-09-06 10:46:28 +00:00
EXPECT_EQ ( StringRef ( ) ,
DINode : : getFlagString ( static_cast < DINode : : DIFlags > ( 0xffff ) ) ) ;
2015-02-21 00:43:09 +00:00
}
2015-04-29 16:38:44 +00:00
TEST ( DINodeTest , splitFlags ) {
2015-04-07 01:21:40 +00:00
// Some valid flags.
2015-02-21 00:45:26 +00:00
# define CHECK_SPLIT(FLAGS, VECTOR, REMAINDER) \
{ \
2016-09-06 10:46:28 +00:00
SmallVector < DINode : : DIFlags , 8 > V ; \
2015-04-29 16:38:44 +00:00
EXPECT_EQ ( REMAINDER , DINode : : splitFlags ( FLAGS , V ) ) ; \
2023-01-04 08:28:45 +01:00
EXPECT_TRUE ( ArrayRef ( V ) . equals ( VECTOR ) ) ; \
2015-02-21 00:45:26 +00:00
}
2016-09-06 10:46:28 +00:00
CHECK_SPLIT ( DINode : : FlagPublic , { DINode : : FlagPublic } , DINode : : FlagZero ) ;
CHECK_SPLIT ( DINode : : FlagProtected , { DINode : : FlagProtected } , DINode : : FlagZero ) ;
CHECK_SPLIT ( DINode : : FlagPrivate , { DINode : : FlagPrivate } , DINode : : FlagZero ) ;
CHECK_SPLIT ( DINode : : FlagVector , { DINode : : FlagVector } , DINode : : FlagZero ) ;
2016-09-06 17:03:02 +00:00
CHECK_SPLIT ( DINode : : FlagRValueReference , { DINode : : FlagRValueReference } ,
DINode : : FlagZero ) ;
2016-09-06 10:46:28 +00:00
DINode : : DIFlags Flags [ ] = { DINode : : FlagFwdDecl , DINode : : FlagVector } ;
2016-09-06 17:03:02 +00:00
CHECK_SPLIT ( DINode : : FlagFwdDecl | DINode : : FlagVector , Flags ,
DINode : : FlagZero ) ;
2016-09-06 10:46:28 +00:00
CHECK_SPLIT ( DINode : : FlagZero , { } , DINode : : FlagZero ) ;
2015-02-21 00:45:26 +00:00
# undef CHECK_SPLIT
}
2020-04-30 13:22:22 -07:00
TEST ( StripTest , LoopMetadata ) {
LLVMContext C ;
std : : unique_ptr < Module > M = parseIR ( C , R " (
define void @ f ( ) ! dbg ! 5 {
ret void , ! dbg ! 10 , ! llvm . loop ! 11
}
! llvm . dbg . cu = ! { ! 0 }
! llvm . debugify = ! { ! 3 , ! 3 }
! llvm . module . flags = ! { ! 4 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C , file : ! 1 , producer : " debugify " , isOptimized : true , runtimeVersion : 0 , emissionKind : FullDebug , enums : ! 2 )
! 1 = ! DIFile ( filename : " loop.ll " , directory : " / " )
! 2 = ! { }
! 3 = ! { i32 1 }
! 4 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 5 = distinct ! DISubprogram ( name : " f " , linkageName : " f " , scope : null , file : ! 1 , line : 1 , type : ! 6 , scopeLine : 1 , spFlags : DISPFlagDefinition | DISPFlagOptimized , unit : ! 0 , retainedNodes : ! 7 )
! 6 = ! DISubroutineType ( types : ! 2 )
! 7 = ! { ! 8 }
! 8 = ! DILocalVariable ( name : " 1 " , scope : ! 5 , file : ! 1 , line : 1 , type : ! 9 )
! 9 = ! DIBasicType ( name : " ty32 " , size : 32 , encoding : DW_ATE_unsigned )
! 10 = ! DILocation ( line : 1 , column : 1 , scope : ! 5 )
! 11 = distinct ! { ! 11 , ! 10 , ! 10 }
) " );
// Look up the debug info emission kind for the CU via the loop metadata
// attached to the terminator. If, when stripping non-line table debug info,
// we update the terminator's metadata correctly, we should be able to
// observe the change in emission kind for the CU.
auto getEmissionKind = [ & ] ( ) {
Instruction & I = * M - > getFunction ( " f " ) - > getEntryBlock ( ) . getFirstNonPHI ( ) ;
MDNode * LoopMD = I . getMetadata ( LLVMContext : : MD_loop ) ;
return cast < DILocation > ( LoopMD - > getOperand ( 1 ) )
- > getScope ( )
- > getSubprogram ( )
- > getUnit ( )
- > getEmissionKind ( ) ;
} ;
EXPECT_EQ ( getEmissionKind ( ) , DICompileUnit : : FullDebug ) ;
bool Changed = stripNonLineTableDebugInfo ( * M ) ;
EXPECT_TRUE ( Changed ) ;
EXPECT_EQ ( getEmissionKind ( ) , DICompileUnit : : LineTablesOnly ) ;
bool BrokenDebugInfo = false ;
bool HardError = verifyModule ( * M , & errs ( ) , & BrokenDebugInfo ) ;
EXPECT_FALSE ( HardError ) ;
EXPECT_FALSE ( BrokenDebugInfo ) ;
}
2024-06-13 17:21:24 +01:00
TEST ( MetadataTest , DeleteInstUsedByDbgRecord ) {
[Instruction] Set metadata uses to undef on deletion
Summary:
Replace any extant metadata uses of a dying instruction with undef to
preserve debug info accuracy. Some alternatives include:
- Treat Instruction like any other Value, and point its extant metadata
uses to an empty ValueAsMetadata node. This makes extant dbg.value uses
trivially dead (i.e. fair game for deletion in many passes), leading to
stale dbg.values being in effect for too long.
- Call salvageDebugInfoOrMarkUndef. Not needed to make instruction removal
correct. OTOH results in wasted work in some common cases (e.g. when all
instructions in a BasicBlock are deleted).
This came up while discussing some basic cases in
https://reviews.llvm.org/D80052.
Reviewers: jmorse, TWeaver, aprantl, dexonsmith, jdoerfert
Subscribers: jholewinski, qcolombet, hiraditya, jfb, sstefan1, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D80264
2020-05-19 18:03:22 -07:00
LLVMContext C ;
std : : unique_ptr < Module > M = parseIR ( C , R " (
define i16 @ f ( i16 % a ) ! dbg ! 6 {
% b = add i16 % a , 1 , ! dbg ! 11
call void @ llvm . dbg . value ( metadata i16 % b , metadata ! 9 , metadata ! DIExpression ( ) ) , ! dbg ! 11
ret i16 0 , ! dbg ! 11
}
declare void @ llvm . dbg . value ( metadata , metadata , metadata ) # 0
attributes # 0 = { nounwind readnone speculatable willreturn }
! llvm . dbg . cu = ! { ! 0 }
! llvm . module . flags = ! { ! 5 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C , file : ! 1 , producer : " debugify " , isOptimized : true , runtimeVersion : 0 , emissionKind : FullDebug , enums : ! 2 )
! 1 = ! DIFile ( filename : " t.ll " , directory : " / " )
! 2 = ! { }
! 5 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 6 = distinct ! DISubprogram ( name : " foo " , linkageName : " foo " , scope : null , file : ! 1 , line : 1 , type : ! 7 , scopeLine : 1 , spFlags : DISPFlagDefinition | DISPFlagOptimized , unit : ! 0 , retainedNodes : ! 8 )
! 7 = ! DISubroutineType ( types : ! 2 )
! 8 = ! { ! 9 }
! 9 = ! DILocalVariable ( name : " 1 " , scope : ! 6 , file : ! 1 , line : 1 , type : ! 10 )
! 10 = ! DIBasicType ( name : " ty16 " , size : 16 , encoding : DW_ATE_unsigned )
! 11 = ! DILocation ( line : 1 , column : 1 , scope : ! 6 )
) " );
// Find %b = add ...
Instruction & I = * M - > getFunction ( " f " ) - > getEntryBlock ( ) . getFirstNonPHI ( ) ;
// Find the dbg.value using %b.
SmallVector < DbgValueInst * , 1 > DVIs ;
2024-06-13 17:21:24 +01:00
SmallVector < DbgVariableRecord * , 1 > DVRs ;
findDbgValues ( DVIs , & I , & DVRs ) ;
[Instruction] Set metadata uses to undef on deletion
Summary:
Replace any extant metadata uses of a dying instruction with undef to
preserve debug info accuracy. Some alternatives include:
- Treat Instruction like any other Value, and point its extant metadata
uses to an empty ValueAsMetadata node. This makes extant dbg.value uses
trivially dead (i.e. fair game for deletion in many passes), leading to
stale dbg.values being in effect for too long.
- Call salvageDebugInfoOrMarkUndef. Not needed to make instruction removal
correct. OTOH results in wasted work in some common cases (e.g. when all
instructions in a BasicBlock are deleted).
This came up while discussing some basic cases in
https://reviews.llvm.org/D80052.
Reviewers: jmorse, TWeaver, aprantl, dexonsmith, jdoerfert
Subscribers: jholewinski, qcolombet, hiraditya, jfb, sstefan1, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D80264
2020-05-19 18:03:22 -07:00
// Delete %b. The dbg.value should now point to undef.
I . eraseFromParent ( ) ;
2024-06-13 17:21:24 +01:00
EXPECT_EQ ( DVRs [ 0 ] - > getNumVariableLocationOps ( ) , 1u ) ;
EXPECT_TRUE ( isa < UndefValue > ( DVRs [ 0 ] - > getValue ( 0 ) ) ) ;
[Instruction] Set metadata uses to undef on deletion
Summary:
Replace any extant metadata uses of a dying instruction with undef to
preserve debug info accuracy. Some alternatives include:
- Treat Instruction like any other Value, and point its extant metadata
uses to an empty ValueAsMetadata node. This makes extant dbg.value uses
trivially dead (i.e. fair game for deletion in many passes), leading to
stale dbg.values being in effect for too long.
- Call salvageDebugInfoOrMarkUndef. Not needed to make instruction removal
correct. OTOH results in wasted work in some common cases (e.g. when all
instructions in a BasicBlock are deleted).
This came up while discussing some basic cases in
https://reviews.llvm.org/D80052.
Reviewers: jmorse, TWeaver, aprantl, dexonsmith, jdoerfert
Subscribers: jholewinski, qcolombet, hiraditya, jfb, sstefan1, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D80264
2020-05-19 18:03:22 -07:00
}
2023-04-25 16:21:42 +01:00
TEST ( DbgVariableIntrinsic , EmptyMDIsKillLocation ) {
LLVMContext Ctx ;
std : : unique_ptr < Module > M = parseIR ( Ctx , R " (
define dso_local void @ fun ( ) local_unnamed_addr # 0 ! dbg ! 9 {
entry :
call void @ llvm . dbg . declare ( metadata ! { } , metadata ! 13 , metadata ! DIExpression ( ) ) , ! dbg ! 16
ret void , ! dbg ! 16
}
declare void @ llvm . dbg . declare ( metadata , metadata , metadata )
! llvm . dbg . cu = ! { ! 0 }
! llvm . module . flags = ! { ! 2 , ! 3 }
! llvm . ident = ! { ! 8 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C99 , file : ! 1 , producer : " clang version 16.0.0 " , isOptimized : true , runtimeVersion : 0 , emissionKind : FullDebug , splitDebugInlining : false , nameTableKind : None )
! 1 = ! DIFile ( filename : " test.c " , directory : " / " )
! 2 = ! { i32 7 , ! " Dwarf Version " , i32 5 }
! 3 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 8 = ! { ! " clang version 16.0.0 " }
! 9 = distinct ! DISubprogram ( name : " fun " , scope : ! 1 , file : ! 1 , line : 1 , type : ! 10 , scopeLine : 1 , flags : DIFlagAllCallsDescribed , spFlags : DISPFlagDefinition | DISPFlagOptimized , unit : ! 0 , retainedNodes : ! 12 )
! 10 = ! DISubroutineType ( types : ! 11 )
! 11 = ! { null }
! 12 = ! { ! 13 }
! 13 = ! DILocalVariable ( name : " a " , scope : ! 9 , file : ! 1 , line : 1 , type : ! 14 )
! 14 = ! DIBasicType ( name : " int " , size : 32 , encoding : DW_ATE_signed )
! 16 = ! DILocation ( line : 1 , column : 21 , scope : ! 9 )
) " );
bool BrokenDebugInfo = true ;
verifyModule ( * M , & errs ( ) , & BrokenDebugInfo ) ;
ASSERT_FALSE ( BrokenDebugInfo ) ;
// Get the dbg.declare.
Function & F = * cast < Function > ( M - > getNamedValue ( " fun " ) ) ;
2024-06-13 17:21:24 +01:00
DbgVariableRecord * DbgDeclare =
cast < DbgVariableRecord > ( & * F . front ( ) . front ( ) . getDbgRecordRange ( ) . begin ( ) ) ;
2023-04-25 16:21:42 +01:00
// Check that this form counts as a "no location" marker.
EXPECT_TRUE ( DbgDeclare - > isKillLocation ( ) ) ;
}
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Duplicate of above test, but in DbgVariableRecord representation.
TEST ( MetadataTest , DeleteInstUsedByDbgVariableRecord ) {
2023-06-07 12:33:43 +01:00
LLVMContext C ;
2024-06-13 17:21:24 +01:00
bool OldDbgValueMode = UseNewDbgInfoFormat ;
UseNewDbgInfoFormat = true ;
2023-06-07 12:33:43 +01:00
std : : unique_ptr < Module > M = parseIR ( C , R " (
define i16 @ f ( i16 % a ) ! dbg ! 6 {
% b = add i16 % a , 1 , ! dbg ! 11
call void @ llvm . dbg . value ( metadata i16 % b , metadata ! 9 , metadata ! DIExpression ( ) ) , ! dbg ! 11
call void @ llvm . dbg . value ( metadata ! DIArgList ( i16 % a , i16 % b ) , metadata ! 9 , metadata ! DIExpression ( DW_OP_LLVM_arg , 0 , DW_OP_LLVM_arg , 1 , DW_OP_plus ) ) , ! dbg ! 11
ret i16 0 , ! dbg ! 11
}
declare void @ llvm . dbg . value ( metadata , metadata , metadata ) # 0
attributes # 0 = { nounwind readnone speculatable willreturn }
! llvm . dbg . cu = ! { ! 0 }
! llvm . module . flags = ! { ! 5 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C , file : ! 1 , producer : " debugify " , isOptimized : true , runtimeVersion : 0 , emissionKind : FullDebug , enums : ! 2 )
! 1 = ! DIFile ( filename : " t.ll " , directory : " / " )
! 2 = ! { }
! 5 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 6 = distinct ! DISubprogram ( name : " foo " , linkageName : " foo " , scope : null , file : ! 1 , line : 1 , type : ! 7 , scopeLine : 1 , spFlags : DISPFlagDefinition | DISPFlagOptimized , unit : ! 0 , retainedNodes : ! 8 )
! 7 = ! DISubroutineType ( types : ! 2 )
! 8 = ! { ! 9 }
! 9 = ! DILocalVariable ( name : " 1 " , scope : ! 6 , file : ! 1 , line : 1 , type : ! 10 )
! 10 = ! DIBasicType ( name : " ty16 " , size : 16 , encoding : DW_ATE_unsigned )
! 11 = ! DILocation ( line : 1 , column : 1 , scope : ! 6 )
) " );
Instruction & I = * M - > getFunction ( " f " ) - > getEntryBlock ( ) . getFirstNonPHI ( ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Find the DbgVariableRecords using %b.
2023-06-07 12:33:43 +01:00
SmallVector < DbgValueInst * , 2 > DVIs ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
SmallVector < DbgVariableRecord * , 2 > DVRs ;
findDbgValues ( DVIs , & I , & DVRs ) ;
ASSERT_EQ ( DVRs . size ( ) , 2u ) ;
2023-06-07 12:33:43 +01:00
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Delete %b. The DbgVariableRecord should now point to undef.
2023-06-07 12:33:43 +01:00
I . eraseFromParent ( ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
EXPECT_EQ ( DVRs [ 0 ] - > getNumVariableLocationOps ( ) , 1u ) ;
EXPECT_TRUE ( isa < UndefValue > ( DVRs [ 0 ] - > getVariableLocationOp ( 0 ) ) ) ;
EXPECT_TRUE ( DVRs [ 0 ] - > isKillLocation ( ) ) ;
EXPECT_EQ ( DVRs [ 1 ] - > getNumVariableLocationOps ( ) , 2u ) ;
EXPECT_TRUE ( isa < UndefValue > ( DVRs [ 1 ] - > getVariableLocationOp ( 1 ) ) ) ;
EXPECT_TRUE ( DVRs [ 1 ] - > isKillLocation ( ) ) ;
2023-06-07 12:33:43 +01:00
UseNewDbgInfoFormat = OldDbgValueMode ;
}
2023-12-05 11:59:26 +00:00
// Ensure that the order of dbg.value intrinsics returned by findDbgValues, and
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// their corresponding DbgVariableRecord representation, are consistent.
TEST ( MetadataTest , OrderingOfDbgVariableRecords ) {
2024-06-13 17:21:24 +01:00
bool OldDbgValueMode = UseNewDbgInfoFormat ;
UseNewDbgInfoFormat = false ;
2023-12-05 11:59:26 +00:00
LLVMContext C ;
std : : unique_ptr < Module > M = parseIR ( C , R " (
define i16 @ f ( i16 % a ) ! dbg ! 6 {
% b = add i16 % a , 1 , ! dbg ! 11
call void @ llvm . dbg . value ( metadata i16 % b , metadata ! 9 , metadata ! DIExpression ( ) ) , ! dbg ! 11
call void @ llvm . dbg . value ( metadata i16 % b , metadata ! 12 , metadata ! DIExpression ( ) ) , ! dbg ! 11
ret i16 0 , ! dbg ! 11
}
declare void @ llvm . dbg . value ( metadata , metadata , metadata ) # 0
attributes # 0 = { nounwind readnone speculatable willreturn }
! llvm . dbg . cu = ! { ! 0 }
! llvm . module . flags = ! { ! 5 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C , file : ! 1 , producer : " debugify " , isOptimized : true , runtimeVersion : 0 , emissionKind : FullDebug , enums : ! 2 )
! 1 = ! DIFile ( filename : " t.ll " , directory : " / " )
! 2 = ! { }
! 5 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 6 = distinct ! DISubprogram ( name : " foo " , linkageName : " foo " , scope : null , file : ! 1 , line : 1 , type : ! 7 , scopeLine : 1 , spFlags : DISPFlagDefinition | DISPFlagOptimized , unit : ! 0 , retainedNodes : ! 8 )
! 7 = ! DISubroutineType ( types : ! 2 )
! 8 = ! { ! 9 }
! 9 = ! DILocalVariable ( name : " foo " , scope : ! 6 , file : ! 1 , line : 1 , type : ! 10 )
! 10 = ! DIBasicType ( name : " ty16 " , size : 16 , encoding : DW_ATE_unsigned )
! 11 = ! DILocation ( line : 1 , column : 1 , scope : ! 6 )
! 12 = ! DILocalVariable ( name : " bar " , scope : ! 6 , file : ! 1 , line : 1 , type : ! 10 )
) " );
Instruction & I = * M - > getFunction ( " f " ) - > getEntryBlock ( ) . getFirstNonPHI ( ) ;
SmallVector < DbgValueInst * , 2 > DVIs ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
SmallVector < DbgVariableRecord * , 2 > DVRs ;
findDbgValues ( DVIs , & I , & DVRs ) ;
2023-12-05 11:59:26 +00:00
ASSERT_EQ ( DVIs . size ( ) , 2u ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
ASSERT_EQ ( DVRs . size ( ) , 0u ) ;
2023-12-05 11:59:26 +00:00
// The correct order of dbg.values is given by their use-list, which becomes
// the reverse order of creation. Thus the dbg.values should come out as
// "bar" and then "foo".
DILocalVariable * Var0 = DVIs [ 0 ] - > getVariable ( ) ;
EXPECT_TRUE ( Var0 - > getName ( ) = = " bar " ) ;
DILocalVariable * Var1 = DVIs [ 1 ] - > getVariable ( ) ;
EXPECT_TRUE ( Var1 - > getName ( ) = = " foo " ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Now try again, but in DbgVariableRecord form.
2023-12-05 11:59:26 +00:00
DVIs . clear ( ) ;
M - > convertToNewDbgValues ( ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
findDbgValues ( DVIs , & I , & DVRs ) ;
2023-12-05 11:59:26 +00:00
ASSERT_EQ ( DVIs . size ( ) , 0u ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
ASSERT_EQ ( DVRs . size ( ) , 2u ) ;
2023-12-05 11:59:26 +00:00
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
Var0 = DVRs [ 0 ] - > getVariable ( ) ;
2023-12-05 11:59:26 +00:00
EXPECT_TRUE ( Var0 - > getName ( ) = = " bar " ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
Var1 = DVRs [ 1 ] - > getVariable ( ) ;
2023-12-05 11:59:26 +00:00
EXPECT_TRUE ( Var1 - > getName ( ) = = " foo " ) ;
M - > convertFromNewDbgValues ( ) ;
UseNewDbgInfoFormat = OldDbgValueMode ;
}
2024-05-02 12:14:57 -07:00
TEST ( DIBuilder , CreateFile ) {
2022-12-01 14:14:43 +01:00
LLVMContext Ctx ;
std : : unique_ptr < Module > M ( new Module ( " MyModule " , Ctx ) ) ;
DIBuilder DIB ( * M ) ;
DIFile * F = DIB . createFile ( " main.c " , " / " ) ;
EXPECT_EQ ( std : : nullopt , F - > getSource ( ) ) ;
2022-12-20 15:53:38 -08:00
std : : optional < DIFile : : ChecksumInfo < StringRef > > Checksum ;
std : : optional < StringRef > Source ;
2022-12-01 14:14:43 +01:00
F = DIB . createFile ( " main.c " , " / " , Checksum , Source ) ;
EXPECT_EQ ( Source , F - > getSource ( ) ) ;
Source = " " ;
F = DIB . createFile ( " main.c " , " / " , Checksum , Source ) ;
EXPECT_EQ ( Source , F - > getSource ( ) ) ;
}
2020-10-28 12:26:44 -07:00
TEST ( DIBuilder , CreateFortranArrayTypeWithAttributes ) {
LLVMContext Ctx ;
std : : unique_ptr < Module > M ( new Module ( " MyModule " , Ctx ) ) ;
DIBuilder DIB ( * M ) ;
DISubrange * Subrange = DIB . getOrCreateSubrange ( 1 , 1 ) ;
SmallVector < Metadata * , 4 > Subranges ;
Subranges . push_back ( Subrange ) ;
DINodeArray Subscripts = DIB . getOrCreateArray ( Subranges ) ;
auto getDIExpression = [ & DIB ] ( int offset ) {
SmallVector < uint64_t , 4 > ops ;
ops . push_back ( llvm : : dwarf : : DW_OP_push_object_address ) ;
DIExpression : : appendOffset ( ops , offset ) ;
ops . push_back ( llvm : : dwarf : : DW_OP_deref ) ;
return DIB . createExpression ( ops ) ;
} ;
DIFile * F = DIB . createFile ( " main.c " , " / " ) ;
DICompileUnit * CU = DIB . createCompileUnit (
dwarf : : DW_LANG_C , DIB . createFile ( " main.c " , " / " ) , " llvm-c " , true , " " , 0 ) ;
DIVariable * DataLocation =
DIB . createTempGlobalVariableFwdDecl ( CU , " dl " , " _dl " , F , 1 , nullptr , true ) ;
DIExpression * Associated = getDIExpression ( 1 ) ;
DIExpression * Allocated = getDIExpression ( 2 ) ;
DIExpression * Rank = DIB . createConstantValueExpression ( 3 ) ;
DICompositeType * ArrayType = DIB . createArrayType ( 0 , 0 , nullptr , Subscripts ,
DataLocation , Associated ,
Allocated , Rank ) ;
EXPECT_TRUE ( isa_and_nonnull < DICompositeType > ( ArrayType ) ) ;
EXPECT_EQ ( ArrayType - > getRawDataLocation ( ) , DataLocation ) ;
EXPECT_EQ ( ArrayType - > getRawAssociated ( ) , Associated ) ;
EXPECT_EQ ( ArrayType - > getRawAllocated ( ) , Allocated ) ;
EXPECT_EQ ( ArrayType - > getRawRank ( ) , Rank ) ;
// Avoid memory leak.
DIVariable : : deleteTemporary ( DataLocation ) ;
}
2021-03-29 15:02:25 -07:00
TEST ( DIBuilder , CreateSetType ) {
LLVMContext Ctx ;
std : : unique_ptr < Module > M ( new Module ( " MyModule " , Ctx ) ) ;
DIBuilder DIB ( * M ) ;
2021-03-29 23:31:14 -07:00
DIScope * Scope = DISubprogram : : getDistinct (
Ctx , nullptr , " " , " " , nullptr , 0 , nullptr , 0 , nullptr , 0 , 0 ,
DINode : : FlagZero , DISubprogram : : SPFlagZero , nullptr ) ;
2021-03-29 15:02:25 -07:00
DIType * Type = DIB . createBasicType ( " Int " , 64 , dwarf : : DW_ATE_signed ) ;
DIFile * F = DIB . createFile ( " main.c " , " / " ) ;
DIDerivedType * SetType = DIB . createSetType ( Scope , " set1 " , F , 1 , 64 , 64 , Type ) ;
EXPECT_TRUE ( isa_and_nonnull < DIDerivedType > ( SetType ) ) ;
}
2022-02-11 14:38:50 -05:00
TEST ( DIBuilder , CreateStringType ) {
LLVMContext Ctx ;
std : : unique_ptr < Module > M ( new Module ( " MyModule " , Ctx ) ) ;
DIBuilder DIB ( * M ) ;
DIScope * Scope = DISubprogram : : getDistinct (
Ctx , nullptr , " " , " " , nullptr , 0 , nullptr , 0 , nullptr , 0 , 0 ,
DINode : : FlagZero , DISubprogram : : SPFlagZero , nullptr ) ;
DIFile * F = DIB . createFile ( " main.c " , " / " ) ;
StringRef StrName = " string " ;
DIVariable * StringLen = DIB . createAutoVariable ( Scope , StrName , F , 0 , nullptr ,
false , DINode : : FlagZero , 0 ) ;
auto getDIExpression = [ & DIB ] ( int offset ) {
SmallVector < uint64_t , 4 > ops ;
ops . push_back ( llvm : : dwarf : : DW_OP_push_object_address ) ;
DIExpression : : appendOffset ( ops , offset ) ;
ops . push_back ( llvm : : dwarf : : DW_OP_deref ) ;
return DIB . createExpression ( ops ) ;
} ;
DIExpression * StringLocationExp = getDIExpression ( 1 ) ;
DIStringType * StringType =
DIB . createStringType ( StrName , StringLen , StringLocationExp ) ;
EXPECT_TRUE ( isa_and_nonnull < DIStringType > ( StringType ) ) ;
EXPECT_EQ ( StringType - > getName ( ) , StrName ) ;
EXPECT_EQ ( StringType - > getStringLength ( ) , StringLen ) ;
EXPECT_EQ ( StringType - > getStringLocationExp ( ) , StringLocationExp ) ;
StringRef StrNameExp = " stringexp " ;
DIExpression * StringLengthExp = getDIExpression ( 2 ) ;
DIStringType * StringTypeExp =
DIB . createStringType ( StrNameExp , StringLengthExp , StringLocationExp ) ;
EXPECT_TRUE ( isa_and_nonnull < DIStringType > ( StringTypeExp ) ) ;
EXPECT_EQ ( StringTypeExp - > getName ( ) , StrNameExp ) ;
EXPECT_EQ ( StringTypeExp - > getStringLocationExp ( ) , StringLocationExp ) ;
EXPECT_EQ ( StringTypeExp - > getStringLengthExp ( ) , StringLengthExp ) ;
}
2021-12-03 11:01:25 -08:00
TEST ( DIBuilder , DIEnumerator ) {
LLVMContext Ctx ;
std : : unique_ptr < Module > M ( new Module ( " MyModule " , Ctx ) ) ;
DIBuilder DIB ( * M ) ;
APSInt I1 ( APInt ( 32 , 1 ) ) ;
APSInt I2 ( APInt ( 33 , 1 ) ) ;
auto * E = DIEnumerator : : get ( Ctx , I1 , I1 . isSigned ( ) , " name " ) ;
EXPECT_TRUE ( E ) ;
auto * E1 = DIEnumerator : : getIfExists ( Ctx , I1 , I1 . isSigned ( ) , " name " ) ;
EXPECT_TRUE ( E1 ) ;
auto * E2 = DIEnumerator : : getIfExists ( Ctx , I2 , I1 . isSigned ( ) , " name " ) ;
EXPECT_FALSE ( E2 ) ;
}
2022-11-23 13:32:53 +00:00
TEST ( DbgAssignIntrinsicTest , replaceVariableLocationOp ) {
LLVMContext C ;
std : : unique_ptr < Module > M = parseIR ( C , R " (
define dso_local void @ fun ( i32 % v1 , ptr % p1 , ptr % p2 ) ! dbg ! 7 {
entry :
call void @ llvm . dbg . assign ( metadata i32 % v1 , metadata ! 14 , metadata ! DIExpression ( ) , metadata ! 17 , metadata ptr % p1 , metadata ! DIExpression ( ) ) , ! dbg ! 16
ret void
}
declare void @ llvm . dbg . assign ( metadata , metadata , metadata , metadata , metadata , metadata )
! llvm . dbg . cu = ! { ! 0 }
! llvm . module . flags = ! { ! 3 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C_plus_plus_14 , file : ! 1 , producer : " clang version 14.0.0 " , isOptimized : true , runtimeVersion : 0 , emissionKind : FullDebug , splitDebugInlining : false , nameTableKind : None )
! 1 = ! DIFile ( filename : " test.cpp " , directory : " / " )
! 3 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 7 = distinct ! DISubprogram ( name : " fun " , linkageName : " fun " , scope : ! 1 , file : ! 1 , line : 2 , type : ! 8 , scopeLine : 2 , flags : DIFlagPrototyped | DIFlagAllCallsDescribed , spFlags : DISPFlagDefinition | DISPFlagOptimized , unit : ! 0 , retainedNodes : ! 11 )
! 8 = ! DISubroutineType ( types : ! 9 )
! 9 = ! { null }
! 10 = ! DIBasicType ( name : " int " , size : 32 , encoding : DW_ATE_signed )
! 11 = ! { }
! 14 = ! DILocalVariable ( name : " Local " , scope : ! 7 , file : ! 1 , line : 3 , type : ! 10 )
! 16 = ! DILocation ( line : 0 , scope : ! 7 )
! 17 = distinct ! DIAssignID ( )
) " );
// Check the test IR isn't malformed.
ASSERT_TRUE ( M ) ;
Function & Fun = * M - > getFunction ( " fun " ) ;
Value * V1 = Fun . getArg ( 0 ) ;
Value * P1 = Fun . getArg ( 1 ) ;
Value * P2 = Fun . getArg ( 2 ) ;
2024-06-13 17:21:24 +01:00
DbgVariableRecord * DbgAssign = cast < DbgVariableRecord > (
& * Fun . front ( ) . front ( ) . getDbgRecordRange ( ) . begin ( ) ) ;
ASSERT_TRUE ( V1 = = DbgAssign - > getVariableLocationOp ( 0 ) ) ;
ASSERT_TRUE ( P1 = = DbgAssign - > getAddress ( ) ) ;
2022-11-23 13:32:53 +00:00
# define TEST_REPLACE(Old, New, ExpectedValue, ExpectedAddr) \
2024-06-13 17:21:24 +01:00
DbgAssign - > replaceVariableLocationOp ( Old , New ) ; \
EXPECT_EQ ( DbgAssign - > getVariableLocationOp ( 0 ) , ExpectedValue ) ; \
EXPECT_EQ ( DbgAssign - > getAddress ( ) , ExpectedAddr ) ;
2022-11-23 13:32:53 +00:00
// Replace address only.
TEST_REPLACE ( /*Old*/ P1 , /*New*/ P2 , /*Value*/ V1 , /*Address*/ P2 ) ;
// Replace value only.
TEST_REPLACE ( /*Old*/ V1 , /*New*/ P2 , /*Value*/ P2 , /*Address*/ P2 ) ;
// Replace both.
TEST_REPLACE ( /*Old*/ P2 , /*New*/ P1 , /*Value*/ P1 , /*Address*/ P1 ) ;
2023-04-11 16:56:05 +01:00
// Replace address only, value uses a DIArgList.
// Value = {DIArgList(V1)}, Addr = P1.
2024-06-13 17:21:24 +01:00
DbgAssign - > setRawLocation ( DIArgList : : get ( C , ValueAsMetadata : : get ( V1 ) ) ) ;
DbgAssign - > setExpression ( DIExpression : : get (
2023-04-11 16:56:05 +01:00
C , { dwarf : : DW_OP_LLVM_arg , 0 , dwarf : : DW_OP_stack_value } ) ) ;
TEST_REPLACE ( /*Old*/ P1 , /*New*/ P2 , /*Value*/ V1 , /*Address*/ P2 ) ;
2022-11-23 13:32:53 +00:00
# undef TEST_REPLACE
}
2022-11-07 11:56:36 +00:00
TEST ( AssignmentTrackingTest , Utils ) {
// Test the assignment tracking utils defined in DebugInfo.h namespace at {}.
// This includes:
// getAssignmentInsts
// getAssignmentMarkers
// RAUW
// deleteAll
//
// The input IR includes two functions, fun1 and fun2. Both contain an alloca
// with a DIAssignID tag. fun1's alloca is linked to two llvm.dbg.assign
// intrinsics, one of which is for an inlined variable and appears before the
// alloca.
LLVMContext C ;
std : : unique_ptr < Module > M = parseIR ( C , R " (
define dso_local void @ fun1 ( ) ! dbg ! 7 {
entry :
call void @ llvm . dbg . assign ( metadata i32 undef , metadata ! 10 , metadata ! DIExpression ( ) , metadata ! 12 , metadata i32 undef , metadata ! DIExpression ( ) ) , ! dbg ! 13
% local = alloca i32 , align 4 , ! DIAssignID ! 12
call void @ llvm . dbg . assign ( metadata i32 undef , metadata ! 16 , metadata ! DIExpression ( ) , metadata ! 12 , metadata i32 undef , metadata ! DIExpression ( ) ) , ! dbg ! 15
ret void , ! dbg ! 15
}
define dso_local void @ fun2 ( ) ! dbg ! 17 {
entry :
% local = alloca i32 , align 4 , ! DIAssignID ! 20
call void @ llvm . dbg . assign ( metadata i32 undef , metadata ! 18 , metadata ! DIExpression ( ) , metadata ! 20 , metadata i32 undef , metadata ! DIExpression ( ) ) , ! dbg ! 19
ret void , ! dbg ! 19
}
define dso_local void @ fun3 ( ) ! dbg ! 21 {
entry :
% local = alloca i32 , align 4 , ! DIAssignID ! 24
call void @ llvm . dbg . assign ( metadata i32 undef , metadata ! 22 , metadata ! DIExpression ( ) , metadata ! 24 , metadata i32 * undef , metadata ! DIExpression ( ) ) , ! dbg ! 23
ret void
}
declare void @ llvm . dbg . assign ( metadata , metadata , metadata , metadata , metadata , metadata )
! llvm . dbg . cu = ! { ! 0 }
! llvm . module . flags = ! { ! 3 , ! 4 , ! 5 }
! llvm . ident = ! { ! 6 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C99 , file : ! 1 , producer : " clang version 14.0.0 " , isOptimized : false , runtimeVersion : 0 , emissionKind : FullDebug , enums : ! 2 , splitDebugInlining : false , nameTableKind : None )
! 1 = ! DIFile ( filename : " test.c " , directory : " / " )
! 2 = ! { }
! 3 = ! { i32 7 , ! " Dwarf Version " , i32 4 }
! 4 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 5 = ! { i32 1 , ! " wchar_size " , i32 4 }
! 6 = ! { ! " clang version 14.0.0 " }
! 7 = distinct ! DISubprogram ( name : " fun1 " , scope : ! 1 , file : ! 1 , line : 1 , type : ! 8 , scopeLine : 1 , spFlags : DISPFlagDefinition , unit : ! 0 , retainedNodes : ! 2 )
! 8 = ! DISubroutineType ( types : ! 9 )
! 9 = ! { null }
! 10 = ! DILocalVariable ( name : " local3 " , scope : ! 14 , file : ! 1 , line : 2 , type : ! 11 )
! 11 = ! DIBasicType ( name : " int " , size : 32 , encoding : DW_ATE_signed )
! 12 = distinct ! DIAssignID ( )
! 13 = ! DILocation ( line : 5 , column : 1 , scope : ! 14 , inlinedAt : ! 15 )
! 14 = distinct ! DISubprogram ( name : " inline " , scope : ! 1 , file : ! 1 , line : 1 , type : ! 8 , scopeLine : 1 , spFlags : DISPFlagDefinition , unit : ! 0 , retainedNodes : ! 2 )
! 15 = ! DILocation ( line : 3 , column : 1 , scope : ! 7 )
! 16 = ! DILocalVariable ( name : " local1 " , scope : ! 7 , file : ! 1 , line : 2 , type : ! 11 )
! 17 = distinct ! DISubprogram ( name : " fun2 " , scope : ! 1 , file : ! 1 , line : 1 , type : ! 8 , scopeLine : 1 , spFlags : DISPFlagDefinition , unit : ! 0 , retainedNodes : ! 2 )
! 18 = ! DILocalVariable ( name : " local2 " , scope : ! 17 , file : ! 1 , line : 2 , type : ! 11 )
! 19 = ! DILocation ( line : 4 , column : 1 , scope : ! 17 )
! 20 = distinct ! DIAssignID ( )
! 21 = distinct ! DISubprogram ( name : " fun3 " , scope : ! 1 , file : ! 1 , line : 1 , type : ! 8 , scopeLine : 1 , spFlags : DISPFlagDefinition , unit : ! 0 , retainedNodes : ! 2 )
! 22 = ! DILocalVariable ( name : " local4 " , scope : ! 21 , file : ! 1 , line : 2 , type : ! 11 )
! 23 = ! DILocation ( line : 4 , column : 1 , scope : ! 21 )
! 24 = distinct ! DIAssignID ( )
) " );
// Check the test IR isn't malformed.
ASSERT_TRUE ( M ) ;
Function & Fun1 = * M - > getFunction ( " fun1 " ) ;
Instruction & Alloca = * Fun1 . getEntryBlock ( ) . getFirstNonPHIOrDbg ( ) ;
// 1. Check the Instruction <-> Intrinsic mappings work in fun1.
//
// Check there are two llvm.dbg.assign intrinsics linked to Alloca.
auto CheckFun1Mapping = [ & Alloca ] ( ) {
2024-06-13 17:21:24 +01:00
auto Markers = at : : getDVRAssignmentMarkers ( & Alloca ) ;
2022-11-07 11:56:36 +00:00
EXPECT_TRUE ( std : : distance ( Markers . begin ( ) , Markers . end ( ) ) = = 2 ) ;
// Check those two entries are distinct.
2024-06-13 17:21:24 +01:00
DbgVariableRecord * First = * Markers . begin ( ) ;
DbgVariableRecord * Second = * std : : next ( Markers . begin ( ) ) ;
2022-11-07 11:56:36 +00:00
EXPECT_NE ( First , Second ) ;
// Check that we can get back to Alloca from each llvm.dbg.assign.
for ( auto * DAI : Markers ) {
auto Insts = at : : getAssignmentInsts ( DAI ) ;
// Check there is exactly one instruction linked to each intrinsic. Use
// ASSERT_TRUE because we're going to dereference the begin iterator.
ASSERT_TRUE ( std : : distance ( Insts . begin ( ) , Insts . end ( ) ) = = 1 ) ;
EXPECT_FALSE ( Insts . empty ( ) ) ;
// Check the linked instruction is Alloca.
Instruction * LinkedInst = * Insts . begin ( ) ;
EXPECT_EQ ( LinkedInst , & Alloca ) ;
}
} ;
CheckFun1Mapping ( ) ;
// 2. Check DIAssignID RAUW replaces attachments and uses.
//
DIAssignID * Old =
cast_or_null < DIAssignID > ( Alloca . getMetadata ( LLVMContext : : MD_DIAssignID ) ) ;
DIAssignID * New = DIAssignID : : getDistinct ( C ) ;
ASSERT_TRUE ( Old & & New & & New ! = Old ) ;
at : : RAUW ( Old , New ) ;
// Check fun1's alloca and intrinsics have been updated and the mapping still
// works.
EXPECT_EQ ( New , cast_or_null < DIAssignID > (
Alloca . getMetadata ( LLVMContext : : MD_DIAssignID ) ) ) ;
CheckFun1Mapping ( ) ;
// Check that fun2's alloca and intrinsic have not not been updated.
Instruction & Fun2Alloca =
* M - > getFunction ( " fun2 " ) - > getEntryBlock ( ) . getFirstNonPHIOrDbg ( ) ;
DIAssignID * Fun2ID = cast_or_null < DIAssignID > (
Fun2Alloca . getMetadata ( LLVMContext : : MD_DIAssignID ) ) ;
EXPECT_NE ( New , Fun2ID ) ;
2024-06-13 17:21:24 +01:00
auto Fun2Markers = at : : getDVRAssignmentMarkers ( & Fun2Alloca ) ;
2022-11-07 11:56:36 +00:00
ASSERT_TRUE ( std : : distance ( Fun2Markers . begin ( ) , Fun2Markers . end ( ) ) = = 1 ) ;
auto Fun2Insts = at : : getAssignmentInsts ( * Fun2Markers . begin ( ) ) ;
ASSERT_TRUE ( std : : distance ( Fun2Insts . begin ( ) , Fun2Insts . end ( ) ) = = 1 ) ;
EXPECT_EQ ( * Fun2Insts . begin ( ) , & Fun2Alloca ) ;
// 3. Check that deleting dbg.assigns from a specific instruction works.
Instruction & Fun3Alloca =
* M - > getFunction ( " fun3 " ) - > getEntryBlock ( ) . getFirstNonPHIOrDbg ( ) ;
2024-06-13 17:21:24 +01:00
auto Fun3Markers = at : : getDVRAssignmentMarkers ( & Fun3Alloca ) ;
2022-11-07 11:56:36 +00:00
ASSERT_TRUE ( std : : distance ( Fun3Markers . begin ( ) , Fun3Markers . end ( ) ) = = 1 ) ;
at : : deleteAssignmentMarkers ( & Fun3Alloca ) ;
2024-06-13 17:21:24 +01:00
Fun3Markers = at : : getDVRAssignmentMarkers ( & Fun3Alloca ) ;
2022-11-07 11:56:36 +00:00
EXPECT_EQ ( Fun3Markers . empty ( ) , true ) ;
// 4. Check that deleting works and applies only to the target function.
at : : deleteAll ( & Fun1 ) ;
// There should now only be the alloca and ret in fun1.
2022-11-07 12:33:23 +00:00
EXPECT_EQ ( Fun1 . begin ( ) - > size ( ) , 2u ) ;
2022-11-07 11:56:36 +00:00
// fun2's alloca should have the same DIAssignID and remain linked to its
// llvm.dbg.assign.
EXPECT_EQ ( Fun2ID , cast_or_null < DIAssignID > (
Fun2Alloca . getMetadata ( LLVMContext : : MD_DIAssignID ) ) ) ;
2024-06-13 17:21:24 +01:00
EXPECT_FALSE ( at : : getDVRAssignmentMarkers ( & Fun2Alloca ) . empty ( ) ) ;
2022-11-07 11:56:36 +00:00
}
2023-09-15 12:52:07 -04:00
TEST ( IRBuilder , GetSetInsertionPointWithEmptyBasicBlock ) {
LLVMContext C ;
std : : unique_ptr < BasicBlock > BB ( BasicBlock : : Create ( C , " start " ) ) ;
Module * M = new Module ( " module " , C ) ;
IRBuilder < > Builder ( BB . get ( ) ) ;
2024-10-11 05:26:03 -07:00
Function * DbgDeclare =
Intrinsic : : getOrInsertDeclaration ( M , Intrinsic : : dbg_declare ) ;
2023-09-15 12:52:07 -04:00
Value * DIV = MetadataAsValue : : get ( C , ( Metadata * ) nullptr ) ;
SmallVector < Value * , 3 > Args = { DIV , DIV , DIV } ;
Builder . CreateCall ( DbgDeclare , Args ) ;
auto IP = BB - > getFirstInsertionPt ( ) ;
2024-06-24 17:59:34 +01:00
Builder . SetInsertPoint ( BB . get ( ) , IP ) ;
2023-09-15 12:52:07 -04:00
}
2022-11-09 10:41:28 +00:00
TEST ( AssignmentTrackingTest , InstrMethods ) {
// Test the assignment tracking Instruction methods.
// This includes:
// Instruction::mergeDIAssignID
LLVMContext C ;
std : : unique_ptr < Module > M = parseIR ( C , R " (
define dso_local void @ fun ( ) # 0 ! dbg ! 8 {
entry :
% Local = alloca [ 2 x i32 ] , align 4 , ! DIAssignID ! 12
call void @ llvm . dbg . assign ( metadata i1 undef , metadata ! 13 , metadata ! DIExpression ( ) , metadata ! 12 , metadata [ 2 x i32 ] * % Local , metadata ! DIExpression ( ) ) , ! dbg ! 18
% arrayidx = getelementptr inbounds [ 2 x i32 ] , [ 2 x i32 ] * % Local , i64 0 , i64 0 , ! dbg ! 19
store i32 5 , i32 * % arrayidx , align 4 , ! dbg ! 20 , ! DIAssignID ! 21
call void @ llvm . dbg . assign ( metadata i32 5 , metadata ! 13 , metadata ! DIExpression ( DW_OP_LLVM_fragment , 0 , 32 ) , metadata ! 21 , metadata i32 * % arrayidx , metadata ! DIExpression ( ) ) , ! dbg ! 18
% arrayidx1 = getelementptr inbounds [ 2 x i32 ] , [ 2 x i32 ] * % Local , i64 0 , i64 1 , ! dbg ! 22
store i32 6 , i32 * % arrayidx1 , align 4 , ! dbg ! 23 , ! DIAssignID ! 24
call void @ llvm . dbg . assign ( metadata i32 6 , metadata ! 13 , metadata ! DIExpression ( DW_OP_LLVM_fragment , 32 , 32 ) , metadata ! 24 , metadata i32 * % arrayidx1 , metadata ! DIExpression ( ) ) , ! dbg ! 18
ret void , ! dbg ! 25
}
declare void @ llvm . dbg . assign ( metadata , metadata , metadata , metadata , metadata , metadata ) # 1
! llvm . dbg . cu = ! { ! 0 }
! llvm . module . flags = ! { ! 2 , ! 3 , ! 4 , ! 5 , ! 6 }
! llvm . ident = ! { ! 7 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C_plus_plus_14 , file : ! 1 , producer : " clang version 14.0.0 " , isOptimized : false , runtimeVersion : 0 , emissionKind : FullDebug , splitDebugInlining : false , nameTableKind : None )
! 1 = ! DIFile ( filename : " test.cpp " , directory : " / " )
! 2 = ! { i32 7 , ! " Dwarf Version " , i32 5 }
! 3 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 4 = ! { i32 1 , ! " wchar_size " , i32 4 }
! 5 = ! { i32 7 , ! " uwtable " , i32 1 }
! 6 = ! { i32 7 , ! " frame-pointer " , i32 2 }
! 7 = ! { ! " clang version 14.0.0 " }
! 8 = distinct ! DISubprogram ( name : " fun " , linkageName : " fun " , scope : ! 1 , file : ! 1 , line : 1 , type : ! 9 , scopeLine : 1 , flags : DIFlagPrototyped , spFlags : DISPFlagDefinition , unit : ! 0 , retainedNodes : ! 11 )
! 9 = ! DISubroutineType ( types : ! 10 )
! 10 = ! { null }
! 11 = ! { }
! 12 = distinct ! DIAssignID ( )
! 13 = ! DILocalVariable ( name : " Local " , scope : ! 8 , file : ! 1 , line : 2 , type : ! 14 )
! 14 = ! DICompositeType ( tag : DW_TAG_array_type , baseType : ! 15 , size : 64 , elements : ! 16 )
! 15 = ! DIBasicType ( name : " int " , size : 32 , encoding : DW_ATE_signed )
! 16 = ! { ! 17 }
! 17 = ! DISubrange ( count : 2 )
! 18 = ! DILocation ( line : 0 , scope : ! 8 )
! 19 = ! DILocation ( line : 3 , column : 3 , scope : ! 8 )
! 20 = ! DILocation ( line : 3 , column : 12 , scope : ! 8 )
! 21 = distinct ! DIAssignID ( )
! 22 = ! DILocation ( line : 4 , column : 3 , scope : ! 8 )
! 23 = ! DILocation ( line : 4 , column : 12 , scope : ! 8 )
! 24 = distinct ! DIAssignID ( )
! 25 = ! DILocation ( line : 5 , column : 1 , scope : ! 8 )
) " );
// Check the test IR isn't malformed.
ASSERT_TRUE ( M ) ;
Function & Fun = * M - > getFunction ( " fun " ) ;
SmallVector < Instruction * > Stores ;
for ( auto & BB : Fun ) {
for ( auto & I : BB ) {
if ( isa < StoreInst > ( & I ) )
Stores . push_back ( & I ) ;
}
}
// The test requires (at least) 2 stores.
ASSERT_TRUE ( Stores . size ( ) = = 2 ) ;
// Use SetVectors to check that the attachments and markers are unique
// (another test requirement).
SetVector < Metadata * > OrigIDs ;
2024-06-13 17:21:24 +01:00
SetVector < DbgVariableRecord * > Markers ;
2022-11-09 10:41:28 +00:00
for ( const Instruction * SI : Stores ) {
Metadata * ID = SI - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
ASSERT_TRUE ( OrigIDs . insert ( ID ) ) ;
ASSERT_TRUE ( ID ! = nullptr ) ;
2024-06-13 17:21:24 +01:00
auto Range = at : : getDVRAssignmentMarkers ( SI ) ;
2022-11-09 10:41:28 +00:00
ASSERT_TRUE ( std : : distance ( Range . begin ( ) , Range . end ( ) ) = = 1 ) ;
ASSERT_TRUE ( Markers . insert ( * Range . begin ( ) ) ) ;
}
// Test 1 - mergeDIAssignID.
//
// Input store0->mergeDIAssignID(store1)
// ----- -------------------------
// store0 !x store0 !x
// dbg.assign0 !x dbg.assign !x
// store1 !y store1 !x
// dbg.assign1 !y dbg.assign1 !x
{
Stores [ 0 ] - > mergeDIAssignID ( Stores [ 1 ] ) ;
// Check that the stores share the same ID.
Metadata * NewID0 = Stores [ 0 ] - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
Metadata * NewID1 = Stores [ 1 ] - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
EXPECT_NE ( NewID0 , nullptr ) ;
EXPECT_EQ ( NewID0 , NewID1 ) ;
EXPECT_EQ ( Markers [ 0 ] - > getAssignID ( ) , NewID0 ) ;
EXPECT_EQ ( Markers [ 1 ] - > getAssignID ( ) , NewID0 ) ;
}
// Test 2 - mergeDIAssignID.
//
// Input store0->mergeDIAssignID(store1)
// ----- -------------------------
// store0 !x store0 !x
// dbg.assign0 !x dbg.assign !x
// store1 store1
{
Stores [ 1 ] - > setMetadata ( LLVMContext : : MD_DIAssignID , nullptr ) ;
Stores [ 0 ] - > mergeDIAssignID ( Stores [ 1 ] ) ;
// Check that store1 doesn't get a new ID.
Metadata * NewID0 = Stores [ 0 ] - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
Metadata * NewID1 = Stores [ 1 ] - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
EXPECT_NE ( NewID0 , nullptr ) ;
EXPECT_EQ ( NewID1 , nullptr ) ;
EXPECT_EQ ( Markers [ 0 ] - > getAssignID ( ) , NewID0 ) ;
}
// Test 3 - mergeDIAssignID.
//
// Input store1->mergeDIAssignID(store0)
// ----- -------------------------
// store0 !x store0 !x
// dbg.assign0 !x dbg.assign !x
// store1 store1 !x
{
Stores [ 1 ] - > setMetadata ( LLVMContext : : MD_DIAssignID , nullptr ) ;
Stores [ 1 ] - > mergeDIAssignID ( Stores [ 0 ] ) ;
// Check that the stores share the same ID (note store1 starts with none).
Metadata * NewID0 = Stores [ 0 ] - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
Metadata * NewID1 = Stores [ 1 ] - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
EXPECT_NE ( NewID0 , nullptr ) ;
EXPECT_EQ ( NewID0 , NewID1 ) ;
EXPECT_EQ ( Markers [ 0 ] - > getAssignID ( ) , NewID0 ) ;
}
// Test 4 - mergeDIAssignID.
//
// Input store1->mergeDIAssignID(store0)
// ----- -------------------------
// store0 !x store0 !x
// dbg.assign0 !x dbg.assign !x
// store1 !x store1 !x
{
Stores [ 0 ] - > mergeDIAssignID ( Stores [ 1 ] ) ;
// Check that the stores share the same ID.
Metadata * NewID0 = Stores [ 0 ] - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
Metadata * NewID1 = Stores [ 1 ] - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
EXPECT_NE ( NewID0 , nullptr ) ;
EXPECT_EQ ( NewID0 , NewID1 ) ;
EXPECT_EQ ( Markers [ 0 ] - > getAssignID ( ) , NewID0 ) ;
}
2022-11-09 10:49:55 +00:00
// Test 5 - dropUnknownNonDebugMetadata.
//
// Input store0->dropUnknownNonDebugMetadata()
// ----- -------------------------
// store0 !x store0 !x
{
Stores [ 0 ] - > dropUnknownNonDebugMetadata ( ) ;
Metadata * NewID0 = Stores [ 0 ] - > getMetadata ( LLVMContext : : MD_DIAssignID ) ;
EXPECT_NE ( NewID0 , nullptr ) ;
}
2022-11-09 10:41:28 +00:00
}
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Test some very straight-forward operations on DbgVariableRecords -- these are
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// dbg.values that have been converted to a non-instruction format.
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
TEST ( MetadataTest , ConvertDbgToDbgVariableRecord ) {
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
LLVMContext C ;
2024-06-13 17:21:24 +01:00
bool OldDbgValueMode = UseNewDbgInfoFormat ;
UseNewDbgInfoFormat = false ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
std : : unique_ptr < Module > M = parseIR ( C , R " (
define i16 @ f ( i16 % a ) ! dbg ! 6 {
call void @ llvm . dbg . value ( metadata i16 % a , metadata ! 9 , metadata ! DIExpression ( ) ) , ! dbg ! 11
% b = add i16 % a , 1 , ! dbg ! 11
call void @ llvm . dbg . value ( metadata i16 % b , metadata ! 9 , metadata ! DIExpression ( ) ) , ! dbg ! 11
ret i16 0 , ! dbg ! 11
exit :
% c = add i16 % b , 1 , ! dbg ! 11
ret i16 0 , ! dbg ! 11
}
declare void @ llvm . dbg . value ( metadata , metadata , metadata ) # 0
attributes # 0 = { nounwind readnone speculatable willreturn }
! llvm . dbg . cu = ! { ! 0 }
! llvm . module . flags = ! { ! 5 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C , file : ! 1 , producer : " debugify " , isOptimized : true , runtimeVersion : 0 , emissionKind : FullDebug , enums : ! 2 )
! 1 = ! DIFile ( filename : " t.ll " , directory : " / " )
! 2 = ! { }
! 5 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 6 = distinct ! DISubprogram ( name : " foo " , linkageName : " foo " , scope : null , file : ! 1 , line : 1 , type : ! 7 , scopeLine : 1 , spFlags : DISPFlagDefinition | DISPFlagOptimized , unit : ! 0 , retainedNodes : ! 8 )
! 7 = ! DISubroutineType ( types : ! 2 )
! 8 = ! { ! 9 }
! 9 = ! DILocalVariable ( name : " 1 " , scope : ! 6 , file : ! 1 , line : 1 , type : ! 10 )
! 10 = ! DIBasicType ( name : " ty16 " , size : 16 , encoding : DW_ATE_unsigned )
! 11 = ! DILocation ( line : 1 , column : 1 , scope : ! 6 )
) " );
// Find the first dbg.value,
Instruction & I = * M - > getFunction ( " f " ) - > getEntryBlock ( ) . getFirstNonPHI ( ) ;
const DILocalVariable * Var = nullptr ;
const DIExpression * Expr = nullptr ;
const DILocation * Loc = nullptr ;
const Metadata * MLoc = nullptr ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
DbgVariableRecord * DVR1 = nullptr ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
{
DbgValueInst * DPI = dyn_cast < DbgValueInst > ( & I ) ;
ASSERT_TRUE ( DPI ) ;
Var = DPI - > getVariable ( ) ;
Expr = DPI - > getExpression ( ) ;
Loc = DPI - > getDebugLoc ( ) . get ( ) ;
MLoc = DPI - > getRawLocation ( ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Test the creation of a DbgVariableRecord and it's conversion back to a
// dbg.value.
DVR1 = new DbgVariableRecord ( DPI ) ;
EXPECT_EQ ( DVR1 - > getVariable ( ) , Var ) ;
EXPECT_EQ ( DVR1 - > getExpression ( ) , Expr ) ;
EXPECT_EQ ( DVR1 - > getDebugLoc ( ) . get ( ) , Loc ) ;
EXPECT_EQ ( DVR1 - > getRawLocation ( ) , MLoc ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// Erase dbg.value,
DPI - > eraseFromParent ( ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Re-create from DVR1, inserting at front.
DVR1 - > createDebugIntrinsic ( & * M ,
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
& M - > getFunction ( " f " ) - > getEntryBlock ( ) . front ( ) ) ;
Instruction * NewDPI = & M - > getFunction ( " f " ) - > getEntryBlock ( ) . front ( ) ;
DbgValueInst * DPI2 = dyn_cast < DbgValueInst > ( NewDPI ) ;
ASSERT_TRUE ( DPI2 ) ;
EXPECT_EQ ( DPI2 - > getVariable ( ) , Var ) ;
EXPECT_EQ ( DPI2 - > getExpression ( ) , Expr ) ;
EXPECT_EQ ( DPI2 - > getDebugLoc ( ) . get ( ) , Loc ) ;
EXPECT_EQ ( DPI2 - > getRawLocation ( ) , MLoc ) ;
}
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Fetch the second dbg.value, convert it to a DbgVariableRecord,
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
BasicBlock : : iterator It = M - > getFunction ( " f " ) - > getEntryBlock ( ) . begin ( ) ;
It = std : : next ( std : : next ( It ) ) ;
DbgValueInst * DPI3 = dyn_cast < DbgValueInst > ( It ) ;
ASSERT_TRUE ( DPI3 ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
DbgVariableRecord * DVR2 = new DbgVariableRecord ( DPI3 ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// These dbg.values are supposed to refer to different values.
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
EXPECT_NE ( DVR1 - > getRawLocation ( ) , DVR2 - > getRawLocation ( ) ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Try manipulating DbgVariableRecords and markers in the exit block.
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
BasicBlock * ExitBlock = & * std : : next ( M - > getFunction ( " f " ) - > getEntryBlock ( ) . getIterator ( ) ) ;
Instruction * FirstInst = & ExitBlock - > front ( ) ;
Instruction * RetInst = & * std : : next ( FirstInst - > getIterator ( ) ) ;
2024-03-20 16:00:10 +00:00
// Set-up DbgMarkers in this block.
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
ExitBlock - > IsNewDbgInfoFormat = true ;
ExitBlock - > createMarker ( FirstInst ) ;
ExitBlock - > createMarker ( RetInst ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Insert DbgRecords into markers, order should come out DVR2, DVR1.
2024-03-20 16:00:10 +00:00
FirstInst - > DebugMarker - > insertDbgRecord ( DVR1 , false ) ;
FirstInst - > DebugMarker - > insertDbgRecord ( DVR2 , true ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
unsigned int ItCount = 0 ;
2024-03-20 16:00:10 +00:00
for ( DbgRecord & Item : FirstInst - > DebugMarker - > getDbgRecordRange ( ) ) {
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
EXPECT_TRUE ( ( & Item = = DVR2 & & ItCount = = 0 ) | |
( & Item = = DVR1 & & ItCount = = 1 ) ) ;
2024-03-20 16:00:10 +00:00
EXPECT_EQ ( Item . getMarker ( ) , FirstInst - > DebugMarker ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
+ + ItCount ;
}
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Clone them onto the second marker -- should allocate new DVRs.
2024-03-20 16:00:10 +00:00
RetInst - > DebugMarker - > cloneDebugInfoFrom ( FirstInst - > DebugMarker , std : : nullopt ,
false ) ;
EXPECT_EQ ( RetInst - > DebugMarker - > StoredDbgRecords . size ( ) , 2u ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
ItCount = 0 ;
// Check these things store the same information; but that they're not the same
// objects.
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
for ( DbgVariableRecord & Item :
2024-03-20 16:00:10 +00:00
filterDbgVars ( RetInst - > DebugMarker - > getDbgRecordRange ( ) ) ) {
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
EXPECT_TRUE (
( Item . getRawLocation ( ) = = DVR2 - > getRawLocation ( ) & & ItCount = = 0 ) | |
( Item . getRawLocation ( ) = = DVR1 - > getRawLocation ( ) & & ItCount = = 1 ) ) ;
2024-02-20 16:00:55 +00:00
2024-03-20 16:00:10 +00:00
EXPECT_EQ ( Item . getMarker ( ) , RetInst - > DebugMarker ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
EXPECT_NE ( & Item , DVR1 ) ;
EXPECT_NE ( & Item , DVR2 ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
+ + ItCount ;
}
2024-03-20 16:00:10 +00:00
RetInst - > DebugMarker - > dropDbgRecords ( ) ;
EXPECT_EQ ( RetInst - > DebugMarker - > StoredDbgRecords . size ( ) , 0u ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Try cloning one single DbgVariableRecord.
2024-03-20 16:00:10 +00:00
auto DIIt = std : : next ( FirstInst - > DebugMarker - > getDbgRecordRange ( ) . begin ( ) ) ;
RetInst - > DebugMarker - > cloneDebugInfoFrom ( FirstInst - > DebugMarker , DIIt , false ) ;
EXPECT_EQ ( RetInst - > DebugMarker - > StoredDbgRecords . size ( ) , 1u ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// The second DbgVariableRecord should have been cloned; it should have the
// same values as DVR1.
EXPECT_EQ (
2024-03-20 16:00:10 +00:00
cast < DbgVariableRecord > ( RetInst - > DebugMarker - > StoredDbgRecords . begin ( ) )
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
- > getRawLocation ( ) ,
DVR1 - > getRawLocation ( ) ) ;
2024-03-13 16:39:35 +00:00
// We should be able to drop individual DbgRecords.
2024-03-20 16:00:10 +00:00
RetInst - > DebugMarker - > dropOneDbgRecord (
& * RetInst - > DebugMarker - > StoredDbgRecords . begin ( ) ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
2024-03-20 16:00:10 +00:00
// "Aborb" a DbgMarker: this means pretend that the instruction it's attached
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// to is disappearing so it needs to be transferred into "this" marker.
2024-03-20 16:00:10 +00:00
RetInst - > DebugMarker - > absorbDebugValues ( * FirstInst - > DebugMarker , true ) ;
EXPECT_EQ ( RetInst - > DebugMarker - > StoredDbgRecords . size ( ) , 2u ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Should be the DVR1 and DVR2 objects.
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
ItCount = 0 ;
2024-03-20 16:00:10 +00:00
for ( DbgRecord & Item : RetInst - > DebugMarker - > getDbgRecordRange ( ) ) {
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
EXPECT_TRUE ( ( & Item = = DVR2 & & ItCount = = 0 ) | |
( & Item = = DVR1 & & ItCount = = 1 ) ) ;
2024-03-20 16:00:10 +00:00
EXPECT_EQ ( Item . getMarker ( ) , RetInst - > DebugMarker ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
+ + ItCount ;
}
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Finally -- there are two DbgVariableRecords left over. If we remove
// evrything in the basic block, then they should sink down into the
// "TrailingDbgRecords" container for dangling debug-info. Future facilities
// will restore them back when a terminator is inserted.
2024-03-20 16:00:10 +00:00
FirstInst - > DebugMarker - > removeMarker ( ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
FirstInst - > eraseFromParent ( ) ;
2024-03-20 16:00:10 +00:00
RetInst - > DebugMarker - > removeMarker ( ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
RetInst - > eraseFromParent ( ) ;
2024-03-20 16:00:10 +00:00
DbgMarker * EndMarker = ExitBlock - > getTrailingDbgRecords ( ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
ASSERT_NE ( EndMarker , nullptr ) ;
2024-03-13 16:39:35 +00:00
EXPECT_EQ ( EndMarker - > StoredDbgRecords . size ( ) , 2u ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Test again that it's those two DbgVariableRecords, DVR1 and DVR2.
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
ItCount = 0 ;
2024-03-12 14:53:13 +00:00
for ( DbgRecord & Item : EndMarker - > getDbgRecordRange ( ) ) {
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
EXPECT_TRUE ( ( & Item = = DVR2 & & ItCount = = 0 ) | |
( & Item = = DVR1 & & ItCount = = 1 ) ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
EXPECT_EQ ( Item . getMarker ( ) , EndMarker ) ;
+ + ItCount ;
}
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// Cleanup the trailing DbgVariableRecord records and marker.
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
EndMarker - > eraseFromParent ( ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// The record of those trailing DbgVariableRecords would dangle and cause an
// assertion failure if it lived until the end of the LLVMContext.
2024-03-12 14:53:13 +00:00
ExitBlock - > deleteTrailingDbgRecords ( ) ;
2024-06-13 17:21:24 +01:00
UseNewDbgInfoFormat = OldDbgValueMode ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
}
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
TEST ( MetadataTest , DbgVariableRecordConversionRoutines ) {
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
LLVMContext C ;
2024-06-13 17:21:24 +01:00
bool OldDbgValueMode = UseNewDbgInfoFormat ;
UseNewDbgInfoFormat = false ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
std : : unique_ptr < Module > M = parseIR ( C , R " (
define i16 @ f ( i16 % a ) ! dbg ! 6 {
call void @ llvm . dbg . value ( metadata i16 % a , metadata ! 9 , metadata ! DIExpression ( ) ) , ! dbg ! 11
% b = add i16 % a , 1 , ! dbg ! 11
call void @ llvm . dbg . value ( metadata i16 % b , metadata ! 9 , metadata ! DIExpression ( ) ) , ! dbg ! 11
ret i16 0 , ! dbg ! 11
exit :
% c = add i16 % b , 1 , ! dbg ! 11
ret i16 0 , ! dbg ! 11
}
declare void @ llvm . dbg . value ( metadata , metadata , metadata ) # 0
attributes # 0 = { nounwind readnone speculatable willreturn }
! llvm . dbg . cu = ! { ! 0 }
! llvm . module . flags = ! { ! 5 }
! 0 = distinct ! DICompileUnit ( language : DW_LANG_C , file : ! 1 , producer : " debugify " , isOptimized : true , runtimeVersion : 0 , emissionKind : FullDebug , enums : ! 2 )
! 1 = ! DIFile ( filename : " t.ll " , directory : " / " )
! 2 = ! { }
! 5 = ! { i32 2 , ! " Debug Info Version " , i32 3 }
! 6 = distinct ! DISubprogram ( name : " foo " , linkageName : " foo " , scope : null , file : ! 1 , line : 1 , type : ! 7 , scopeLine : 1 , spFlags : DISPFlagDefinition | DISPFlagOptimized , unit : ! 0 , retainedNodes : ! 8 )
! 7 = ! DISubroutineType ( types : ! 2 )
! 8 = ! { ! 9 }
! 9 = ! DILocalVariable ( name : " 1 " , scope : ! 6 , file : ! 1 , line : 1 , type : ! 10 )
! 10 = ! DIBasicType ( name : " ty16 " , size : 16 , encoding : DW_ATE_unsigned )
! 11 = ! DILocation ( line : 1 , column : 1 , scope : ! 6 )
) " );
2024-06-13 17:21:24 +01:00
// For the purpose of this test, set and un-set the command line option
// corresponding to UseNewDbgInfoFormat, but only after parsing, to ensure
// that the IR starts off in the old format.
UseNewDbgInfoFormat = true ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// Check that the conversion routines and utilities between dbg.value
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// debug-info format and DbgVariableRecords works.
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
Function * F = M - > getFunction ( " f " ) ;
BasicBlock * BB1 = & F - > getEntryBlock ( ) ;
// First instruction should be a dbg.value.
EXPECT_TRUE ( isa < DbgValueInst > ( BB1 - > front ( ) ) ) ;
EXPECT_FALSE ( BB1 - > IsNewDbgInfoFormat ) ;
2024-03-20 16:00:10 +00:00
// Validating the block for DbgVariableRecords / DbgMarkers shouldn't fail --
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// there's no data stored right now.
2024-02-27 16:30:31 +00:00
bool BrokenDebugInfo = false ;
bool Error = verifyModule ( * M , & errs ( ) , & BrokenDebugInfo ) ;
EXPECT_FALSE ( Error ) ;
EXPECT_FALSE ( BrokenDebugInfo ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// Function and module should be marked as not having the new format too.
EXPECT_FALSE ( F - > IsNewDbgInfoFormat ) ;
EXPECT_FALSE ( M - > IsNewDbgInfoFormat ) ;
// Now convert.
M - > convertToNewDbgValues ( ) ;
EXPECT_TRUE ( M - > IsNewDbgInfoFormat ) ;
EXPECT_TRUE ( F - > IsNewDbgInfoFormat ) ;
EXPECT_TRUE ( BB1 - > IsNewDbgInfoFormat ) ;
// There should now be no dbg.value instructions!
// Ensure the first instruction exists, the test all of them.
EXPECT_FALSE ( isa < DbgValueInst > ( BB1 - > front ( ) ) ) ;
for ( auto & BB : * F )
for ( auto & I : BB )
EXPECT_FALSE ( isa < DbgValueInst > ( I ) ) ;
2024-03-20 16:00:10 +00:00
// There should be a DbgMarker on each of the two instructions in the entry
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// block, each containing one DbgVariableRecord.
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
EXPECT_EQ ( BB1 - > size ( ) , 2u ) ;
Instruction * FirstInst = & BB1 - > front ( ) ;
Instruction * SecondInst = FirstInst - > getNextNode ( ) ;
2024-03-20 16:00:10 +00:00
ASSERT_TRUE ( FirstInst - > DebugMarker ) ;
ASSERT_TRUE ( SecondInst - > DebugMarker ) ;
EXPECT_NE ( FirstInst - > DebugMarker , SecondInst - > DebugMarker ) ;
EXPECT_EQ ( FirstInst , FirstInst - > DebugMarker - > MarkedInstr ) ;
EXPECT_EQ ( SecondInst , SecondInst - > DebugMarker - > MarkedInstr ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
2024-03-20 16:00:10 +00:00
EXPECT_EQ ( FirstInst - > DebugMarker - > StoredDbgRecords . size ( ) , 1u ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
DbgVariableRecord * DVR1 = cast < DbgVariableRecord > (
2024-03-20 16:00:10 +00:00
& * FirstInst - > DebugMarker - > getDbgRecordRange ( ) . begin ( ) ) ;
EXPECT_EQ ( DVR1 - > getMarker ( ) , FirstInst - > DebugMarker ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// Should point at %a, an argument.
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
EXPECT_TRUE ( isa < Argument > ( DVR1 - > getVariableLocationOp ( 0 ) ) ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
2024-03-20 16:00:10 +00:00
EXPECT_EQ ( SecondInst - > DebugMarker - > StoredDbgRecords . size ( ) , 1u ) ;
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
DbgVariableRecord * DVR2 = cast < DbgVariableRecord > (
2024-03-20 16:00:10 +00:00
& * SecondInst - > DebugMarker - > getDbgRecordRange ( ) . begin ( ) ) ;
EXPECT_EQ ( DVR2 - > getMarker ( ) , SecondInst - > DebugMarker ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// Should point at FirstInst.
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
EXPECT_EQ ( DVR2 - > getVariableLocationOp ( 0 ) , FirstInst ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
2024-03-20 16:00:10 +00:00
// There should be no DbgVariableRecords / DbgMarkers in the second block, but
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
// it should be marked as being in the new format.
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
BasicBlock * BB2 = BB1 - > getNextNode ( ) ;
EXPECT_TRUE ( BB2 - > IsNewDbgInfoFormat ) ;
for ( auto & Inst : * BB2 )
// Either there should be no marker, or it should be empty.
2024-03-20 16:00:10 +00:00
EXPECT_TRUE ( ! Inst . DebugMarker | |
Inst . DebugMarker - > StoredDbgRecords . empty ( ) ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// Validating the first block should continue to not be a problem,
2024-02-27 16:30:31 +00:00
Error = verifyModule ( * M , & errs ( ) , & BrokenDebugInfo ) ;
EXPECT_FALSE ( Error ) ;
EXPECT_FALSE ( BrokenDebugInfo ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// But if we were to break something, it should be able to fire. Don't attempt
// to comprehensively test the validator, it's a smoke-test rather than a
// "proper" verification pass.
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
DVR1 - > setMarker ( nullptr ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// A marker pointing the wrong way should be an error.
2024-02-27 16:30:31 +00:00
Error = verifyModule ( * M , & errs ( ) , & BrokenDebugInfo ) ;
EXPECT_FALSE ( Error ) ;
EXPECT_TRUE ( BrokenDebugInfo ) ;
2024-03-20 16:00:10 +00:00
DVR1 - > setMarker ( FirstInst - > DebugMarker ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
[RemoveDIs][NFC] Rename DPValue -> DbgVariableRecord (#85216)
This is the major rename patch that prior patches have built towards.
The DPValue class is being renamed to DbgVariableRecord, which reflects
the updated terminology for the "final" implementation of the RemoveDI
feature. This is a pure string substitution + clang-format patch. The
only manual component of this patch was determining where to perform
these string substitutions: `DPValue` and `DPV` are almost exclusively
used for DbgRecords, *except* for:
- llvm/lib/target, where 'DP' is used to mean double-precision, and so
appears as part of .td files and in variable names. NB: There is a
single existing use of `DPValue` here that refers to debug info, which
I've manually updated.
- llvm/tools/gold, where 'LDPV' is used as a prefix for symbol
visibility enums.
Outside of these places, I've applied several basic string
substitutions, with the intent that they only affect DbgRecord-related
identifiers; I've checked them as I went through to verify this, with
reasonable confidence that there are no unintended changes that slipped
through the cracks. The substitutions applied are all case-sensitive,
and are applied in the order shown:
```
DPValue -> DbgVariableRecord
DPVal -> DbgVarRec
DPV -> DVR
```
Following the previous rename patches, it should be the case that there
are no instances of any of these strings that are meant to refer to the
general case of DbgRecords, or anything other than the DPValue class.
The idea behind this patch is therefore that pure string substitution is
correct in all cases as long as these assumptions hold.
2024-03-19 20:07:07 +00:00
DILocalVariable * DLV1 = DVR1 - > getVariable ( ) ;
DIExpression * Expr1 = DVR1 - > getExpression ( ) ;
DILocalVariable * DLV2 = DVR2 - > getVariable ( ) ;
DIExpression * Expr2 = DVR2 - > getExpression ( ) ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
// Convert everything back to the "old" format and ensure it's right.
M - > convertFromNewDbgValues ( ) ;
EXPECT_FALSE ( M - > IsNewDbgInfoFormat ) ;
EXPECT_FALSE ( F - > IsNewDbgInfoFormat ) ;
EXPECT_FALSE ( BB1 - > IsNewDbgInfoFormat ) ;
EXPECT_EQ ( BB1 - > size ( ) , 4u ) ;
ASSERT_TRUE ( isa < DbgValueInst > ( BB1 - > front ( ) ) ) ;
DbgValueInst * DVI1 = cast < DbgValueInst > ( & BB1 - > front ( ) ) ;
// These dbg.values should still point at the same places.
EXPECT_TRUE ( isa < Argument > ( DVI1 - > getVariableLocationOp ( 0 ) ) ) ;
DbgValueInst * DVI2 = cast < DbgValueInst > ( DVI1 - > getNextNode ( ) - > getNextNode ( ) ) ;
EXPECT_EQ ( DVI2 - > getVariableLocationOp ( 0 ) , FirstInst ) ;
// Check a few fields too,
EXPECT_EQ ( DVI1 - > getVariable ( ) , DLV1 ) ;
EXPECT_EQ ( DVI1 - > getExpression ( ) , Expr1 ) ;
EXPECT_EQ ( DVI2 - > getVariable ( ) , DLV2 ) ;
EXPECT_EQ ( DVI2 - > getExpression ( ) , Expr2 ) ;
2024-06-13 17:21:24 +01:00
UseNewDbgInfoFormat = OldDbgValueMode ;
Reapply 7d77bbef4ad92, adding new debug-info classes
This reverts commit 957efa4ce4f0391147cec62746e997226ee2b836.
Original commit message below -- in this follow up, I've shifted
un-necessary inclusions of DebugProgramInstruction.h into being forward
declarations (fixes clang-compile time I hope), and a memory leak in the
DebugInfoTest.cpp IR unittests.
I also tracked a compile-time regression in D154080, more explanation
there, but the result of which is hiding some of the changes behind the
EXPERIMENTAL_DEBUGINFO_ITERATORS compile-time flag. This is tested by the
"new-debug-iterators" buildbot.
[DebugInfo][RemoveDIs] Add prototype storage classes for "new" debug-info
This patch adds a variety of classes needed to record variable location
debug-info without using the existing intrinsic approach, see the rationale
at [0].
The two added files and corresponding unit tests are the majority of the
plumbing required for this, but at this point isn't accessible from the
rest of LLVM as we need to stage it into the repo gently. An overview is
that classes are added for recording variable information attached to Real
(TM) instructions, in the form of DPValues and DPMarker objects. The
metadata-uses of DPValues is plumbed into the metadata hierachy, and a
field added to class Instruction, which are all stimulated in the unit
tests. The next few patches in this series add utilities to convert to/from
this new debug-info format and add instruction/block utilities to have
debug-info automatically updated in the background when various operations
occur.
This patch was reviewed in Phab in D153990 and D154080, I've squashed them
together into this commit as there are dependencies between the two
patches, and there's little profit in landing them separately.
[0] https://discourse.llvm.org/t/rfc-instruction-api-changes-needed-to-eliminate-debug-intrinsics-from-ir/68939
2023-11-08 14:58:34 +00:00
}
2024-05-08 15:51:46 -07:00
// Test that the hashing function for DISubprograms representing methods produce
// the same result after replacing their scope (the type containing the
// subprogram) from a temporary DIType with the permanent one.
2024-05-02 12:14:57 -07:00
TEST ( DIBuilder , HashingDISubprogram ) {
LLVMContext Ctx ;
std : : unique_ptr < Module > M = std : : make_unique < Module > ( " MyModule " , Ctx ) ;
DIBuilder DIB ( * M ) ;
DIFile * F = DIB . createFile ( " main.c " , " / " ) ;
DICompileUnit * CU =
DIB . createCompileUnit ( dwarf : : DW_LANG_C , F , " Test " , false , " " , 0 ) ;
llvm : : TempDIType ForwardDeclaredType =
llvm : : TempDIType ( DIB . createReplaceableCompositeType (
llvm : : dwarf : : DW_TAG_structure_type , " MyType " , CU , F , 0 , 0 , 8 , 8 , { } ,
" UniqueIdentifier " ) ) ;
// The hashing function is different for declarations and definitions, so
// create one of each.
DISubprogram * Declaration =
DIB . createMethod ( ForwardDeclaredType . get ( ) , " MethodName " , " LinkageName " ,
F , 0 , DIB . createSubroutineType ( { } ) ) ;
DISubprogram * Definition = DIB . createFunction (
ForwardDeclaredType . get ( ) , " MethodName " , " LinkageName " , F , 0 ,
DIB . createSubroutineType ( { } ) , 0 , DINode : : FlagZero ,
llvm : : DISubprogram : : SPFlagDefinition , nullptr , Declaration ) ;
// Produce the hash with the temporary scope.
unsigned HashDeclaration =
MDNodeKeyImpl < DISubprogram > ( Declaration ) . getHashValue ( ) ;
unsigned HashDefinition =
MDNodeKeyImpl < DISubprogram > ( Definition ) . getHashValue ( ) ;
// Instantiate the real scope and replace the temporary one with it.
DICompositeType * Type = DIB . createStructType ( CU , " MyType " , F , 0 , 8 , 8 , { } , { } ,
{ } , 0 , { } , " UniqueIdentifier " ) ;
DIB . replaceTemporary ( std : : move ( ForwardDeclaredType ) , Type ) ;
// Now make sure the hashing is consistent.
unsigned HashDeclarationAfter =
MDNodeKeyImpl < DISubprogram > ( Declaration ) . getHashValue ( ) ;
unsigned HashDefinitionAfter =
MDNodeKeyImpl < DISubprogram > ( Definition ) . getHashValue ( ) ;
EXPECT_EQ ( HashDeclaration , HashDeclarationAfter ) ;
EXPECT_EQ ( HashDefinition , HashDefinitionAfter ) ;
}
2024-08-13 12:12:29 +02:00
TEST ( DIBuilder , CompositeTypes ) {
LLVMContext Ctx ;
std : : unique_ptr < Module > M = std : : make_unique < Module > ( " MyModule " , Ctx ) ;
DIBuilder DIB ( * M ) ;
DIFile * F = DIB . createFile ( " main.c " , " / " ) ;
DICompileUnit * CU =
DIB . createCompileUnit ( dwarf : : DW_LANG_C , F , " Test " , false , " " , 0 ) ;
DICompositeType * Class =
DIB . createClassType ( CU , " MyClass " , F , 0 , 8 , 8 , 0 , { } , nullptr , { } , 0 ,
nullptr , nullptr , " ClassUniqueIdentifier " ) ;
EXPECT_EQ ( Class - > getTag ( ) , dwarf : : DW_TAG_class_type ) ;
DICompositeType * Struct = DIB . createStructType (
CU , " MyStruct " , F , 0 , 8 , 8 , { } , { } , { } , 0 , { } , " StructUniqueIdentifier " ) ;
EXPECT_EQ ( Struct - > getTag ( ) , dwarf : : DW_TAG_structure_type ) ;
DICompositeType * Union = DIB . createUnionType ( CU , " MyUnion " , F , 0 , 8 , 8 , { } ,
{ } , 0 , " UnionUniqueIdentifier " ) ;
EXPECT_EQ ( Union - > getTag ( ) , dwarf : : DW_TAG_union_type ) ;
DICompositeType * Array = DIB . createArrayType ( 8 , 8 , nullptr , { } ) ;
EXPECT_EQ ( Array - > getTag ( ) , dwarf : : DW_TAG_array_type ) ;
DICompositeType * Vector = DIB . createVectorType ( 8 , 8 , nullptr , { } ) ;
EXPECT_EQ ( Vector - > getTag ( ) , dwarf : : DW_TAG_array_type ) ;
DICompositeType * Enum = DIB . createEnumerationType (
CU , " MyEnum " , F , 0 , 8 , 8 , { } , nullptr , 0 , " EnumUniqueIdentifier " ) ;
EXPECT_EQ ( Enum - > getTag ( ) , dwarf : : DW_TAG_enumeration_type ) ;
}
2014-10-03 20:01:09 +00:00
} // end namespace