[PATCH] D74470: Seperated DIBasicType DIFlags to DIBTFlags.

Adrian Prantl via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 24 08:49:19 PST 2020


aprantl added a comment.

Thank you this looks very good! Just a few questions inline.



================
Comment at: llvm/lib/AsmParser/LLParser.cpp:4171
+template <>
+bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DIBTFlagField &Result) {
+
----------------
Chirag wrote:
> Chirag wrote:
> > Chirag wrote:
> > > aprantl wrote:
> > > > Could the bulk of the implementation of this function be shared with the function that parses DIFlag and DISPFlag?
> > > Does using macro to generate flag LLParser seems like a good idea? it can be reused for other flags as well.
> > something like,
> > 
> > #define FLAG_FIELDS(MDNODE, FLAG_NAME)                                        \
> > struct DI##FLAG_NAME##Field : public MDFieldImpl<MDNODE::DI##FLAG_NAME##s> {  \
> >   DI##FLAG_NAME##Field() : MDFieldImpl(MDNODE::FLAG_NAME##Zero) {}            \
> > };
> > 
> > FLAG_FIELDS(DINode, Flag)
> > FLAG_FIELDS(DIBasicType, BTFlag)
> > FLAG_FIELDS(DISubprogram, SPFlag)
> > 
> > 
> > #define FLAG_FIELDS_PARSER(MDNODE, FLAG_NAME)                                 \
> > template <>                                                                   \
> > bool LLParser::ParseMDField(LocTy Loc, StringRef Name,                        \
> >                             DI##FLAG_NAME##Field &Result) {                   \
> >                                                                               \
> >   auto parseFlag = [&](MDNODE::DI##FLAG_NAME##s &Val) {                       \
> >     if (Lex.getKind() == lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {   \
> >       uint32_t TempVal = static_cast<uint32_t>(Val);                          \
> >       bool Res = ParseUInt32(TempVal);                                        \
> >       Val = static_cast<MDNODE::DI##FLAG_NAME##s>(TempVal);                   \
> >       return Res;                                                             \
> >     }                                                                         \
> >                                                                               \
> >     if (Lex.getKind() != lltok::DI##FLAG_NAME)                                \
> >       return TokError("expected debug info flag");                            \
> >                                                                               \
> >     Val = MDNODE::getFlag(Lex.getStrVal());                                   \
> >     if (!Val)                                                                 \
> >       return TokError(Twine("invalid basicType debug info flag '") +          \
> >                       Lex.getStrVal() + "'");                                 \
> >     Lex.Lex();                                                                \
> >     return false;                                                             \
> >   };                                                                          \
> >                                                                               \
> >   MDNODE::DI##FLAG_NAME##s Combined = MDNODE::FLAG_NAME##Zero;                \
> >   do {                                                                        \
> >     MDNODE::DI##FLAG_NAME##s Val;                                             \
> >     if (parseFlag(Val))                                                       \
> >       return true;                                                            \
> >     Combined |= Val;                                                          \
> >   } while (EatIfPresent(lltok::bar));                                         \
> >                                                                               \
> >   Result.assign(Combined);                                                    \
> >   return false;                                                               \
> > }
> > 
> > FLAG_FIELDS_PARSER(DINode, Flag)
> > FLAG_FIELDS_PARSER(DIBasicType, BTFlag)
> > FLAG_FIELDS_PARSER(DISubprogram, SPFlag)
> > 
> > 
> i will create a reusable function for flag parsing. 
Sharing the parsing code was not feasible?


================
Comment at: llvm/lib/Bitcode/Reader/MetadataLoader.cpp:1515
+    // Some flags were moved from DIFlags to SPFlags
+    DISubprogram::moveDItoSPFlags(Flags, SPFlags);
+
----------------
I believe this should only be called conditionally? Or specifically: What will happen when we reuse flag bits that are in the range of the old now freed-up DIFlags?


================
Comment at: llvm/lib/IR/AsmWriter.cpp:1721
 
+void MDFieldPrinter::printDIBTFlags(StringRef Name,
+                                    DIBasicType::DIBTFlags Flags) {
----------------
Again, can this function share code with the printDISPFlags function?


================
Comment at: llvm/lib/IR/DebugInfoMetadata.cpp:366
+  switch (Flag) {
+    // Appease a warning.
+#define HANDLE_DIBT_FLAG(ID, NAME)                                             \
----------------
Which warning is being appeased here?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74470/new/

https://reviews.llvm.org/D74470





More information about the cfe-commits mailing list