Hi Will. I saw that page. I was using xlC 6.1.1-beta6, the most recent
version I could find, and it still exhibited the error.

It seems to recognize and process the #pragma, but claims *default* is not
a valid attribute. It absolutely is, and the line and syntax are taken from
IBM's example code. (and compile correctly with GCC). I think the compiler
intends to support this #pragma,but the processing of the #pragma itself is
bugged, it is not able to recognize any of the valid attributes and kicks
out an error (which stops compilation).

Tony C.

On Thu, Oct 18, 2018 at 2:54 PM William Cohen <wco...@redhat.com> wrote:

> On 10/18/18 3:10 PM, Anthony Castaldo wrote:
> > This problem comes from our PAPI list, but is a pfmlib problem when
> compiling with
> > IBM XL C/C++. I investigated it.
> >
> > First, this is a real problem that prevents creating libpfm.so.
> > Second, I found no clean workaround (other than using gcc instead of
> xlC), but there is a way to create a functional lib using xlC.
> >
> > The line of code that causes the error in pfmlib.h:29 is
> > #pragma GCC visibility push (default)
> >
> > The error report is as follows;
> > The attribute " __attribute__((visibility("default")))" is not a valid
> type attribute. The attribute is ignored. The error number given by xlC is
> 1540-0081. The problem was reported for xlC 16.01,
> > I did not have that and tested on our latest beta version, xlC
> 16.1.1-beta6.
> >
> > Experiments show the compiler will not recognize any valid attribute.
> Those are
> > [default, protected, hidden, internal], they all get 1540-0081.
> >
> > This is an error that does not occur when compiling with GCC; it
> interprets the lines correctly, and they have the desired effect (making
> function names in the library hidden or visible when using the linux "nm"
> utility, specifically "nm -C -D libpfm4.so").
> >
> > Searching the web for ways to deal with error 1540-0081, we found it has
> been produced by a compiler bug in another problem. For those, IBM says
> compile with the -qsuppress=1540-0081 flag. We tried that here; and
> although the xlC compiler accepted the flag, it did not fix our problem.
> >
> > Failing that, the only way I found to produce a usable lib was by
> deleting the #pragmas and changing the compile flag -fvisibility.
> >
> > There were three header files to modify:
> >
> > perf_event.h, pfmlib.h, pfmlib_perf_event.h. There are two lines in each
> > to comment out; a ;'push' and a 'pop'. This is the grep I used to find
> them:
> >
> > ~/papi/src/libpfm4$ grep "#pragma GCC visibility" -H -n -r --include="*"
> >
> > The following is the result:
> >
> > include/perfmon/perf_event.h:25:#pragma GCC visibility push(default)
> > include/perfmon/perf_event.h:618:#pragma GCC visibility pop
> > include/perfmon/pfmlib.h:29:#pragma GCC visibility push(default)
> > include/perfmon/pfmlib.h:787:#pragma GCC visibility pop
> > include/perfmon/pfmlib_perf_event.h:28:#pragma GCC visibility
> push(default)
> > include/perfmon/pfmlib_perf_event.h:66:#pragma GCC visibility pop
> >
> > I also modified the pfmlib4/lib/Makefile, line 36 reads:
> > CFLAGS+=-D_REENTRANT -I. -fvisibility=hidden
> >
> > and the 'hidden' needs to be changed to 'default': We can't make every
> function hidden!
> >
> > CFLAGS+=-D_REENTRANT -I. -fvisibility=default
> >
> > This had no compile errors using xlC, and produced a libpfm.so with a
> lot of
> > routines visible that are not visible when compiled with GCC, but all
> the ones
> > GCC made visible are also visible in the xlC versionof the lib.
> >
> > The size of the xlC produced lib is virtually the same as the GCC lib.
> >
> > (gcc=1,377,120 bytes, xlC=1,377,680 bytes. 560 bytes more).
> >
> > I have no prior experience with xlC, so there may be a more elegant
> method
> > of doing this. However, I believe the syntax of the #pragma's is
> correct, and
> > since they work as written for gcc, I suspect an xlC compiler error. It
> might
> > not exist in other versions of xlC, or may be corrected in future
> versions.
> >
> > Tony C.
>
> Hi Tony,
>
> According to the following link the xlc compiler supports the pragma but
> the note towards the bottom says only for newer version:
>
>
> https://www.ibm.com/support/knowledgecenter/SSGH3R_13.1.2/com.ibm.xlcpp1312.aix.doc/compiler_ref/pragma_visibility.html
>
> There looks to be might be similar xlc attribute extensions that you could
> switch between between them with preprocessor defines.  GCC ones are listed
> at
> http://cs.swan.ac.uk/~csoliver/ok-sat-library/internet_html/doc/doc/Gcc/4.1.2/html/cpp/Common-Predefined-Macros.html
> . Similar ones for xlc at
>
> https://www.ibm.com/support/knowledgecenter/SSGH3R_12.1.0/com.ibm.xlcpp121.aix.doc/compiler_ref/xlmacros.html
>
> -Will
>
>
>
>
> -Will
>
>
_______________________________________________
perfmon2-devel mailing list
perfmon2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel

Reply via email to