@@ -861,7 +861,7 @@ class SlotTracker : public AbstractSlotTrackerStorage {
861
861
// / Add all of the metadata from an instruction.
862
862
void processInstructionMetadata (const Instruction &I);
863
863
864
- // / Add all of the metadata from an instruction .
864
+ // / Add all of the metadata from a DbgRecord .
865
865
void processDbgRecordMetadata (const DbgRecord &DPV);
866
866
};
867
867
@@ -1140,6 +1140,9 @@ void SlotTracker::processFunctionMetadata(const Function &F) {
1140
1140
1141
1141
void SlotTracker::processDbgRecordMetadata (const DbgRecord &DR) {
1142
1142
if (const DPValue *DPV = dyn_cast<const DPValue>(&DR)) {
1143
+ // Process metadata used by DbgRecords; we only specifically care about the
1144
+ // DILocalVariable, DILocation, and DIAssignID fields, as the Value and
1145
+ // Expression fields should only be printed inline and so do not use a slot.
1143
1146
CreateMetadataSlot (DPV->getVariable ());
1144
1147
if (DPV->isDbgAssign ())
1145
1148
CreateMetadataSlot (DPV->getAssignID ());
@@ -2703,6 +2706,7 @@ class AssemblyWriter {
2703
2706
void printDPValue (const DPValue &DPI);
2704
2707
void printDPLabel (const DPLabel &DPL);
2705
2708
void printDbgRecord (const DbgRecord &DPI);
2709
+ void printDbgRecordLine (const DbgRecord &DPI);
2706
2710
2707
2711
void printUseListOrder (const Value *V, const std::vector<unsigned > &Shuffle);
2708
2712
void printUseLists (const Function *F);
@@ -3885,9 +3889,6 @@ void AssemblyWriter::printTypeIdentities() {
3885
3889
3886
3890
// / printFunction - Print all aspects of a function.
3887
3891
void AssemblyWriter::printFunction (const Function *F) {
3888
- bool ConvertBack = F->IsNewDbgInfoFormat ;
3889
- if (ConvertBack)
3890
- const_cast <Function *>(F)->convertFromNewDbgValues ();
3891
3892
if (AnnotationWriter) AnnotationWriter->emitFunctionAnnot (F, Out);
3892
3893
3893
3894
if (F->isMaterializable ())
@@ -4030,8 +4031,6 @@ void AssemblyWriter::printFunction(const Function *F) {
4030
4031
Out << " }\n " ;
4031
4032
}
4032
4033
4033
- if (ConvertBack)
4034
- const_cast <Function *>(F)->convertToNewDbgValues ();
4035
4034
Machine.purgeFunction ();
4036
4035
}
4037
4036
@@ -4098,6 +4097,8 @@ void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
4098
4097
4099
4098
// Output all of the instructions in the basic block...
4100
4099
for (const Instruction &I : *BB) {
4100
+ for (const DbgRecord &DR : I.getDbgValueRange ())
4101
+ printDbgRecordLine (DR);
4101
4102
printInstructionLine (I);
4102
4103
}
4103
4104
@@ -4611,12 +4612,10 @@ void AssemblyWriter::printDbgRecord(const DbgRecord &DR) {
4611
4612
llvm_unreachable (" Unexpected DbgRecord kind" );
4612
4613
}
4613
4614
4614
- void AssemblyWriter::printDPValue (const DPValue &Value) {
4615
- // There's no formal representation of a DPValue -- print purely as a
4616
- // debugging aid.
4617
- Out << " DPValue " ;
4618
-
4619
- switch (Value.getType ()) {
4615
+ void AssemblyWriter::printDPValue (const DPValue &DPV) {
4616
+ auto WriterCtx = getContext ();
4617
+ Out << " #dbg_" ;
4618
+ switch (DPV.getType ()) {
4620
4619
case DPValue::LocationType::Value:
4621
4620
Out << " value" ;
4622
4621
break ;
@@ -4629,35 +4628,39 @@ void AssemblyWriter::printDPValue(const DPValue &Value) {
4629
4628
default :
4630
4629
llvm_unreachable (" Tried to print a DPValue with an invalid LocationType!" );
4631
4630
}
4632
- Out << " { " ;
4633
- auto WriterCtx = getContext ();
4634
- WriteAsOperandInternal (Out, Value.getRawLocation (), WriterCtx, true );
4631
+ Out << " (" ;
4632
+ WriteAsOperandInternal (Out, DPV.getRawLocation (), WriterCtx, true );
4635
4633
Out << " , " ;
4636
- WriteAsOperandInternal (Out, Value .getVariable (), WriterCtx, true );
4634
+ WriteAsOperandInternal (Out, DPV .getVariable (), WriterCtx, true );
4637
4635
Out << " , " ;
4638
- WriteAsOperandInternal (Out, Value .getExpression (), WriterCtx, true );
4636
+ WriteAsOperandInternal (Out, DPV .getExpression (), WriterCtx, true );
4639
4637
Out << " , " ;
4640
- if (Value .isDbgAssign ()) {
4641
- WriteAsOperandInternal (Out, Value .getAssignID (), WriterCtx, true );
4638
+ if (DPV .isDbgAssign ()) {
4639
+ WriteAsOperandInternal (Out, DPV .getAssignID (), WriterCtx, true );
4642
4640
Out << " , " ;
4643
- WriteAsOperandInternal (Out, Value .getRawAddress (), WriterCtx, true );
4641
+ WriteAsOperandInternal (Out, DPV .getRawAddress (), WriterCtx, true );
4644
4642
Out << " , " ;
4645
- WriteAsOperandInternal (Out, Value .getAddressExpression (), WriterCtx, true );
4643
+ WriteAsOperandInternal (Out, DPV .getAddressExpression (), WriterCtx, true );
4646
4644
Out << " , " ;
4647
4645
}
4648
- WriteAsOperandInternal (Out, Value.getDebugLoc ().get (), WriterCtx, true );
4649
- Out << " marker @" << Value.getMarker ();
4650
- Out << " }" ;
4646
+ WriteAsOperandInternal (Out, DPV.getDebugLoc ().getAsMDNode (), WriterCtx, true );
4647
+ Out << " )" ;
4648
+ }
4649
+
4650
+ // / printDbgRecordLine - Print a DbgRecord with indentation and a newline
4651
+ // / character.
4652
+ void AssemblyWriter::printDbgRecordLine (const DbgRecord &DR) {
4653
+ // Print lengthier indentation to bring out-of-line with instructions.
4654
+ Out << " " ;
4655
+ printDbgRecord (DR);
4656
+ Out << ' \n ' ;
4651
4657
}
4652
4658
4653
4659
void AssemblyWriter::printDPLabel (const DPLabel &Label) {
4654
- // There's no formal representation of a DPLabel -- print purely as
4655
- // a debugging aid.
4656
- Out << " DPLabel { " ;
4657
4660
auto WriterCtx = getContext ();
4661
+ Out << " #dbg_label(" ;
4658
4662
WriteAsOperandInternal (Out, Label.getLabel (), WriterCtx, true );
4659
- Out << " marker @" << Label.getMarker ();
4660
- Out << " }" ;
4663
+ Out << " )" ;
4661
4664
}
4662
4665
4663
4666
void AssemblyWriter::printMetadataAttachments (
@@ -4805,19 +4808,11 @@ void BasicBlock::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW,
4805
4808
4806
4809
void Module::print (raw_ostream &ROS, AssemblyAnnotationWriter *AAW,
4807
4810
bool ShouldPreserveUseListOrder, bool IsForDebug) const {
4808
- // RemoveDIs: always print with debug-info in intrinsic format.
4809
- bool ConvertAfter = IsNewDbgInfoFormat;
4810
- if (IsNewDbgInfoFormat)
4811
- const_cast <Module *>(this )->convertFromNewDbgValues ();
4812
-
4813
4811
SlotTracker SlotTable (this );
4814
4812
formatted_raw_ostream OS (ROS);
4815
4813
AssemblyWriter W (OS, SlotTable, this , AAW, IsForDebug,
4816
4814
ShouldPreserveUseListOrder);
4817
4815
W.printModule (this );
4818
-
4819
- if (ConvertAfter)
4820
- const_cast <Module *>(this )->convertToNewDbgValues ();
4821
4816
}
4822
4817
4823
4818
void NamedMDNode::print (raw_ostream &ROS, bool IsForDebug) const {
@@ -4908,8 +4903,6 @@ void DPValue::print(raw_ostream &ROS, bool IsForDebug) const {
4908
4903
4909
4904
void DPMarker::print (raw_ostream &ROS, ModuleSlotTracker &MST,
4910
4905
bool IsForDebug) const {
4911
- // There's no formal representation of a DPMarker -- print purely as a
4912
- // debugging aid.
4913
4906
formatted_raw_ostream OS (ROS);
4914
4907
SlotTracker EmptySlotTable (static_cast <const Module *>(nullptr ));
4915
4908
SlotTracker &SlotTable =
@@ -4931,8 +4924,6 @@ void DPLabel::print(raw_ostream &ROS, bool IsForDebug) const {
4931
4924
4932
4925
void DPValue::print (raw_ostream &ROS, ModuleSlotTracker &MST,
4933
4926
bool IsForDebug) const {
4934
- // There's no formal representation of a DPValue -- print purely as a
4935
- // debugging aid.
4936
4927
formatted_raw_ostream OS (ROS);
4937
4928
SlotTracker EmptySlotTable (static_cast <const Module *>(nullptr ));
4938
4929
SlotTracker &SlotTable =
@@ -4950,8 +4941,6 @@ void DPValue::print(raw_ostream &ROS, ModuleSlotTracker &MST,
4950
4941
4951
4942
void DPLabel::print (raw_ostream &ROS, ModuleSlotTracker &MST,
4952
4943
bool IsForDebug) const {
4953
- // There's no formal representation of a DbgLabelRecord -- print purely as
4954
- // a debugging aid.
4955
4944
formatted_raw_ostream OS (ROS);
4956
4945
SlotTracker EmptySlotTable (static_cast <const Module *>(nullptr ));
4957
4946
SlotTracker &SlotTable =
0 commit comments