[Info-vax] VMS Software Q1 '23 Update

Dave Froble davef at tsoft-inc.com
Wed Jan 25 20:36:14 EST 2023


On 1/25/2023 6:50 PM, Arne Vajhøj wrote:
> On 1/25/2023 5:55 PM, John Reagan wrote:
>> G2L recurses down the symbol table and converts the static variables in each
>> block as it finds
>> them.  The difference is that GEM frontends can record the desired offset into
>> the PSECT in
>> any order.  We sort by offset in each block, but we need to hoist all the
>> static variables out in
>> another pass, sort them, and do them all at the module level.  PSECTs are
>> created by the linker.
>> They exist outside the control of the compiler.
>>
>> Here's a nasty Fortran program where each subroutine initializes and
>> reinitializes parts of the
>> same common block in a particular order.
>>
>>          subroutine print_common
>>          common /mypsect/ i1,i2
>>          integer*4 :: i1,i2
>>          write (*,10) i1,i2
>> 10      format (' ',Z8,' ',Z8)
>>          return
>>          end
>>
>>          subroutine update_longwords
>>          common /mypsect/ i1,i2
>> c start with putting hex AAAAAAAA into both longwords
>>          integer*4 :: i1='AAAAAAAA'X,i2='AAAAAAAA'X
>>          return
>>          end
>>
>>          subroutine update_words
>> c and update bottom words with BBBB
>>          common /mypsect/ w1,w2,w3,w4
>>          integer*2 :: w1,w2='BBBB'X,w3,w4='BBBB'X
>>          return
>>          end
>>
>>          subroutine update_bytes
>> c and update bottom bytes with CC
>>          common /mypsect/ b1,b2,b3,b4,b5,b6,b7,b8
>>          integer*1 :: b1,b2,b3,b4='CC'X,b5,b6,b7,b8='CC'X
>>          return
>>          end
>>
>>          program main
>> c by now, the two longwords in the common should be
>> c CCBBAAAA CCBBAAAA
>>          call print_common
>>          end
>
> That is horrible code IMHO.

I find that an interesting comment ...

Perhaps it is doing what someone needed it to do ...

> Initializing the same common block in multiple subroutines
> is not something I would ever do.

You've never redefined the data type of some data?

> I would expect either an error or undefined result due to
> order of processing being undefined.
>
> But then I don't know what the Fortran standard and the
> VMS Fortran documentation says on the topic.
>
> Someone is actually using such constructs?
>
> Arne
>

Consider:

        Record TLS
           Variant
             Case
                 String  Rec$=42
             Case
                 Byte    Byte1%
                 Byte    VerMajor%
                 Byte    VerMinor%
                 Long    UnixDate%
                 String  Random$=28
                 Long    SessionID%
                 Word    Cypher%
                 Byte    Method%
           End Variant
         End Record


In this case the Basic RECORD statement allows multiple variants of the same 
memory, basically allowing different types of variables to be used on the same 
memory location(s).  Useful, and a relatively later addition to the language. 
Similar to what is called a structure in C and perhaps other languages.

Perhaps some would not want variants, but I for one have used them many times.

         Map (D) Long D1%
         Map (D) String D1$=4

Now in a MAP statement, whiich is rather similar to a COMMON block, multiple 
definitions of the MAP statement allows for a similar redefinition of the same 
memory.  In the above, a longword value is stored in 4 bytes of memory.  The 
redefinition of the MAP statement allows the same memory to be labeled as a 
string or a longword.

It's been useful to me in the past.

Back in the day, some programmers learned to work around things a language 
didn't provide.  I'd guess that different implementations of a compiler might 
not be quite happy with such work arounds.

Sorry John ...

-- 
David Froble                       Tel: 724-529-0450
Dave Froble Enterprises, Inc.      E-Mail: davef at tsoft-inc.com
DFE Ultralights, Inc.
170 Grimplin Road
Vanderbilt, PA  15486



More information about the Info-vax mailing list