| //===-- 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 <cstdlib> |
| |
| using namespace llvm; |
| using namespace MachO; |
| using namespace object; |
| |
| namespace { |
| cl::OptionCategory NMCat("llvm-tapi-diff Options"); |
| cl::opt<std::string> InputFileNameLHS(cl::Positional, cl::desc("<first file>"), |
| cl::cat(NMCat)); |
| cl::opt<std::string> InputFileNameRHS(cl::Positional, cl::desc("<second file>"), |
| cl::cat(NMCat)); |
| } // anonymous namespace |
| |
| Expected<std::unique_ptr<Binary>> convertFileToBinary(std::string &Filename) { |
| ErrorOr<std::unique_ptr<MemoryBuffer>> 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<TapiUniversal>(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<TapiUniversal>(BinRHS.get()); |
| if (!FileRHS) { |
| ExitOnErr(createStringError(std::errc::executable_format_error, |
| "unsupported file format")); |
| } |
| |
| raw_ostream &OS = outs(); |
| |
| return DiffEngine(FileLHS, FileRHS).compareFiles(OS); |
| } |