On 06-03-2012, at 15:17, Prof Brian Ripley wrote:

>> [..]
>> used to indicate that the function/variable/symbol is defined in
>> another compilation unit.  In FORTRAN77, "external" is used to tell the
>> compiler that you are passing a function to another
>> function/subroutine.  At least that is my understanding from what I
>> re-read in my FORTRAN documentation.
> 
> Not quite.  It also means that you really want to externally link and not 
> allow the compiler to find any routine of that name it knows about (e.g. an 
> intrinsic).  See para 8.7 of http://www.fortran.com/F77_std/rjcnf-8.html 
> (although I got this from my Fortran reference on my bookshelf).
> 
>> Thus, perhaps strangely, if there is only a
>>      external double complex zdotc
>> declaration in your subroutine, the compiler doesn't know that a call
> 
> The only 'strangely' thing is that is accepted: AFAICS is it not valid 
> according to the link above.
> 

Agree. The fortran 77 standard doesn't allow that syntax and I'm really 
surprised that no error is flagged.

>> to zdotc will return a double complex but will assume that the result
>> has the implicitly defined type, a real*8 IIRC.
> 
> The Fortran default type for z* is real.
> 
> > So zdotc is called, and
>> puts a double complex as result on the stack (heap?), but within
>> callzdotc a real as return is expected and that is taken from the
>> stack (heap?), that real is than coerced to a double complex when
>> assigned to retval.  Note that while I am pretty sure about the above,
>> this last paragraph is more speculative. :)  But it would explain why
>> the erroneous code returns 0 on little-endian machines.
> 
> We haven't been told which machines, and this actually matters down to the 
> level of optimization used by the compilers.  But these days typically double 
> complex gets passed in sse registers, and double is passed in fpu registers.
> 

Mac OS X 10.6.8, Mini Core 2 Duo
Apple gcc (i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664))
and gfortran (GNU Fortran (GCC) 4.2.1 (Apple Inc. build 5664)) from 
r.research.att.com.

Output from  R CMD SHLIB --output=dozdot.so callzdotc.f czdot.c 

gfortran -arch x86_64   -fPIC  -g -O2 -c callzdotc.f -o callzdotc.o
gcc -arch x86_64 -std=gnu99 -I/Library/Frameworks/R.framework/Resources/include 
-I/Library/Frameworks/R.framework/Resources/include/x86_64  
-I/usr/local/include    -fPIC  -g -O2 -c czdot.c -o czdot.o
gcc -arch x86_64 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names 
-undefined dynamic_lookup -single_module -multiply_defined suppress 
-L/usr/local/lib -o dozdot.so callzdotc.o czdot.o -lgfortran 
-F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework 
-Wl,CoreFoundation

Same thing happens with gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 and gfortran 
on Xubuntu 11.10 64-bit.

Berend

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to