Skip to content

tapi-diff -> readtapi #7205

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions llvm/lib/TextAPI/TextStubV5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ All library level keys, accept target values and are defaulted if not specified.
"target_info": [ # Required: target information
{
"target": "x86_64-macos",
"min_deployment": "10.14" # Required: minimum OS deployment version
"min_deployment": "10.14" # Optional: minOS defaults to 0
},
{
"target": "arm64-macos",
Expand Down Expand Up @@ -282,17 +282,16 @@ Expected<TargetList> getTargetsSection(const Object *Section) {
getRequiredValue<StringRef>(TBDKey::Target, Obj, &Object::getString);
if (!TargetStr)
return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Target));
auto VersionStr = getRequiredValue<StringRef>(TBDKey::Deployment, Obj,
&Object::getString);
if (!VersionStr)
return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Deployment));
VersionTuple Version;
if (Version.tryParse(*VersionStr))
return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Deployment));
auto TargetOrErr = Target::create(*TargetStr);
if (!TargetOrErr)
return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Target));

auto VersionStr = Obj->getString(Keys[TBDKey::Deployment]);
VersionTuple Version;
if (VersionStr && Version.tryParse(*VersionStr))
return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Deployment));
TargetOrErr->MinDeployment = Version;

// Convert to LLVM::Triple to accurately compute minOS + platform + arch
// pairing.
IFTargets.push_back(
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ set(LLVM_TEST_DEPENDS
llvm-strip
llvm-symbolizer
llvm-tblgen
llvm-tapi-diff
llvm-readtapi
llvm-tli-checker
llvm-undname
llvm-windres
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/lit.cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ def get_asan_rtlib():
'llvm-pdbutil', 'llvm-profdata', 'llvm-profgen', 'llvm-ranlib', 'llvm-rc', 'llvm-readelf',
'llvm-readobj', 'llvm-remark-size-diff', 'llvm-rtdyld', 'llvm-sim',
'llvm-size', 'llvm-split', 'llvm-stress', 'llvm-strings', 'llvm-strip',
'llvm-tblgen', 'llvm-tapi-diff', 'llvm-undname', 'llvm-windres',
'llvm-tblgen', 'llvm-readtapi', 'llvm-undname', 'llvm-windres',
'llvm-c-test', 'llvm-cxxfilt', 'llvm-xray', 'yaml2obj', 'obj2yaml',
'yaml-bench', 'verify-uselistorder', 'bugpoint', 'llc', 'llvm-symbolizer',
'opt', 'sancov', 'sanstats', 'llvm-remarkutil'])
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
; RUN: mkdir -p %t
; RUN: yaml2obj %S/Inputs/macho.yaml -o %t/macho.dylib
; RUN: not llvm-tapi-diff %S/Inputs/v4A.tbd %t/macho.dylib 2>&1 | FileCheck %s
; RUN: not llvm-readtapi --compare %S/Inputs/v4A.tbd %t/macho.dylib 2>&1 | FileCheck %s

; CHECK: error: {{.*}}macho.dylib' unsupported file format
; CHECK-NOT: error:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; RUN: not llvm-tapi-diff %S/Inputs/v4B.tbd %S/Inputs/v4E.tbd 2>&1 | FileCheck %s
; RUN: not llvm-readtapi --compare %S/Inputs/v4B.tbd %S/Inputs/v4E.tbd 2>&1 | FileCheck %s

; CHECK:< {{.*}}/Inputs/v4B.tbd
; CHECK:> {{.*}}/Inputs/v4E.tbd
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; RUN: not llvm-tapi-diff %S/Inputs/v4A.tbd %S/Inputs/v4B.tbd 2>&1 | FileCheck %s
; RUN: not llvm-readtapi --compare %S/Inputs/v4A.tbd %S/Inputs/v4B.tbd 2>&1 | FileCheck %s

; CHECK:< {{.*}}/Inputs/v4A.tbd
; CHECK:> {{.*}}/Inputs/v4B.tbd
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
; RUN: llvm-readtapi --compare %S/Inputs/v4A.tbd %S/Inputs/v4A.tbd 2>&1 | FileCheck %s --allow-empty

; CHECK-NOT: error:
; CHECK-NOT: warning:
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; RUN: not llvm-tapi-diff %S/Inputs/v4B.tbd %S/Inputs/v4D.tbd 2>&1 | FileCheck %s
; RUN: not llvm-readtapi --compare %S/Inputs/v4B.tbd %S/Inputs/v4D.tbd 2>&1 | FileCheck %s

; CHECK:< {{.*}}/Inputs/v4B.tbd
; CHECK:> {{.*}}/Inputs/v4D.tbd
Expand Down
3 changes: 3 additions & 0 deletions llvm/test/tools/llvm-readtapi/compare-misspelled-files.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
; RUN: not llvm-readtapi --compare %S/Inputs/v4A.tbd %S/Inputs/v4.tbd 2>&1 | FileCheck -DMSG=%errc_ENOENT %s

; CHECK: error: {{.*}}v4.tbd' [[MSG]]
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; RUN: not llvm-tapi-diff %S/Inputs/v4A.tbd %S/Inputs/v4D.tbd 2>&1 | FileCheck %s
; RUN: not llvm-readtapi --compare %S/Inputs/v4A.tbd %S/Inputs/v4D.tbd 2>&1 | FileCheck %s

; CHECK:< {{.*}}/Inputs/v4A.tbd
; CHECK:> {{.*}}/Inputs/v4D.tbd
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; RUN: not llvm-tapi-diff %S/Inputs/v4A.tbd %S/Inputs/v4C.tbd 2>&1 | FileCheck %s
; RUN: not llvm-readtapi --compare %S/Inputs/v4A.tbd %S/Inputs/v4C.tbd 2>&1 | FileCheck %s

; CHECK:< {{.*}}/Inputs/v4A.tbd
; CHECK:> {{.*}}/Inputs/v4C.tbd
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; RUN: not llvm-tapi-diff %S/Inputs/v4B.tbd %S/Inputs/v4C.tbd 2>&1 | FileCheck %s
; RUN: not llvm-readtapi --compare %S/Inputs/v4B.tbd %S/Inputs/v4C.tbd 2>&1 | FileCheck %s

; CHECK:< {{.*}}/Inputs/v4B.tbd
; CHECK:> {{.*}}/Inputs/v4C.tbd
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
; RUN: rm -rf %t
; RUN: split-file %s %t
; RUN: llvm-tapi-diff %t/Simple_v5.tbd %t/Simple_v5.tbd 2>&1 | FileCheck %s --allow-empty
; RUN: llvm-tapi-diff %t/Simple_v5.tbd %t/Simple_v4.tbd 2>&1 | FileCheck %s --allow-empty
; RUN: llvm-readtapi --compare %t/Simple_v5.tbd %t/Simple_v5.tbd 2>&1 | FileCheck %s --allow-empty
; RUN: llvm-readtapi --compare %t/Simple_v5.tbd %t/Simple_v4.tbd 2>&1 | FileCheck %s --allow-empty

; CHECK-NOT: error:
; CHECK-NOT: warning:
Expand Down
4 changes: 0 additions & 4 deletions llvm/test/tools/llvm-tapi-diff/matching-tbd.test

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/tools/llvm-tapi-diff/misspelled-tbd.test

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ set(LLVM_LINK_COMPONENTS
TextAPI
)

add_llvm_tool(llvm-tapi-diff
llvm-tapi-diff.cpp
add_llvm_tool(llvm-readtapi
llvm-readtapi.cpp
DiffEngine.cpp
)
90 changes: 90 additions & 0 deletions llvm/tools/llvm-readtapi/llvm-readtapi.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
//===-- llvm-readtapi.cpp - tapi file reader and manipulator -----*- 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 llvm-readtapi.
//
//===----------------------------------------------------------------------===//
#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 TapiCat("llvm-readtapi options");
cl::OptionCategory CompareCat("llvm-readtapi --compare options");

cl::opt<std::string> InputFileName(cl::Positional, cl::desc("<tapi file>"),
cl::Required, cl::cat(TapiCat));
cl::opt<std::string> CompareInputFileName(cl::Positional,
cl::desc("<comparison file>"),
cl::Required, cl::cat(CompareCat));
enum OutputKind {
Compare,
};

cl::opt<OutputKind>
Output(cl::desc("choose command action:"),
cl::values(clEnumValN(Compare, "compare",
"compare tapi file for library differences")),
cl::init(OutputKind::Compare), cl::cat(TapiCat));
} // 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(TapiCat);
cl::ParseCommandLineOptions(Argc, Argv,
"TAPI File Reader and Manipulator Tool");

if (Output == OutputKind::Compare) {
if (InputFileName.empty() || CompareInputFileName.empty()) {
cl::PrintHelpMessage();
return EXIT_FAILURE;
}

ExitOnError ExitOnErr("error: '" + InputFileName + "' ",
/*DefaultErrorExitCode=*/2);
auto BinLHS = ExitOnErr(convertFileToBinary(InputFileName));

TapiUniversal *FileLHS = dyn_cast<TapiUniversal>(BinLHS.get());
if (!FileLHS) {
ExitOnErr(createStringError(std::errc::executable_format_error,
"unsupported file format"));
}

ExitOnErr.setBanner("error: '" + CompareInputFileName + "' ");
auto BinRHS = ExitOnErr(convertFileToBinary(CompareInputFileName));

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);
}

return 0;
}
74 changes: 0 additions & 74 deletions llvm/tools/llvm-tapi-diff/llvm-tapi-diff.cpp

This file was deleted.

47 changes: 47 additions & 0 deletions llvm/unittests/TextAPI/TextStubV5Tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1104,6 +1104,53 @@ TEST(TBDv5, InvalidSymbols) {
EXPECT_EQ("invalid exported_symbols section\n", ErrorMessage);
}

TEST(TBDv5, DefaultMinOS) {
static const char TBDv5File[] = R"({
"tapi_tbd_version": 5,
"main_library": {
"target_info": [
{
"target": "arm64-ios-simulator"
}
],
"install_names":[
{ "name":"/S/L/F/Foo.framework/Foo" }
]
}})";

Expected<TBDFile> Result =
TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
EXPECT_TRUE(!!Result);
TBDFile File = std::move(Result.get());
EXPECT_EQ(FileType::TBD_V5, File->getFileType());
EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), File->getInstallName());
EXPECT_TRUE(File->targets().begin() != File->targets().end());
EXPECT_EQ(*File->targets().begin(),
Target(AK_arm64, PLATFORM_IOSSIMULATOR, VersionTuple(0, 0)));
}

TEST(TBDv5, InvalidMinOS) {
static const char TBDv5File[] = R"({
"tapi_tbd_version": 5,
"main_library": {
"target_info": [
{
"target": "arm64-ios-simulator",
"min_deployment": "swift-abi"
}
],
"install_names":[
{ "name":"/S/L/F/Foo.framework/Foo" }
]
}})";

Expected<TBDFile> Result =
TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
EXPECT_FALSE(!!Result);
std::string ErrorMessage = toString(Result.takeError());
EXPECT_EQ("invalid min_deployment section\n", ErrorMessage);
}

TEST(TBDv5, MergeIF) {
static const char TBDv5FileA[] = R"({
"tapi_tbd_version": 5,
Expand Down