[PATCH] D74470: Seperated DIBasicType DIFlags to DIBTFlags.

Chirag Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 13 02:30:49 PST 2020


Chirag added inline comments.


================
Comment at: llvm/lib/AsmParser/LLParser.cpp:4171
+template <>
+bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DIBTFlagField &Result) {
+
----------------
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)




Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D74470





More information about the llvm-commits mailing list