From a07cc3957102f400ec15e893f05073113795d404 Mon Sep 17 00:00:00 2001 From: Zhang Xianyi Date: Wed, 31 Jul 2013 14:41:39 +0800 Subject: [PATCH] Refs #266. Fixed the compiling bug with Open64 5.0. --- Makefile.system | 1 + exports/Makefile | 20 ++++++----- exports/gensymbol | 69 ++++++++++++++++++++++++++++++++++-- f_check | 21 ++++++++++- ftest3.f | 6 ++++ interface/trtri.c | 4 +-- lapack/trtri/dtrtri_lapack.f | 2 +- 7 files changed, 108 insertions(+), 15 deletions(-) create mode 100644 ftest3.f diff --git a/Makefile.system b/Makefile.system index cb0cac3e0..727b08960 100644 --- a/Makefile.system +++ b/Makefile.system @@ -897,6 +897,7 @@ export CC export FC export BU export FU +export NEED2UNDERSCORES export USE_THREAD export NUM_THREADS export NUM_CORES diff --git a/exports/Makefile b/exports/Makefile index 6502d5d01..7ef2830db 100644 --- a/exports/Makefile +++ b/exports/Makefile @@ -18,6 +18,10 @@ ifndef NO_LAPACKE NO_LAPACKE = 0 endif +ifndef NEED2UNDERSCORES +NEED2UNDERSCORES=0 +endif + ifeq ($(OSNAME), WINNT) ifeq ($(F_COMPILER), GFORTRAN) EXTRALIB += -lgfortran @@ -94,13 +98,13 @@ libgoto2_shared.dll : ../$(LIBNAME) libgoto2_shared.def -Wl,--out-implib,libgoto2_shared.lib $(FEXTRALIB) libopenblas.def : gensymbol - perl ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F) + perl ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) > $(@F) libgoto2_shared.def : gensymbol - perl ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F) + perl ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) > $(@F) libgoto_hpl.def : gensymbol - perl ./gensymbol win2khpl $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F) + perl ./gensymbol win2khpl $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) > $(@F) $(LIBDYNNAME) : ../$(LIBNAME) osx.def $(CC) $(CFLAGS) -all_load -headerpad_max_install_names -install_name $(CURDIR)/../$(LIBDYNNAME) -dynamiclib -o ../$(LIBDYNNAME) $< -Wl,-exported_symbols_list,osx.def $(FEXTRALIB) @@ -187,23 +191,23 @@ static : ../$(LIBNAME) rm -f goto.$(SUFFIX) linux.def : gensymbol ../Makefile.system ../getarch.c - perl ./gensymbol linux $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F) + perl ./gensymbol linux $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) > $(@F) osx.def : gensymbol ../Makefile.system ../getarch.c - perl ./gensymbol osx $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F) + perl ./gensymbol osx $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) > $(@F) aix.def : gensymbol ../Makefile.system ../getarch.c - perl ./gensymbol aix $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F) + perl ./gensymbol aix $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) > $(@F) symbol.S : gensymbol - perl ./gensymbol win2kasm noarch dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > symbol.S + perl ./gensymbol win2kasm noarch dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) > symbol.S test : linktest.c $(CC) $(CFLAGS) -w -o linktest linktest.c ../$(LIBSONAME) -lm && echo OK. rm -f linktest linktest.c : gensymbol ../Makefile.system ../getarch.c - perl ./gensymbol linktest $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > linktest.c + perl ./gensymbol linktest $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) $(NEED2UNDERSCORES) > linktest.c clean :: @rm -f *.def *.dylib __.SYMDEF* diff --git a/exports/gensymbol b/exports/gensymbol index 0a9729a6c..707641291 100644 --- a/exports/gensymbol +++ b/exports/gensymbol @@ -114,8 +114,8 @@ # ALLAUX -- Auxiliary routines called from all precisions # already provided by @blasobjs: xerbla, lsame - ilaenv, ieeeck, lsamen, xerbla_array, iparmq, - ilaprec, ilatrans, ilauplo, iladiag, chla_transtype, + ilaenv, ieeeck, lsamen, iparmq, + ilaprec, ilatrans, ilauplo, iladiag, ilaver, slamch, slamc3, # SCLAUX -- Auxiliary routines called from both REAL and COMPLEX. @@ -2672,12 +2672,25 @@ #LAPACKE_zlagsy_work, ); +#These function may need 2 underscores. +@lapack_embeded_underscore_objs=(xerbla_array, chla_transtype,); + if ($ARGV[5] == 1) { #NO_LAPACK=1 @underscore_objs = (@blasobjs, @misc_underscore_objs); } elsif (-d "../lapack-3.1.1" || -d "../lapack-3.4.0" || -d "../lapack-3.4.1" || -d "../lapack-3.4.2" || -d "../lapack-netlib") { - @underscore_objs = (@blasobjs, @lapackobjs, @lapackobjs2, @misc_underscore_objs); + + if ($ARGV[7] == 0){ + # NEED2UNDERSCORES=0 + # Don't need 2 underscores + @underscore_objs = (@blasobjs, @lapackobjs, @lapackobjs2, @misc_underscore_objs, @lapack_embeded_underscore_objs); + }else{ + # Need 2 underscores + @underscore_objs = (@blasobjs, @lapackobjs, @lapackobjs2, @misc_underscore_objs); + @need_2underscore_objs = (@lapack_embeded_underscore_objs); + }; + } else { @underscore_objs = (@blasobjs, @lapackobjs, @misc_underscore_objs); } @@ -2729,6 +2742,10 @@ if ($ARGV[0] eq "linux"){ print $objs, $bu, "\n"; } + foreach $objs (@need_2underscore_objs) { + print $objs, $bu, $bu, "\n"; + } + # if ($ARGV[4] == 0) { foreach $objs (@no_underscore_objs) { print $objs, "\n"; @@ -2750,6 +2767,10 @@ if ($ARGV[0] eq "osx"){ print "_", $objs, $bu, "\n"; } + foreach $objs (@need_2underscore_objs) { + print "_", $objs, $bu, $bu, "\n"; + } + # if ($ARGV[4] == 0) { foreach $objs (@no_underscore_objs) { print "_", $objs, "\n"; @@ -2767,6 +2788,10 @@ if ($ARGV[0] eq "aix"){ print $objs, $bu, "\n"; } + foreach $objs (@need_2underscore_objs) { + print $objs, $bu, $bu, "\n"; + } + # if ($ARGV[4] == 0) { foreach $objs (@no_underscore_objs) { print $objs, "\n"; @@ -2791,6 +2816,17 @@ if ($ARGV[0] eq "win2k"){ print "\t$uppercase=$objs", "_ \@", $count, "\n"; $count ++; } + + foreach $objs (@need_2underscore_objs) { + $uppercase = $objs; + $uppercase =~ tr/[a-z]/[A-Z]/; + print "\t$objs=$objs","__ \@", $count, "\n"; + $count ++; + print "\t",$objs, "__=$objs","__ \@", $count, "\n"; + $count ++; + print "\t$uppercase=$objs", "__ \@", $count, "\n"; + $count ++; + } #for misc_common_objs foreach $objs (@misc_common_objs) { @@ -2852,6 +2888,18 @@ if ($ARGV[0] eq "microsoft"){ print "\t$uppercase\_ = $objs","_\n"; $count ++; } + + foreach $objs (@need_2underscore_objs) { + $uppercase = $objs; + $uppercase =~ tr/[a-z]/[A-Z]/; + print "\t$objs=$objs","__ \@", $count, "\n"; + $count ++; + print "\t",$objs, "__=$objs","__ \@", $count, "\n"; + $count ++; + print "\t$uppercase=$objs", "__ \@", $count, "\n"; + $count ++; + } + exit(0); } @@ -2868,6 +2916,16 @@ if ($ARGV[0] eq "win2kasm"){ print "_", $uppercase, "_:\n"; print "\tjmp\t_", $objs, "_\n"; } + + foreach $objs (@need_2underscore_objs) { + $uppercase = $objs; + $uppercase =~ tr/[a-z]/[A-Z]/; + print "\t.align 16\n"; + print "\t.globl _", $uppercase, "__\n"; + print "_", $uppercase, "__:\n"; + print "\tjmp\t_", $objs, "__\n"; + } + exit(0); } @@ -2880,6 +2938,11 @@ if ($ARGV[0] eq "linktest"){ foreach $objs (@underscore_objs) { print $objs, $bu, "();\n" if $objs ne "xerbla"; } + + foreach $objs (@need_2underscore_objs) { + print $objs, $bu, $bu, "();\n"; + } + # if ($ARGV[4] == 0) { foreach $objs (@no_underscore_objs) { print $objs, "();\n"; diff --git a/f_check b/f_check index d7c0b2328..86f1fa689 100644 --- a/f_check +++ b/f_check @@ -114,6 +114,12 @@ if ($compiler eq "") { $vendor = IBM; $openmp = "-openmp"; } + + # for embeded underscore name, e.g. zho_ge, it may append 2 underscores. + $data = `$compiler -O2 -S ftest3.f > /dev/null 2>&1 && cat ftest3.s && rm -f ftest3.s`; + if ($data =~ /zho_ge__/) { + $need2bu = 1; + } } if ($vendor eq "") { @@ -245,6 +251,8 @@ if ($link ne "") { $link =~ s/\-rpath\s+/\-rpath\@/g; + $link =~ s/\-rpath-link\s+/\-rpath-link\@/g; + @flags = split(/[\s\,\n]/, $link); # remove leading and trailing quotes from each flag. @flags = map {s/^['"]|['"]$//g; $_} @flags; @@ -265,7 +273,15 @@ if ($link ne "") { $linker_L .= "-Wl,". $flags . " "; } - if ($flags =~ /^\-rpath/) { + if ($flags =~ /^\-rpath\@/) { + $flags =~ s/\@/\,/g; + if ($vendor eq "PGI") { + $flags =~ s/lib$/libso/; + } + $linker_L .= "-Wl,". $flags . " " ; + } + + if ($flags =~ /^\-rpath-link\@/) { $flags =~ s/\@/\,/g; if ($vendor eq "PGI") { $flags =~ s/lib$/libso/; @@ -309,6 +325,9 @@ print MAKEFILE "NOFORTRAN=1\n" if $nofortran == 1; print CONFFILE "#define BUNDERSCORE\t$bu\n" if $bu ne ""; print CONFFILE "#define NEEDBUNDERSCORE\t1\n" if $bu ne ""; +print CONFFILE "#define NEED2UNDERSCORES\t1\n" if $need2bu ne ""; + +print MAKEFILE "NEED2UNDERSCORES=1\n" if $need2bu ne ""; if (($linker_l ne "") || ($linker_a ne "")) { print MAKEFILE "FEXTRALIB=$linker_L $linker_l $linker_a\n"; diff --git a/ftest3.f b/ftest3.f new file mode 100644 index 000000000..8f2cd332f --- /dev/null +++ b/ftest3.f @@ -0,0 +1,6 @@ + double complex function zho_ge() + + zho_ge = (0.0d0,0.0d0) + + return + end diff --git a/interface/trtri.c b/interface/trtri.c index 71680e87d..007dbd7fa 100644 --- a/interface/trtri.c +++ b/interface/trtri.c @@ -60,7 +60,7 @@ static blasint (*trtri_parallel[])(blas_arg_t *, BLASLONG *, BLASLONG *, FLOAT * }; #endif -extern void dtrtri_lapack_(char *UPLO, char *DIAG, int *N, double *a, int *ldA, int *Info); +extern void BLASFUNC(dtrtrilapack)(char *UPLO, char *DIAG, int *N, double *a, int *ldA, int *Info); int NAME(char *UPLO, char *DIAG, blasint *N, FLOAT *a, blasint *ldA, blasint *Info){ @@ -137,7 +137,7 @@ int NAME(char *UPLO, char *DIAG, blasint *N, FLOAT *a, blasint *ldA, blasint *In // double trtri_U single thread error // call dtrtri from lapack for a walk around. if(uplo==0){ - dtrtri_lapack_(UPLO, DIAG, N, a, ldA, Info); + BLASFUNC(dtrtrilapack)(UPLO, DIAG, N, a, ldA, Info); #ifndef PPC440 blas_memory_free(buffer); #endif diff --git a/lapack/trtri/dtrtri_lapack.f b/lapack/trtri/dtrtri_lapack.f index 31a880f76..8e9a08170 100644 --- a/lapack/trtri/dtrtri_lapack.f +++ b/lapack/trtri/dtrtri_lapack.f @@ -107,7 +107,7 @@ *> \ingroup doubleOTHERcomputational * * ===================================================================== - SUBROUTINE DTRTRI_LAPACK( UPLO, DIAG, N, A, LDA, INFO ) + SUBROUTINE DTRTRILAPACK( UPLO, DIAG, N, A, LDA, INFO ) * * -- LAPACK computational routine (version 3.4.0) -- * -- LAPACK is a software package provided by Univ. of Tennessee, --