1*d415bd75Srobert //===-- llvm-tapi-diff.cpp - tbd comparator command-line driver --*- C++-*-===//
273471bf0Spatrick //
373471bf0Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
473471bf0Spatrick // See https://llvm.org/LICENSE.txt for license information.
573471bf0Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
673471bf0Spatrick //
773471bf0Spatrick //===----------------------------------------------------------------------===//
873471bf0Spatrick //
973471bf0Spatrick // This file defines the command-line driver for the llvm-tapi difference
1073471bf0Spatrick // engine.
1173471bf0Spatrick //
1273471bf0Spatrick //===----------------------------------------------------------------------===//
1373471bf0Spatrick #include "DiffEngine.h"
1473471bf0Spatrick #include "llvm/Object/TapiUniversal.h"
1573471bf0Spatrick #include "llvm/Support/CommandLine.h"
1673471bf0Spatrick #include "llvm/Support/Error.h"
1773471bf0Spatrick #include "llvm/Support/InitLLVM.h"
18*d415bd75Srobert #include "llvm/Support/MemoryBuffer.h"
1973471bf0Spatrick #include "llvm/Support/WithColor.h"
2073471bf0Spatrick #include "llvm/Support/raw_ostream.h"
2173471bf0Spatrick #include <cstdlib>
2273471bf0Spatrick
2373471bf0Spatrick using namespace llvm;
2473471bf0Spatrick using namespace MachO;
2573471bf0Spatrick using namespace object;
2673471bf0Spatrick
2773471bf0Spatrick namespace {
2873471bf0Spatrick cl::OptionCategory NMCat("llvm-tapi-diff Options");
2973471bf0Spatrick cl::opt<std::string> InputFileNameLHS(cl::Positional, cl::desc("<first file>"),
3073471bf0Spatrick cl::cat(NMCat));
3173471bf0Spatrick cl::opt<std::string> InputFileNameRHS(cl::Positional, cl::desc("<second file>"),
3273471bf0Spatrick cl::cat(NMCat));
3373471bf0Spatrick } // anonymous namespace
3473471bf0Spatrick
convertFileToBinary(std::string & Filename)3573471bf0Spatrick Expected<std::unique_ptr<Binary>> convertFileToBinary(std::string &Filename) {
3673471bf0Spatrick ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =
3773471bf0Spatrick MemoryBuffer::getFileOrSTDIN(Filename);
3873471bf0Spatrick if (BufferOrErr.getError())
3973471bf0Spatrick return errorCodeToError(BufferOrErr.getError());
4073471bf0Spatrick return createBinary(BufferOrErr.get()->getMemBufferRef());
4173471bf0Spatrick }
4273471bf0Spatrick
main(int Argc,char ** Argv)4373471bf0Spatrick int main(int Argc, char **Argv) {
4473471bf0Spatrick InitLLVM X(Argc, Argv);
4573471bf0Spatrick cl::HideUnrelatedOptions(NMCat);
46*d415bd75Srobert cl::ParseCommandLineOptions(Argc, Argv, "Text-based Stubs Comparison Tool");
4773471bf0Spatrick if (InputFileNameLHS.empty() || InputFileNameRHS.empty()) {
4873471bf0Spatrick cl::PrintHelpMessage();
4973471bf0Spatrick return EXIT_FAILURE;
5073471bf0Spatrick }
5173471bf0Spatrick
52*d415bd75Srobert ExitOnError ExitOnErr("error: '" + InputFileNameLHS + "' ",
53*d415bd75Srobert /*DefaultErrorExitCode=*/2);
5473471bf0Spatrick auto BinLHS = ExitOnErr(convertFileToBinary(InputFileNameLHS));
5573471bf0Spatrick
5673471bf0Spatrick TapiUniversal *FileLHS = dyn_cast<TapiUniversal>(BinLHS.get());
5773471bf0Spatrick if (!FileLHS) {
58*d415bd75Srobert ExitOnErr(createStringError(std::errc::executable_format_error,
59*d415bd75Srobert "unsupported file format"));
6073471bf0Spatrick }
6173471bf0Spatrick
62*d415bd75Srobert ExitOnErr.setBanner("error: '" + InputFileNameRHS + "' ");
6373471bf0Spatrick auto BinRHS = ExitOnErr(convertFileToBinary(InputFileNameRHS));
6473471bf0Spatrick
6573471bf0Spatrick TapiUniversal *FileRHS = dyn_cast<TapiUniversal>(BinRHS.get());
6673471bf0Spatrick if (!FileRHS) {
67*d415bd75Srobert ExitOnErr(createStringError(std::errc::executable_format_error,
68*d415bd75Srobert "unsupported file format"));
6973471bf0Spatrick }
7073471bf0Spatrick
7173471bf0Spatrick raw_ostream &OS = outs();
7273471bf0Spatrick
7373471bf0Spatrick return DiffEngine(FileLHS, FileRHS).compareFiles(OS);
7473471bf0Spatrick }
75