[llvm] r235041 - DebugInfo: Require a DebugLoc in DIBuilder::insertDeclare()

Duncan P. N. Exon Smith dexonsmith at apple.com
Wed Apr 15 15:22:04 PDT 2015


> On 2015-Apr-15, at 14:18, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
> 
> Author: dexonsmith
> Date: Wed Apr 15 16:18:07 2015
> New Revision: 235041
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=235041&view=rev
> Log:
> DebugInfo: Require a DebugLoc in DIBuilder::insertDeclare()
> 
> Change `DIBuilder::insertDeclare()` and `insertDbgValueIntrinsic()` to
> take an `MDLocation*`/`DebugLoc` parameter which it attaches to the
> created intrinsic.  Assert at creation time that the `scope:` field's
> subprogram matches the variable's.  There's a matching `clang` commit to
> use the API.
> 
> The context for this is PR22778, which is removing the `inlinedAt:`
> field from `MDLocalVariable`, instead deferring to the `!dbg` location
> attached to the debug info intrinsic.  The best way to ensure we always
> have a `!dbg` attachment is to require one at creation time.  I'll be
> adding verifier checks next, but this API change is the best way to
> shake out frontend bugs.
> 
> Note: I added an `llvm_unreachable()` in `bindings/go` and passed in
> `nullptr` for the `DebugLoc`.  The `llgo` folks will eventually need to
> pass a valid `DebugLoc` here.

@Peter, I wasn't sure whether you'd rather a build failure or a runtime
failure here.

> 
> Modified:
>    llvm/trunk/bindings/go/llvm/DIBuilderBindings.cpp
>    llvm/trunk/include/llvm/IR/DIBuilder.h
>    llvm/trunk/lib/IR/DIBuilder.cpp
>    llvm/trunk/lib/Transforms/Scalar/SROA.cpp
>    llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp
>    llvm/trunk/lib/Transforms/Utils/Local.cpp
>    llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
> 
> Modified: llvm/trunk/bindings/go/llvm/DIBuilderBindings.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/go/llvm/DIBuilderBindings.cpp?rev=235041&r1=235040&r2=235041&view=diff
> ==============================================================================
> --- llvm/trunk/bindings/go/llvm/DIBuilderBindings.cpp (original)
> +++ llvm/trunk/bindings/go/llvm/DIBuilderBindings.cpp Wed Apr 15 16:18:07 2015
> @@ -234,10 +234,14 @@ LLVMValueRef LLVMDIBuilderInsertDeclareA
>                                              LLVMMetadataRef VarInfo,
>                                              LLVMMetadataRef Expr,
>                                              LLVMBasicBlockRef Block) {
> +  // Fail immediately here until the llgo folks update their bindings.  The
> +  // called function is going to assert out anyway.
> +  llvm_unreachable("DIBuilder API change requires a DebugLoc");
> +
>   DIBuilder *D = unwrap(Dref);
> -  Instruction *Instr =
> -      D->insertDeclare(unwrap(Storage), unwrap<MDLocalVariable>(VarInfo),
> -                       unwrap<MDExpression>(Expr), unwrap(Block));
> +  Instruction *Instr = D->insertDeclare(
> +      unwrap(Storage), unwrap<MDLocalVariable>(VarInfo),
> +      unwrap<MDExpression>(Expr), /* DebugLoc */ nullptr, unwrap(Block));
>   return wrap(Instr);
> }
> 
> @@ -246,9 +250,13 @@ LLVMValueRef LLVMDIBuilderInsertValueAtE
>                                            LLVMMetadataRef VarInfo,
>                                            LLVMMetadataRef Expr,
>                                            LLVMBasicBlockRef Block) {
> +  // Fail immediately here until the llgo folks update their bindings.  The
> +  // called function is going to assert out anyway.
> +  llvm_unreachable("DIBuilder API change requires a DebugLoc");
> +
>   DIBuilder *D = unwrap(Dref);
>   Instruction *Instr = D->insertDbgValueIntrinsic(
>       unwrap(Val), Offset, unwrap<MDLocalVariable>(VarInfo),
> -      unwrap<MDExpression>(Expr), unwrap(Block));
> +      unwrap<MDExpression>(Expr), /* DebugLoc */ nullptr, unwrap(Block));
>   return wrap(Instr);
> }
> 
> Modified: llvm/trunk/include/llvm/IR/DIBuilder.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DIBuilder.h?rev=235041&r1=235040&r2=235041&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/DIBuilder.h (original)
> +++ llvm/trunk/include/llvm/IR/DIBuilder.h Wed Apr 15 16:18:07 2015
> @@ -656,26 +656,32 @@ namespace llvm {
>     /// @param Storage     llvm::Value of the variable
>     /// @param VarInfo     Variable's debug info descriptor.
>     /// @param Expr         A complex location expression.
> +    /// @param DL           Debug info location.
>     /// @param InsertAtEnd Location for the new intrinsic.
>     Instruction *insertDeclare(llvm::Value *Storage, DIVariable VarInfo,
> -                               DIExpression Expr, BasicBlock *InsertAtEnd);
> +                               DIExpression Expr, const MDLocation *DL,
> +                               BasicBlock *InsertAtEnd);
> 
>     /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
>     /// @param Storage      llvm::Value of the variable
>     /// @param VarInfo      Variable's debug info descriptor.
>     /// @param Expr         A complex location expression.
> +    /// @param DL           Debug info location.
>     /// @param InsertBefore Location for the new intrinsic.
>     Instruction *insertDeclare(llvm::Value *Storage, DIVariable VarInfo,
> -                               DIExpression Expr, Instruction *InsertBefore);
> +                               DIExpression Expr, const MDLocation *DL,
> +                               Instruction *InsertBefore);
> 
>     /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
>     /// @param Val          llvm::Value of the variable
>     /// @param Offset       Offset
>     /// @param VarInfo      Variable's debug info descriptor.
>     /// @param Expr         A complex location expression.
> +    /// @param DL           Debug info location.
>     /// @param InsertAtEnd Location for the new intrinsic.
>     Instruction *insertDbgValueIntrinsic(llvm::Value *Val, uint64_t Offset,
>                                          DIVariable VarInfo, DIExpression Expr,
> +                                         const MDLocation *DL,
>                                          BasicBlock *InsertAtEnd);
> 
>     /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
> @@ -683,9 +689,11 @@ namespace llvm {
>     /// @param Offset       Offset
>     /// @param VarInfo      Variable's debug info descriptor.
>     /// @param Expr         A complex location expression.
> +    /// @param DL           Debug info location.
>     /// @param InsertBefore Location for the new intrinsic.
>     Instruction *insertDbgValueIntrinsic(llvm::Value *Val, uint64_t Offset,
>                                          DIVariable VarInfo, DIExpression Expr,
> +                                         const MDLocation *DL,
>                                          Instruction *InsertBefore);
> 
>     /// \brief Replace the vtable holder in the given composite type.
> 
> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=235041&r1=235040&r2=235041&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
> +++ llvm/trunk/lib/IR/DIBuilder.cpp Wed Apr 15 16:18:07 2015
> @@ -761,10 +761,19 @@ static Value *getDbgIntrinsicValueImpl(L
>   return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
> }
> 
> +static Instruction *withDebugLoc(Instruction *I, const MDLocation *DL) {
> +  I->setDebugLoc(const_cast<MDLocation *>(DL));
> +  return I;
> +}
> +
> Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
> -                                      DIExpression Expr,
> +                                      DIExpression Expr, const MDLocation *DL,
>                                       Instruction *InsertBefore) {
>   assert(VarInfo && "empty or invalid DIVariable passed to dbg.declare");
> +  assert(DL && "Expected debug loc");
> +  assert(DL->getScope()->getSubprogram() ==
> +             VarInfo->getScope()->getSubprogram() &&
> +         "Expected matching subprograms");
>   if (!DeclareFn)
>     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
> 
> @@ -773,13 +782,17 @@ Instruction *DIBuilder::insertDeclare(Va
>   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
>                    MetadataAsValue::get(VMContext, VarInfo),
>                    MetadataAsValue::get(VMContext, Expr)};
> -  return CallInst::Create(DeclareFn, Args, "", InsertBefore);
> +  return withDebugLoc(CallInst::Create(DeclareFn, Args, "", InsertBefore), DL);
> }
> 
> Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
> -                                      DIExpression Expr,
> +                                      DIExpression Expr, const MDLocation *DL,
>                                       BasicBlock *InsertAtEnd) {
>   assert(VarInfo && "empty or invalid DIVariable passed to dbg.declare");
> +  assert(DL && "Expected debug loc");
> +  assert(DL->getScope()->getSubprogram() ==
> +             VarInfo->getScope()->getSubprogram() &&
> +         "Expected matching subprograms");
>   if (!DeclareFn)
>     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
> 
> @@ -792,17 +805,21 @@ Instruction *DIBuilder::insertDeclare(Va
>   // If this block already has a terminator then insert this intrinsic
>   // before the terminator.
>   if (TerminatorInst *T = InsertAtEnd->getTerminator())
> -    return CallInst::Create(DeclareFn, Args, "", T);
> -  else
> -    return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
> +    return withDebugLoc(CallInst::Create(DeclareFn, Args, "", T), DL);
> +  return withDebugLoc(CallInst::Create(DeclareFn, Args, "", InsertAtEnd), DL);
> }
> 
> Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
>                                                 DIVariable VarInfo,
>                                                 DIExpression Expr,
> +                                                const MDLocation *DL,
>                                                 Instruction *InsertBefore) {
>   assert(V && "no value passed to dbg.value");
>   assert(VarInfo && "empty or invalid DIVariable passed to dbg.value");
> +  assert(DL && "Expected debug loc");
> +  assert(DL->getScope()->getSubprogram() ==
> +             VarInfo->getScope()->getSubprogram() &&
> +         "Expected matching subprograms");
>   if (!ValueFn)
>     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
> 
> @@ -812,15 +829,20 @@ Instruction *DIBuilder::insertDbgValueIn
>                    ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
>                    MetadataAsValue::get(VMContext, VarInfo),
>                    MetadataAsValue::get(VMContext, Expr)};
> -  return CallInst::Create(ValueFn, Args, "", InsertBefore);
> +  return withDebugLoc(CallInst::Create(ValueFn, Args, "", InsertBefore), DL);
> }
> 
> Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
>                                                 DIVariable VarInfo,
>                                                 DIExpression Expr,
> +                                                const MDLocation *DL,
>                                                 BasicBlock *InsertAtEnd) {
>   assert(V && "no value passed to dbg.value");
>   assert(VarInfo && "empty or invalid DIVariable passed to dbg.value");
> +  assert(DL && "Expected debug loc");
> +  assert(DL->getScope()->getSubprogram() ==
> +             VarInfo->getScope()->getSubprogram() &&
> +         "Expected matching subprograms");
>   if (!ValueFn)
>     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
> 
> @@ -830,7 +852,8 @@ Instruction *DIBuilder::insertDbgValueIn
>                    ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
>                    MetadataAsValue::get(VMContext, VarInfo),
>                    MetadataAsValue::get(VMContext, Expr)};
> -  return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
> +
> +  return withDebugLoc(CallInst::Create(ValueFn, Args, "", InsertAtEnd), DL);
> }
> 
> void DIBuilder::replaceVTableHolder(DICompositeType &T, DICompositeType VTableHolder) {
> 
> Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=235041&r1=235040&r2=235041&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Wed Apr 15 16:18:07 2015
> @@ -1166,10 +1166,9 @@ public:
>       } else {
>         continue;
>       }
> -      Instruction *DbgVal =
> -          DIB.insertDbgValueIntrinsic(Arg, 0, DIVariable(DVI->getVariable()),
> -                                      DIExpression(DVI->getExpression()), Inst);
> -      DbgVal->setDebugLoc(DVI->getDebugLoc());
> +      DIB.insertDbgValueIntrinsic(Arg, 0, DIVariable(DVI->getVariable()),
> +                                  DIExpression(DVI->getExpression()),
> +                                  DVI->getDebugLoc(), Inst);
>     }
>   }
> };
> @@ -4211,8 +4210,8 @@ bool SROA::splitAlloca(AllocaInst &AI, A
>       if (DbgDeclareInst *OldDDI = FindAllocaDbgDeclare(Piece.Alloca))
>         OldDDI->eraseFromParent();
> 
> -      auto *NewDDI = DIB.insertDeclare(Piece.Alloca, Var, PieceExpr, &AI);
> -      NewDDI->setDebugLoc(DbgDecl->getDebugLoc());
> +      DIB.insertDeclare(Piece.Alloca, Var, PieceExpr, DbgDecl->getDebugLoc(),
> +                        &AI);
>     }
>   }
>   return Changed;
> 
> Modified: llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp?rev=235041&r1=235040&r2=235041&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp Wed Apr 15 16:18:07 2015
> @@ -1117,10 +1117,9 @@ public:
>       } else {
>         continue;
>       }
> -      Instruction *DbgVal = DIB->insertDbgValueIntrinsic(
> -          Arg, 0, DIVariable(DVI->getVariable()),
> -          DIExpression(DVI->getExpression()), Inst);
> -      DbgVal->setDebugLoc(DVI->getDebugLoc());
> +      DIB->insertDbgValueIntrinsic(Arg, 0, DIVariable(DVI->getVariable()),
> +                                   DIExpression(DVI->getExpression()),
> +                                   DVI->getDebugLoc(), Inst);
>     }
>   }
> };
> 
> Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=235041&r1=235040&r2=235041&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Wed Apr 15 16:18:07 2015
> @@ -1015,11 +1015,11 @@ bool llvm::ConvertDebugDeclareToDebugVal
>   if (SExtInst *SExt = dyn_cast<SExtInst>(SI->getOperand(0)))
>     ExtendedArg = dyn_cast<Argument>(SExt->getOperand(0));
>   if (ExtendedArg)
> -    DbgVal = Builder.insertDbgValueIntrinsic(ExtendedArg, 0, DIVar, DIExpr, SI);
> +    DbgVal = Builder.insertDbgValueIntrinsic(ExtendedArg, 0, DIVar, DIExpr,
> +                                             DDI->getDebugLoc(), SI);
>   else
>     DbgVal = Builder.insertDbgValueIntrinsic(SI->getOperand(0), 0, DIVar,
> -                                             DIExpr, SI);
> -  DbgVal->setDebugLoc(DDI->getDebugLoc());
> +                                             DIExpr, DDI->getDebugLoc(), SI);
>   return true;
> }
> 
> @@ -1035,9 +1035,8 @@ bool llvm::ConvertDebugDeclareToDebugVal
>   if (LdStHasDebugValue(DIVar, LI))
>     return true;
> 
> -  Instruction *DbgVal =
> -      Builder.insertDbgValueIntrinsic(LI->getOperand(0), 0, DIVar, DIExpr, LI);
> -  DbgVal->setDebugLoc(DDI->getDebugLoc());
> +  Builder.insertDbgValueIntrinsic(LI->getOperand(0), 0, DIVar, DIExpr,
> +                                  DDI->getDebugLoc(), LI);
>   return true;
> }
> 
> @@ -1079,10 +1078,9 @@ bool llvm::LowerDbgDeclare(Function &F)
>           // This is a call by-value or some other instruction that
>           // takes a pointer to the variable. Insert a *value*
>           // intrinsic that describes the alloca.
> -          auto DbgVal = DIB.insertDbgValueIntrinsic(
> -              AI, 0, DIVariable(DDI->getVariable()),
> -              DIExpression(DDI->getExpression()), CI);
> -          DbgVal->setDebugLoc(DDI->getDebugLoc());
> +          DIB.insertDbgValueIntrinsic(AI, 0, DIVariable(DDI->getVariable()),
> +                                      DIExpression(DDI->getExpression()),
> +                                      DDI->getDebugLoc(), CI);
>         }
>       DDI->eraseFromParent();
>     }
> @@ -1128,8 +1126,7 @@ bool llvm::replaceDbgDeclareForAlloca(Al
>   // Insert llvm.dbg.declare in the same basic block as the original alloca,
>   // and remove old llvm.dbg.declare.
>   BasicBlock *BB = AI->getParent();
> -  Builder.insertDeclare(NewAllocaAddress, DIVar, DIExpr, BB)
> -    ->setDebugLoc(Loc);
> +  Builder.insertDeclare(NewAllocaAddress, DIVar, DIExpr, Loc, BB);
>   DDI->eraseFromParent();
>   return true;
> }
> 
> Modified: llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Transforms/Utils/Cloning.cpp?rev=235041&r1=235040&r2=235041&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/Transforms/Utils/Cloning.cpp (original)
> +++ llvm/trunk/unittests/Transforms/Utils/Cloning.cpp Wed Apr 15 16:18:07 2015
> @@ -255,8 +255,10 @@ protected:
>     DIExpression E = DBuilder.createExpression();
>     DIVariable Variable = DBuilder.createLocalVariable(
>       dwarf::DW_TAG_auto_variable, Subprogram, "x", File, 5, IntType, true);
> -    DBuilder.insertDeclare(Alloca, Variable, E, Store);
> -    DBuilder.insertDbgValueIntrinsic(AllocaContent, 0, Variable, E, Terminator);
> +    auto *DL = MDLocation::get(Subprogram->getContext(), 5, 0, Subprogram);
> +    DBuilder.insertDeclare(Alloca, Variable, E, DL, Store);
> +    DBuilder.insertDbgValueIntrinsic(AllocaContent, 0, Variable, E, DL,
> +                                     Terminator);
>     // Finalize the debug info
>     DBuilder.finalize();
> 
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list