HP MLIB User's Guide Vol. 2 7th Ed.
Chapter 10 Introduction to ScaLAPACK 703
Accessing ScaLAPACK
Itanium processors
If you compile on Itanium using the compiler option +noppu your xerbla.o
object has an entry point xerbla (without the postpended underbar). However
the Itanium MLIB libraries were compiled with +ppu option (following the
default behavior described in Table 10-2) and the entry points without
underbars were added as synonyms to the entry points with underbars. Hence
the various MLIB Fortran source subprograms that call XERBLA reference
them as xerbla_. Therefore, your xerbla (without the postpended underbar)
does not satisfy the Fortran calls to XERBLA, so the linker accesses xerbla.o
from the library. This file contains both entry points xerbla and xerbla_, and
xerbla conflicts with your XERBLA subroutine.
Moreover, the various MLIB C source subprograms that call XERBLA still
reference them as xerbla (without the postpended underbar). It means that
both xerbla and xerbla_ entry points must be provided in your xerbla.o.
Use one of the following workarounds on Itanium if you are compiling your own
Fortran version of XERBLA:
• Compile your Fortran source for XERBLA with +noppu and provide both
xerbla and xerbla_ entry points:
SUBROUTINE XERBLA(SRNAME,INFO)
ENTRY XERBLA_SRNAME,INFO)
...
• Use f90 ALIAS directives and provide both xerbla and xerbla_ entry points:
!$HP$ ALIAS xerbla='xerbla'
!$HP$ ALIAS xerbla_='xerbla_'
SUBROUTINE XERBLA(SRNAME,INFO)
ENTRY XERBLA_(SRNAME,INFO)
...
The ALIAS directives prevent the compiler from postpending the underbar
onto the entry points and external references to XERBLA.
Use the following workaround on Itanium if you are compiling your own C
version of XERBLA:
• Undefine any previous aliasing from include files and provide both xerbla
and xerbla_ entry points explicitly:
#undef xerbla
#undef xerbla_
void xerbla (char*name, int*iarg, size_t len_name){
...
}
void xerbla_ (char*name, int*iarg, size_t len_name){
xerbla (name, iarg, len_name);
}