Andrew Ross wrote:
> On Thu, Feb 12, 2009 at 04:14:57PM -0800, Alan Irwin wrote:
>> On 2009-02-12 15:01-0700 Orion Poplawski wrote:
>>
>>> Orion Poplawski wrote:
>>>> #2  0x0000000010001e84 in x23f ()
>>>>      at /builddir/build/BUILD/plplot-5.9.2/fedora/examples/f77/x23f.f:326
>>>> 326            call plsfci(0)
>>>>
>>> This is clearly wrong.  plsfci takes a 64-bit integer.  The attached patch 
>>> fixes.  The x23f.f90 example uses "0_plunicode" to specify the type.  I 
>>> don't 
>>> know if "PL_INT_0" is the best name, but it shows the general solution.
>> Hi Andrew,
>>
>> I mostly address this to you since you were the pl[gs]fci implementer for
>> most languages (as discussed in a thread started by you last July 31).  At
>> the time, I found a similar error to Orion's for the f95 case, and you
>> almost immediately found a fix.  At the time we were overly focussed on just
>> getting something to work, but in retrospect I have some questions about the
>> whole approach taken to deal with the f77 bindings (and probably other
>> bindings as well) for pl[sg]fci.
>>
>> I notice the following comment from you in bindings/f77/scstubs.c.
>>
>> "Note: Fortran does not have unsigned integers so we need to use a
>> 64 bit signed integer which corresponds to a fortran integer*8
>> in order to contain the number."
>>
>> Could you explain that comment? My question is why is it necessary to use
>> the 64-bit type PLINT64 at the C level of the f77 interface (and therefore
>> 64-bit types in all calling fortran routines) when only 32-bits are actually
>> required to store the unsigned bit pattern?
> 
> The real problem is that PLUNICODE was defined as a unsigned 32-bit
> integer. Many languages, including fortran do not have unsigned types,
> and so we only have 31 bits available for the value. The fact that the 
> top bit is always set in an fci character means that we can never
> represent these numbers using a 32-bit integer. Of course we can try
> various tricks casting unsigned integers to a signed integer - which is
> what you did, but obviously this doesn't work. It is also potentially
> confusing for the user who queries the value of an fci and doesn't get
> the value they expect. We chose to go for 64-bit integers for these
> languages to ensure the values fitted. With hindsight a safer choice
> would have been to make PLUNICODE an signed 32-bit int, but it's a bit
> late for that now.
> 
>> According to "info gfortran" typeless BOZ constants (i.e., binary, octal, or
>> hexadecimal bit patterns) are allowed anywhere that ordinary integers can be
>> used, and there is a similar statement in the Intel fortran compiler
>> programmer's reference.  For gfortran I tried the following simple test
>> code:
>>
>>        integer*4 hello
>>        hello = Z'80000001'
>>        write(*,*) hello
>>        end
>>
>> That would not compile by default.  It complained about an overflow. I think
>> that is a gfortran implementation error since the size of the BOZ constant
>> on the right is not larger than the size of the integer*4 on the left, and
>> no such error would have occurred it I had said
>>
>> hello = -2147483647
>>
>> instead.  However, when I specified the option -fno-range-check, the above
>> source code compiled, and the resulting executable gave the correct result,
>> -2^31 + 1 = -2147483647.  I assume from the writeup in the Intel Fortran
>> programmer's reference manual, you would get the same result from Intel
>> Fortran (and perhaps other modern Fortran compilers as well?).  In any case,
>> using a typeless BOZ constant to make sure the most significant bit is set
>> to mark the integer as an FCI is an unlikely case which normally would not
>> happen since if you don't specify that FCI marker, the C code for plsfci
>> applies it anyway.  Also, when you look at plgfci, it should just fill the
>> 4 bytes of memory with the appropriate bit pattern, and I cannot see what
>> could go wrong if those 4 bytes of memory were integer*4.
>>
>> Anyhow, I am tentatively concluding we should be doing absolutely nothing
>> special at the f77 interface level to deal with pl[sg]fci.  We simply want 4
>> bytes sent to the C library or returned from it, and integer*4 should have
>> sufficient storage for the task, if we don't interfere at the interface
>> level to translate to 8 bytes and that back to 4 bytes again.
>>
>> Andrew, do you see anything obviously wrong with the simple approach I just
>> outlined for transferring a 4-byte bit pattern from the f77 level to our C
>> library and back again?
> 
> It sounds like your approach would work for at least gfortran and
> probably ifort. It is not particularly nice, but neither is the current
> solution. We need to make it clear that fci is only to be thought of as
> a 4 byte bit pattern. We may run into problems with other compilers at
> some stage. We will also need to bodge example 23 to print out the fci
> value correctly. 
> 
> I'm happy for you to give it a try.
> 
> Andrew
> 
Hi,
I think this is an f77 issue only. For f95 see below. 

The reason for the error is a mismatch between the fortran and c code.
For a call such as in x023f
        call plsfci(0)
an f77 compiler will generate an integer*4 temporary for the argument 0 and 
pass that address to PLSFCI (see f77/scstubs.c) . However PLSFCI interprets it 
as an integer*8 (PLINT64) pointer taking in the adjacent 4 bytes. It is only 
luck that this code works with other compilers and architectures.

An f77 compiler will also generate the wrong code for any calls to plsfci with 
an integer*4 variable.  

When Orion added the integer*8 parameter the f77 compiler would have created an 
integer*8 temporary and the program worked as expected.

f95 compilers should generate the correct integer*8 code from the module 
declaration.


Kind Regards


Terrence


      

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Plplot-devel mailing list
Plplot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/plplot-devel

Reply via email to