@@ -960,6 +960,22 @@ DILexicalBlock *DIBuilder::createLexicalBlock(DIScope *Scope, DIFile *File,
960960 File, Line, Col);
961961}
962962
963+ DbgInstPtr DIBuilder::insertDeclare (Value *Storage, DILocalVariable *VarInfo,
964+ DIExpression *Expr, const DILocation *DL,
965+ Instruction *InsertBefore) {
966+ return insertDeclare (Storage, VarInfo, Expr, DL, InsertBefore->getParent (),
967+ InsertBefore);
968+ }
969+
970+ DbgInstPtr DIBuilder::insertDeclare (Value *Storage, DILocalVariable *VarInfo,
971+ DIExpression *Expr, const DILocation *DL,
972+ BasicBlock *InsertAtEnd) {
973+ // If this block already has a terminator then insert this intrinsic before
974+ // the terminator. Otherwise, put it at the end of the block.
975+ Instruction *InsertBefore = InsertAtEnd->getTerminator ();
976+ return insertDeclare (Storage, VarInfo, Expr, DL, InsertAtEnd, InsertBefore);
977+ }
978+
963979DbgInstPtr DIBuilder::insertDbgAssign (Instruction *LinkedInstr, Value *Val,
964980 DILocalVariable *SrcVar,
965981 DIExpression *ValExpr, Value *Addr,
@@ -972,10 +988,11 @@ DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val,
972988 if (M.IsNewDbgInfoFormat ) {
973989 DbgVariableRecord *DVR = DbgVariableRecord::createDVRAssign (
974990 Val, SrcVar, ValExpr, Link, Addr, AddrExpr, DL);
991+ BasicBlock *InsertBB = LinkedInstr->getParent ();
975992 // Insert after LinkedInstr.
976993 BasicBlock::iterator NextIt = std::next (LinkedInstr->getIterator ());
977- NextIt. setHeadBit ( true ) ;
978- insertDbgVariableRecord (DVR, NextIt );
994+ Instruction *InsertBefore = NextIt == InsertBB-> end () ? nullptr : &*NextIt ;
995+ insertDbgVariableRecord (DVR, InsertBB, InsertBefore, true );
979996 return DVR;
980997 }
981998
@@ -1001,11 +1018,47 @@ DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val,
10011018 return DVI;
10021019}
10031020
1021+ DbgInstPtr DIBuilder::insertLabel (DILabel *LabelInfo, const DILocation *DL,
1022+ Instruction *InsertBefore) {
1023+ return insertLabel (LabelInfo, DL,
1024+ InsertBefore ? InsertBefore->getParent () : nullptr ,
1025+ InsertBefore);
1026+ }
1027+
1028+ DbgInstPtr DIBuilder::insertLabel (DILabel *LabelInfo, const DILocation *DL,
1029+ BasicBlock *InsertAtEnd) {
1030+ return insertLabel (LabelInfo, DL, InsertAtEnd, nullptr );
1031+ }
1032+
1033+ DbgInstPtr DIBuilder::insertDbgValueIntrinsic (Value *V,
1034+ DILocalVariable *VarInfo,
1035+ DIExpression *Expr,
1036+ const DILocation *DL,
1037+ Instruction *InsertBefore) {
1038+ DbgInstPtr DVI = insertDbgValueIntrinsic (
1039+ V, VarInfo, Expr, DL, InsertBefore ? InsertBefore->getParent () : nullptr ,
1040+ InsertBefore);
1041+ if (auto *Inst = dyn_cast<Instruction *>(DVI))
1042+ cast<CallInst>(Inst)->setTailCall ();
1043+ return DVI;
1044+ }
1045+
1046+ DbgInstPtr DIBuilder::insertDbgValueIntrinsic (Value *V,
1047+ DILocalVariable *VarInfo,
1048+ DIExpression *Expr,
1049+ const DILocation *DL,
1050+ BasicBlock *InsertAtEnd) {
1051+ return insertDbgValueIntrinsic (V, VarInfo, Expr, DL, InsertAtEnd, nullptr );
1052+ }
1053+
10041054// / Initialize IRBuilder for inserting dbg.declare and dbg.value intrinsics.
10051055// / This abstracts over the various ways to specify an insert position.
10061056static void initIRBuilder (IRBuilder<> &Builder, const DILocation *DL,
1007- InsertPosition InsertPt) {
1008- Builder.SetInsertPoint (InsertPt.getBasicBlock (), InsertPt);
1057+ BasicBlock *InsertBB, Instruction *InsertBefore) {
1058+ if (InsertBefore)
1059+ Builder.SetInsertPoint (InsertBefore);
1060+ else if (InsertBB)
1061+ Builder.SetInsertPoint (InsertBB);
10091062 Builder.SetCurrentDebugLocation (DL);
10101063}
10111064
@@ -1018,28 +1071,26 @@ static Function *getDeclareIntrin(Module &M) {
10181071 return Intrinsic::getOrInsertDeclaration (&M, Intrinsic::dbg_declare);
10191072}
10201073
1021- DbgInstPtr DIBuilder::insertDbgValueIntrinsic (llvm::Value *Val,
1022- DILocalVariable *VarInfo,
1023- DIExpression *Expr,
1024- const DILocation *DL,
1025- InsertPosition InsertPt) {
1074+ DbgInstPtr DIBuilder::insertDbgValueIntrinsic (
1075+ llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr,
1076+ const DILocation *DL, BasicBlock *InsertBB, Instruction *InsertBefore) {
10261077 if (M.IsNewDbgInfoFormat ) {
10271078 DbgVariableRecord *DVR =
10281079 DbgVariableRecord::createDbgVariableRecord (Val, VarInfo, Expr, DL);
1029- insertDbgVariableRecord (DVR, InsertPt );
1080+ insertDbgVariableRecord (DVR, InsertBB, InsertBefore );
10301081 return DVR;
10311082 }
10321083
10331084 if (!ValueFn)
10341085 ValueFn = Intrinsic::getOrInsertDeclaration (&M, Intrinsic::dbg_value);
1035- auto *DVI = insertDbgIntrinsic (ValueFn, Val, VarInfo, Expr, DL, InsertPt);
1036- cast<CallInst>(DVI)->setTailCall ();
1037- return DVI;
1086+ return insertDbgIntrinsic (ValueFn, Val, VarInfo, Expr, DL, InsertBB,
1087+ InsertBefore);
10381088}
10391089
10401090DbgInstPtr DIBuilder::insertDeclare (Value *Storage, DILocalVariable *VarInfo,
10411091 DIExpression *Expr, const DILocation *DL,
1042- InsertPosition InsertPt) {
1092+ BasicBlock *InsertBB,
1093+ Instruction *InsertBefore) {
10431094 assert (VarInfo && " empty or invalid DILocalVariable* passed to dbg.declare" );
10441095 assert (DL && " Expected debug loc" );
10451096 assert (DL->getScope ()->getSubprogram () ==
@@ -1049,7 +1100,7 @@ DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
10491100 if (M.IsNewDbgInfoFormat ) {
10501101 DbgVariableRecord *DVR =
10511102 DbgVariableRecord::createDVRDeclare (Storage, VarInfo, Expr, DL);
1052- insertDbgVariableRecord (DVR, InsertPt );
1103+ insertDbgVariableRecord (DVR, InsertBB, InsertBefore );
10531104 return DVR;
10541105 }
10551106
@@ -1063,27 +1114,35 @@ DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
10631114 MetadataAsValue::get (VMContext, Expr)};
10641115
10651116 IRBuilder<> B (DL->getContext ());
1066- initIRBuilder (B, DL, InsertPt );
1117+ initIRBuilder (B, DL, InsertBB, InsertBefore );
10671118 return B.CreateCall (DeclareFn, Args);
10681119}
10691120
10701121void DIBuilder::insertDbgVariableRecord (DbgVariableRecord *DVR,
1071- InsertPosition InsertPt) {
1072- assert (InsertPt.isValid ());
1122+ BasicBlock *InsertBB,
1123+ Instruction *InsertBefore,
1124+ bool InsertAtHead) {
1125+ assert (InsertBefore || InsertBB);
10731126 trackIfUnresolved (DVR->getVariable ());
10741127 trackIfUnresolved (DVR->getExpression ());
10751128 if (DVR->isDbgAssign ())
10761129 trackIfUnresolved (DVR->getAddressExpression ());
10771130
1078- auto *BB = InsertPt.getBasicBlock ();
1079- BB->insertDbgRecordBefore (DVR, InsertPt);
1131+ BasicBlock::iterator InsertPt;
1132+ if (InsertBB && InsertBefore)
1133+ InsertPt = InsertBefore->getIterator ();
1134+ else if (InsertBB)
1135+ InsertPt = InsertBB->end ();
1136+ InsertPt.setHeadBit (InsertAtHead);
1137+ InsertBB->insertDbgRecordBefore (DVR, InsertPt);
10801138}
10811139
10821140Instruction *DIBuilder::insertDbgIntrinsic (llvm::Function *IntrinsicFn,
10831141 Value *V, DILocalVariable *VarInfo,
10841142 DIExpression *Expr,
10851143 const DILocation *DL,
1086- InsertPosition InsertPt) {
1144+ BasicBlock *InsertBB,
1145+ Instruction *InsertBefore) {
10871146 assert (IntrinsicFn && " must pass a non-null intrinsic function" );
10881147 assert (V && " must pass a value to a dbg intrinsic" );
10891148 assert (VarInfo &&
@@ -1100,12 +1159,13 @@ Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn,
11001159 MetadataAsValue::get (VMContext, Expr)};
11011160
11021161 IRBuilder<> B (DL->getContext ());
1103- initIRBuilder (B, DL, InsertPt );
1162+ initIRBuilder (B, DL, InsertBB, InsertBefore );
11041163 return B.CreateCall (IntrinsicFn, Args);
11051164}
11061165
11071166DbgInstPtr DIBuilder::insertLabel (DILabel *LabelInfo, const DILocation *DL,
1108- InsertPosition InsertPt) {
1167+ BasicBlock *InsertBB,
1168+ Instruction *InsertBefore) {
11091169 assert (LabelInfo && " empty or invalid DILabel* passed to dbg.label" );
11101170 assert (DL && " Expected debug loc" );
11111171 assert (DL->getScope ()->getSubprogram () ==
@@ -1115,10 +1175,10 @@ DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
11151175 trackIfUnresolved (LabelInfo);
11161176 if (M.IsNewDbgInfoFormat ) {
11171177 DbgLabelRecord *DLR = new DbgLabelRecord (LabelInfo, DL);
1118- if (InsertPt. isValid ()) {
1119- auto *BB = InsertPt. getBasicBlock ( );
1120- BB-> insertDbgRecordBefore (DLR, InsertPt);
1121- }
1178+ if (InsertBB && InsertBefore)
1179+ InsertBB-> insertDbgRecordBefore (DLR, InsertBefore-> getIterator () );
1180+ else if (InsertBB)
1181+ InsertBB-> insertDbgRecordBefore (DLR, InsertBB-> end ());
11221182 return DLR;
11231183 }
11241184
@@ -1128,7 +1188,7 @@ DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
11281188 Value *Args[] = {MetadataAsValue::get (VMContext, LabelInfo)};
11291189
11301190 IRBuilder<> B (DL->getContext ());
1131- initIRBuilder (B, DL, InsertPt );
1191+ initIRBuilder (B, DL, InsertBB, InsertBefore );
11321192 return B.CreateCall (LabelFn, Args);
11331193}
11341194
0 commit comments