xref: /openbsd-src/gnu/llvm/llvm/tools/llvm-tapi-diff/llvm-tapi-diff.cpp (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
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