Fix debuginfos for nested ref/out parameters (use llvm.dbg.declare)

llvm.dbg.value() apparently doesn't like GEP + deref, so use
llvm.dbg.declare() & GEP.
This commit is contained in:
Martin 2017-09-07 23:12:07 +02:00
parent 93decabe6c
commit 8cc5ff6e79
6 changed files with 55 additions and 35 deletions

View file

@ -116,19 +116,21 @@ public:
/// \brief Emits all things necessary for making debug info for a local
/// variable vd.
/// \param ll LL value which, in combination with `addr`, yields the
/// storage/lvalue of the variable (not treating ref/out params as special
/// case; what's needed is the lvalue of the original variable).
/// For special-ref loop variables, specify the lvalue of the reference/
/// pointer.
/// storage/lvalue of the variable. For special-ref loop variables, specify
/// the storage/lvalue of the reference/pointer.
/// \param vd Variable declaration to emit debug info for.
/// \param type Type of variable if different from vd->type
/// \param isThisPtr Variable is hidden this pointer
/// \param forceAsLocal Emit as local even if the variable is a parameter
/// \param isRefRVal Only relevant for ref/out parameters: indicates whether
/// ll & addr specify the reference's rvalue, i.e., the lvalue of the original
/// variable, instead of the reference's lvalue.
/// \param addr An array of complex address operations encoding a DWARF
/// expression.
void
EmitLocalVariable(llvm::Value *ll, VarDeclaration *vd, Type *type = nullptr,
bool isThisPtr = false, bool forceAsLocal = false,
bool isRefRVal = false,
llvm::ArrayRef<int64_t> addr = llvm::ArrayRef<int64_t>());
/// \brief Emits all things necessary for making debug info for a global