@@ -961,18 +961,28 @@ DILexicalBlock *DIBuilder::createLexicalBlock(DIScope *Scope, DIFile *File,
961
961
962
962
DbgInstPtr DIBuilder::insertDeclare (Value *Storage, DILocalVariable *VarInfo,
963
963
DIExpression *Expr, const DILocation *DL,
964
- Instruction * InsertBefore) {
964
+ BasicBlock::iterator InsertBefore) {
965
965
return insertDeclare (Storage, VarInfo, Expr, DL, InsertBefore->getParent (),
966
966
InsertBefore);
967
967
}
968
968
969
+ DbgInstPtr DIBuilder::insertDeclare (Value *Storage, DILocalVariable *VarInfo,
970
+ DIExpression *Expr, const DILocation *DL,
971
+ Instruction *InsertBefore) {
972
+ return insertDeclare (Storage, VarInfo, Expr, DL, InsertBefore->getParent (),
973
+ InsertBefore->getIterator ());
974
+ }
975
+
969
976
DbgInstPtr DIBuilder::insertDeclare (Value *Storage, DILocalVariable *VarInfo,
970
977
DIExpression *Expr, const DILocation *DL,
971
978
BasicBlock *InsertAtEnd) {
972
979
// If this block already has a terminator then insert this intrinsic before
973
980
// the terminator. Otherwise, put it at the end of the block.
974
981
Instruction *InsertBefore = InsertAtEnd->getTerminator ();
975
- return insertDeclare (Storage, VarInfo, Expr, DL, InsertAtEnd, InsertBefore);
982
+ std::optional<BasicBlock::iterator> It = std::nullopt;
983
+ if (InsertBefore)
984
+ It = InsertBefore->getIterator ();
985
+ return insertDeclare (Storage, VarInfo, Expr, DL, InsertAtEnd, It);
976
986
}
977
987
978
988
DbgInstPtr DIBuilder::insertDbgAssign (Instruction *LinkedInstr, Value *Val,
@@ -990,8 +1000,8 @@ DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val,
990
1000
BasicBlock *InsertBB = LinkedInstr->getParent ();
991
1001
// Insert after LinkedInstr.
992
1002
BasicBlock::iterator NextIt = std::next (LinkedInstr->getIterator ());
993
- Instruction *InsertBefore = NextIt == InsertBB-> end () ? nullptr : &*NextIt ;
994
- insertDbgVariableRecord (DVR, InsertBB, InsertBefore, true );
1003
+ NextIt. setHeadBit ( true ) ;
1004
+ insertDbgVariableRecord (DVR, InsertBB, NextIt );
995
1005
return DVR;
996
1006
}
997
1007
@@ -1019,24 +1029,40 @@ DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val,
1019
1029
1020
1030
DbgInstPtr DIBuilder::insertLabel (DILabel *LabelInfo, const DILocation *DL,
1021
1031
Instruction *InsertBefore) {
1022
- return insertLabel (LabelInfo, DL,
1023
- InsertBefore ? InsertBefore->getParent () : nullptr ,
1024
- InsertBefore);
1032
+ BasicBlock *BB = InsertBefore ? InsertBefore->getParent () : nullptr ;
1033
+ std::optional<BasicBlock::iterator> It = std::nullopt;
1034
+ if (InsertBefore)
1035
+ It = InsertBefore->getIterator ();
1036
+ return insertLabel (LabelInfo, DL, BB, It);
1025
1037
}
1026
1038
1027
1039
DbgInstPtr DIBuilder::insertLabel (DILabel *LabelInfo, const DILocation *DL,
1028
1040
BasicBlock *InsertAtEnd) {
1029
- return insertLabel (LabelInfo, DL, InsertAtEnd, nullptr );
1041
+ return insertLabel (LabelInfo, DL, InsertAtEnd, std::nullopt);
1042
+ }
1043
+
1044
+ DbgInstPtr DIBuilder::insertDbgValueIntrinsic (Value *V,
1045
+ DILocalVariable *VarInfo,
1046
+ DIExpression *Expr,
1047
+ const DILocation *DL,
1048
+ BasicBlock::iterator InsertBefore) {
1049
+ BasicBlock *BB = InsertBefore->getParent ();
1050
+ DbgInstPtr DVI = insertDbgValueIntrinsic (V, VarInfo, Expr, DL, BB, InsertBefore);
1051
+ if (auto *Inst = dyn_cast<Instruction *>(DVI))
1052
+ cast<CallInst>(Inst)->setTailCall ();
1053
+ return DVI;
1030
1054
}
1031
1055
1032
1056
DbgInstPtr DIBuilder::insertDbgValueIntrinsic (Value *V,
1033
1057
DILocalVariable *VarInfo,
1034
1058
DIExpression *Expr,
1035
1059
const DILocation *DL,
1036
1060
Instruction *InsertBefore) {
1037
- DbgInstPtr DVI = insertDbgValueIntrinsic (
1038
- V, VarInfo, Expr, DL, InsertBefore ? InsertBefore->getParent () : nullptr ,
1039
- InsertBefore);
1061
+ BasicBlock *BB = InsertBefore ? InsertBefore->getParent () : nullptr ;
1062
+ std::optional<BasicBlock::iterator> It = std::nullopt;
1063
+ if (InsertBefore)
1064
+ It = InsertBefore->getIterator ();
1065
+ DbgInstPtr DVI = insertDbgValueIntrinsic (V, VarInfo, Expr, DL, BB, It);
1040
1066
if (auto *Inst = dyn_cast<Instruction *>(DVI))
1041
1067
cast<CallInst>(Inst)->setTailCall ();
1042
1068
return DVI;
@@ -1047,15 +1073,16 @@ DbgInstPtr DIBuilder::insertDbgValueIntrinsic(Value *V,
1047
1073
DIExpression *Expr,
1048
1074
const DILocation *DL,
1049
1075
BasicBlock *InsertAtEnd) {
1050
- return insertDbgValueIntrinsic (V, VarInfo, Expr, DL, InsertAtEnd, nullptr );
1076
+ return insertDbgValueIntrinsic (V, VarInfo, Expr, DL, InsertAtEnd, std::nullopt );
1051
1077
}
1052
1078
1053
1079
// / Initialize IRBuilder for inserting dbg.declare and dbg.value intrinsics.
1054
1080
// / This abstracts over the various ways to specify an insert position.
1055
1081
static void initIRBuilder (IRBuilder<> &Builder, const DILocation *DL,
1056
- BasicBlock *InsertBB, Instruction *InsertBefore) {
1082
+ BasicBlock *InsertBB,
1083
+ std::optional<BasicBlock::iterator> InsertBefore) {
1057
1084
if (InsertBefore)
1058
- Builder.SetInsertPoint (InsertBefore);
1085
+ Builder.SetInsertPoint (InsertBB, * InsertBefore);
1059
1086
else if (InsertBB)
1060
1087
Builder.SetInsertPoint (InsertBB);
1061
1088
Builder.SetCurrentDebugLocation (DL);
@@ -1072,7 +1099,9 @@ static Function *getDeclareIntrin(Module &M) {
1072
1099
1073
1100
DbgInstPtr DIBuilder::insertDbgValueIntrinsic (
1074
1101
llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr,
1075
- const DILocation *DL, BasicBlock *InsertBB, Instruction *InsertBefore) {
1102
+ const DILocation *DL, BasicBlock *InsertBB,
1103
+ std::optional<BasicBlock::iterator> InsertBefore) {
1104
+
1076
1105
if (M.IsNewDbgInfoFormat ) {
1077
1106
DbgVariableRecord *DVR =
1078
1107
DbgVariableRecord::createDbgVariableRecord (Val, VarInfo, Expr, DL);
@@ -1089,7 +1118,7 @@ DbgInstPtr DIBuilder::insertDbgValueIntrinsic(
1089
1118
DbgInstPtr DIBuilder::insertDeclare (Value *Storage, DILocalVariable *VarInfo,
1090
1119
DIExpression *Expr, const DILocation *DL,
1091
1120
BasicBlock *InsertBB,
1092
- Instruction * InsertBefore) {
1121
+ std::optional<BasicBlock::iterator> InsertBefore) {
1093
1122
assert (VarInfo && " empty or invalid DILocalVariable* passed to dbg.declare" );
1094
1123
assert (DL && " Expected debug loc" );
1095
1124
assert (DL->getScope ()->getSubprogram () ==
@@ -1119,8 +1148,7 @@ DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
1119
1148
1120
1149
void DIBuilder::insertDbgVariableRecord (DbgVariableRecord *DVR,
1121
1150
BasicBlock *InsertBB,
1122
- Instruction *InsertBefore,
1123
- bool InsertAtHead) {
1151
+ std::optional<BasicBlock::iterator> InsertBefore) {
1124
1152
assert (InsertBefore || InsertBB);
1125
1153
trackIfUnresolved (DVR->getVariable ());
1126
1154
trackIfUnresolved (DVR->getExpression ());
@@ -1129,10 +1157,9 @@ void DIBuilder::insertDbgVariableRecord(DbgVariableRecord *DVR,
1129
1157
1130
1158
BasicBlock::iterator InsertPt;
1131
1159
if (InsertBB && InsertBefore)
1132
- InsertPt = InsertBefore-> getIterator () ;
1160
+ InsertPt = * InsertBefore;
1133
1161
else if (InsertBB)
1134
1162
InsertPt = InsertBB->end ();
1135
- InsertPt.setHeadBit (InsertAtHead);
1136
1163
InsertBB->insertDbgRecordBefore (DVR, InsertPt);
1137
1164
}
1138
1165
@@ -1141,7 +1168,7 @@ Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn,
1141
1168
DIExpression *Expr,
1142
1169
const DILocation *DL,
1143
1170
BasicBlock *InsertBB,
1144
- Instruction * InsertBefore) {
1171
+ std::optional<BasicBlock::iterator> InsertBefore) {
1145
1172
assert (IntrinsicFn && " must pass a non-null intrinsic function" );
1146
1173
assert (V && " must pass a value to a dbg intrinsic" );
1147
1174
assert (VarInfo &&
@@ -1164,7 +1191,7 @@ Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn,
1164
1191
1165
1192
DbgInstPtr DIBuilder::insertLabel (DILabel *LabelInfo, const DILocation *DL,
1166
1193
BasicBlock *InsertBB,
1167
- Instruction * InsertBefore) {
1194
+ std::optional<BasicBlock::iterator> InsertBefore) {
1168
1195
assert (LabelInfo && " empty or invalid DILabel* passed to dbg.label" );
1169
1196
assert (DL && " Expected debug loc" );
1170
1197
assert (DL->getScope ()->getSubprogram () ==
@@ -1175,7 +1202,7 @@ DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
1175
1202
if (M.IsNewDbgInfoFormat ) {
1176
1203
DbgLabelRecord *DLR = new DbgLabelRecord (LabelInfo, DL);
1177
1204
if (InsertBB && InsertBefore)
1178
- InsertBB->insertDbgRecordBefore (DLR, InsertBefore-> getIterator () );
1205
+ InsertBB->insertDbgRecordBefore (DLR, * InsertBefore);
1179
1206
else if (InsertBB)
1180
1207
InsertBB->insertDbgRecordBefore (DLR, InsertBB->end ());
1181
1208
return DLR;
0 commit comments