1//===-- LVCompare.h ---------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the LVCompare class, which is used to describe a logical
10// view comparison.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVCOMPARE_H
15#define LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVCOMPARE_H
16
17#include "llvm/DebugInfo/LogicalView/Core/LVObject.h"
18
19namespace llvm {
20namespace logicalview {
21
22class LVReader;
23
24// Record the elements missing or added and their compare pass.
25using LVPassEntry = std::tuple<LVReader *, LVElement *, LVComparePass>;
26using LVPassTable = std::vector<LVPassEntry>;
27
28class LVCompare final {
29  raw_ostream &OS;
30  LVScopes ScopeStack;
31
32  // As the comparison is performed twice (by exchanging the reference
33  // and target readers) the element missing/added status does specify
34  // the comparison pass.
35  // By recording each missing/added elements along with its pass, it
36  // allows checking which elements were missing/added during each pass.
37  LVPassTable PassTable;
38
39  // Reader used on the LHS of the comparison.
40  // In the 'Missing' pass, it points to the reference reader.
41  // In the 'Added' pass it points to the target reader.
42  LVReader *Reader = nullptr;
43
44  bool FirstMissing = true;
45  bool PrintLines = false;
46  bool PrintScopes = false;
47  bool PrintSymbols = false;
48  bool PrintTypes = false;
49
50  static void setInstance(LVCompare *Compare);
51
52  void printCurrentStack();
53  void printSummary() const;
54
55public:
56  LVCompare() = delete;
57  LVCompare(raw_ostream &OS);
58  LVCompare(const LVCompare &) = delete;
59  LVCompare &operator=(const LVCompare &) = delete;
60  ~LVCompare() = default;
61
62  static LVCompare &getInstance();
63
64  // Scopes stack used during the missing/added reporting.
65  void push(LVScope *Scope) { ScopeStack.push_back(Scope); }
66  void pop() { ScopeStack.pop_back(); }
67
68  // Perform comparison between the 'Reference' and 'Target' scopes tree.
69  Error execute(LVReader *ReferenceReader, LVReader *TargetReader);
70
71  void addPassEntry(LVReader *Reader, LVElement *Element, LVComparePass Pass) {
72    PassTable.emplace_back(Reader, Element, Pass);
73  }
74  const LVPassTable &getPassTable() const & { return PassTable; }
75
76  void printItem(LVElement *Element, LVComparePass Pass);
77  void print(raw_ostream &OS) const;
78
79#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
80  void dump() const { print(dbgs()); }
81#endif
82};
83
84inline LVCompare &getComparator() { return LVCompare::getInstance(); }
85
86} // end namespace logicalview
87} // end namespace llvm
88
89#endif // LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVCOMPARE_H
90