//===- TGParser.h - Parser for TableGen Files -------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This class represents the Parser for tablegen files.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TABLEGEN_TGPARSER_H
#define LLVM_LIB_TABLEGEN_TGPARSER_H

#include "TGLexer.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
#include <map>

namespace llvm {
class SourceMgr;
class Twine;
struct ForeachLoop;
struct MultiClass;
struct SubClassReference;
struct SubMultiClassReference;

struct LetRecord {
  const StringInit *Name;
  std::vector<unsigned> Bits;
  const Init *Value;
  SMLoc Loc;
  LetRecord(const StringInit *N, ArrayRef<unsigned> B, const Init *V, SMLoc L)
      : Name(N), Bits(B), Value(V), Loc(L) {}
};

/// RecordsEntry - Holds exactly one of a Record, ForeachLoop, or
/// AssertionInfo.
struct RecordsEntry {
  std::unique_ptr<Record> Rec;
  std::unique_ptr<ForeachLoop> Loop;
  std::unique_ptr<Record::AssertionInfo> Assertion;
  std::unique_ptr<Record::DumpInfo> Dump;

  void dump() const;

  RecordsEntry() = default;
  RecordsEntry(std::unique_ptr<Record> Rec) : Rec(std::move(Rec)) {}
  RecordsEntry(std::unique_ptr<ForeachLoop> Loop) : Loop(std::move(Loop)) {}
  RecordsEntry(std::unique_ptr<Record::AssertionInfo> Assertion)
      : Assertion(std::move(Assertion)) {}
  RecordsEntry(std::unique_ptr<Record::DumpInfo> Dump)
      : Dump(std::move(Dump)) {}
};

/// ForeachLoop - Record the iteration state associated with a for loop.
/// This is used to instantiate items in the loop body.
///
/// IterVar is allowed to be null, in which case no iteration variable is
/// defined in the loop at all. (This happens when a ForeachLoop is
/// constructed by desugaring an if statement.)
struct ForeachLoop {
  SMLoc Loc;
  const VarInit *IterVar;
  const Init *ListValue;
  std::vector<RecordsEntry> Entries;

  void dump() const;

  ForeachLoop(SMLoc Loc, const VarInit *IVar, const Init *LValue)
      : Loc(Loc), IterVar(IVar), ListValue(LValue) {}
};

struct DefsetRecord {
  SMLoc Loc;
  const RecTy *EltTy = nullptr;
  SmallVector<Init *, 16> Elements;
};

struct MultiClass {
  Record Rec; // Placeholder for template args and Name.
  std::vector<RecordsEntry> Entries;

  void dump() const;

  MultiClass(StringRef Name, SMLoc Loc, RecordKeeper &Records)
      : Rec(Name, Loc, Records, Record::RK_MultiClass) {}
};

class TGVarScope {
public:
  enum ScopeKind { SK_Local, SK_Record, SK_ForeachLoop, SK_MultiClass };

private:
  ScopeKind Kind;
  std::unique_ptr<TGVarScope> Parent;
  // A scope to hold variable definitions from defvar.
  std::map<std::string, const Init *, std::less<>> Vars;
  Record *CurRec = nullptr;
  ForeachLoop *CurLoop = nullptr;
  MultiClass *CurMultiClass = nullptr;

public:
  TGVarScope(std::unique_ptr<TGVarScope> Parent)
      : Kind(SK_Local), Parent(std::move(Parent)) {}
  TGVarScope(std::unique_ptr<TGVarScope> Parent, Record *Rec)
      : Kind(SK_Record), Parent(std::move(Parent)), CurRec(Rec) {}
  TGVarScope(std::unique_ptr<TGVarScope> Parent, ForeachLoop *Loop)
      : Kind(SK_ForeachLoop), Parent(std::move(Parent)), CurLoop(Loop) {}
  TGVarScope(std::unique_ptr<TGVarScope> Parent, MultiClass *Multiclass)
      : Kind(SK_MultiClass), Parent(std::move(Parent)),
        CurMultiClass(Multiclass) {}

  std::unique_ptr<TGVarScope> extractParent() {
    // This is expected to be called just before we are destructed, so
    // it doesn't much matter what state we leave 'parent' in.
    return std::move(Parent);
  }

  const Init *getVar(RecordKeeper &Records, MultiClass *ParsingMultiClass,
                     const StringInit *Name, SMRange NameLoc,
                     bool TrackReferenceLocs) const;

  bool varAlreadyDefined(StringRef Name) const {
    // When we check whether a variable is already defined, for the purpose of
    // reporting an error on redefinition, we don't look up to the parent
    // scope, because it's all right to shadow an outer definition with an
    // inner one.
    return Vars.find(Name) != Vars.end();
  }

  void addVar(StringRef Name, const Init *I) {
    bool Ins = Vars.try_emplace(std::string(Name), I).second;
    (void)Ins;
    assert(Ins && "Local variable already exists");
  }

  bool isOutermost() const { return Parent == nullptr; }
};

class TGParser {
  TGLexer Lex;
  std::vector<SmallVector<LetRecord, 4>> LetStack;
  std::map<std::string, std::unique_ptr<MultiClass>> MultiClasses;
  std::map<std::string, const RecTy *> TypeAliases;

  /// Loops - Keep track of any foreach loops we are within.
  ///
  std::vector<std::unique_ptr<ForeachLoop>> Loops;

  SmallVector<DefsetRecord *, 2> Defsets;

  /// CurMultiClass - If we are parsing a 'multiclass' definition, this is the
  /// current value.
  MultiClass *CurMultiClass;

  /// CurScope - Innermost of the current nested scopes for 'defvar' variables.
  std::unique_ptr<TGVarScope> CurScope;

  // Record tracker
  RecordKeeper &Records;

  // A "named boolean" indicating how to parse identifiers.  Usually
  // identifiers map to some existing object but in special cases
  // (e.g. parsing def names) no such object exists yet because we are
  // in the middle of creating in.  For those situations, allow the
  // parser to ignore missing object errors.
  enum IDParseMode {
    ParseValueMode,   // We are parsing a value we expect to look up.
    ParseNameMode,    // We are parsing a name of an object that does not yet
                      // exist.
  };

  bool NoWarnOnUnusedTemplateArgs = false;
  bool TrackReferenceLocs = false;

public:
  TGParser(SourceMgr &SM, ArrayRef<std::string> Macros, RecordKeeper &records,
           const bool NoWarnOnUnusedTemplateArgs = false,
           const bool TrackReferenceLocs = false)
      : Lex(SM, Macros), CurMultiClass(nullptr), Records(records),
        NoWarnOnUnusedTemplateArgs(NoWarnOnUnusedTemplateArgs),
        TrackReferenceLocs(TrackReferenceLocs) {}

  /// ParseFile - Main entrypoint for parsing a tblgen file.  These parser
  /// routines return true on error, or false on success.
  bool ParseFile();

  bool Error(SMLoc L, const Twine &Msg) const {
    PrintError(L, Msg);
    return true;
  }
  bool TokError(const Twine &Msg) const {
    return Error(Lex.getLoc(), Msg);
  }
  const TGLexer::DependenciesSetTy &getDependencies() const {
    return Lex.getDependencies();
  }

  TGVarScope *PushScope() {
    CurScope = std::make_unique<TGVarScope>(std::move(CurScope));
    // Returns a pointer to the new scope, so that the caller can pass it back
    // to PopScope which will check by assertion that the pushes and pops
    // match up properly.
    return CurScope.get();
  }
  TGVarScope *PushScope(Record *Rec) {
    CurScope = std::make_unique<TGVarScope>(std::move(CurScope), Rec);
    return CurScope.get();
  }
  TGVarScope *PushScope(ForeachLoop *Loop) {
    CurScope = std::make_unique<TGVarScope>(std::move(CurScope), Loop);
    return CurScope.get();
  }
  TGVarScope *PushScope(MultiClass *Multiclass) {
    CurScope = std::make_unique<TGVarScope>(std::move(CurScope), Multiclass);
    return CurScope.get();
  }
  void PopScope(TGVarScope *ExpectedStackTop) {
    assert(ExpectedStackTop == CurScope.get() &&
           "Mismatched pushes and pops of local variable scopes");
    CurScope = CurScope->extractParent();
  }

private: // Semantic analysis methods.
  bool AddValue(Record *TheRec, SMLoc Loc, const RecordVal &RV);
  /// Set the value of a RecordVal within the given record. If `OverrideDefLoc`
  /// is set, the provided location overrides any existing location of the
  /// RecordVal.
  bool SetValue(Record *TheRec, SMLoc Loc, const Init *ValName,
                ArrayRef<unsigned> BitList, const Init *V,
                bool AllowSelfAssignment = false, bool OverrideDefLoc = true);
  bool AddSubClass(Record *Rec, SubClassReference &SubClass);
  bool AddSubClass(RecordsEntry &Entry, SubClassReference &SubClass);
  bool AddSubMultiClass(MultiClass *CurMC,
                        SubMultiClassReference &SubMultiClass);

  using SubstStack = SmallVector<std::pair<const Init *, const Init *>, 8>;

  bool addEntry(RecordsEntry E);
  bool resolve(const ForeachLoop &Loop, SubstStack &Stack, bool Final,
               std::vector<RecordsEntry> *Dest, SMLoc *Loc = nullptr);
  bool resolve(const std::vector<RecordsEntry> &Source, SubstStack &Substs,
               bool Final, std::vector<RecordsEntry> *Dest,
               SMLoc *Loc = nullptr);
  bool addDefOne(std::unique_ptr<Record> Rec);

  using ArgValueHandler = std::function<void(const Init *, const Init *)>;
  bool resolveArguments(
      const Record *Rec, ArrayRef<const ArgumentInit *> ArgValues, SMLoc Loc,
      ArgValueHandler ArgValueHandler = [](const Init *, const Init *) {});
  bool resolveArgumentsOfClass(MapResolver &R, const Record *Rec,
                               ArrayRef<const ArgumentInit *> ArgValues,
                               SMLoc Loc);
  bool resolveArgumentsOfMultiClass(SubstStack &Substs, MultiClass *MC,
                                    ArrayRef<const ArgumentInit *> ArgValues,
                                    const Init *DefmName, SMLoc Loc);

private:  // Parser methods.
  bool consume(tgtok::TokKind K);
  bool ParseObjectList(MultiClass *MC = nullptr);
  bool ParseObject(MultiClass *MC);
  bool ParseClass();
  bool ParseMultiClass();
  bool ParseDefm(MultiClass *CurMultiClass);
  bool ParseDef(MultiClass *CurMultiClass);
  bool ParseDefset();
  bool ParseDeftype();
  bool ParseDefvar(Record *CurRec = nullptr);
  bool ParseDump(MultiClass *CurMultiClass, Record *CurRec = nullptr);
  bool ParseForeach(MultiClass *CurMultiClass);
  bool ParseIf(MultiClass *CurMultiClass);
  bool ParseIfBody(MultiClass *CurMultiClass, StringRef Kind);
  bool ParseAssert(MultiClass *CurMultiClass, Record *CurRec = nullptr);
  bool ParseTopLevelLet(MultiClass *CurMultiClass);
  void ParseLetList(SmallVectorImpl<LetRecord> &Result);

  bool ParseObjectBody(Record *CurRec);
  bool ParseBody(Record *CurRec);
  bool ParseBodyItem(Record *CurRec);

  bool ParseTemplateArgList(Record *CurRec);
  const Init *ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs);
  const VarInit *ParseForeachDeclaration(const Init *&ForeachListValue);

  SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm);
  SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC);

  const Init *ParseIDValue(Record *CurRec, const StringInit *Name,
                           SMRange NameLoc, IDParseMode Mode = ParseValueMode);
  const Init *ParseSimpleValue(Record *CurRec, const RecTy *ItemType = nullptr,
                               IDParseMode Mode = ParseValueMode);
  const Init *ParseValue(Record *CurRec, const RecTy *ItemType = nullptr,
                         IDParseMode Mode = ParseValueMode);
  void ParseValueList(SmallVectorImpl<const Init *> &Result, Record *CurRec,
                      const RecTy *ItemType = nullptr);
  bool ParseTemplateArgValueList(SmallVectorImpl<const ArgumentInit *> &Result,
                                 SmallVectorImpl<SMLoc> &ArgLocs,
                                 Record *CurRec, const Record *ArgsRec);
  void ParseDagArgList(
      SmallVectorImpl<std::pair<const Init *, const StringInit *>> &Result,
      Record *CurRec);
  bool ParseOptionalRangeList(SmallVectorImpl<unsigned> &Ranges);
  bool ParseOptionalBitList(SmallVectorImpl<unsigned> &Ranges);
  const TypedInit *ParseSliceElement(Record *CurRec);
  const TypedInit *ParseSliceElements(Record *CurRec, bool Single = false);
  void ParseRangeList(SmallVectorImpl<unsigned> &Result);
  bool ParseRangePiece(SmallVectorImpl<unsigned> &Ranges,
                       const TypedInit *FirstItem = nullptr);
  const RecTy *ParseType();
  const Init *ParseOperation(Record *CurRec, const RecTy *ItemType);
  const Init *ParseOperationSubstr(Record *CurRec, const RecTy *ItemType);
  const Init *ParseOperationFind(Record *CurRec, const RecTy *ItemType);
  const Init *ParseOperationForEachFilter(Record *CurRec,
                                          const RecTy *ItemType);
  const Init *ParseOperationCond(Record *CurRec, const RecTy *ItemType);
  const RecTy *ParseOperatorType();
  const Init *ParseObjectName(MultiClass *CurMultiClass);
  const Record *ParseClassID();
  MultiClass *ParseMultiClassID();
  bool ApplyLetStack(Record *CurRec);
  bool ApplyLetStack(RecordsEntry &Entry);
  bool CheckTemplateArgValues(SmallVectorImpl<const ArgumentInit *> &Values,
                              ArrayRef<SMLoc> ValuesLocs,
                              const Record *ArgsRec);
};

} // end namespace llvm

#endif
