blob: 4019ea6f174483484c9a6a81a8840219ea7f828e [file] [log] [blame]
//===-- LVCompare.h ---------------------------------------------*- 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 file defines the LVCompare class, which is used to describe a logical
// view comparison.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVCOMPARE_H
#define LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVCOMPARE_H
#include "llvm/DebugInfo/LogicalView/Core/LVObject.h"
namespace llvm {
namespace logicalview {
class LVReader;
// Record the elements missing or added and their compare pass.
using LVPassEntry = std::tuple<LVReader *, LVElement *, LVComparePass>;
using LVPassTable = std::vector<LVPassEntry>;
class LVCompare final {
raw_ostream &OS;
LVScopes ScopeStack;
// As the comparison is performed twice (by exchanging the reference
// and target readers) the element missing/added status does specify
// the comparison pass.
// By recording each missing/added elements along with its pass, it
// allows checking which elements were missing/added during each pass.
LVPassTable PassTable;
// Reader used on the LHS of the comparison.
// In the 'Missing' pass, it points to the reference reader.
// In the 'Added' pass it points to the target reader.
LVReader *Reader = nullptr;
bool FirstMissing = true;
bool PrintLines = false;
bool PrintScopes = false;
bool PrintSymbols = false;
bool PrintTypes = false;
static void setInstance(LVCompare *Compare);
void printCurrentStack();
void printSummary() const;
public:
LVCompare() = delete;
LVCompare(raw_ostream &OS);
LVCompare(const LVCompare &) = delete;
LVCompare &operator=(const LVCompare &) = delete;
~LVCompare() = default;
static LVCompare &getInstance();
// Scopes stack used during the missing/added reporting.
void push(LVScope *Scope) { ScopeStack.push_back(Scope); }
void pop() { ScopeStack.pop_back(); }
// Perform comparison between the 'Reference' and 'Target' scopes tree.
Error execute(LVReader *ReferenceReader, LVReader *TargetReader);
void addPassEntry(LVReader *Reader, LVElement *Element, LVComparePass Pass) {
PassTable.emplace_back(Reader, Element, Pass);
}
const LVPassTable &getPassTable() const & { return PassTable; }
void printItem(LVElement *Element, LVComparePass Pass);
void print(raw_ostream &OS) const;
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
void dump() const { print(dbgs()); }
#endif
};
inline LVCompare &getComparator() { return LVCompare::getInstance(); }
} // end namespace logicalview
} // end namespace llvm
#endif // LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVCOMPARE_H