//===-- 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/MemoryBuffer.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)); } // anonymous namespace 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, "Text-based Stubs Comparison Tool"); if (InputFileNameLHS.empty() || InputFileNameRHS.empty()) { cl::PrintHelpMessage(); return EXIT_FAILURE; } ExitOnError ExitOnErr("error: '" + InputFileNameLHS + "' ", /*DefaultErrorExitCode=*/2); auto BinLHS = ExitOnErr(convertFileToBinary(InputFileNameLHS)); TapiUniversal *FileLHS = dyn_cast(BinLHS.get()); if (!FileLHS) { ExitOnErr(createStringError(std::errc::executable_format_error, "unsupported file format")); } ExitOnErr.setBanner("error: '" + InputFileNameRHS + "' "); auto BinRHS = ExitOnErr(convertFileToBinary(InputFileNameRHS)); TapiUniversal *FileRHS = dyn_cast(BinRHS.get()); if (!FileRHS) { ExitOnErr(createStringError(std::errc::executable_format_error, "unsupported file format")); } raw_ostream &OS = outs(); return DiffEngine(FileLHS, FileRHS).compareFiles(OS); }