Refs #266. Fixed the compiling bug with Open64 5.0.
authorZhang Xianyi <traits.zhang@gmail.com>
Wed, 31 Jul 2013 06:41:39 +0000 (14:41 +0800)
committerZhang Xianyi <traits.zhang@gmail.com>
Wed, 31 Jul 2013 06:41:39 +0000 (14:41 +0800)
Makefile.system
exports/Makefile
exports/gensymbol
f_check
ftest3.f [new file with mode: 0644]
interface/trtri.c
lapack/trtri/dtrtri_lapack.f

index cb0cac3..727b089 100644 (file)
@@ -897,6 +897,7 @@ export CC
 export FC
 export BU
 export FU
+export NEED2UNDERSCORES
 export USE_THREAD
 export NUM_THREADS
 export NUM_CORES
index 6502d5d..7ef2830 100644 (file)
@@ -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*
index 0a9729a..7076412 100644 (file)
 
                # 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.
                #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 d7c0b23..86f1fa6 100644 (file)
--- 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 (file)
index 0000000..8f2cd33
--- /dev/null
+++ b/ftest3.f
@@ -0,0 +1,6 @@
+      double complex function zho_ge()
+
+      zho_ge = (0.0d0,0.0d0)
+
+      return 
+      end
index 71680e8..007dbd7 100644 (file)
@@ -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
index 31a880f..8e9a081 100644 (file)
 *> \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,    --