[llvm] ae39de9 - [MIRParser][nfc] Factor out code parsing debug MD nodes
Felipe de Azevedo Piovezan via llvm-commits
llvm-commits at lists.llvm.org
Thu May 4 11:17:27 PDT 2023
Author: Felipe de Azevedo Piovezan
Date: 2023-05-04T14:17:08-04:00
New Revision: ae39de91b80fd73115b5cd5f58019d0bc254234e
URL: https://github.com/llvm/llvm-project/commit/ae39de91b80fd73115b5cd5f58019d0bc254234e
DIFF: https://github.com/llvm/llvm-project/commit/ae39de91b80fd73115b5cd5f58019d0bc254234e.diff
LOG: [MIRParser][nfc] Factor out code parsing debug MD nodes
This commit splits a function that both parses MD nodes from YAML into
DI{Expr,Loc,Variable} objects AND adds an entry to the MF variable table, so
that each of those jobs is done separately.
It will enable subsequent patches to reuse the MD node parsing code.
Differential Revision: https://reviews.llvm.org/D149870
Added:
Modified:
llvm/lib/CodeGen/MIRParser/MIRParser.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
index 4fffd628f1e6e..5488824306261 100644
--- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
@@ -130,6 +130,16 @@ class MIRParserImpl {
const yaml::StringValue &RegisterSource,
bool IsRestored, int FrameIdx);
+ struct VarExprLoc {
+ DILocalVariable *DIVar = nullptr;
+ DIExpression *DIExpr = nullptr;
+ DILocation *DILoc = nullptr;
+ };
+
+ std::optional<VarExprLoc> parseVarExprLoc(PerFunctionMIParsingState &PFS,
+ const yaml::StringValue &VarStr,
+ const yaml::StringValue &ExprStr,
+ const yaml::StringValue &LocStr);
template <typename T>
bool parseStackObjectsDebugInfo(PerFunctionMIParsingState &PFS,
const T &Object,
@@ -888,26 +898,37 @@ static bool typecheckMDNode(T *&Result, MDNode *Node,
return false;
}
-template <typename T>
-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::VarExprLoc> 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 <typename T>
+bool MIRParserImpl::parseStackObjectsDebugInfo(PerFunctionMIParsingState &PFS,
+ const T &Object, int FrameIdx) {
+ std::optional<VarExprLoc> 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;
}
More information about the llvm-commits
mailing list