mirror of
git://sourceware.org/git/libabigail.git
synced 2025-01-20 16:30:44 +00:00
abidiff: Add --{follow,list}-dependencies & add-binaries{1,2} support
This patch implements comparing two sets of binaries constituted by the binaries given in argument of the abidiff command, as well as their respective dependencies (specified by the DT_NEEDED ELF property for ELF binaries) or an arbitrary set of libraries found in the directories determined by --added-binaries-dir{1,2}. The detected dependencies can also be listed by the option --list-dependencies. * tools/abidiff.cc (options::{follow_dependencies, list_dependencies, added_bins_dirs1, added_bins_dirs2, added_bins1, added_bins2}): Add new data members. (options::options): Initialize the new follow_dependencies and list_dependencies boolean data members. (display_usage): Add usage strings for --added-binaries-dir{1,2}, --add-binaries{1,2}, --follow-dependencies, --list-dependencies. (parse_command_line): Parse the options --follow-dependencies, --list-dependencies, --added-binaries-dir{1,2}, --add-binaries{1,2}. (display_dependencies): Add new static function. (main): Support the new --add-binaries{1,2}, --follow-dependencies, --list-dependencies. * doc/manuals/abidiff.rst: Document the new options above. * tests/data/test-abidiff-exit/test-PR30034/libabigail.abignore: Add test input. * tests/data/test-abidiff-exit/test-PR30034/reference/include/rte_log.h: Likewise. * tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_eal.so: Likewise. * tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_eal.so.23: Likewise. * tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_eal.so.23.1: Likewise. * tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_kvargs.so: Likewise. * tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_kvargs.so.23: Likewise. * tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_kvargs.so.23.1: Likewise. * tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_telemetry.so: Likewise. * tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_telemetry.so.23: Likewise. * tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_telemetry.so.23.1: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/include/rte_log.h: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_eal.so: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_eal.so.23: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_eal.so.23.2: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_kvargs.so: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_kvargs.so.23: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_kvargs.so.23.2: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_log.so: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_log.so.23: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_log.so.23.2: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_telemetry.so: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_telemetry.so.23: Likewise. * tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_telemetry.so.23.2: Likewise. * tests/data/test-abidiff-exit/test-PR30034/test-PR30034-report-1.txt: Likewise. * tests/data/Makefile.am: Add the test inputs to source distribution. * tests/test-abidiff-exit.cc (InOutSpec::in_elfv{0,1}_added_bins_dir): Add new data member. (main): Add --added-binaries-dir{1,2} option to abidiff if the InOutSpec::in_elfv{0,1}_added_bins_dir data members are non-empty. (in_out_specs): Add test inputs to this test harness. Signed-off-by: Dodji Seketeli <dodji@redhat.com>
This commit is contained in:
parent
3e568fef6b
commit
0b338dfaf6
@ -177,6 +177,72 @@ Options
|
||||
library that the tool has to consider. The tool will thus filter
|
||||
out ABI changes on types that are not defined in public headers.
|
||||
|
||||
* ``--add-binaries1`` <*bin1,bin2,bin3,..*>
|
||||
|
||||
For each of the comma-separated binaries given in argument to this
|
||||
option, if the binary is found in the directory specified by the
|
||||
``--added-binaries-dir1`` option, then ``abidiff`` loads the ABI
|
||||
corpus of the binary and adds it to a set of corpora (called an
|
||||
ABI Corpus Group) that includes the first argument of ``abidiff``.
|
||||
|
||||
That ABI corpus group is then compared against the second corpus
|
||||
group given in argument to ``abidiff``.
|
||||
|
||||
* ``--add-binaries2`` <*bin1,bin2,bin3,..*>
|
||||
|
||||
For each of the comma-separated binaries given in argument to this
|
||||
option, if the binary is found in the directory specified by the
|
||||
``--added-binaries-dir2`` option, then ``abidiff`` loads the ABI
|
||||
corpus of the binary and adds it to a set of corpora(called an ABI
|
||||
Corpus Group) that includes the second argument of ``abidiff``.
|
||||
|
||||
That ABI corpus group is then compared against the first corpus
|
||||
group given in argument to ``abidiff``.
|
||||
|
||||
* ``--follow-dependencies | --fdeps``
|
||||
|
||||
For each dependency of the first argument of ``abidiff``, if it's
|
||||
found in the directory specified by the ``--added-binaries-dir1``
|
||||
option, then construct an ABI corpus out of the dependency, add it
|
||||
to a set of corpora (called an ABI Corpus Group) that includes the
|
||||
first argument of ``abidiff``.
|
||||
|
||||
Similarly, for each dependency of the second argument of
|
||||
``abidiff``, if it's found in the directory specified by the
|
||||
``--added-binaries-dir2`` option, then construct an ABI corpus out
|
||||
of the dependency, add it to an ABI corpus group that includes the
|
||||
second argument of ``abidiff``.
|
||||
|
||||
These two ABI corpus groups are then compared against each other.
|
||||
|
||||
Said otherwise, this makes ``abidiff`` compare the set of its
|
||||
first input and its dependencies against the set of its second
|
||||
input and its dependencies.
|
||||
|
||||
* ``list-dependencies | --ldeps``
|
||||
|
||||
This option lists all the dependencies of the input arguments of
|
||||
``abidiff`` that are found in the directories specified by the
|
||||
options ``--added-binaries-dir1`` and ``--added-binaries-dir2``
|
||||
|
||||
* ``--added-binaries-dir1 | --abd1`` <added-binaries-directory-1>
|
||||
|
||||
This option is to be used in conjunction with the
|
||||
``--add-binaries1``, ``--follow-dependencies`` and
|
||||
``--list-dependencies`` options. Binaries referred to by these
|
||||
options, if found in the directory `added-binaries-directory-1`,
|
||||
are loaded as ABI corpus and are added to the first ABI corpus group
|
||||
that is to be used in the comparison.
|
||||
|
||||
* ``--added-binaries-dir2 | --abd2`` <added-binaries-directory-2>
|
||||
|
||||
This option is to be used in conjunction with the
|
||||
``--add-binaries2``, ``--follow-dependencies`` and
|
||||
``--list-dependencies`` options. Binaries referred to by these
|
||||
options, if found in the directory `added-binaries-directory-2`,
|
||||
are loaded as ABI corpus and are added to the second ABI corpus
|
||||
group to be used in the comparison.
|
||||
|
||||
* ``--no-linux-kernel-mode``
|
||||
|
||||
Without this option, if abidiff detects that the binaries it is
|
||||
@ -845,6 +911,30 @@ Usage examples
|
||||
|
||||
$
|
||||
|
||||
4. Comparing two sets of binaries that are passed on the command line: ::
|
||||
|
||||
$ abidiff --add-binaries1=file2-v1 \
|
||||
--add-binaries2=file2-v2,file2-v1 \
|
||||
--added-binaries-dir1 dir1 \
|
||||
--added-binaries-dir2 dir2 \
|
||||
file1-v1 file1-v2
|
||||
|
||||
Note that the files ``file2-v1``, and ``file2-v2`` are to be
|
||||
found in ``dir1`` and ``dir2`` or in the current directory.
|
||||
|
||||
|
||||
5. Compare two libraries and their dependencies: ::
|
||||
|
||||
$ abidiff --follow-dependencies \
|
||||
--added-binaries-dir1 /some/where \
|
||||
--added-binaries-dir2 /some/where/else \
|
||||
foo bar
|
||||
|
||||
This compares the set of binaries comprised by ``foo`` and its
|
||||
dependencies against the set of binaries comprised by ``bar`` and
|
||||
its dependencies.
|
||||
|
||||
|
||||
.. _ELF: http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
|
||||
.. _DWARF: http://www.dwarfstd.org
|
||||
.. _CTF: https://raw.githubusercontent.com/wiki/oracle/binutils-gdb/files/ctf-spec.pdf
|
||||
|
@ -326,6 +326,31 @@ test-abidiff-exit/PR30503/libsdl/1.2.60/lib64/libSDL-1.2.so.1.2.60.debug \
|
||||
test-abidiff-exit/PR30503/libsdl/1.2.64/lib64/libSDL-1.2.so.1.2.64 \
|
||||
test-abidiff-exit/PR30503/libsdl/1.2.64/lib64/libSDL-1.2.so.1.2.64.debug \
|
||||
test-abidiff-exit/PR30503/libsdl/libsdl-1.2.60-1.2.64-report.txt \
|
||||
test-abidiff-exit/test-PR30034/libabigail.abignore \
|
||||
test-abidiff-exit/test-PR30034/reference/include/rte_log.h \
|
||||
test-abidiff-exit/test-PR30034/reference/lib64/librte_eal.so \
|
||||
test-abidiff-exit/test-PR30034/reference/lib64/librte_eal.so.23 \
|
||||
test-abidiff-exit/test-PR30034/reference/lib64/librte_eal.so.23.1 \
|
||||
test-abidiff-exit/test-PR30034/reference/lib64/librte_kvargs.so \
|
||||
test-abidiff-exit/test-PR30034/reference/lib64/librte_kvargs.so.23 \
|
||||
test-abidiff-exit/test-PR30034/reference/lib64/librte_kvargs.so.23.1 \
|
||||
test-abidiff-exit/test-PR30034/reference/lib64/librte_telemetry.so \
|
||||
test-abidiff-exit/test-PR30034/reference/lib64/librte_telemetry.so.23 \
|
||||
test-abidiff-exit/test-PR30034/reference/lib64/librte_telemetry.so.23.1 \
|
||||
test-abidiff-exit/test-PR30034/split/include/rte_log.h \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_eal.so \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_eal.so.23 \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_eal.so.23.2 \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_kvargs.so \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_kvargs.so.23 \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_kvargs.so.23.2 \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_log.so \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_log.so.23 \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_log.so.23.2 \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_telemetry.so \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_telemetry.so.23 \
|
||||
test-abidiff-exit/test-PR30034/split/lib64/librte_telemetry.so.23.2 \
|
||||
test-abidiff-exit/test-PR30034/test-PR30034-report-1.txt \
|
||||
\
|
||||
test-diff-dwarf/test0-v0.cc \
|
||||
test-diff-dwarf/test0-v0.o \
|
||||
|
@ -0,0 +1,47 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Core suppression rules: DO NOT TOUCH ;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
[suppress_function]
|
||||
symbol_version = EXPERIMENTAL
|
||||
[suppress_variable]
|
||||
symbol_version = EXPERIMENTAL
|
||||
|
||||
[suppress_function]
|
||||
symbol_version = INTERNAL
|
||||
[suppress_variable]
|
||||
symbol_version = INTERNAL
|
||||
|
||||
; Ignore generated PMD information strings
|
||||
[suppress_variable]
|
||||
name_regexp = _pmd_info$
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Special rules to skip libraries ;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;
|
||||
; This is not a libabigail rule (see check-abi.sh).
|
||||
; This is used for driver removal and other special cases like mlx glue libs.
|
||||
;
|
||||
; SKIP_LIBRARY=librte_common_mlx5_glue
|
||||
; SKIP_LIBRARY=librte_net_mlx4_glue
|
||||
; SKIP_LIBRARY=librte_net_liquidio
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Experimental APIs exceptions ;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; Ignore changes to asymmetric crypto API which is experimental
|
||||
[suppress_type]
|
||||
name = rte_crypto_asym_op
|
||||
[suppress_type]
|
||||
type_kind = enum
|
||||
changed_enumerators = RTE_CRYPTO_ASYM_XFORM_ECPM, RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Temporary exceptions till next major ABI version ;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; Ignore changes to rte_security_ops which are internal to PMD.
|
||||
[suppress_type]
|
||||
name = rte_security_ops
|
@ -0,0 +1,409 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause
|
||||
* Copyright(c) 2010-2017 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef _RTE_LOG_H_
|
||||
#define _RTE_LOG_H_
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* RTE Logs API
|
||||
*
|
||||
* This file provides a log API to RTE applications.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <rte_common.h>
|
||||
#include <rte_config.h>
|
||||
|
||||
/* SDK log type */
|
||||
#define RTE_LOGTYPE_EAL 0 /**< Log related to eal. */
|
||||
#define RTE_LOGTYPE_MALLOC 1 /**< Log related to malloc. */
|
||||
#define RTE_LOGTYPE_RING 2 /**< Log related to ring. */
|
||||
#define RTE_LOGTYPE_MEMPOOL 3 /**< Log related to mempool. */
|
||||
#define RTE_LOGTYPE_TIMER 4 /**< Log related to timers. */
|
||||
#define RTE_LOGTYPE_PMD 5 /**< Log related to poll mode driver. */
|
||||
#define RTE_LOGTYPE_HASH 6 /**< Log related to hash table. */
|
||||
#define RTE_LOGTYPE_LPM 7 /**< Log related to LPM. */
|
||||
#define RTE_LOGTYPE_KNI 8 /**< Log related to KNI. */
|
||||
#define RTE_LOGTYPE_ACL 9 /**< Log related to ACL. */
|
||||
#define RTE_LOGTYPE_POWER 10 /**< Log related to power. */
|
||||
#define RTE_LOGTYPE_METER 11 /**< Log related to QoS meter. */
|
||||
#define RTE_LOGTYPE_SCHED 12 /**< Log related to QoS port scheduler. */
|
||||
#define RTE_LOGTYPE_PORT 13 /**< Log related to port. */
|
||||
#define RTE_LOGTYPE_TABLE 14 /**< Log related to table. */
|
||||
#define RTE_LOGTYPE_PIPELINE 15 /**< Log related to pipeline. */
|
||||
#define RTE_LOGTYPE_MBUF 16 /**< Log related to mbuf. */
|
||||
#define RTE_LOGTYPE_CRYPTODEV 17 /**< Log related to cryptodev. */
|
||||
#define RTE_LOGTYPE_EFD 18 /**< Log related to EFD. */
|
||||
#define RTE_LOGTYPE_EVENTDEV 19 /**< Log related to eventdev. */
|
||||
#define RTE_LOGTYPE_GSO 20 /**< Log related to GSO. */
|
||||
|
||||
/* these log types can be used in an application */
|
||||
#define RTE_LOGTYPE_USER1 24 /**< User-defined log type 1. */
|
||||
#define RTE_LOGTYPE_USER2 25 /**< User-defined log type 2. */
|
||||
#define RTE_LOGTYPE_USER3 26 /**< User-defined log type 3. */
|
||||
#define RTE_LOGTYPE_USER4 27 /**< User-defined log type 4. */
|
||||
#define RTE_LOGTYPE_USER5 28 /**< User-defined log type 5. */
|
||||
#define RTE_LOGTYPE_USER6 29 /**< User-defined log type 6. */
|
||||
#define RTE_LOGTYPE_USER7 30 /**< User-defined log type 7. */
|
||||
#define RTE_LOGTYPE_USER8 31 /**< User-defined log type 8. */
|
||||
|
||||
/** First identifier for extended logs */
|
||||
#define RTE_LOGTYPE_FIRST_EXT_ID 32
|
||||
|
||||
/* Can't use 0, as it gives compiler warnings */
|
||||
#define RTE_LOG_EMERG 1U /**< System is unusable. */
|
||||
#define RTE_LOG_ALERT 2U /**< Action must be taken immediately. */
|
||||
#define RTE_LOG_CRIT 3U /**< Critical conditions. */
|
||||
#define RTE_LOG_ERR 4U /**< Error conditions. */
|
||||
#define RTE_LOG_WARNING 5U /**< Warning conditions. */
|
||||
#define RTE_LOG_NOTICE 6U /**< Normal but significant condition. */
|
||||
#define RTE_LOG_INFO 7U /**< Informational. */
|
||||
#define RTE_LOG_DEBUG 8U /**< Debug-level messages. */
|
||||
#define RTE_LOG_MAX RTE_LOG_DEBUG /**< Most detailed log level. */
|
||||
|
||||
/**
|
||||
* Change the stream that will be used by the logging system.
|
||||
*
|
||||
* This can be done at any time. The f argument represents the stream
|
||||
* to be used to send the logs. If f is NULL, the default output is
|
||||
* used (stderr).
|
||||
*
|
||||
* @param f
|
||||
* Pointer to the stream.
|
||||
* @return
|
||||
* - 0 on success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
int rte_openlog_stream(FILE *f);
|
||||
|
||||
/**
|
||||
* Retrieve the stream used by the logging system (see rte_openlog_stream()
|
||||
* to change it).
|
||||
*
|
||||
* @return
|
||||
* Pointer to the stream.
|
||||
*/
|
||||
FILE *rte_log_get_stream(void);
|
||||
|
||||
/**
|
||||
* Set the global log level.
|
||||
*
|
||||
* After this call, logs with a level lower or equal than the level
|
||||
* passed as argument will be displayed.
|
||||
*
|
||||
* @param level
|
||||
* Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
|
||||
*/
|
||||
void rte_log_set_global_level(uint32_t level);
|
||||
|
||||
/**
|
||||
* Get the global log level.
|
||||
*
|
||||
* @return
|
||||
* The current global log level.
|
||||
*/
|
||||
uint32_t rte_log_get_global_level(void);
|
||||
|
||||
/**
|
||||
* Get the log level for a given type.
|
||||
*
|
||||
* @param logtype
|
||||
* The log type identifier.
|
||||
* @return
|
||||
* 0 on success, a negative value if logtype is invalid.
|
||||
*/
|
||||
int rte_log_get_level(uint32_t logtype);
|
||||
|
||||
/**
|
||||
* For a given `logtype`, check if a log with `loglevel` can be printed.
|
||||
*
|
||||
* @param logtype
|
||||
* The log type identifier
|
||||
* @param loglevel
|
||||
* Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
|
||||
* @return
|
||||
* Returns 'true' if log can be printed and 'false' if it can't.
|
||||
*/
|
||||
bool rte_log_can_log(uint32_t logtype, uint32_t loglevel);
|
||||
|
||||
/**
|
||||
* Set the log level for a given type based on globbing pattern.
|
||||
*
|
||||
* @param pattern
|
||||
* The globbing pattern identifying the log type.
|
||||
* @param level
|
||||
* The level to be set.
|
||||
* @return
|
||||
* 0 on success, a negative value if level is invalid.
|
||||
*/
|
||||
int rte_log_set_level_pattern(const char *pattern, uint32_t level);
|
||||
|
||||
/**
|
||||
* Set the log level for a given type based on regular expression.
|
||||
*
|
||||
* @param regex
|
||||
* The regular expression identifying the log type.
|
||||
* @param level
|
||||
* The level to be set.
|
||||
* @return
|
||||
* 0 on success, a negative value if level is invalid.
|
||||
*/
|
||||
int rte_log_set_level_regexp(const char *regex, uint32_t level);
|
||||
|
||||
/**
|
||||
* Set the log level for a given type.
|
||||
*
|
||||
* @param logtype
|
||||
* The log type identifier.
|
||||
* @param level
|
||||
* The level to be set.
|
||||
* @return
|
||||
* 0 on success, a negative value if logtype or level is invalid.
|
||||
*/
|
||||
int rte_log_set_level(uint32_t logtype, uint32_t level);
|
||||
|
||||
/**
|
||||
* Get the current loglevel for the message being processed.
|
||||
*
|
||||
* Before calling the user-defined stream for logging, the log
|
||||
* subsystem sets a per-lcore variable containing the loglevel and the
|
||||
* logtype of the message being processed. This information can be
|
||||
* accessed by the user-defined log output function through this
|
||||
* function.
|
||||
*
|
||||
* @return
|
||||
* The loglevel of the message being processed.
|
||||
*/
|
||||
int rte_log_cur_msg_loglevel(void);
|
||||
|
||||
/**
|
||||
* Get the current logtype for the message being processed.
|
||||
*
|
||||
* Before calling the user-defined stream for logging, the log
|
||||
* subsystem sets a per-lcore variable containing the loglevel and the
|
||||
* logtype of the message being processed. This information can be
|
||||
* accessed by the user-defined log output function through this
|
||||
* function.
|
||||
*
|
||||
* @return
|
||||
* The logtype of the message being processed.
|
||||
*/
|
||||
int rte_log_cur_msg_logtype(void);
|
||||
|
||||
/**
|
||||
* Register a dynamic log type
|
||||
*
|
||||
* If a log is already registered with the same type, the returned value
|
||||
* is the same than the previous one.
|
||||
*
|
||||
* @param name
|
||||
* The string identifying the log type.
|
||||
* @return
|
||||
* - >0: success, the returned value is the log type identifier.
|
||||
* - (-ENOMEM): cannot allocate memory.
|
||||
*/
|
||||
int rte_log_register(const char *name);
|
||||
|
||||
/**
|
||||
* Register a dynamic log type and try to pick its level from EAL options
|
||||
*
|
||||
* rte_log_register() is called inside. If successful, the function tries
|
||||
* to search for matching regexp in the list of EAL log level options and
|
||||
* pick the level from the last matching entry. If nothing can be applied
|
||||
* from the list, the level will be set to the user-defined default value.
|
||||
*
|
||||
* @param name
|
||||
* Name for the log type to be registered
|
||||
* @param level_def
|
||||
* Fallback level to be set if the global list has no matching options
|
||||
* @return
|
||||
* - >=0: the newly registered log type
|
||||
* - <0: rte_log_register() error value
|
||||
*/
|
||||
int rte_log_register_type_and_pick_level(const char *name, uint32_t level_def);
|
||||
|
||||
/**
|
||||
* Dump name of each logtype, one per line.
|
||||
*
|
||||
* @param out
|
||||
* Stream where the list is sent.
|
||||
* @param prefix
|
||||
* String preceding each logtype in the output.
|
||||
*/
|
||||
void rte_log_list_types(FILE *out, const char *prefix);
|
||||
|
||||
/**
|
||||
* Dump log information.
|
||||
*
|
||||
* Dump the global level and the registered log types.
|
||||
*
|
||||
* @param f
|
||||
* The output stream where the dump should be sent.
|
||||
*/
|
||||
void rte_log_dump(FILE *f);
|
||||
|
||||
/**
|
||||
* Generates a log message.
|
||||
*
|
||||
* The message will be sent in the stream defined by the previous call
|
||||
* to rte_openlog_stream().
|
||||
*
|
||||
* The level argument determines if the log should be displayed or
|
||||
* not, depending on the loglevel settings.
|
||||
*
|
||||
* The preferred alternative is the RTE_LOG() because it adds the
|
||||
* level and type in the logged string.
|
||||
*
|
||||
* @param level
|
||||
* Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
|
||||
* @param logtype
|
||||
* The log type, for example, RTE_LOGTYPE_EAL.
|
||||
* @param format
|
||||
* The format string, as in printf(3), followed by the variable arguments
|
||||
* required by the format.
|
||||
* @return
|
||||
* - 0: Success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
int rte_log(uint32_t level, uint32_t logtype, const char *format, ...)
|
||||
#ifdef __GNUC__
|
||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2))
|
||||
__rte_cold
|
||||
#endif
|
||||
#endif
|
||||
__rte_format_printf(3, 4);
|
||||
|
||||
/**
|
||||
* Generates a log message.
|
||||
*
|
||||
* The message will be sent in the stream defined by the previous call
|
||||
* to rte_openlog_stream().
|
||||
*
|
||||
* The level argument determines if the log should be displayed or
|
||||
* not, depending on the loglevel settings. A trailing
|
||||
* newline may be added if needed.
|
||||
*
|
||||
* The preferred alternative is the RTE_LOG() because it adds the
|
||||
* level and type in the logged string.
|
||||
*
|
||||
* @param level
|
||||
* Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
|
||||
* @param logtype
|
||||
* The log type, for example, RTE_LOGTYPE_EAL.
|
||||
* @param format
|
||||
* The format string, as in printf(3), followed by the variable arguments
|
||||
* required by the format.
|
||||
* @param ap
|
||||
* The va_list of the variable arguments required by the format.
|
||||
* @return
|
||||
* - 0: Success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
int rte_vlog(uint32_t level, uint32_t logtype, const char *format, va_list ap)
|
||||
__rte_format_printf(3, 0);
|
||||
|
||||
/**
|
||||
* Generates a log message.
|
||||
*
|
||||
* The RTE_LOG() is a helper that prefixes the string with the log level
|
||||
* and type, and call rte_log().
|
||||
*
|
||||
* @param l
|
||||
* Log level. A value between EMERG (1) and DEBUG (8). The short name is
|
||||
* expanded by the macro, so it cannot be an integer value.
|
||||
* @param t
|
||||
* The log type, for example, EAL. The short name is expanded by the
|
||||
* macro, so it cannot be an integer value.
|
||||
* @param ...
|
||||
* The fmt string, as in printf(3), followed by the variable arguments
|
||||
* required by the format.
|
||||
* @return
|
||||
* - 0: Success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
#define RTE_LOG(l, t, ...) \
|
||||
rte_log(RTE_LOG_ ## l, \
|
||||
RTE_LOGTYPE_ ## t, # t ": " __VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Generates a log message for data path.
|
||||
*
|
||||
* Similar to RTE_LOG(), except that it is removed at compilation time
|
||||
* if the RTE_LOG_DP_LEVEL configuration option is lower than the log
|
||||
* level argument.
|
||||
*
|
||||
* @param l
|
||||
* Log level. A value between EMERG (1) and DEBUG (8). The short name is
|
||||
* expanded by the macro, so it cannot be an integer value.
|
||||
* @param t
|
||||
* The log type, for example, EAL. The short name is expanded by the
|
||||
* macro, so it cannot be an integer value.
|
||||
* @param ...
|
||||
* The fmt string, as in printf(3), followed by the variable arguments
|
||||
* required by the format.
|
||||
* @return
|
||||
* - 0: Success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
#define RTE_LOG_DP(l, t, ...) \
|
||||
(void)((RTE_LOG_ ## l <= RTE_LOG_DP_LEVEL) ? \
|
||||
rte_log(RTE_LOG_ ## l, \
|
||||
RTE_LOGTYPE_ ## t, # t ": " __VA_ARGS__) : \
|
||||
0)
|
||||
|
||||
#define RTE_LOG_REGISTER_IMPL(type, name, level) \
|
||||
int type; \
|
||||
RTE_INIT(__##type) \
|
||||
{ \
|
||||
type = rte_log_register_type_and_pick_level(name, RTE_LOG_##level); \
|
||||
if (type < 0) \
|
||||
type = RTE_LOGTYPE_EAL; \
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a dynamic log type in constructor context with its name and level.
|
||||
*
|
||||
* It is a wrapper macro for declaring the logtype, register the log and
|
||||
* sets it's level in the constructor context.
|
||||
*
|
||||
* @param type
|
||||
* The log type identifier
|
||||
* @param name
|
||||
* Name for the log type to be registered
|
||||
* @param level
|
||||
* Log level. A value between EMERG (1) and DEBUG (8).
|
||||
*/
|
||||
#define RTE_LOG_REGISTER(type, name, level) \
|
||||
RTE_LOG_REGISTER_IMPL(type, RTE_STR(name), level)
|
||||
|
||||
/**
|
||||
* This is an equivalent to RTE_LOG_REGISTER, but relying on the build system
|
||||
* to select the right format for the logtype.
|
||||
*/
|
||||
#define RTE_LOG_REGISTER_DEFAULT(type, level) \
|
||||
RTE_LOG_REGISTER_IMPL(type, RTE_STR(RTE_LOG_DEFAULT_LOGTYPE), level)
|
||||
|
||||
/**
|
||||
* This is an equivalent to RTE_LOG_REGISTER, but relying on the build system
|
||||
* to select the right prefix for the logtype.
|
||||
*/
|
||||
#define RTE_LOG_REGISTER_SUFFIX(type, suffix, level) \
|
||||
RTE_LOG_REGISTER_IMPL(type, \
|
||||
RTE_STR(RTE_LOG_DEFAULT_LOGTYPE) "." RTE_STR(suffix), level)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _RTE_LOG_H_ */
|
@ -0,0 +1 @@
|
||||
librte_eal.so.23
|
@ -0,0 +1 @@
|
||||
librte_eal.so.23.1
|
BIN
tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_eal.so.23.1
Executable file
BIN
tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_eal.so.23.1
Executable file
Binary file not shown.
@ -0,0 +1 @@
|
||||
librte_kvargs.so.23
|
@ -0,0 +1 @@
|
||||
librte_kvargs.so.23.1
|
BIN
tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_kvargs.so.23.1
Executable file
BIN
tests/data/test-abidiff-exit/test-PR30034/reference/lib64/librte_kvargs.so.23.1
Executable file
Binary file not shown.
@ -0,0 +1 @@
|
||||
librte_telemetry.so.23
|
@ -0,0 +1 @@
|
||||
librte_telemetry.so.23.1
|
Binary file not shown.
@ -0,0 +1,409 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause
|
||||
* Copyright(c) 2010-2017 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef _RTE_LOG_H_
|
||||
#define _RTE_LOG_H_
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* RTE Logs API
|
||||
*
|
||||
* This file provides a log API to RTE applications.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <rte_common.h>
|
||||
#include <rte_config.h>
|
||||
|
||||
/* SDK log type */
|
||||
#define RTE_LOGTYPE_EAL 0 /**< Log related to eal. */
|
||||
#define RTE_LOGTYPE_MALLOC 1 /**< Log related to malloc. */
|
||||
#define RTE_LOGTYPE_RING 2 /**< Log related to ring. */
|
||||
#define RTE_LOGTYPE_MEMPOOL 3 /**< Log related to mempool. */
|
||||
#define RTE_LOGTYPE_TIMER 4 /**< Log related to timers. */
|
||||
#define RTE_LOGTYPE_PMD 5 /**< Log related to poll mode driver. */
|
||||
#define RTE_LOGTYPE_HASH 6 /**< Log related to hash table. */
|
||||
#define RTE_LOGTYPE_LPM 7 /**< Log related to LPM. */
|
||||
#define RTE_LOGTYPE_KNI 8 /**< Log related to KNI. */
|
||||
#define RTE_LOGTYPE_ACL 9 /**< Log related to ACL. */
|
||||
#define RTE_LOGTYPE_POWER 10 /**< Log related to power. */
|
||||
#define RTE_LOGTYPE_METER 11 /**< Log related to QoS meter. */
|
||||
#define RTE_LOGTYPE_SCHED 12 /**< Log related to QoS port scheduler. */
|
||||
#define RTE_LOGTYPE_PORT 13 /**< Log related to port. */
|
||||
#define RTE_LOGTYPE_TABLE 14 /**< Log related to table. */
|
||||
#define RTE_LOGTYPE_PIPELINE 15 /**< Log related to pipeline. */
|
||||
#define RTE_LOGTYPE_MBUF 16 /**< Log related to mbuf. */
|
||||
#define RTE_LOGTYPE_CRYPTODEV 17 /**< Log related to cryptodev. */
|
||||
#define RTE_LOGTYPE_EFD 18 /**< Log related to EFD. */
|
||||
#define RTE_LOGTYPE_EVENTDEV 19 /**< Log related to eventdev. */
|
||||
#define RTE_LOGTYPE_GSO 20 /**< Log related to GSO. */
|
||||
|
||||
/* these log types can be used in an application */
|
||||
#define RTE_LOGTYPE_USER1 24 /**< User-defined log type 1. */
|
||||
#define RTE_LOGTYPE_USER2 25 /**< User-defined log type 2. */
|
||||
#define RTE_LOGTYPE_USER3 26 /**< User-defined log type 3. */
|
||||
#define RTE_LOGTYPE_USER4 27 /**< User-defined log type 4. */
|
||||
#define RTE_LOGTYPE_USER5 28 /**< User-defined log type 5. */
|
||||
#define RTE_LOGTYPE_USER6 29 /**< User-defined log type 6. */
|
||||
#define RTE_LOGTYPE_USER7 30 /**< User-defined log type 7. */
|
||||
#define RTE_LOGTYPE_USER8 31 /**< User-defined log type 8. */
|
||||
|
||||
/** First identifier for extended logs */
|
||||
#define RTE_LOGTYPE_FIRST_EXT_ID 32
|
||||
|
||||
/* Can't use 0, as it gives compiler warnings */
|
||||
#define RTE_LOG_EMERG 1U /**< System is unusable. */
|
||||
#define RTE_LOG_ALERT 2U /**< Action must be taken immediately. */
|
||||
#define RTE_LOG_CRIT 3U /**< Critical conditions. */
|
||||
#define RTE_LOG_ERR 4U /**< Error conditions. */
|
||||
#define RTE_LOG_WARNING 5U /**< Warning conditions. */
|
||||
#define RTE_LOG_NOTICE 6U /**< Normal but significant condition. */
|
||||
#define RTE_LOG_INFO 7U /**< Informational. */
|
||||
#define RTE_LOG_DEBUG 8U /**< Debug-level messages. */
|
||||
#define RTE_LOG_MAX RTE_LOG_DEBUG /**< Most detailed log level. */
|
||||
|
||||
/**
|
||||
* Change the stream that will be used by the logging system.
|
||||
*
|
||||
* This can be done at any time. The f argument represents the stream
|
||||
* to be used to send the logs. If f is NULL, the default output is
|
||||
* used (stderr).
|
||||
*
|
||||
* @param f
|
||||
* Pointer to the stream.
|
||||
* @return
|
||||
* - 0 on success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
int rte_openlog_stream(FILE *f);
|
||||
|
||||
/**
|
||||
* Retrieve the stream used by the logging system (see rte_openlog_stream()
|
||||
* to change it).
|
||||
*
|
||||
* @return
|
||||
* Pointer to the stream.
|
||||
*/
|
||||
FILE *rte_log_get_stream(void);
|
||||
|
||||
/**
|
||||
* Set the global log level.
|
||||
*
|
||||
* After this call, logs with a level lower or equal than the level
|
||||
* passed as argument will be displayed.
|
||||
*
|
||||
* @param level
|
||||
* Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
|
||||
*/
|
||||
void rte_log_set_global_level(uint32_t level);
|
||||
|
||||
/**
|
||||
* Get the global log level.
|
||||
*
|
||||
* @return
|
||||
* The current global log level.
|
||||
*/
|
||||
uint32_t rte_log_get_global_level(void);
|
||||
|
||||
/**
|
||||
* Get the log level for a given type.
|
||||
*
|
||||
* @param logtype
|
||||
* The log type identifier.
|
||||
* @return
|
||||
* 0 on success, a negative value if logtype is invalid.
|
||||
*/
|
||||
int rte_log_get_level(uint32_t logtype);
|
||||
|
||||
/**
|
||||
* For a given `logtype`, check if a log with `loglevel` can be printed.
|
||||
*
|
||||
* @param logtype
|
||||
* The log type identifier
|
||||
* @param loglevel
|
||||
* Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
|
||||
* @return
|
||||
* Returns 'true' if log can be printed and 'false' if it can't.
|
||||
*/
|
||||
bool rte_log_can_log(uint32_t logtype, uint32_t loglevel);
|
||||
|
||||
/**
|
||||
* Set the log level for a given type based on globbing pattern.
|
||||
*
|
||||
* @param pattern
|
||||
* The globbing pattern identifying the log type.
|
||||
* @param level
|
||||
* The level to be set.
|
||||
* @return
|
||||
* 0 on success, a negative value if level is invalid.
|
||||
*/
|
||||
int rte_log_set_level_pattern(const char *pattern, uint32_t level);
|
||||
|
||||
/**
|
||||
* Set the log level for a given type based on regular expression.
|
||||
*
|
||||
* @param regex
|
||||
* The regular expression identifying the log type.
|
||||
* @param level
|
||||
* The level to be set.
|
||||
* @return
|
||||
* 0 on success, a negative value if level is invalid.
|
||||
*/
|
||||
int rte_log_set_level_regexp(const char *regex, uint32_t level);
|
||||
|
||||
/**
|
||||
* Set the log level for a given type.
|
||||
*
|
||||
* @param logtype
|
||||
* The log type identifier.
|
||||
* @param level
|
||||
* The level to be set.
|
||||
* @return
|
||||
* 0 on success, a negative value if logtype or level is invalid.
|
||||
*/
|
||||
int rte_log_set_level(uint32_t logtype, uint32_t level);
|
||||
|
||||
/**
|
||||
* Get the current loglevel for the message being processed.
|
||||
*
|
||||
* Before calling the user-defined stream for logging, the log
|
||||
* subsystem sets a per-lcore variable containing the loglevel and the
|
||||
* logtype of the message being processed. This information can be
|
||||
* accessed by the user-defined log output function through this
|
||||
* function.
|
||||
*
|
||||
* @return
|
||||
* The loglevel of the message being processed.
|
||||
*/
|
||||
int rte_log_cur_msg_loglevel(void);
|
||||
|
||||
/**
|
||||
* Get the current logtype for the message being processed.
|
||||
*
|
||||
* Before calling the user-defined stream for logging, the log
|
||||
* subsystem sets a per-lcore variable containing the loglevel and the
|
||||
* logtype of the message being processed. This information can be
|
||||
* accessed by the user-defined log output function through this
|
||||
* function.
|
||||
*
|
||||
* @return
|
||||
* The logtype of the message being processed.
|
||||
*/
|
||||
int rte_log_cur_msg_logtype(void);
|
||||
|
||||
/**
|
||||
* Register a dynamic log type
|
||||
*
|
||||
* If a log is already registered with the same type, the returned value
|
||||
* is the same than the previous one.
|
||||
*
|
||||
* @param name
|
||||
* The string identifying the log type.
|
||||
* @return
|
||||
* - >0: success, the returned value is the log type identifier.
|
||||
* - (-ENOMEM): cannot allocate memory.
|
||||
*/
|
||||
int rte_log_register(const char *name);
|
||||
|
||||
/**
|
||||
* Register a dynamic log type and try to pick its level from EAL options
|
||||
*
|
||||
* rte_log_register() is called inside. If successful, the function tries
|
||||
* to search for matching regexp in the list of EAL log level options and
|
||||
* pick the level from the last matching entry. If nothing can be applied
|
||||
* from the list, the level will be set to the user-defined default value.
|
||||
*
|
||||
* @param name
|
||||
* Name for the log type to be registered
|
||||
* @param level_def
|
||||
* Fallback level to be set if the global list has no matching options
|
||||
* @return
|
||||
* - >=0: the newly registered log type
|
||||
* - <0: rte_log_register() error value
|
||||
*/
|
||||
int rte_log_register_type_and_pick_level(const char *name, uint32_t level_def);
|
||||
|
||||
/**
|
||||
* Dump name of each logtype, one per line.
|
||||
*
|
||||
* @param out
|
||||
* Stream where the list is sent.
|
||||
* @param prefix
|
||||
* String preceding each logtype in the output.
|
||||
*/
|
||||
void rte_log_list_types(FILE *out, const char *prefix);
|
||||
|
||||
/**
|
||||
* Dump log information.
|
||||
*
|
||||
* Dump the global level and the registered log types.
|
||||
*
|
||||
* @param f
|
||||
* The output stream where the dump should be sent.
|
||||
*/
|
||||
void rte_log_dump(FILE *f);
|
||||
|
||||
/**
|
||||
* Generates a log message.
|
||||
*
|
||||
* The message will be sent in the stream defined by the previous call
|
||||
* to rte_openlog_stream().
|
||||
*
|
||||
* The level argument determines if the log should be displayed or
|
||||
* not, depending on the loglevel settings.
|
||||
*
|
||||
* The preferred alternative is the RTE_LOG() because it adds the
|
||||
* level and type in the logged string.
|
||||
*
|
||||
* @param level
|
||||
* Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
|
||||
* @param logtype
|
||||
* The log type, for example, RTE_LOGTYPE_EAL.
|
||||
* @param format
|
||||
* The format string, as in printf(3), followed by the variable arguments
|
||||
* required by the format.
|
||||
* @return
|
||||
* - 0: Success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
int rte_log(uint32_t level, uint32_t logtype, const char *format, ...)
|
||||
#ifdef __GNUC__
|
||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2))
|
||||
__rte_cold
|
||||
#endif
|
||||
#endif
|
||||
__rte_format_printf(3, 4);
|
||||
|
||||
/**
|
||||
* Generates a log message.
|
||||
*
|
||||
* The message will be sent in the stream defined by the previous call
|
||||
* to rte_openlog_stream().
|
||||
*
|
||||
* The level argument determines if the log should be displayed or
|
||||
* not, depending on the loglevel settings. A trailing
|
||||
* newline may be added if needed.
|
||||
*
|
||||
* The preferred alternative is the RTE_LOG() because it adds the
|
||||
* level and type in the logged string.
|
||||
*
|
||||
* @param level
|
||||
* Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
|
||||
* @param logtype
|
||||
* The log type, for example, RTE_LOGTYPE_EAL.
|
||||
* @param format
|
||||
* The format string, as in printf(3), followed by the variable arguments
|
||||
* required by the format.
|
||||
* @param ap
|
||||
* The va_list of the variable arguments required by the format.
|
||||
* @return
|
||||
* - 0: Success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
int rte_vlog(uint32_t level, uint32_t logtype, const char *format, va_list ap)
|
||||
__rte_format_printf(3, 0);
|
||||
|
||||
/**
|
||||
* Generates a log message.
|
||||
*
|
||||
* The RTE_LOG() is a helper that prefixes the string with the log level
|
||||
* and type, and call rte_log().
|
||||
*
|
||||
* @param l
|
||||
* Log level. A value between EMERG (1) and DEBUG (8). The short name is
|
||||
* expanded by the macro, so it cannot be an integer value.
|
||||
* @param t
|
||||
* The log type, for example, EAL. The short name is expanded by the
|
||||
* macro, so it cannot be an integer value.
|
||||
* @param ...
|
||||
* The fmt string, as in printf(3), followed by the variable arguments
|
||||
* required by the format.
|
||||
* @return
|
||||
* - 0: Success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
#define RTE_LOG(l, t, ...) \
|
||||
rte_log(RTE_LOG_ ## l, \
|
||||
RTE_LOGTYPE_ ## t, # t ": " __VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Generates a log message for data path.
|
||||
*
|
||||
* Similar to RTE_LOG(), except that it is removed at compilation time
|
||||
* if the RTE_LOG_DP_LEVEL configuration option is lower than the log
|
||||
* level argument.
|
||||
*
|
||||
* @param l
|
||||
* Log level. A value between EMERG (1) and DEBUG (8). The short name is
|
||||
* expanded by the macro, so it cannot be an integer value.
|
||||
* @param t
|
||||
* The log type, for example, EAL. The short name is expanded by the
|
||||
* macro, so it cannot be an integer value.
|
||||
* @param ...
|
||||
* The fmt string, as in printf(3), followed by the variable arguments
|
||||
* required by the format.
|
||||
* @return
|
||||
* - 0: Success.
|
||||
* - Negative on error.
|
||||
*/
|
||||
#define RTE_LOG_DP(l, t, ...) \
|
||||
(void)((RTE_LOG_ ## l <= RTE_LOG_DP_LEVEL) ? \
|
||||
rte_log(RTE_LOG_ ## l, \
|
||||
RTE_LOGTYPE_ ## t, # t ": " __VA_ARGS__) : \
|
||||
0)
|
||||
|
||||
#define RTE_LOG_REGISTER_IMPL(type, name, level) \
|
||||
int type; \
|
||||
RTE_INIT(__##type) \
|
||||
{ \
|
||||
type = rte_log_register_type_and_pick_level(name, RTE_LOG_##level); \
|
||||
if (type < 0) \
|
||||
type = RTE_LOGTYPE_EAL; \
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a dynamic log type in constructor context with its name and level.
|
||||
*
|
||||
* It is a wrapper macro for declaring the logtype, register the log and
|
||||
* sets it's level in the constructor context.
|
||||
*
|
||||
* @param type
|
||||
* The log type identifier
|
||||
* @param name
|
||||
* Name for the log type to be registered
|
||||
* @param level
|
||||
* Log level. A value between EMERG (1) and DEBUG (8).
|
||||
*/
|
||||
#define RTE_LOG_REGISTER(type, name, level) \
|
||||
RTE_LOG_REGISTER_IMPL(type, RTE_STR(name), level)
|
||||
|
||||
/**
|
||||
* This is an equivalent to RTE_LOG_REGISTER, but relying on the build system
|
||||
* to select the right format for the logtype.
|
||||
*/
|
||||
#define RTE_LOG_REGISTER_DEFAULT(type, level) \
|
||||
RTE_LOG_REGISTER_IMPL(type, RTE_STR(RTE_LOG_DEFAULT_LOGTYPE), level)
|
||||
|
||||
/**
|
||||
* This is an equivalent to RTE_LOG_REGISTER, but relying on the build system
|
||||
* to select the right prefix for the logtype.
|
||||
*/
|
||||
#define RTE_LOG_REGISTER_SUFFIX(type, suffix, level) \
|
||||
RTE_LOG_REGISTER_IMPL(type, \
|
||||
RTE_STR(RTE_LOG_DEFAULT_LOGTYPE) "." RTE_STR(suffix), level)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _RTE_LOG_H_ */
|
@ -0,0 +1 @@
|
||||
librte_eal.so.23
|
@ -0,0 +1 @@
|
||||
librte_eal.so.23.2
|
BIN
tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_eal.so.23.2
Executable file
BIN
tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_eal.so.23.2
Executable file
Binary file not shown.
@ -0,0 +1 @@
|
||||
librte_kvargs.so.23
|
@ -0,0 +1 @@
|
||||
librte_kvargs.so.23.2
|
BIN
tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_kvargs.so.23.2
Executable file
BIN
tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_kvargs.so.23.2
Executable file
Binary file not shown.
@ -0,0 +1 @@
|
||||
librte_log.so.23
|
@ -0,0 +1 @@
|
||||
librte_log.so.23.2
|
BIN
tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_log.so.23.2
Executable file
BIN
tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_log.so.23.2
Executable file
Binary file not shown.
@ -0,0 +1 @@
|
||||
librte_telemetry.so.23
|
@ -0,0 +1 @@
|
||||
librte_telemetry.so.23.2
|
BIN
tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_telemetry.so.23.2
Executable file
BIN
tests/data/test-abidiff-exit/test-PR30034/split/lib64/librte_telemetry.so.23.2
Executable file
Binary file not shown.
@ -0,0 +1,3 @@
|
||||
Functions changes summary: 0 Removed, 0 Changed (1 filtered out), 0 Added (12 filtered out) functions
|
||||
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
|
||||
|
@ -39,6 +39,8 @@ struct InOutSpec
|
||||
const char* in_elfv1_headers_dirs;
|
||||
const char* in_elfv0_debug_dir;
|
||||
const char* in_elfv1_debug_dir;
|
||||
const char* in_elfv0_added_bins_dir;
|
||||
const char* in_elfv1_added_bins_dir;
|
||||
const char* abidiff_options;
|
||||
abidiff_status status;
|
||||
const char* in_report_path;
|
||||
@ -55,6 +57,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --no-show-locs",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE
|
||||
| abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
|
||||
@ -69,6 +73,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --no-show-locs",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test1-voffset-change-report1.txt",
|
||||
@ -82,6 +88,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --no-show-locs",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE
|
||||
| abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
|
||||
@ -96,6 +104,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --no-show-locs",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test2-filtered-removed-fns-report1.txt",
|
||||
@ -110,6 +120,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-loc-with-locs-report.txt",
|
||||
"output/test-abidiff-exit/test-loc-with-locs-report.txt"
|
||||
@ -122,6 +134,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-show-locs",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-loc-without-locs-report.txt",
|
||||
@ -135,6 +149,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-no-stray-comma-report.txt",
|
||||
@ -148,6 +164,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-show-locs --leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-leaf-stats-report.txt",
|
||||
@ -161,6 +179,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-show-locs --leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE
|
||||
| abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
|
||||
@ -175,6 +195,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-show-locs --leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-leaf-fun-type-report.txt",
|
||||
@ -188,6 +210,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-leaf-redundant-report.txt",
|
||||
@ -201,6 +225,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-leaf-peeling-report.txt",
|
||||
@ -214,6 +240,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE
|
||||
| abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
|
||||
@ -229,6 +257,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-member-size-report0.txt",
|
||||
"output/test-abidiff-exit/test-member-size-report0.txt"
|
||||
@ -241,6 +271,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-member-size-report1.txt",
|
||||
@ -254,6 +286,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--harmless",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-decl-struct-report.txt",
|
||||
@ -268,6 +302,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-fun-param-report.txt",
|
||||
"output/test-abidiff-exit/test-fun-param-report.txt"
|
||||
@ -280,6 +316,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--harmless",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-decl-enum-report.txt",
|
||||
@ -294,6 +332,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-decl-enum-report-2.txt",
|
||||
"output/test-abidiff-exit/test-decl-enum-report-2.txt"
|
||||
@ -306,6 +346,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-decl-enum-report-3.txt",
|
||||
@ -319,6 +361,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --no-show-locs",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE
|
||||
| abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
|
||||
@ -333,6 +377,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --no-show-locs",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-net-change-report1.txt",
|
||||
@ -346,6 +392,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --no-show-locs --leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE
|
||||
| abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
|
||||
@ -360,6 +408,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --no-show-locs --leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-net-change-report3.txt",
|
||||
@ -373,6 +423,8 @@ InOutSpec in_out_specs[] =
|
||||
"data/test-abidiff-exit/test-headers-dirs/headers-a",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-headers-dirs/test-headers-dir-report-1.txt",
|
||||
@ -388,6 +440,8 @@ InOutSpec in_out_specs[] =
|
||||
"data/test-abidiff-exit/test-headers-dirs/headers-b",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-headers-dirs/test-headers-dir-report-2.txt",
|
||||
@ -402,6 +456,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/qualifier-typedef-array-report-0.txt",
|
||||
"output/test-abidiff-exit/qualifier-typedef-array-report-0.txt"
|
||||
@ -414,6 +470,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--harmless",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/qualifier-typedef-array-report-1.txt",
|
||||
@ -427,6 +485,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/qualifier-typedef-array-report-2.txt",
|
||||
@ -440,6 +500,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--harmless --leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/qualifier-typedef-array-report-3.txt",
|
||||
@ -453,6 +515,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-non-leaf-array-report.txt",
|
||||
@ -467,6 +531,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-crc-report.txt",
|
||||
"output/test-abidiff-exit/test-crc-report.txt"
|
||||
@ -480,6 +546,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-missing-alias-report.txt",
|
||||
"output/test-abidiff-exit/test-missing-alias-report.txt"
|
||||
@ -492,6 +560,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --harmless",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-PR28316-report.txt",
|
||||
@ -505,6 +575,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --harmless",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-PR29144-report.txt",
|
||||
@ -518,6 +590,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--leaf-changes-only --no-default-suppression --harmless",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-PR29144-report-2.txt",
|
||||
@ -531,6 +605,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-ld-2.28-210.so--ld-2.28-211.so.txt",
|
||||
@ -544,6 +620,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-rhbz2114909-report-1.txt",
|
||||
@ -557,6 +635,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/PR30048-test-report-0.txt",
|
||||
@ -570,6 +650,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/PR30048-test-2-report-1.txt",
|
||||
@ -583,6 +665,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-array-v0--v1-report-1.txt",
|
||||
@ -596,6 +680,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-allow-type-array-v0--v1-report-2.txt",
|
||||
@ -609,6 +695,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-array-v0--v2-report-1.txt",
|
||||
@ -622,6 +710,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-array-v0--v2-report-2.txt",
|
||||
@ -635,6 +725,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-array-v0--v3-report-1.txt",
|
||||
@ -648,6 +740,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-allow-type-array-v0--v3-report-2.txt",
|
||||
@ -661,6 +755,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v1-report-1.txt",
|
||||
@ -674,6 +770,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v1-report-2.txt",
|
||||
@ -687,6 +785,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v2-report-1.txt",
|
||||
@ -700,6 +800,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v2-report-1.txt",
|
||||
@ -713,6 +815,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v2-report-2.txt",
|
||||
@ -726,6 +830,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v3-report-1.txt",
|
||||
@ -739,6 +845,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v3-report-2.txt",
|
||||
@ -752,6 +860,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v4-report-1.txt",
|
||||
@ -765,6 +875,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v4-report-2.txt",
|
||||
@ -778,6 +890,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v5-report-1.txt",
|
||||
@ -791,6 +905,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/test-allow-type-region-v0--v5-report-2.txt",
|
||||
@ -804,6 +920,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-1.txt",
|
||||
@ -817,6 +935,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-2.txt",
|
||||
@ -830,6 +950,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/ada-subrange/test2-ada-subrange-redundant/test2-ada-subrange-redundant-report-1.txt",
|
||||
@ -843,6 +965,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --leaf-changes-only",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/ada-subrange/test2-ada-subrange-redundant/test2-ada-subrange-redundant-report-2.txt",
|
||||
@ -856,6 +980,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"data/test-abidiff-exit/PR30329/old-image/usr/lib/debug",
|
||||
"data/test-abidiff-exit/PR30329/new-image/usr/lib/debug",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/PR30329/PR30329-report-1.txt",
|
||||
@ -869,11 +995,28 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/PR30503/libsdl/libsdl-1.2.60-1.2.64-report.txt",
|
||||
"output/test-abidiff-exit/PR30503/libsdl/libsdl-1.2.60-1.2.64-report.txt"
|
||||
},
|
||||
{
|
||||
"data/test-abidiff-exit/test-PR30034/reference/lib64/librte_eal.so.23.1",
|
||||
"data/test-abidiff-exit/test-PR30034/split/lib64/librte_eal.so.23.2",
|
||||
"data/test-abidiff-exit/test-PR30034/libabigail.abignore",
|
||||
"data/test-abidiff-exit/test-PR30034/reference/include",
|
||||
"data/test-abidiff-exit/test-PR30034/split/include",
|
||||
"",
|
||||
"",
|
||||
"data/test-abidiff-exit/test-PR30034/reference/lib64",
|
||||
"data/test-abidiff-exit/test-PR30034/split/lib64",
|
||||
"--no-default-suppression --no-added-syms --follow-dependencies",
|
||||
abigail::tools_utils::ABIDIFF_OK,
|
||||
"data/test-abidiff-exit/test-PR30034/test-PR30034-report-1.txt",
|
||||
"output/test-abidiff-exit/test-PR30034/test-PR30034-report-1.txt"
|
||||
},
|
||||
#ifdef WITH_BTF
|
||||
{
|
||||
"data/test-abidiff-exit/btf/test0-v0.o",
|
||||
@ -883,6 +1026,8 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --btf",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/btf/test0-report-1.txt",
|
||||
@ -896,13 +1041,15 @@ InOutSpec in_out_specs[] =
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"--no-default-suppression --harmless --btf",
|
||||
abigail::tools_utils::ABIDIFF_ABI_CHANGE,
|
||||
"data/test-abidiff-exit/btf/test0-report-2.txt",
|
||||
"output/test-abidiff-exit/btf/test0-report-2.txt"
|
||||
},
|
||||
#endif
|
||||
{0, 0, 0 ,0, 0, 0, 0, 0, abigail::tools_utils::ABIDIFF_OK, 0, 0}
|
||||
{0, 0, 0 ,0, 0, 0, 0, 0, 0, 0, abigail::tools_utils::ABIDIFF_OK, 0, 0}
|
||||
};
|
||||
|
||||
/// Prefix the strings in a vector of string.
|
||||
@ -935,7 +1082,7 @@ main()
|
||||
string in_elfv0_path, in_elfv1_path,
|
||||
in_suppression_path, abidiff_options, abidiff, cmd, diff_cmd,
|
||||
ref_diff_report_path, out_diff_report_path, in_elfv0_debug_dir,
|
||||
in_elfv1_debug_dir;
|
||||
in_elfv1_debug_dir, in_elfv0_added_bins_dir, in_elfv1_added_bins_dir;
|
||||
vector<string> in_elfv0_headers_dirs, in_elfv1_headers_dirs;
|
||||
string source_dir_prefix = string(get_src_dir()) + "/tests/";
|
||||
string build_dir_prefix = string(get_build_dir()) + "/tests/";
|
||||
@ -949,6 +1096,9 @@ main()
|
||||
in_elfv1_debug_dir = source_dir_prefix + s->in_elfv1_debug_dir;
|
||||
in_elfv0_headers_dirs.clear();
|
||||
in_elfv1_headers_dirs.clear();
|
||||
in_elfv0_added_bins_dir.clear();
|
||||
in_elfv1_added_bins_dir.clear();
|
||||
|
||||
if (s->in_elfv0_headers_dirs && strcmp(s->in_elfv0_headers_dirs, ""))
|
||||
{
|
||||
split_string(s->in_elfv0_headers_dirs, ",", in_elfv0_headers_dirs);
|
||||
@ -966,6 +1116,16 @@ main()
|
||||
else
|
||||
in_suppression_path.clear();
|
||||
|
||||
if (s->in_elfv0_added_bins_dir
|
||||
&& strcmp(s->in_elfv0_added_bins_dir, ""))
|
||||
in_elfv0_added_bins_dir =
|
||||
source_dir_prefix + s->in_elfv0_added_bins_dir;
|
||||
|
||||
if (s->in_elfv1_added_bins_dir
|
||||
&& strcmp(s->in_elfv1_added_bins_dir, ""))
|
||||
in_elfv1_added_bins_dir =
|
||||
source_dir_prefix + s->in_elfv1_added_bins_dir;
|
||||
|
||||
abidiff_options = s->abidiff_options;
|
||||
ref_diff_report_path = source_dir_prefix + s->in_report_path;
|
||||
out_diff_report_path = build_dir_prefix + s->out_report_path;
|
||||
@ -983,6 +1143,12 @@ main()
|
||||
if (!abidiff_options.empty())
|
||||
abidiff += " " + abidiff_options;
|
||||
|
||||
if (!in_elfv0_added_bins_dir.empty())
|
||||
abidiff += " --added-binaries-dir1 " + in_elfv0_added_bins_dir;
|
||||
|
||||
if (!in_elfv1_added_bins_dir.empty())
|
||||
abidiff += " --added-binaries-dir2 " + in_elfv1_added_bins_dir;
|
||||
|
||||
if (!in_elfv0_debug_dir.empty())
|
||||
abidiff += " --debug-info-dir1 " + in_elfv0_debug_dir;
|
||||
|
||||
|
427
tools/abidiff.cc
427
tools/abidiff.cc
@ -13,6 +13,7 @@
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include "abg-config.h"
|
||||
#include "abg-comp-filter.h"
|
||||
#include "abg-suppression.h"
|
||||
@ -28,6 +29,7 @@
|
||||
#endif
|
||||
|
||||
using std::vector;
|
||||
using std::set;
|
||||
using std::string;
|
||||
using std::ostream;
|
||||
using std::cout;
|
||||
@ -60,6 +62,10 @@ using abigail::tools_utils::load_default_system_suppressions;
|
||||
using abigail::tools_utils::load_default_user_suppressions;
|
||||
using abigail::tools_utils::abidiff_status;
|
||||
using abigail::tools_utils::create_best_elf_based_reader;
|
||||
using abigail::tools_utils::stick_corpus_and_dependencies_into_corpus_group;
|
||||
using abigail::tools_utils::stick_corpus_and_binaries_into_corpus_group;
|
||||
using abigail::tools_utils::add_dependencies_into_corpus_group;
|
||||
using abigail::tools_utils::get_dependencies;
|
||||
|
||||
using namespace abigail;
|
||||
|
||||
@ -115,6 +121,8 @@ struct options
|
||||
bool assume_odr_for_cplusplus;
|
||||
bool leverage_dwarf_factorization;
|
||||
bool perform_change_categorization;
|
||||
bool follow_dependencies;
|
||||
bool list_dependencies;
|
||||
bool dump_diff_tree;
|
||||
bool show_stats;
|
||||
bool do_log;
|
||||
@ -134,6 +142,10 @@ struct options
|
||||
vector<char*> di_root_paths2;
|
||||
vector<char**> prepared_di_root_paths1;
|
||||
vector<char**> prepared_di_root_paths2;
|
||||
vector<string> added_bins_dirs1;
|
||||
vector<string> added_bins_dirs2;
|
||||
vector<string> added_bins1;
|
||||
vector<string> added_bins2;
|
||||
|
||||
options()
|
||||
: display_usage(),
|
||||
@ -172,6 +184,8 @@ struct options
|
||||
assume_odr_for_cplusplus(true),
|
||||
leverage_dwarf_factorization(true),
|
||||
perform_change_categorization(true),
|
||||
follow_dependencies(),
|
||||
list_dependencies(),
|
||||
dump_diff_tree(),
|
||||
show_stats(),
|
||||
do_log()
|
||||
@ -224,6 +238,15 @@ display_usage(const string& prog_name, ostream& out)
|
||||
<< " --header-file1|--hf1 <path> the path to one header of file1\n"
|
||||
<< " --headers-dir2|--hd2 <path> the path to headers of file2\n"
|
||||
<< " --header-file2|--hf2 <path> the path to one header of file2\n"
|
||||
<< " --added-binaries-dir1 the path to the dependencies of file1\n"
|
||||
<< " --added-binaries-dir2 the path to the dependencies of file2\n"
|
||||
<< " --add-binaries1 <bin1,bin2,.>. build corpus groups with "
|
||||
"extra binaries added to the first one and compare them\n"
|
||||
<< " --add-binaries2 <bin1,bin2,..> build corpus groups with "
|
||||
"extra binaries added to the second one and compare them\n"
|
||||
<< " --follow-dependencies|--fdeps build corpus groups with the "
|
||||
"dependencies of the input files\n"
|
||||
<< " --list-dependencies|--ldeps show the dependencies of the input files\n"
|
||||
<< " --drop-private-types drop private types from "
|
||||
"internal representation\n"
|
||||
<< " --exported-interfaces-only analyze exported interfaces only\n"
|
||||
@ -423,6 +446,80 @@ parse_command_line(int argc, char* argv[], options& opts)
|
||||
opts.header_files2.push_back(argv[j]);
|
||||
++i;
|
||||
}
|
||||
else if (!strcmp(argv[i], "--follow-dependencies")
|
||||
|| !strcmp(argv[i], "--fdeps"))
|
||||
opts.follow_dependencies = true;
|
||||
else if (!strcmp(argv[i], "--list-dependencies")
|
||||
|| !strcmp(argv[i], "--ldeps"))
|
||||
opts.list_dependencies = true;
|
||||
else if (!strcmp(argv[i], "--added-binaries-dir1")
|
||||
|| !strcmp(argv[i], "--abd1"))
|
||||
{
|
||||
int j = i + 1;
|
||||
if (j >= argc)
|
||||
{
|
||||
opts.missing_operand = true;
|
||||
opts.wrong_option = argv[i];
|
||||
return true;
|
||||
}
|
||||
opts.added_bins_dirs1.push_back(argv[j]);
|
||||
++i;
|
||||
}
|
||||
else if (!strcmp(argv[i], "--added-binaries-dir2")
|
||||
|| !strcmp(argv[i], "--abd2"))
|
||||
{
|
||||
int j = i + 1;
|
||||
if (j >= argc)
|
||||
{
|
||||
opts.missing_operand = true;
|
||||
opts.wrong_option = argv[i];
|
||||
return true;
|
||||
}
|
||||
opts.added_bins_dirs2.push_back(argv[j]);
|
||||
++i;
|
||||
}
|
||||
else if (!strncmp(argv[i], "--add-binaries1=",
|
||||
strlen("--add-binaries1=")))
|
||||
tools_utils::get_comma_separated_args_of_option(argv[i],
|
||||
"--add-binaries1=",
|
||||
opts.added_bins1);
|
||||
else if (!strcmp(argv[i], "--add-binaries1"))
|
||||
{
|
||||
int j = i + 1;
|
||||
if (j >= argc)
|
||||
{
|
||||
opts.missing_operand = true;
|
||||
opts.wrong_option = argv[i];
|
||||
return true;
|
||||
}
|
||||
string s = argv[j];
|
||||
if (s.find(','))
|
||||
tools_utils::split_string(s, ",", opts.added_bins1);
|
||||
else
|
||||
opts.added_bins1.push_back(s);
|
||||
++i;
|
||||
}
|
||||
else if (!strncmp(argv[i], "--add-binaries2=",
|
||||
strlen("--add-binaries2=")))
|
||||
tools_utils::get_comma_separated_args_of_option(argv[i],
|
||||
"--add-binaries2=",
|
||||
opts.added_bins2);
|
||||
else if (!strcmp(argv[i], "--add-binaries2"))
|
||||
{
|
||||
int j = i + 1;
|
||||
if (j >= argc)
|
||||
{
|
||||
opts.missing_operand = true;
|
||||
opts.wrong_option = argv[i];
|
||||
return true;
|
||||
}
|
||||
string s = argv[j];
|
||||
if (s.find(','))
|
||||
tools_utils::split_string(s, ",", opts.added_bins2);
|
||||
else
|
||||
opts.added_bins2.push_back(s);
|
||||
++i;
|
||||
}
|
||||
else if (!strcmp(argv[i], "--kmi-whitelist")
|
||||
|| !strcmp(argv[i], "-w"))
|
||||
{
|
||||
@ -1156,6 +1253,63 @@ emit_incompatible_format_version_error_message(const string& file_path1,
|
||||
<< "'" << file_path2 << "' (" << version2 << ")\n";
|
||||
}
|
||||
|
||||
/// Display the dependencies of two corpora.
|
||||
///
|
||||
/// @param prog_name the name of the current abidiff program.
|
||||
///
|
||||
/// @param corp1 the first corpus to consider.
|
||||
///
|
||||
/// @param corp2 the second corpus to consider.
|
||||
///
|
||||
/// @param deps1 the dependencies to display.
|
||||
///
|
||||
/// @param deps2 the dependencies to display.
|
||||
static void
|
||||
display_dependencies(const string& prog_name,
|
||||
const corpus_sptr& corp1,
|
||||
const corpus_sptr& corp2,
|
||||
const set<string>& deps1,
|
||||
const set<string>& deps2)
|
||||
{
|
||||
if (deps1.empty())
|
||||
emit_prefix(prog_name, cout)
|
||||
<< "No dependencies found for '" << corp1->get_path() << "':\n";
|
||||
else
|
||||
{
|
||||
emit_prefix(prog_name, cout)
|
||||
<< "dependencies of '" << corp1->get_path() << "':\n\t";
|
||||
|
||||
int n = 0;
|
||||
for (const auto& dep : deps1)
|
||||
{
|
||||
if (n)
|
||||
cout << ", ";
|
||||
cout << dep;
|
||||
++n;
|
||||
}
|
||||
cout << "\n";
|
||||
}
|
||||
|
||||
if (deps2.empty())
|
||||
emit_prefix(prog_name, cout)
|
||||
<< "No dependencies found for '" << corp2->get_path() << "':\n";
|
||||
else
|
||||
{
|
||||
emit_prefix(prog_name, cout)
|
||||
<< "dependencies of '" << corp2->get_path() << "':\n\t";
|
||||
|
||||
int n = 0;
|
||||
for (const auto& dep : deps2)
|
||||
{
|
||||
if (n)
|
||||
cout << ", ";
|
||||
cout << dep;
|
||||
++n;
|
||||
}
|
||||
cout << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char* argv[])
|
||||
{
|
||||
@ -1287,6 +1441,20 @@ main(int argc, char* argv[])
|
||||
return handle_error(c1_status, rdr.get(),
|
||||
argv[0], opts);
|
||||
|
||||
if (!opts.added_bins1.empty())
|
||||
g1 = stick_corpus_and_binaries_into_corpus_group(rdr, c1,
|
||||
opts.added_bins1,
|
||||
opts.added_bins_dirs1);
|
||||
if (opts.follow_dependencies)
|
||||
{
|
||||
if (g1)
|
||||
add_dependencies_into_corpus_group(rdr, *c1,
|
||||
opts.added_bins_dirs1,
|
||||
*g1);
|
||||
else
|
||||
g1 = stick_corpus_and_dependencies_into_corpus_group(rdr, c1,
|
||||
opts.added_bins_dirs1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case abigail::tools_utils::FILE_TYPE_XML_CORPUS:
|
||||
@ -1304,8 +1472,7 @@ main(int argc, char* argv[])
|
||||
case abigail::tools_utils::FILE_TYPE_XML_CORPUS_GROUP:
|
||||
{
|
||||
abigail::fe_iface_sptr rdr =
|
||||
abixml::create_reader(opts.file1,
|
||||
env);
|
||||
abixml::create_reader(opts.file1, env);
|
||||
assert(rdr);
|
||||
set_suppressions(*rdr, opts);
|
||||
set_native_xml_reader_options(*rdr, opts);
|
||||
@ -1364,6 +1531,21 @@ main(int argc, char* argv[])
|
||||
&& (c2_status & abigail::fe_iface::STATUS_ALT_DEBUG_INFO_NOT_FOUND)
|
||||
&& (c2_status & abigail::fe_iface::STATUS_DEBUG_INFO_NOT_FOUND)))
|
||||
return handle_error(c2_status, rdr.get(), argv[0], opts);
|
||||
|
||||
if (!opts.added_bins2.empty())
|
||||
g2 = stick_corpus_and_binaries_into_corpus_group(rdr, c2,
|
||||
opts.added_bins2,
|
||||
opts.added_bins_dirs2);
|
||||
if (opts.follow_dependencies)
|
||||
{
|
||||
if (g2)
|
||||
add_dependencies_into_corpus_group(rdr, *c2,
|
||||
opts.added_bins_dirs2,
|
||||
*g2);
|
||||
else
|
||||
g2 = stick_corpus_and_dependencies_into_corpus_group(rdr, c2,
|
||||
opts.added_bins_dirs2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case abigail::tools_utils::FILE_TYPE_XML_CORPUS:
|
||||
@ -1397,6 +1579,34 @@ main(int argc, char* argv[])
|
||||
break;
|
||||
}
|
||||
|
||||
if (!opts.added_bins1.empty()
|
||||
|| !opts.added_bins2.empty())
|
||||
{
|
||||
// We were requested to compare a set of binaries against
|
||||
// another set of binaries. Let's make sure we construct
|
||||
// two ABI construct groups in all cases.
|
||||
|
||||
if (!g1 && c1)
|
||||
{
|
||||
// We don't have a corpus group for the first argument.
|
||||
// Let's build one and stick the ABI corpus at hand in
|
||||
// it.
|
||||
g1.reset(new corpus_group(c1->get_environment(),
|
||||
c1->get_path()));
|
||||
g1->add_corpus(c1);
|
||||
}
|
||||
|
||||
if (!g2 && c2)
|
||||
{
|
||||
// We don't have a corpus group for the second argument.
|
||||
// Let's build one and stick the ABI corpus at hand in
|
||||
// it.
|
||||
g2.reset(new corpus_group(c2->get_environment(),
|
||||
c2->get_path()));
|
||||
g2->add_corpus(c1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!!c1 != !!c2
|
||||
|| !!t1 != !!t2
|
||||
|| !!g1 != !!g2)
|
||||
@ -1449,105 +1659,6 @@ main(int argc, char* argv[])
|
||||
|
||||
diff->report(cout);
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "Report computed!:" << t << "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (c1)
|
||||
{
|
||||
if (opts.show_symtabs)
|
||||
{
|
||||
display_symtabs(c1, c2, cout);
|
||||
return abigail::tools_utils::ABIDIFF_OK;
|
||||
}
|
||||
|
||||
const auto c1_version = c1->get_format_major_version_number();
|
||||
const auto c2_version = c2->get_format_major_version_number();
|
||||
if (c1_version != c2_version)
|
||||
{
|
||||
emit_incompatible_format_version_error_message(opts.file1,
|
||||
c1_version,
|
||||
opts.file2,
|
||||
c2_version,
|
||||
argv[0]);
|
||||
return abigail::tools_utils::ABIDIFF_ERROR;
|
||||
}
|
||||
|
||||
set_corpus_keep_drop_regex_patterns(opts, c1);
|
||||
set_corpus_keep_drop_regex_patterns(opts, c2);
|
||||
|
||||
tools_utils::timer t;
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Compute diff ...\n";
|
||||
}
|
||||
|
||||
corpus_diff_sptr diff = compute_diff(c1, c2, ctxt);
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "diff computed!:" << t << "\n";
|
||||
}
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Computing net changes ...\n";
|
||||
}
|
||||
|
||||
if (diff->has_net_changes())
|
||||
{
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "net changes computed!: "<< t << "\n";
|
||||
}
|
||||
status = abigail::tools_utils::ABIDIFF_ABI_CHANGE;
|
||||
}
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Computing incompatible changes ...\n";
|
||||
}
|
||||
|
||||
if (diff->has_incompatible_changes())
|
||||
{
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "incompatible changes computed!: "<< t << "\n";
|
||||
}
|
||||
status |= abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE;
|
||||
}
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Computing changes ...\n";
|
||||
}
|
||||
|
||||
if (diff->has_changes())
|
||||
{
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "changes computed!: "<< t << "\n";
|
||||
}
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Computing report ...\n";
|
||||
}
|
||||
|
||||
diff->report(cout);
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
@ -1658,6 +1769,120 @@ main(int argc, char* argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (opts.list_dependencies)
|
||||
{
|
||||
set<string> deps1, deps2;
|
||||
get_dependencies(*c1, opts.added_bins_dirs1, deps1);
|
||||
get_dependencies(*c2, opts.added_bins_dirs2, deps2);
|
||||
display_dependencies(argv[0], c1, c2, deps1, deps2);
|
||||
}
|
||||
}
|
||||
else if (c1)
|
||||
{
|
||||
if (opts.show_symtabs)
|
||||
{
|
||||
display_symtabs(c1, c2, cout);
|
||||
return abigail::tools_utils::ABIDIFF_OK;
|
||||
}
|
||||
|
||||
if (opts.list_dependencies)
|
||||
{
|
||||
set<string> deps1, deps2;
|
||||
get_dependencies(*c1, opts.added_bins_dirs1, deps1);
|
||||
get_dependencies(*c2, opts.added_bins_dirs2, deps2);
|
||||
display_dependencies(argv[0], c1, c2, deps1, deps2);
|
||||
return abigail::tools_utils::ABIDIFF_OK;
|
||||
}
|
||||
const auto c1_version = c1->get_format_major_version_number();
|
||||
const auto c2_version = c2->get_format_major_version_number();
|
||||
if (c1_version != c2_version)
|
||||
{
|
||||
emit_incompatible_format_version_error_message(opts.file1,
|
||||
c1_version,
|
||||
opts.file2,
|
||||
c2_version,
|
||||
argv[0]);
|
||||
return abigail::tools_utils::ABIDIFF_ERROR;
|
||||
}
|
||||
|
||||
set_corpus_keep_drop_regex_patterns(opts, c1);
|
||||
set_corpus_keep_drop_regex_patterns(opts, c2);
|
||||
|
||||
tools_utils::timer t;
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Compute diff ...\n";
|
||||
}
|
||||
|
||||
corpus_diff_sptr diff = compute_diff(c1, c2, ctxt);
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "diff computed!:" << t << "\n";
|
||||
}
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Computing net changes ...\n";
|
||||
}
|
||||
|
||||
if (diff->has_net_changes())
|
||||
{
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "net changes computed!: "<< t << "\n";
|
||||
}
|
||||
status = abigail::tools_utils::ABIDIFF_ABI_CHANGE;
|
||||
}
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Computing incompatible changes ...\n";
|
||||
}
|
||||
|
||||
if (diff->has_incompatible_changes())
|
||||
{
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "incompatible changes computed!: "<< t << "\n";
|
||||
}
|
||||
status |= abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE;
|
||||
}
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Computing changes ...\n";
|
||||
}
|
||||
|
||||
if (diff->has_changes())
|
||||
{
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "changes computed!: "<< t << "\n";
|
||||
}
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.start();
|
||||
std::cerr << "Computing report ...\n";
|
||||
}
|
||||
|
||||
diff->report(cout);
|
||||
|
||||
if (opts.do_log)
|
||||
{
|
||||
t.stop();
|
||||
std::cerr << "Report computed!:" << t << "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
status = abigail::tools_utils::ABIDIFF_ERROR;
|
||||
|
Loading…
Reference in New Issue
Block a user