diff options
Diffstat (limited to 'contrib/llvm-project/llvm/tools/llvm-tapi-diff/llvm-tapi-diff.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/tools/llvm-tapi-diff/llvm-tapi-diff.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/tools/llvm-tapi-diff/llvm-tapi-diff.cpp b/contrib/llvm-project/llvm/tools/llvm-tapi-diff/llvm-tapi-diff.cpp new file mode 100644 index 000000000000..40f1eec162be --- /dev/null +++ b/contrib/llvm-project/llvm/tools/llvm-tapi-diff/llvm-tapi-diff.cpp @@ -0,0 +1,89 @@ +//===-- 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 <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)); + +std::string ToolName; +} // anonymous namespace + +ExitOnError ExitOnErr; + +void setErrorBanner(ExitOnError &ExitOnErr, std::string InputFile) { + ExitOnErr.setBanner(ToolName + ": error: " + InputFile + ": "); +} + +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, + "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<TapiUniversal>(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<TapiUniversal>(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); +} |