Title: | Digital Fortran |
Notice: | Read notes 1.* for important information |
Moderator: | QUARK::LIONEL |
Created: | Thu Jun 01 1995 |
Last Modified: | Fri Jun 06 1997 |
Last Successful Update: | Fri Jun 06 1997 |
Number of topics: | 1333 |
Total number of notes: | 6734 |
Hi, All, A customer sent me mail describing a problem I hope someone can explain. I checked the f77 man page and could not figure it out - f77 may be working as expected, I just can't seem to find the magic switch. I looked at -static & -noautomatic but since these are defaults... Thanks for any advice! Lee ------------------------------------------------------------------ I've got a test program called foobar.f. If I compile it with the command: f77 -g2 -c foobar.f and then do an odump -t foobar.o, the symbol table contains all the local symbols I've defined (in particular two local variables IFOO and IBAR). If I compile it with: f77 -g2 -S foobar.f f77 -g2 -c foobar.s and then do an odump -t foobar.o, the symbol table doesn't contain the local symbols. Is there a switch that can be used to force the declaration of symbols in the foobar.s file? The following is the output of what I've described above: rckingdc1> cat foobar.f PROGRAM FOOBAR C IMPLICIT NONE C INTEGER*2 IFOO INTEGER*2 IBAR C WRITE ( *, * ) IFOO, IBAR C END rckingdc1> f77 -g2 -c foobar.f rckingdc1> odump -t foobar.o ***SYMBOL TABLE INFORMATION*** [Index] Name Value Sclass Symtype Ref foobar.o: [0] foobar.f 0x0000000000000000 0x01 0x0b 0x0008 [1] foobar_ 0x0000000000000000 0x01 0x06 0x0019 [2] 0x0000000000000010 0x01 0x07 0x0006 [3] IFOO 0x0000000000000150 0x03 0x02 0x001b [4] IBAR 0x0000000000000158 0x03 0x02 0x001c [5] 0x000000000000008c 0x01 0x08 0x0002 [6] foobar_ 0x0000000000000098 0x01 0x08 0x0001 [7] foobar.f 0x0000000000000000 0x01 0x08 0x0000 [8] MAIN__ 0x0000000000000000 0x01 0x06 0x0001 [9] foobar_ 0x0000000000000000 0x01 0x06 0x0001 [10] for_write_seq_lis0x0000000000000000 0x06 0x06 0xfffff [11] for_write_seq_lis_xmit0x0000000000000000 0x06 0x06 0xfffff [12] for_set_reentrancy0x0000000000000000 0x06 0x06 0xfffff [13] _fpdata 0x0000000000000000 0x06 0x01 0xfffff rckingdc1> f77 -g2 -S foobar.f rckingdc1> f77 -g2 -c foobar.s rckingdc1> odump -t foobar.o ***SYMBOL TABLE INFORMATION*** [Index] Name Value Sclass Symtype Ref foobar.o: [0] foobar.s 0x0000000000000000 0x01 0x0b 0x0006 [1] $$1 0x0000000000000110 0x02 0x02 0xfffff [2] $$2 0x0000000000000114 0x02 0x02 0xfffff [3] $$3 0x0000000000000100 0x02 0x02 0xfffff [4] $$4 0x0000000000000120 0x03 0x02 0xfffff [5] foobar.s 0x0000000000000000 0x01 0x08 0x0000 [6] foobar.f 0x0000000000000000 0x01 0x0b 0x000a [7] foobar_ 0x0000000000000000 0x01 0x06 0x0002 [8] foobar_ 0x0000000000000098 0x01 0x08 0x0007 [9] foobar.f 0x0000000000000000 0x01 0x08 0x0006 [10] $$1 0x0000000000000000 0x00 0x00 0xfffff [11] $$2 0x0000000000000000 0x00 0x00 0xfffff [12] $$3 0x0000000000000000 0x00 0x00 0xfffff [13] $$4 0x0000000000000000 0x00 0x00 0xfffff [14] foobar_ 0x0000000000000000 0x01 0x06 0x0007 [15] for_set_reentrancy0x0000000000000000 0x06 0x01 0xfffff [16] for_write_seq_lis0x0000000000000000 0x06 0x01 0xfffff [17] for_write_seq_lis_xmit0x0000000000000000 0x06 0x01 0xfffff [18] _fpdata 0x0000000000000000 0x06 0x01 0xfffff
T.R | Title | User | Personal Name | Date | Lines |
---|---|---|---|---|---|
1190.1 | TLE::MENARD | new kid on the COMMON block | Fri Feb 21 1997 09:58 | 7 | |
I looked at this briefly, and it does look like a bug. We'll get back to you when we've got it sorted out and fixed. Thanks for the simple program - - Lorri | |||||
1190.2 | Thanks!! | RHETT::PARKER | Fri Feb 21 1997 11:26 | 10 | |
Thanks for looking into this. I was not sure if it was f77(1) or as(1) or something else that could be causing the problem. Still not sure ... Thanks again! Lee | |||||
1190.3 | TLE::MENARD | new kid on the COMMON block | Fri Feb 21 1997 11:27 | 7 | |
> I was not sure if it was f77(1) or > as(1) or something else that could be causing the problem. > Still not sure ... Frankly, I'm not either ;-) but we'll figure it out somehow! - Lorri | |||||
1190.4 | QUARRY::neth | Craig Neth | Fri Feb 21 1997 13:11 | 9 | |
You should ask Gene Albert for sure, but I'm pretty sure that this behavior is what is intended. The compiler front ends turn all local variables into a name that starts with $$. The reason this is done is to ensure that local variables do not conflict with any global variables in the application. There is no concept of 'local' vs 'global' symbols in .s files. | |||||
1190.5 | feature, not a bug (although a front-end improvement would help) | GEMGRP::ALBERT | Sun Feb 23 1997 10:17 | 37 | |
Craig is right, this is to keep namespaces from colliding. Consider the following C program: main () { static int localvar = 0; foo(localvar); printf("a: 1=%d\n", localvar); } foo (i) int i; { static int localvar = 1; printf("foo: 1=%d\n", localvar); } Both main and foo define "localvar", and both of these require static storage. In the .s file, which has a flat namespace, this looks like: $$1$localvar: .long 0x0 # .long 0 $$2$localvar: .long 0x1 # .long 1 The back end calls the front end to generate these names. The C compiler prepends a unique prefix to the user's name. The Fortran compiler generates an entirely new name, loosing the original name in the process. The front ends could do better than they currently are, but the basic task of ensuring that all local names are unique in a .s file remains. FYI, GEM calls GEM_ST_GET_NAME with the GEM_ST_CONTEXT_K_SFILE context to request name disambiguation. | |||||
1190.6 | Thanks - more info | RHETT::PARKER | Mon Feb 24 1997 10:26 | 405 | |
Ok, now I understand why it works this way. The customer gave me a much more complete explanation of why/what they are trying to acomplish so I thought I'd see if any of you fortran guru's might have a "work around" - not that anything is broken. :-) Thanks, Lee --------------------------------------------------------------------- Customer email: As I've said before, we're trying to use System V type shared memory for our FORTRAN applications. Mike has developed a Windows application called Coed which we use to manage and create the FORTRAN INCLUDE files for our applications. These INCLUDE files are basically the definitions for all of the variables that reside in our FORTRAN GLOBAL COMMONS. (An example of one of these include files is attached - called comlog_l.f.) The way things currently work is: we take the comlog_l.f file and run it through the FORTRAN compiler with the -g2 -c switches and generate a .o file. This .o file is then processed by another utility written by Mike called ascomm. ascomm reads the .o file and extracts the GLOBAL COMMON's name from the .o file and creates an assembly language routine. (An example of the assembly routine that we're currently generating for comlog_l.f is attached - called comlog_l.s.) This routine is callable from the FORTRAN program at run time and remaps the program to the System V shared memory space. The problem with ascomm is that it can't generate all the necessary symbol table information for the variables in the GLOBAL COMMON necessary for debugging. What I would like to be able to do is compile the comlog_l.f type files with the -S switch to generate the assembly language code. Then, I'd like to modify the assembly language code to be a callable subroutine that, when called, will remap to the System V shared memory - much the same way things are working now. The "problem" (?) with the FORTRAN compiler the way it currently works is that the symbol table is generated fine if I just use the -c option. But, if I use the -S option, none of the variable's symbols make it into the .s file. I know what we're trying to do sounds a little strange, but we've developed an architecture around the Coed and ascomm utilities and everything works fine - except we can't look at values in GLOBAL COMMON with dbx. ------------------------------------------------------------------------ comlog_l.f C C NODE: DC1 1997/02/17 C REGION: COMLOG 13:32:03 C BLOCK DATA COMLOG_L C C Data Logging Common C IMPLICIT NONE INCLUDE '/usr/include/sysparam.inc' INTEGER * 2 NCOMLOG (512) COMMON /COMLOG_ / NCOMLOG C DATA NCOMLOG / 512 * 0 / C C VARIABLE DECLARATIONS: C C C Sum of A-622 Filter Argon Gas (North, Middle, South) C REAL*8 D622AR(3) EQUIVALENCE (D622AR, NCOMLOG(1)) DATA D622AR / 3 * 0.0/ C C Sum of A-622 Filter Chlorine Gas (North, Middle, South) C REAL*8 D622CL(3) EQUIVALENCE (D622CL, NCOMLOG(201)) DATA D622CL / 3 * 0.0/ C C Sum of R-934 Filter Argon Gas (North, Middle, South) C REAL*8 D934AR(3) EQUIVALENCE (D934AR, NCOMLOG(189)) DATA D934AR / 3 * 0.0/ C C Sum of R-934 Filter Chlorine Gas (North, Middle, South) C REAL*8 D934CL(3) EQUIVALENCE (D934CL, NCOMLOG(213)) DATA D934CL / 3 * 0.0/ C C Sum of Casting Temperature C REAL*8 DCASTP EQUIVALENCE (DCASTP, NCOMLOG(25)) DATA DCASTP / 0.0/ C C Sum of Cooling Water Flow C REAL*8 DCWFLO EQUIVALENCE (DCWFLO, NCOMLOG(297)) C C Sum of Cooling Water Temperature C REAL*8 DCWTMP EQUIVALENCE (DCWTMP, NCOMLOG(301)) C C Sum of A-622 Filter Disperser (#1, #2, #3) C REAL*8 DDISPR(3) EQUIVALENCE (DDISPR, NCOMLOG(225)) C C Sum of Drop Rate C REAL*8 DDRATE EQUIVALENCE (DDRATE, NCOMLOG(37)) C C Sum of Grain Rod Speed C REAL*8 DGRARF EQUIVALENCE (DGRARF, NCOMLOG(305)) C C Sum of Holding Furnace Temperature C REAL*8 DHFTMP EQUIVALENCE (DHFTMP, NCOMLOG(21)) C C Sum of Fluxing Gas Rate in Melting Furnace C REAL*8 DMFGAS EQUIVALENCE (DMFGAS, NCOMLOG(17)) C C Sum of Melting Furnace Temperature C REAL*8 DMFTMP EQUIVALENCE (DMFTMP, NCOMLOG(13)) C C Sum of Metal Level (#1, #2, #3, #4, #5, #6, #7) C REAL*8 DMLCAV(7) EQUIVALENCE (DMLCAV, NCOMLOG(237)) C C One Minute Count for Casting Temperature C INTEGER*2 I1MCTP EQUIVALENCE (I1MCTP, NCOMLOG(81)) C C One Minute Count for Grain Refiner C INTEGER*2 I1MGRF EQUIVALENCE (I1MGRF, NCOMLOG(77)) C C One Minute Count for Steady State C INTEGER*2 I1MINC EQUIVALENCE (I1MINC, NCOMLOG(69)) C C Five Minute Count for Steady State C INTEGER*2 I5MINC EQUIVALENCE (I5MINC, NCOMLOG(73)) C C Start Cast Crew C INTEGER*2 ICCREW EQUIVALENCE (ICCREW, NCOMLOG(177)) C C Start Cast Day of Year C INTEGER*2 ICDAYR EQUIVALENCE (ICDAYR, NCOMLOG(109)) C C Start Furnace Number C INTEGER*2 ICFURN EQUIVALENCE (ICFURN, NCOMLOG(129)) C C Start Narrow Dimension of Mold C INTEGER*2 ICGAGE EQUIVALENCE (ICGAGE, NCOMLOG(117)) C C Start Number of Active Molds C INTEGER*2 ICNUMI EQUIVALENCE (ICNUMI, NCOMLOG(125)) C C Total CO2 Flow Time C INTEGER*2 ICOTIM EQUIVALENCE (ICOTIM, NCOMLOG(65)) C C Start Cast Time (Minutes Past Midnight) C INTEGER*2 ICTIME EQUIVALENCE (ICTIME, NCOMLOG(113)) C C Start Wide Dimension of Mold C INTEGER*2 ICWDTH EQUIVALENCE (ICWDTH, NCOMLOG(121)) C C Start Cast Year C INTEGER*2 ICYEAR EQUIVALENCE (ICYEAR, NCOMLOG(105)) C C Active Molds in Drop C INTEGER*2 IDNUMI EQUIVALENCE (IDNUMI, NCOMLOG(169)) C C Acceptable Ingot Length for the Stop Cast Report C INTEGER*2 ILABTR EQUIVALENCE (ILABTR, NCOMLOG(309)) C C Total Melting Furnace Gas Flow Time C INTEGER*2 IMFGTM EQUIVALENCE (IMFGTM, NCOMLOG(61)) C C End Cast Crew C INTEGER*2 ISCREW EQUIVALENCE (ISCREW, NCOMLOG(181)) C C Casting Temperature Target C INTEGER*2 ISCSTG EQUIVALENCE (ISCSTG, NCOMLOG(161)) C C Cooling Water Flow Target C INTEGER*2 ISCWTG EQUIVALENCE (ISCWTG, NCOMLOG(165)) C C End Cast Day of Year C INTEGER*2 ISDAYR EQUIVALENCE (ISDAYR, NCOMLOG(149)) C C Grain Refiner Target for Drop C INTEGER*2 ISGRTG EQUIVALENCE (ISGRTG, NCOMLOG(157)) C C End Cast Time (Minutes Past Midnight) C INTEGER*2 ISTIME EQUIVALENCE (ISTIME, NCOMLOG(153)) C C End Cast Year C INTEGER*2 ISYEAR EQUIVALENCE (ISYEAR, NCOMLOG(145)) C C Walk Thru Crew C INTEGER*2 IWCREW EQUIVALENCE (IWCREW, NCOMLOG(185)) C C Start Cast Day of Year for Walkthru C INTEGER*2 IWDAYR EQUIVALENCE (IWDAYR, NCOMLOG(141)) C C Start Cast Time (Minutes Past Midnight) C INTEGER*2 IWTIME EQUIVALENCE (IWTIME, NCOMLOG(137)) C C Start Cast Year of Walk Thru C INTEGER*2 IWYEAR EQUIVALENCE (IWYEAR, NCOMLOG(133)) C C Print Header for Cast History C LOGICAL*2 LDLGHA EQUIVALENCE (LDLGHA, NCOMLOG(317)) C C Flag used to Print the Stop Cast Report C LOGICAL*2 LNOPRT EQUIVALENCE (LNOPRT, NCOMLOG(313)) C C Trough Jacks in Auto at Start of Cast C LOGICAL*2 LTJCST EQUIVALENCE (LTJCST, NCOMLOG(93)) C C Maximum CO2 Flow Rate C REAL*4 RCO2MX EQUIVALENCE (RCO2MX, NCOMLOG(41)) C C Maximum Casting Temperature C REAL*4 RCSMAX EQUIVALENCE (RCSMAX, NCOMLOG(29)) C C Minimum Casting Temperature C REAL*4 RCSMIN EQUIVALENCE (RCSMIN, NCOMLOG(33)) C C Minimum Cooling Water Flow C REAL*4 RCWFMN EQUIVALENCE (RCWFMN, NCOMLOG(49)) C C Maximum Cooling Water Flow C REAL*4 RCWFMX EQUIVALENCE (RCWFMX, NCOMLOG(45)) C C Maximum Grain Refiner Speed C REAL*4 RGRMAX EQUIVALENCE (RGRMAX, NCOMLOG(53)) C C Minimum Grain Refiner Speed C REAL*4 RGRMIN EQUIVALENCE (RGRMIN, NCOMLOG(57)) C C One Inch Calibration Box Readings (#1, #2, #3, etc.) C REAL*4 RMLCB1(7) EQUIVALENCE (RMLCB1, NCOMLOG(265)) C C Three Inch Calibration Box Readings (#1, #2, #3, etc.) C REAL*4 RMLCB3(7) EQUIVALENCE (RMLCB3, NCOMLOG(281)) C C North LVDT Value at the Start of the Cast C REAL*4 RNLTCS EQUIVALENCE (RNLTCS, NCOMLOG(85)) C C Platen LVDT Value at Block Set Time C REAL*4 RPLTCE EQUIVALENCE (RPLTCE, NCOMLOG(97)) C C Platen LVDT Value at Cast Start Time C REAL*4 RPLTCS EQUIVALENCE (RPLTCS, NCOMLOG(101)) C C Ending Actual Ingot Length of Drop C REAL*4 RRACIL EQUIVALENCE (RRACIL, NCOMLOG(173)) C C South LVDT Value at the Start of the Cast C REAL*4 RSLTCS EQUIVALENCE (RSLTCS, NCOMLOG(89)) C C DATA STATEMENTS C END -------------------------------------------------------------------------- comlog_l.s .set noat .set noreorder .text .align 4 .globl comlog_l .ent comlog_l comlog_l: ldgp $gp, 0($27) lda $sp, -16($sp) stq $26, 0($sp) .mask 0x04000000,-16 .frame $sp, 16, $26, 0 .prologue 1 .extern comlog_ 8192 .rdata .align 4 comlog_nm: .ascii "comlog\X00" .text lda $16, comlog_nm mov 8192, $17 jsr $26, mapgbl_ ldgp $gp, 0($26) .text ldq $26, 0($sp) lda $sp, 16($sp) ret ($26) .end comlog_l | |||||
1190.7 | Does shcom_connect(3f) do what they want? | SUBPAC::FARICELLI | Mon Feb 24 1997 11:27 | 5 | |
Is the customer aware of shcom_connect(3f), which sounds like a much cleaner way to get common blocks shared across processes. -- John Faricelli | |||||
1190.8 | Not a bug | TLE::EKLUND | Always smiling on the inside! | Tue Feb 25 1997 10:57 | 19 |
Currently the .s file will only contain references to the original local symbols if they are data initialized (via data statements or the like). If you take a closer look at the C example given a few notes back, you will observe that the local variables were declared static AND data initialized. Both of these are required in order for the symbols to appear in the .s file! So C has exactly the same behavior as Fortran for local symbols. I looked at what it might take to change this, and it does NOT look simple. It is unlikely that we could justify the effort to change this. We will add this as a low priority item for possible future work. Cheers! Dave Eklund | |||||
1190.9 | Great Info! | RHETT::PARKER | Tue Feb 25 1997 17:28 | 11 | |
Thanks! I understand even better now. Thanks to all who replied. I have asked the customer about shcom_connect(3) but I have not heard back yet. I expect they can work around the issue with all of the information supplied here. Thanks again!! Lee | |||||
1190.10 | RHETT::PARKER | Thu Feb 27 1997 11:59 | 9 | ||
RE: .7 - Should shcom_connect(3) work with System V shared memory. They can't seem to get it to work... Thanks, Lee | |||||
1190.11 | shcom_connect(3f) has nothing to do with Sys V ipc | SUBPAC::FARICELLI | Fri Feb 28 1997 08:29 | 12 | |
shcom_connect(3f) doesn't have anything to do with System V shared memory. It uses mmap(3) to map a shared library containing the common block to be shared amongst processes. I assume that the end user is trying to share a common block across multiple processes, correct? The man page "man 3f shcom_connect" has a complete example. What exactly is the user trying to achieve? -- John Faricelli | |||||
1190.12 | .6 explains what they are trying to do | RHETT::PARKER | Fri Feb 28 1997 11:15 | 17 | |
John, Thanks for the reply. I posted an explanation of what they are trying to do in .6. >> I assume that the end user is trying to share a common block across >> multiple processes, correct? Yes. But, they have already implemented it using SysV shared memory and they think it will be too much work to change it now. Thanks for the help! I don't know if there is anything else we can do for them. If anyone has any ideas, I'm open to them. Lee | |||||
1190.13 | If they'd rather munge object files, be my guest | SUBPAC::FARICELLI | Fri Feb 28 1997 14:26 | 13 | |
I can't think of anything more cludgy that what was posted in reply .6 I proposed shcom_connect() as a supported way to get the end result they want. I don't think it would be that big a deal -- they just create a block data subroutine with the common blocks they wish to share, make it into a shared library, and then call shcom_connect(). But the customer is always right... ;-) -- John Faricelli |