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
[email protected]
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel