[llvm] 1297c21 - Revert "Add llvm-tli-checker"
Paul Robinson via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 8 15:48:37 PST 2021
Author: Paul Robinson
Date: 2021-11-08T15:48:29-08:00
New Revision: 1297c214060a11ab06447767bec5f273b7bcb0f9
URL: https://github.com/llvm/llvm-project/commit/1297c214060a11ab06447767bec5f273b7bcb0f9
DIFF: https://github.com/llvm/llvm-project/commit/1297c214060a11ab06447767bec5f273b7bcb0f9.diff
LOG: Revert "Add llvm-tli-checker"
Not all bots have ld.lld available.
This reverts commit 62dd488164f5b68cce1ac3825f857b0108476c3c.
Added:
Modified:
llvm/docs/CommandGuide/index.rst
Removed:
llvm/docs/CommandGuide/llvm-tli-checker.rst
llvm/test/tools/llvm-tli-checker/ps4-tli-check.s
llvm/tools/llvm-tli-checker/CMakeLists.txt
llvm/tools/llvm-tli-checker/Opts.td
llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp
################################################################################
diff --git a/llvm/docs/CommandGuide/index.rst b/llvm/docs/CommandGuide/index.rst
index ee69cd83074f1..4f5c912bb4111 100644
--- a/llvm/docs/CommandGuide/index.rst
+++ b/llvm/docs/CommandGuide/index.rst
@@ -82,4 +82,3 @@ Developer Tools
llvm-locstats
llvm-pdbutil
llvm-profgen
- llvm-tli-checker
diff --git a/llvm/docs/CommandGuide/llvm-tli-checker.rst b/llvm/docs/CommandGuide/llvm-tli-checker.rst
deleted file mode 100644
index bbd2bf29f46b9..0000000000000
--- a/llvm/docs/CommandGuide/llvm-tli-checker.rst
+++ /dev/null
@@ -1,85 +0,0 @@
-llvm-tli-checker - TargetLibraryInfo vs library checker
-=======================================================
-
-.. program:: llvm-tli-checker
-
-SYNOPSIS
---------
-
-:program:`llvm-tli-checker` [*options*] [*library-file...*]
-
-DESCRIPTION
------------
-
-:program:`llvm-tli-checker` compares TargetLibraryInfo's opinion of the
-availability of library functions against the set of functions exported
-by the specified library files, reporting any disagreements between TLI's
-opinion and whether the function is actually present. This is primarily
-useful for vendors to ensure the TLI for their target is correct, and
-the compiler will not "optimize" some code sequence into a library call
-that is not actually available.
-
-EXAMPLE
--------
-
-.. code-block:: console
-
- $ llvm-tli-checker --triple x86_64-scei-ps4 example.so
- TLI knows 466 symbols, 235 available for 'x86_64-scei-ps4'
-
- Looking for symbols in 'example.so'
- Found 235 global function symbols in 'example.so'
- Found a grand total of 235 library symbols
- << TLI yes SDK no: '_ZdaPv' aka operator delete[](void*)
- >> TLI no SDK yes: '_ZdaPvj' aka operator delete[](void*, unsigned int)
- << Total TLI yes SDK no: 1
- >> Total TLI no SDK yes: 1
- == Total TLI yes SDK yes: 234
- FAIL: LLVM TLI doesn't match SDK libraries.
-
-OPTIONS
--------
-
-.. option:: --dump-tli
-
- Print "available"/"not available" for each library function, according to
- TargetLibraryInfo's information for the specified triple, and exit. This
- option does not read any input files.
-
-.. option:: --help, -h
-
- Print a summary of command line options and exit.
-
-.. option:: --libdir=<directory>
-
- A base directory to prepend to each library file path. This is handy
- when there are a number of library files all in the same directory, or
- a list of input filenames are kept in a response file.
-
-.. option:: --report=<level>
-
- The amount of information to report. <level> can be summary, discrepancy,
- or full. A summary report gives only the count of matching and mis-matching
- symbols; discrepancy lists the mis-matching symbols; and full lists all
- symbols known to TLI, matching or mis-matching. The default is discrepancy.
-
-.. option:: --separate
-
- Read and report a summary for each library file separately. This can be
- useful to identify library files that don't contribute anything that TLI
- knows about. Implies --report=summary (can be overridden).
-
-.. option:: --triple=<triple>
-
- The triple to use for initializing TargetLibraryInfo.
-
-.. option:: @<FILE>
-
- Read command-line options and/or library names from response file `<FILE>`.
-
-EXIT STATUS
------------
-
-:program:`llvm-tli-checker` returns 0 even if there are mismatches. It returns a
-non-zero exit code if there is an unrecognized option, or no input files are
-provided.
diff --git a/llvm/test/tools/llvm-tli-checker/ps4-tli-check.s b/llvm/test/tools/llvm-tli-checker/ps4-tli-check.s
deleted file mode 100644
index e17ceb104a28f..0000000000000
--- a/llvm/test/tools/llvm-tli-checker/ps4-tli-check.s
+++ /dev/null
@@ -1,288 +0,0 @@
-# REQUIRES: x86-registered-target
-#
-# RUN: llvm-mc --triple=x86_64-scei-ps4 --filetype=obj %s -o %t.o
-# RUN: ld.lld --shared %t.o -o %t.so
-# RUN: llvm-tli-checker --triple=x86_64-scei-ps4 %t.so | FileCheck %s
-#
-# RUN: llvm-mc --triple=x86_64-scei-ps4 --defsym WRONG=1 --filetype=obj %s -o %t2.o
-# RUN: ld.lld --shared %t2.o -o %t2.so
-# RUN: echo %t2.so > %t2.txt
-# RUN: llvm-tli-checker --triple x86_64-scei-ps4 @%t2.txt | \
-# RUN: FileCheck %s --check-prefix=WRONG_SUMMARY --check-prefix=WRONG_DETAIL \
-# RUN: --implicit-check-not="==" --implicit-check-not="<<" --implicit-check-not=">>"
-# RUN: llvm-tli-checker --triple x86_64-scei-ps4 @%t2.txt --report=summary | \
-# RUN: FileCheck %s --check-prefix=WRONG_SUMMARY \
-# RUN: --implicit-check-not="==" --implicit-check-not="<<" --implicit-check-not=">>"
-## --separate implies --report=summary.
-# RUN: llvm-tli-checker --triple x86_64-scei-ps4 @%t2.txt --separate | \
-# RUN: FileCheck %s --check-prefix=WRONG_SUMMARY \
-# RUN: --implicit-check-not="==" --implicit-check-not="<<" --implicit-check-not=">>"
-#
-# RUN: llvm-tli-checker --triple x86_64-scei-ps4 --dump-tli > %t3.txt
-# RUN: FileCheck %s --check-prefix=AVAIL --input-file %t3.txt
-# RUN: FileCheck %s --check-prefix=UNAVAIL --input-file %t3.txt
-#
-# CHECK: << Total TLI yes SDK no: 0
-# CHECK: >> Total TLI no SDK yes: 0
-# CHECK: == Total TLI yes SDK yes: 235
-#
-# WRONG_DETAIL: << TLI yes SDK no : '_ZdaPv'
-# WRONG_DETAIL: >> TLI no SDK yes: '_ZdaPvj'
-# WRONG_SUMMARY: << Total TLI yes SDK no: 1{{$}}
-# WRONG_SUMMARY: >> Total TLI no SDK yes: 1{{$}}
-# WRONG_SUMMARY: == Total TLI yes SDK yes: 234
-#
-## The -COUNT suffix doesn't care if there are too many matches, so check
-## the exact count first; the two directives should add up to that.
-# AVAIL: TLI knows 466 symbols, 235 available
-# AVAIL-COUNT-235: {{^}} available
-# UNAVAIL-COUNT-231: not available
-
-.macro defname name
-.globl \name
-.type \name , at function
-\name : nop
-.endm
-
-.text
-# For the WRONG case, omit _ZdaPv and include _ZdaPvj.
-.ifdef WRONG
-defname _ZdaPvj
-.else
-defname _ZdaPv
-.endif
-defname _ZdaPvRKSt9nothrow_t
-defname _ZdaPvSt11align_val_t
-defname _ZdaPvSt11align_val_tRKSt9nothrow_t
-defname _ZdaPvm
-defname _ZdaPvmSt11align_val_t
-defname _ZdlPv
-defname _ZdlPvRKSt9nothrow_t
-defname _ZdlPvSt11align_val_t
-defname _ZdlPvSt11align_val_tRKSt9nothrow_t
-defname _ZdlPvm
-defname _ZdlPvmSt11align_val_t
-defname _Znam
-defname _ZnamRKSt9nothrow_t
-defname _ZnamSt11align_val_t
-defname _ZnamSt11align_val_tRKSt9nothrow_t
-defname _Znwm
-defname _ZnwmRKSt9nothrow_t
-defname _ZnwmSt11align_val_t
-defname _ZnwmSt11align_val_tRKSt9nothrow_t
-defname __cxa_atexit
-defname __cxa_guard_abort
-defname __cxa_guard_acquire
-defname __cxa_guard_release
-defname abs
-defname acos
-defname acosf
-defname acosh
-defname acoshf
-defname acoshl
-defname acosl
-defname aligned_alloc
-defname asin
-defname asinf
-defname asinh
-defname asinhf
-defname asinhl
-defname asinl
-defname atan
-defname atan2
-defname atan2f
-defname atan2l
-defname atanf
-defname atanh
-defname atanhf
-defname atanhl
-defname atanl
-defname atof
-defname atoi
-defname atol
-defname atoll
-defname calloc
-defname cbrt
-defname cbrtf
-defname cbrtl
-defname ceil
-defname ceilf
-defname ceill
-defname clearerr
-defname copysign
-defname copysignf
-defname copysignl
-defname cos
-defname cosf
-defname cosh
-defname coshf
-defname coshl
-defname cosl
-defname exp
-defname exp2
-defname exp2f
-defname exp2l
-defname expf
-defname expl
-defname expm1
-defname expm1f
-defname expm1l
-defname fabs
-defname fabsf
-defname fabsl
-defname fclose
-defname fdopen
-defname feof
-defname ferror
-defname fflush
-defname fgetc
-defname fgetpos
-defname fgets
-defname fileno
-defname floor
-defname floorf
-defname floorl
-defname fmax
-defname fmaxf
-defname fmaxl
-defname fmin
-defname fminf
-defname fminl
-defname fmod
-defname fmodf
-defname fmodl
-defname fopen
-defname fprintf
-defname fputc
-defname fputs
-defname fread
-defname free
-defname frexp
-defname frexpf
-defname frexpl
-defname fscanf
-defname fseek
-defname fsetpos
-defname ftell
-defname fwrite
-defname getc
-defname getchar
-defname gets
-defname isdigit
-defname labs
-defname ldexp
-defname ldexpf
-defname ldexpl
-defname llabs
-defname log
-defname log10
-defname log10f
-defname log10l
-defname log1p
-defname log1pf
-defname log1pl
-defname log2
-defname log2f
-defname log2l
-defname logb
-defname logbf
-defname logbl
-defname logf
-defname logl
-defname malloc
-defname memalign
-defname memchr
-defname memcmp
-defname memcpy
-defname memmove
-defname memset
-defname mktime
-defname modf
-defname modff
-defname modfl
-defname nearbyint
-defname nearbyintf
-defname nearbyintl
-defname perror
-defname posix_memalign
-defname pow
-defname powf
-defname powl
-defname printf
-defname putc
-defname putchar
-defname puts
-defname qsort
-defname realloc
-defname remainder
-defname remainderf
-defname remainderl
-defname remove
-defname rewind
-defname rint
-defname rintf
-defname rintl
-defname round
-defname roundf
-defname roundl
-defname scanf
-defname setbuf
-defname setvbuf
-defname sin
-defname sinf
-defname sinh
-defname sinhf
-defname sinhl
-defname sinl
-defname snprintf
-defname sprintf
-defname sqrt
-defname sqrtf
-defname sqrtl
-defname sscanf
-defname strcasecmp
-defname strcat
-defname strchr
-defname strcmp
-defname strcoll
-defname strcpy
-defname strcspn
-defname strdup
-defname strlen
-defname strncasecmp
-defname strncat
-defname strncmp
-defname strncpy
-defname strpbrk
-defname strrchr
-defname strspn
-defname strstr
-defname strtod
-defname strtof
-defname strtok
-defname strtok_r
-defname strtol
-defname strtold
-defname strtoll
-defname strtoul
-defname strtoull
-defname strxfrm
-defname tan
-defname tanf
-defname tanh
-defname tanhf
-defname tanhl
-defname tanl
-defname trunc
-defname truncf
-defname truncl
-defname ungetc
-defname vfprintf
-defname vfscanf
-defname vprintf
-defname vscanf
-defname vsnprintf
-defname vsprintf
-defname vsscanf
-defname wcslen
-
diff --git a/llvm/tools/llvm-tli-checker/CMakeLists.txt b/llvm/tools/llvm-tli-checker/CMakeLists.txt
deleted file mode 100644
index 9be44e4d895e6..0000000000000
--- a/llvm/tools/llvm-tli-checker/CMakeLists.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-set(LLVM_LINK_COMPONENTS
- Analysis
- BinaryFormat
- BitReader
- BitstreamReader
- Core
- Demangle
- MC
- MCParser
- Object
- Option
- Remarks
- Support
- TextAPI
- )
-
-set(LLVM_TARGET_DEFINITIONS Opts.td)
-tablegen(LLVM Opts.inc -gen-opt-parser-defs)
-add_public_tablegen_target(TLICheckerOptsTableGen)
-
-add_llvm_tool(llvm-tli-checker
- llvm-tli-checker.cpp
-
- DEPENDS
- TLICheckerOptsTableGen
- )
diff --git a/llvm/tools/llvm-tli-checker/Opts.td b/llvm/tools/llvm-tli-checker/Opts.td
deleted file mode 100644
index b1acef4093c45..0000000000000
--- a/llvm/tools/llvm-tli-checker/Opts.td
+++ /dev/null
@@ -1,16 +0,0 @@
-include "llvm/Option/OptParser.td"
-
-class F<string name, string help> : Flag<["--"], name>, HelpText<help>;
-multiclass Eq<string name, string metavar, string help> {
- def NAME #_EQ : Joined<["--"], name #"=">,
- HelpText<help>, MetaVarName<metavar>;
- def : Separate<["--"], name>, Alias<!cast<Joined>(NAME #_EQ)>;
-}
-
-def help : F<"help", "Display available options">;
-def : Flag<["-"], "h">, HelpText<"Alias for --help">, Alias<help>;
-def dump_tli : F<"dump-tli", "Dump TLI's list of functions and whether they are available">;
-defm triple : Eq<"triple", "<triple>", "Target triple">;
-defm libdir : Eq<"libdir", "<directory>", "Root directory for finding library files">;
-def separate : F<"separate", "Report on each library file separately">;
-def report_EQ : Joined<["--"], "report=">, HelpText<"Level of detail to report">, Values<"summary,discrepancy,full">;
diff --git a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp b/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp
deleted file mode 100644
index bf25efc0b0bdf..0000000000000
--- a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp
+++ /dev/null
@@ -1,357 +0,0 @@
-//===-- llvm-tli-checker.cpp - Compare TargetLibraryInfo to SDK libraries -===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/ADT/SmallString.h"
-#include "llvm/ADT/StringMap.h"
-#include "llvm/ADT/Triple.h"
-#include "llvm/Analysis/TargetLibraryInfo.h"
-#include "llvm/Config/llvm-config.h"
-#include "llvm/Demangle/Demangle.h"
-#include "llvm/Object/Archive.h"
-#include "llvm/Object/ELFObjectFile.h"
-#include "llvm/Option/ArgList.h"
-#include "llvm/Option/Option.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/InitLLVM.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/WithColor.h"
-
-using namespace llvm;
-using namespace llvm::object;
-
-// Command-line option boilerplate.
-namespace {
-enum ID {
- OPT_INVALID = 0, // This is not an option ID.
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES) \
- OPT_##ID,
-#include "Opts.inc"
-#undef OPTION
-};
-
-#define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE;
-#include "Opts.inc"
-#undef PREFIX
-
-const opt::OptTable::Info InfoTable[] = {
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES) \
- { \
- PREFIX, NAME, HELPTEXT, \
- METAVAR, OPT_##ID, opt::Option::KIND##Class, \
- PARAM, FLAGS, OPT_##GROUP, \
- OPT_##ALIAS, ALIASARGS, VALUES},
-#include "Opts.inc"
-#undef OPTION
-};
-
-class TLICheckerOptTable : public opt::OptTable {
-public:
- TLICheckerOptTable() : OptTable(InfoTable) {}
-};
-} // namespace
-
-// We have three levels of reporting.
-enum class ReportKind {
- Error, // For argument parsing errors.
- Summary, // Report counts but not details.
- Discrepancy, // Report where TLI and the library
diff er.
- Full // Report for every known-to-TLI function.
-};
-
-// Most of the ObjectFile interfaces return an Expected<T>, so make it easy
-// to ignore those.
-template <typename T> T unwrapIgnoreError(Expected<T> E) {
- if (E)
- return std::move(*E);
- // Sink the error and return a nothing value.
- consumeError(E.takeError());
- return T();
-}
-
-static void fail(const Twine &Message) {
- WithColor::error() << Message << '\n';
- exit(EXIT_FAILURE);
-}
-
-// Some problem occurred with an archive member; complain and continue.
-static void reportArchiveChildIssue(const object::Archive::Child &C, int Index,
- StringRef ArchiveFilename) {
- // First get the member name.
- std::string ChildName;
- Expected<StringRef> NameOrErr = C.getName();
- if (NameOrErr)
- ChildName = std::string(NameOrErr.get());
- else {
- // Ignore the name-fetch error, just report the index.
- consumeError(NameOrErr.takeError());
- ChildName = "<file index: " + std::to_string(Index) + ">";
- }
-
- WithColor::warning() << ArchiveFilename << "(" << ChildName
- << "): member is not usable\n";
-}
-
-// Return Name, and if Name is mangled, append "aka" and the demangled name.
-static std::string PrintableName(StringRef Name) {
- std::string OutputName = "'";
- OutputName += Name;
- OutputName += "'";
- if (Name.startswith("_Z") || Name.startswith("??")) {
- OutputName += " aka ";
- OutputName += demangle(Name.str());
- }
- return OutputName;
-}
-
-// Store all the names that TargetLibraryInfo knows about; the bool indicates
-// whether TLI has it marked as "available" for the target of interest.
-// This is a vector to preserve the sorted order for better reporting.
-struct TLINameList : std::vector<std::pair<StringRef, bool>> {
- // Record all the TLI info in the vector.
- void initialize(StringRef TargetTriple);
- // Print out what we found.
- void dump();
-};
-TLINameList TLINames;
-
-void TLINameList::initialize(StringRef TargetTriple) {
- Triple T(TargetTriple);
- TargetLibraryInfoImpl TLII(T);
- TargetLibraryInfo TLI(TLII);
-
- reserve(LibFunc::NumLibFuncs);
- size_t NumAvailable = 0;
- for (unsigned FI = 0; FI != LibFunc::NumLibFuncs; ++FI) {
- LibFunc LF = (LibFunc)FI;
- bool Available = TLI.has(LF);
- // getName returns names only for available funcs.
- TLII.setAvailable(LF);
- emplace_back(TLI.getName(LF), Available);
- if (Available)
- ++NumAvailable;
- }
- outs() << "TLI knows " << LibFunc::NumLibFuncs << " symbols, " << NumAvailable
- << " available for '" << TargetTriple << "'\n";
-}
-
-void TLINameList::dump() {
- // Assume this gets called after initialize(), so we have the above line of
- // output as a header. So, for example, no need to repeat the triple.
- for (auto &TLIName : TLINames) {
- outs() << (TLIName.second ? " " : "not ")
- << "available: " << PrintableName(TLIName.first) << '\n';
- }
-}
-
-// Store all the exported symbol names we found in the input libraries.
-// We use a map to get hashed lookup speed; the bool is meaningless.
-class SDKNameMap : public StringMap<bool> {
- void populateFromObject(ObjectFile *O);
- void populateFromArchive(Archive *A);
-
-public:
- void populateFromFile(StringRef LibDir, StringRef LibName);
-};
-SDKNameMap SDKNames;
-
-// Given an ObjectFile, extract the global function symbols.
-void SDKNameMap::populateFromObject(ObjectFile *O) {
- // FIXME: Support COFF.
- if (!O->isELF()) {
- WithColor::warning() << "Only ELF-format files are supported\n";
- return;
- }
- auto *ELF = cast<const ELFObjectFileBase>(O);
-
- for (auto I = ELF->getDynamicSymbolIterators().begin();
- I != ELF->getDynamicSymbolIterators().end(); ++I) {
- // We want only global function symbols.
- SymbolRef::Type Type = unwrapIgnoreError(I->getType());
- uint32_t Flags = unwrapIgnoreError(I->getFlags());
- StringRef Name = unwrapIgnoreError(I->getName());
- if (Type == SymbolRef::ST_Function && (Flags & SymbolRef::SF_Global))
- insert({Name, true});
- }
-}
-
-// Unpack an archive and populate from the component object files.
-// This roughly imitates dumpArchive() from llvm-objdump.cpp.
-void SDKNameMap::populateFromArchive(Archive *A) {
- Error Err = Error::success();
- int Index = -1;
- for (auto &C : A->children(Err)) {
- ++Index;
- Expected<std::unique_ptr<object::Binary>> ChildOrErr = C.getAsBinary();
- if (!ChildOrErr) {
- if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError())) {
- // Issue a generic warning.
- consumeError(std::move(E));
- reportArchiveChildIssue(C, Index, A->getFileName());
- }
- continue;
- }
- if (ObjectFile *O = dyn_cast<ObjectFile>(&*ChildOrErr.get()))
- populateFromObject(O);
- // Ignore non-object archive members.
- }
- if (Err)
- WithColor::defaultErrorHandler(std::move(Err));
-}
-
-// Unpack a library file and extract the global function names.
-void SDKNameMap::populateFromFile(StringRef LibDir, StringRef LibName) {
- // Pick an arbitrary but reasonable default size.
- SmallString<255> Filepath(LibDir);
- sys::path::append(Filepath, LibName);
- if (!sys::fs::exists(Filepath)) {
- WithColor::warning() << "Could not find '" << StringRef(Filepath) << "'\n";
- return;
- }
- outs() << "\nLooking for symbols in '" << StringRef(Filepath) << "'\n";
- auto ExpectedBinary = createBinary(Filepath);
- if (!ExpectedBinary) {
- // FIXME: Report this better.
- WithColor::defaultWarningHandler(ExpectedBinary.takeError());
- return;
- }
- OwningBinary<Binary> OBinary = std::move(*ExpectedBinary);
- Binary &Binary = *OBinary.getBinary();
- size_t Precount = size();
- if (Archive *A = dyn_cast<Archive>(&Binary))
- populateFromArchive(A);
- else if (ObjectFile *O = dyn_cast<ObjectFile>(&Binary))
- populateFromObject(O);
- else {
- WithColor::warning() << "Not an Archive or ObjectFile: '"
- << StringRef(Filepath) << "'\n";
- return;
- }
- if (Precount == size())
- WithColor::warning() << "No symbols found in '" << StringRef(Filepath)
- << "'\n";
- else
- outs() << "Found " << size() - Precount << " global function symbols in '"
- << StringRef(Filepath) << "'\n";
-}
-
-int main(int argc, char *argv[]) {
- InitLLVM X(argc, argv);
- BumpPtrAllocator A;
- StringSaver Saver(A);
- TLICheckerOptTable Tbl;
- opt::InputArgList Args = Tbl.parseArgs(argc, argv, OPT_UNKNOWN, Saver,
- [&](StringRef Msg) { fail(Msg); });
-
- if (Args.hasArg(OPT_help)) {
- std::string Usage(argv[0]);
- Usage += " [options] library-file [library-file...]";
- Tbl.printHelp(outs(), Usage.c_str(),
- "LLVM TargetLibraryInfo versus SDK checker");
- outs() << "\nPass @FILE as argument to read options or library names from "
- "FILE.\n";
- return 0;
- }
-
- TLINames.initialize(Args.getLastArgValue(OPT_triple_EQ));
-
- // --dump-tli doesn't require any input files.
- if (Args.hasArg(OPT_dump_tli)) {
- TLINames.dump();
- return 0;
- }
-
- std::vector<std::string> LibList = Args.getAllArgValues(OPT_INPUT);
- if (LibList.empty()) {
- WithColor::error() << "No input files\n";
- exit(EXIT_FAILURE);
- }
- StringRef LibDir = Args.getLastArgValue(OPT_libdir_EQ);
- bool SeparateMode = Args.hasArg(OPT_separate);
-
- ReportKind ReportLevel =
- SeparateMode ? ReportKind::Summary : ReportKind::Discrepancy;
- if (const opt::Arg *A = Args.getLastArg(OPT_report_EQ)) {
- ReportLevel = StringSwitch<ReportKind>(A->getValue())
- .Case("summary", ReportKind::Summary)
- .Case("discrepancy", ReportKind::Discrepancy)
- .Case("full", ReportKind::Full)
- .Default(ReportKind::Error);
- if (ReportLevel == ReportKind::Error) {
- WithColor::error() << "invalid option for --report: " << A->getValue();
- exit(EXIT_FAILURE);
- }
- }
-
- for (size_t I = 0; I < LibList.size(); ++I) {
- // In SeparateMode we report on input libraries individually; otherwise
- // we do one big combined search. Reading to the end of LibList here
- // will cause the outer while loop to terminate cleanly.
- if (SeparateMode) {
- SDKNames.clear();
- SDKNames.populateFromFile(LibDir, LibList[I]);
- if (SDKNames.empty())
- continue;
- } else {
- do
- SDKNames.populateFromFile(LibDir, LibList[I]);
- while (++I < LibList.size());
- if (SDKNames.empty()) {
- WithColor::error() << "NO symbols found!\n";
- break;
- }
- outs() << "Found a grand total of " << SDKNames.size()
- << " library symbols\n";
- }
- unsigned TLIdoesSDKdoesnt = 0;
- unsigned TLIdoesntSDKdoes = 0;
- unsigned TLIandSDKboth = 0;
- unsigned TLIandSDKneither = 0;
- for (auto &TLIName : TLINames) {
- bool TLIHas = TLIName.second;
- bool SDKHas = SDKNames.count(TLIName.first) == 1;
- int Which = int(TLIHas) * 2 + int(SDKHas);
- switch (Which) {
- case 0: ++TLIandSDKneither; break;
- case 1: ++TLIdoesntSDKdoes; break;
- case 2: ++TLIdoesSDKdoesnt; break;
- case 3: ++TLIandSDKboth; break;
- }
- // If the results match, report only if user requested a full report.
- ReportKind Threshold =
- TLIHas == SDKHas ? ReportKind::Full : ReportKind::Discrepancy;
- if (Threshold <= ReportLevel) {
- constexpr char YesNo[2][4] = {"no ", "yes"};
- constexpr char Indicator[4][3] = {"!!", ">>", "<<", "=="};
- outs() << Indicator[Which] << " TLI " << YesNo[TLIHas] << " SDK "
- << YesNo[SDKHas] << ": " << PrintableName(TLIName.first) << '\n';
- }
- }
-
- assert(TLIandSDKboth + TLIandSDKneither + TLIdoesSDKdoesnt +
- TLIdoesntSDKdoes ==
- LibFunc::NumLibFuncs);
- outs() << "<< Total TLI yes SDK no: " << TLIdoesSDKdoesnt
- << "\n>> Total TLI no SDK yes: " << TLIdoesntSDKdoes
- << "\n== Total TLI yes SDK yes: " << TLIandSDKboth;
- if (TLIandSDKboth == 0) {
- outs() << " *** NO TLI SYMBOLS FOUND";
- if (SeparateMode)
- outs() << " in '" << LibList[I] << "'";
- }
- outs() << '\n';
-
- if (!SeparateMode) {
- if (TLIdoesSDKdoesnt == 0 && TLIdoesntSDKdoes == 0)
- outs() << "PASS: LLVM TLI matched SDK libraries successfully.\n";
- else
- outs() << "FAIL: LLVM TLI doesn't match SDK libraries.\n";
- }
- }
-}
More information about the llvm-commits
mailing list