//===-- llvm-tapi-diff.cpp - tbd comparator command-line driver ---*- // 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 command-line driver for the llvm-tapi difference // engine. // //===----------------------------------------------------------------------===// #include "DiffEngine.h" #include "llvm/Object/TapiUniversal.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Error.h" #include "llvm/Support/InitLLVM.h" #include "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" #include using namespace llvm; using namespace MachO; using namespace object; namespace { cl::OptionCategory NMCat("llvm-tapi-diff Options"); cl::opt InputFileNameLHS(cl::Positional, cl::desc(""), cl::cat(NMCat)); cl::opt InputFileNameRHS(cl::Positional, cl::desc(""), cl::cat(NMCat)); std::string ToolName; } // anonymous namespace ExitOnError ExitOnErr; void setErrorBanner(ExitOnError &ExitOnErr, std::string InputFile) { ExitOnErr.setBanner(ToolName + ": error: " + InputFile + ": "); } Expected> convertFileToBinary(std::string &Filename) { ErrorOr> BufferOrErr = MemoryBuffer::getFileOrSTDIN(Filename); if (BufferOrErr.getError()) return errorCodeToError(BufferOrErr.getError()); return createBinary(BufferOrErr.get()->getMemBufferRef()); } int main(int Argc, char **Argv) { InitLLVM X(Argc, Argv); cl::HideUnrelatedOptions(NMCat); cl::ParseCommandLineOptions( Argc, Argv, "This tool will compare two tbd files and return the " "differences in those files."); if (InputFileNameLHS.empty() || InputFileNameRHS.empty()) { cl::PrintHelpMessage(); return EXIT_FAILURE; } ToolName = Argv[0]; setErrorBanner(ExitOnErr, InputFileNameLHS); auto BinLHS = ExitOnErr(convertFileToBinary(InputFileNameLHS)); TapiUniversal *FileLHS = dyn_cast(BinLHS.get()); if (!FileLHS) { ExitOnErr( createStringError(std::errc::executable_format_error, "Error when parsing file, unsupported file format")); } setErrorBanner(ExitOnErr, InputFileNameRHS); auto BinRHS = ExitOnErr(convertFileToBinary(InputFileNameRHS)); TapiUniversal *FileRHS = dyn_cast(BinRHS.get()); if (!FileRHS) { ExitOnErr( createStringError(std::errc::executable_format_error, "Error when parsing file, unsupported file format")); } raw_ostream &OS = outs(); return DiffEngine(FileLHS, FileRHS).compareFiles(OS); }