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).

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