170 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- DiffEngine.h - File comparator --------------------------*- 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 header defines the interface to the llvm-tapi difference engine,
 | |
| // which structurally compares two tbd files.
 | |
| //
 | |
| //===----------------------------------------------------------------------===/
 | |
| #ifndef LLVM_TOOLS_LLVM_TAPI_DIFF_DIFFENGINE_H
 | |
| #define LLVM_TOOLS_LLVM_TAPI_DIFF_DIFFENGINE_H
 | |
| 
 | |
| #include "llvm/ADT/Optional.h"
 | |
| #include "llvm/Object/TapiUniversal.h"
 | |
| #include "llvm/Support/raw_ostream.h"
 | |
| #include "llvm/TextAPI/Symbol.h"
 | |
| #include "llvm/TextAPI/Target.h"
 | |
| 
 | |
| namespace llvm {
 | |
| 
 | |
| /// InterfaceInputOrder determines from which file the diff attribute belongs
 | |
| /// to.
 | |
| enum InterfaceInputOrder { lhs, rhs };
 | |
| 
 | |
| /// DiffAttrKind is the enum that holds the concrete bases for RTTI.
 | |
| enum DiffAttrKind {
 | |
|   AD_Diff_Scalar_PackedVersion,
 | |
|   AD_Diff_Scalar_Unsigned,
 | |
|   AD_Diff_Scalar_Bool,
 | |
|   AD_Diff_Scalar_Str,
 | |
|   AD_Str_Vec,
 | |
|   AD_Sym_Vec,
 | |
|   AD_Inline_Doc,
 | |
| };
 | |
| 
 | |
| /// AttributeDiff is the abstract class for RTTI.
 | |
| class AttributeDiff {
 | |
| public:
 | |
|   AttributeDiff(DiffAttrKind Kind) : Kind(Kind){};
 | |
|   virtual ~AttributeDiff(){};
 | |
|   DiffAttrKind getKind() const { return Kind; }
 | |
| 
 | |
| private:
 | |
|   DiffAttrKind Kind;
 | |
| };
 | |
| 
 | |
| /// DiffOutput is the representation of a diff for a single attribute.
 | |
| struct DiffOutput {
 | |
|   /// The name of the attribute.
 | |
|   std::string Name;
 | |
|   /// The kind for RTTI
 | |
|   DiffAttrKind Kind;
 | |
|   /// Different values for the attribute
 | |
|   /// from each file where a diff is present.
 | |
|   std::vector<std::unique_ptr<AttributeDiff>> Values;
 | |
|   DiffOutput(std::string Name) : Name(Name){};
 | |
| };
 | |
| 
 | |
| /// DiffScalarVal is a template class for the different types of scalar values.
 | |
| template <class T, DiffAttrKind U> class DiffScalarVal : public AttributeDiff {
 | |
| public:
 | |
|   DiffScalarVal(InterfaceInputOrder Order, T Val)
 | |
|       : AttributeDiff(U), Order(Order), Val(Val){};
 | |
| 
 | |
|   static bool classof(const AttributeDiff *A) { return A->getKind() == U; }
 | |
| 
 | |
|   void print(raw_ostream &, std::string);
 | |
| 
 | |
|   T getVal() const { return Val; }
 | |
|   InterfaceInputOrder getOrder() const { return Order; }
 | |
| 
 | |
| private:
 | |
|   /// The order is the file from which the diff is found.
 | |
|   InterfaceInputOrder Order;
 | |
|   T Val;
 | |
| };
 | |
| 
 | |
| /// SymScalar is the diff symbol and the order.
 | |
| class SymScalar {
 | |
| public:
 | |
|   SymScalar(InterfaceInputOrder Order, const MachO::Symbol *Sym)
 | |
|       : Order(Order), Val(Sym){};
 | |
| 
 | |
|   std::string getFlagString(MachO::SymbolFlags Flags) {
 | |
|     return Flags != MachO::SymbolFlags::None
 | |
|                ? " - " + stringifySymbolFlag(Flags)
 | |
|                : stringifySymbolFlag(Flags);
 | |
|   }
 | |
| 
 | |
|   void print(raw_ostream &OS, std::string Indent, MachO::Target Targ);
 | |
| 
 | |
|   const MachO::Symbol *getVal() const { return Val; }
 | |
|   InterfaceInputOrder getOrder() const { return Order; }
 | |
| 
 | |
| private:
 | |
|   /// The order is the file from which the diff is found.
 | |
|   InterfaceInputOrder Order;
 | |
|   const MachO::Symbol *Val;
 | |
|   StringLiteral getSymbolNamePrefix(MachO::SymbolKind Kind);
 | |
|   std::string stringifySymbolFlag(MachO::SymbolFlags Flag);
 | |
| };
 | |
| 
 | |
| class DiffStrVec : public AttributeDiff {
 | |
| public:
 | |
|   MachO::Target Targ;
 | |
|   /// Values is a vector of StringRef values associated with the target.
 | |
|   std::vector<DiffScalarVal<StringRef, AD_Diff_Scalar_Str>> TargValues;
 | |
|   DiffStrVec(MachO::Target Targ) : AttributeDiff(AD_Str_Vec), Targ(Targ){};
 | |
| 
 | |
|   static bool classof(const AttributeDiff *A) {
 | |
|     return A->getKind() == AD_Str_Vec;
 | |
|   }
 | |
| };
 | |
| 
 | |
| class DiffSymVec : public AttributeDiff {
 | |
| public:
 | |
|   MachO::Target Targ;
 | |
|   /// Values is a vector of symbol values associated with the target.
 | |
|   std::vector<SymScalar> TargValues;
 | |
|   DiffSymVec(MachO::Target Targ) : AttributeDiff(AD_Sym_Vec), Targ(Targ){};
 | |
| 
 | |
|   static bool classof(const AttributeDiff *A) {
 | |
|     return A->getKind() == AD_Sym_Vec;
 | |
|   }
 | |
| };
 | |
| 
 | |
| /// InlineDoc represents an inlined framework/library in a TBD File.
 | |
| class InlineDoc : public AttributeDiff {
 | |
| public:
 | |
|   /// Install name of the framework/library.
 | |
|   std::string InstallName;
 | |
|   /// Differences found from each file.
 | |
|   std::vector<DiffOutput> DocValues;
 | |
|   InlineDoc(StringRef InstName, std::vector<DiffOutput> Diff)
 | |
|       : AttributeDiff(AD_Inline_Doc), InstallName(InstName),
 | |
|         DocValues(std::move(Diff)){};
 | |
| 
 | |
|   static bool classof(const AttributeDiff *A) {
 | |
|     return A->getKind() == AD_Inline_Doc;
 | |
|   }
 | |
| };
 | |
| 
 | |
| /// DiffEngine contains the methods to compare the input files and print the
 | |
| /// output of the differences found in the files.
 | |
| class DiffEngine {
 | |
| public:
 | |
|   DiffEngine(object::TapiUniversal *InputFileNameLHS,
 | |
|              object::TapiUniversal *InputFileNameRHS)
 | |
|       : FileLHS(InputFileNameLHS), FileRHS(InputFileNameRHS){};
 | |
|   bool compareFiles(raw_ostream &);
 | |
| 
 | |
| private:
 | |
|   object::TapiUniversal *FileLHS;
 | |
|   object::TapiUniversal *FileRHS;
 | |
| 
 | |
|   /// Function that prints the differences found in the files.
 | |
|   void printDifferences(raw_ostream &, const std::vector<DiffOutput> &, int);
 | |
|   /// Function that does the comparison of the TBD files and returns the
 | |
|   /// differences.
 | |
|   std::vector<DiffOutput> findDifferences(const MachO::InterfaceFile *,
 | |
|                                           const MachO::InterfaceFile *);
 | |
| };
 | |
| 
 | |
| } // namespace llvm
 | |
| 
 | |
| #endif
 |