[comp.sys.mips] Problems with conditionally compiled f77 code

pmontgom@euphemia.math.ucla.edu (Peter Montgomery) (02/06/91)

	Is this the proper newsgroup for reports like the following?

#! /bin/csh -f
#
#		Using f77 version 2.10 under ULTRIX V4.0 on a DEC 5000,
#	I have experienced many problems while using source files which
#	pass through the C preprocessor (.F suffix) and which have
#	conditional compilation (#if or #ifdef or #ifndef) directives 
#	which cause source code to be skipped.
#	Some problems are dependent upon the precise file name.
#	This script demonstrates some of them.  
#
#		Problems reported February, 1991 by
#
#			Peter L. Montgomery
#			Department of Mathematics
#			University of California
#			Los Angeles, CA 90024-1555
#
#			pmontgom@math.ucla.edu
#
#**********************************************************************
set dir = /tmp/UCLAtests
/bin/rm -r -f $dir
mkdir $dir
cd $dir			# Test files go there

cat << End_file > verylongname.F

C		Call this source file "verylongname.F".
C	Compile with "f77 -g".  Then run "dbx a.out".
C	The debugger immediately prints registers and dies.

C		With some other file names, such as ",1.F", the
C	program works OK.  It is also OK if we change the "#if 0" to "#if 1".
	
	program test
	end

#if 0

#endif
End_file
echo "***** Debugger prints registers and dies *****"
f77 -g verylongname.F
echo "quit" | dbx a.out
echo "***** With different source file name, debugger is OK *****"
mv verylongname.F ,1.F
f77 -g ,1.F
echo "quit" | dbx a.out
#**********************************************************************
cat << End_file > outrange.F
C
C	Using f77 -c -g, this source gets
C
C	    libmld: Internal: st_psym_ifd_isym: ifd (0) or isym (2) out of range
C
C	if we specify exactly one of -DCHARACTER and -DENTRY, 
C	but works OK if we use both or neither of those.
C
	subroutine ONE(name)
#ifdef CHARACTER 
	character*(*) name
#endif
#ifdef ENTRY
	entry TWO(name)
#endif
	end
End_file
echo "***** Two libmld: Internal: st_psym_ifd_isym: *****"
echo "*****             ifd (0) or isym (2) out of range *****"
f77 -c -g -DCHARACTER outrange.F
f77 -c -g -DENTRY outrange.F
echo "***** Next two compile OK *****"
f77 -c -g outrange.F
f77 -c -g -DCHARACTER -DENTRY outrange.F
#**********************************************************************
cat << End_file > prof1.F
C	Subject: Wrong file name in profile listing using C preprocessor
C
C	Compile this source using the C preprocessor and -p (profile).
C	After executing a.out, run "prof" to get an profile listing.
C	The profile has the proper source file name for ZERO and ONE,
C	but not for TWO and THREE.

	program ZERO
	do i = 1, 100000
	    call ONE
	end do
	end
	subroutine ONE
	do i = 1, 2
	   call TWO
	end do
	end
#if 0
	The wrong file name is used hereafter.
#endif
	subroutine TWO
	do i = 1, 2
	    call THREE
	end do
	end
	subroutine THREE
	end	
End_file
echo "***** Prof lists wrong file name for TWO and THREE *****"
/bin/rm -f a.out mon.out core
f77 -p prof1.F
a.out
prof
#**********************************************************************
cat << End_file > x.F 
#if 0
C	Subject: Profiler says "Unknown language"
C
C	Call this "x.F" and  compile with "f77 -p".  
C	Then run "a.out" and "prof".
C	Prof terminates abnormally with the message
C	"Unknown language in symbol table (4)".
C
C	If we call this "prof2.F", the problem does not occur.
#endif
	program main
	end
	subroutine ONE
	entry TWO
	end
End_file
/bin/rm -f core a.out mon.out
echo "***** Unknown language in symbol table (4) *****"
f77 -p x.F
a.out; prof
cp x.F prof2.F
/bin/rm -f core a.out mon.out
echo "***** With file name changed, problem does not occur *****"
f77 -p prof2.F
a.out; prof
#**********************************************************************
exit
--
        Peter L. Montgomery 
        pmontgom@MATH.UCLA.EDU 
        Department of Mathematics, UCLA, Los Angeles, CA 90024-1555
If I spent as much time on my dissertation as I do reading news, I'd graduate.