Hi,

On Thu, Mar 23, 2017 at 8:31 AM, William Cohen <wco...@redhat.com> wrote:
>
> Hi Stephane,
>
> There is ABI change between libpfm-4.7 and libpfm-4.8 that is visible
> to programs using libpfm that break compatability.  This change can be
> observed with libabigail's abidiff command
> (https://sourceware.org/libabigail/manual/abidiff.html) I found that
> following patch has changed the layout of struct pfm_event_attr_info_t
> in pfmlib.h:
>
> commit 4dc4c6ada254f30eee8cd2ae27bb0869a111b613
> Author: Stephane Eranian <eran...@gmail.com>
> Date:   Sat May 28 03:49:04 2016 +0200
>
>     Allow raw umask for OFFCORE_RESPONSE on Intel core PMUs
>
>     This patch makes it possible to specify the raw umask as
>     hexadecimal for the Intel core PMU OFFCORE_RESPONSE_* event.
>     This makes it possible to encode a umask which could have been
>     omitted by mistake from the library or not yet supported.
>
>     $ examples/check_events offcore_response_0:0xffff
>
>     Added validation tests for this new support.
>
>     Signed-off-by: Stephane Eranian <eran...@gmail.com>
>
> --------------------------- include/perfmon/pfmlib.h 
> ---------------------------
> index 24a2a60..8921164 100644
> @@ -420,8 +420,8 @@ typedef struct {
>         size_t                  size;   /* struct sizeof */
>         uint64_t                code;   /* attribute code */
>         pfm_attr_t              type;   /* attribute type */
> -       int                     idx;    /* attribute opaque index */
> -       pfm_attr_ctrl_t         ctrl;           /* what is providing attr */
> +       uint64_t                idx;    /* attribute opaque index */
> +       pfm_attr_ctrl_t         ctrl;   /* what is providing attr */
>         struct {
>                 unsigned int    is_dfl:1;       /* is default umask */
>                 unsigned int    is_precise:1;   /* Intel X86: supports PEBS */
>
>
>
> The struct in libpfm-4.7 is
>
> typedef struct {
>         const char              *name;  /* attribute symbolic name */
>         const char              *desc;  /* attribute description */
>         const char              *equiv; /* attribute is equivalent to */
>         size_t                  size;   /* struct sizeof */
>         uint64_t                code;   /* attribute code */
>         pfm_attr_t              type;   /* attribute type */
>         int                     idx;    /* attribute opaque index */
>         pfm_attr_ctrl_t         ctrl;           /* what is providing attr */
>         struct {
>                 unsigned int    is_dfl:1;       /* is default umask */
>                 unsigned int    is_precise:1;   /* Intel X86: supports PEBS */
>                 unsigned int    reserved_bits:30;
>         } SWIG_NAME(flags);
>         union {
>                 uint64_t        dfl_val64;      /* default 64-bit value */
>                 const char      *dfl_str;       /* default string value */
>                 int             dfl_bool;       /* default boolean value */
>                 int             dfl_int;        /* default integer value */
>         } SWIG_NAME(defaults);
> } pfm_event_attr_info_t;
>
> The patch changes idx from a 32-bit to 64-bit value.  This causes
> padding (made explicit by commit
> 06b296c72838be44d8950dc03227fe0dc8ca1fb1) to be inserted so idx and
> following fields are at different locations in the struct.  The struct
> is also made 8 bytes larger (512 bits to 576 bits).
>
Ok, my bad. That was not my goal here.
We can revert this change. But to enable support, this struct will
need to change.
So it will incur some ABI change.

>
> abidiff /usr/lib64/libpfm.so.4.7.0 libpfm.so
> ...
>   [C]'function int pfm_get_event_attr_info(int, int, pfm_os_t, 
> pfm_event_attr_info_t*)' at pfmlib_common.c:1812:1 has some indirect sub-type 
> changes:
>     parameter 4 of type 'pfm_event_attr_info_t*' has sub-type changes:
>       in pointed to type 'typedef pfm_event_attr_info_t' at pfmlib.h:507:1:
>         underlying type 'struct __anonymous_struct__' at pfmlib.h:486:1 
> changed:
>           type size changed from 512 to 576 bits
>           1 data member insertion:
>             'int __anonymous_struct__::pad', at offset 352 (in bits) at 
> pfmlib.h:493:1
>           3 data member changes:
>            type of 'int __anonymous_struct__::idx' changed:
>              entity changed from 'int' to compatible type 'typedef uint64_t' 
> at stdint.h:55:1
>                type name changed from 'int' to 'unsigned long int'
>                type size changed from 32 to 64 bits
>            and offset changed from 352 to 384 (in bits)
>            'pfm_attr_ctrl_t __anonymous_struct__::ctrl' offset changed from 
> 384 to 448 (in bits)
>            '__anonymous_struct__ ' offset changed from 416 to 480 (in bits)
>
> ...
>
> -Will

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
perfmon2-devel mailing list
perfmon2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel

Reply via email to