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