diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp --- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp @@ -130,6 +130,16 @@ const yaml::StringValue &RegisterSource, bool IsRestored, int FrameIdx); + struct VarExprLoc { + DILocalVariable *DIVar = nullptr; + DIExpression *DIExpr = nullptr; + DILocation *DILoc = nullptr; + }; + + std::optional parseVarExprLoc(PerFunctionMIParsingState &PFS, + const yaml::StringValue &VarStr, + const yaml::StringValue &ExprStr, + const yaml::StringValue &LocStr); template bool parseStackObjectsDebugInfo(PerFunctionMIParsingState &PFS, const T &Object, @@ -888,26 +898,37 @@ return false; } -template -bool MIRParserImpl::parseStackObjectsDebugInfo(PerFunctionMIParsingState &PFS, - const T &Object, int FrameIdx) { - // Debug information can only be attached to stack objects; Fixed stack - // objects aren't supported. - MDNode *Var = nullptr, *Expr = nullptr, *Loc = nullptr; - if (parseMDNode(PFS, Var, Object.DebugVar) || - parseMDNode(PFS, Expr, Object.DebugExpr) || - parseMDNode(PFS, Loc, Object.DebugLoc)) - return true; - if (!Var && !Expr && !Loc) - return false; +std::optional MIRParserImpl::parseVarExprLoc( + PerFunctionMIParsingState &PFS, const yaml::StringValue &VarStr, + const yaml::StringValue &ExprStr, const yaml::StringValue &LocStr) { + MDNode *Var = nullptr; + MDNode *Expr = nullptr; + MDNode *Loc = nullptr; + if (parseMDNode(PFS, Var, VarStr) || parseMDNode(PFS, Expr, ExprStr) || + parseMDNode(PFS, Loc, LocStr)) + return std::nullopt; DILocalVariable *DIVar = nullptr; DIExpression *DIExpr = nullptr; DILocation *DILoc = nullptr; - if (typecheckMDNode(DIVar, Var, Object.DebugVar, "DILocalVariable", *this) || - typecheckMDNode(DIExpr, Expr, Object.DebugExpr, "DIExpression", *this) || - typecheckMDNode(DILoc, Loc, Object.DebugLoc, "DILocation", *this)) + if (typecheckMDNode(DIVar, Var, VarStr, "DILocalVariable", *this) || + typecheckMDNode(DIExpr, Expr, ExprStr, "DIExpression", *this) || + typecheckMDNode(DILoc, Loc, LocStr, "DILocation", *this)) + return std::nullopt; + return VarExprLoc{DIVar, DIExpr, DILoc}; +} + +template +bool MIRParserImpl::parseStackObjectsDebugInfo(PerFunctionMIParsingState &PFS, + const T &Object, int FrameIdx) { + std::optional MaybeInfo = + parseVarExprLoc(PFS, Object.DebugVar, Object.DebugExpr, Object.DebugLoc); + if (!MaybeInfo) return true; - PFS.MF.setVariableDbgInfo(DIVar, DIExpr, FrameIdx, DILoc); + // Debug information can only be attached to stack objects; Fixed stack + // objects aren't supported. + if (MaybeInfo->DIVar || MaybeInfo->DIExpr || MaybeInfo->DILoc) + PFS.MF.setVariableDbgInfo(MaybeInfo->DIVar, MaybeInfo->DIExpr, FrameIdx, + MaybeInfo->DILoc); return false; }