Trailing-Edge
-
PDP-10 Archives
-
FORTRAN-10_V7wLink_Feb83
-
debug.bli
There are 12 other files named debug.bli in the archive. Click here to see a list.
!THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
! OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
!COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1974, 1983
!AUTHOR: S. MURPHY/TFV/AHM
MODULE DEBUG(RESERVE(0,1,2,3),SREG=#17,FREG=#16,VREG=#15,DREGS=4)=
BEGIN
SWITCHES NOLIST;
REQUIRE FIRST.BLI;
REQUIRE TABLES.BLI;
REQUIRE 'REQREL.BLI';
SWITCHES LIST;
GLOBAL BIND DEBUGV = 7^24 + 0^18+ #1512; ! Version Date: 26-Mar-82
%(
***** Begin Revision History *****
34 ----- ----- MOVE THE ROUTINE "DMPRLBLOCK" OUT OF THIS
MODULE INTO THE MODULE "RELBUF"
35 ----- ----- CHECK THE FLAG "DBGDIMN" TO DETERMINE WHETHER
TO DUMP ARRAY DIMENSIONS FOR FORDDT
36 ----- ----- ADD THE ROUTINES "INIFDDT" AND "XCTFDDT" TO GENERATE
"XCT FDDT." WHEN THE "TRACE" OPTION OF THE
DEBUG SWITCH WAS SPECIFIED BY THE USER
***** Begin Version 6 *****
37 761 TFV 1-Mar-80 -----
Choose arg type based on /GFLOATING
40 1002 TFV 1-Jul-80 ------
MAP EVALU onto EVALTAB to get the argtype for argblock entries
***** Begin Version 7 *****
1503 AHM 26-Feb-82
Change the format of dimension information blocks for extended
addressing support. Rejustify some routines.
1505 AHM 12-Mar-82
Have INIFDDT set the psect index of the symbol table entry for
"FDDT." to PSDATA to relocate those references by .DATA.
1506 AHM 14-Mar-82
Make DEFISN use ZOUTBLOCK to output line number labels,
instead of using its own buffers.
1512 AHM 26-Mar-82
Convert to using ZSYMBOL in DEFISN to output symbols.
***** End Revision History *****
)%
! This module contains routines for outputing debugging information to
! the REL file. This includes:
!
! 1. Routines to output a label for each source line.
! 2. Routines to output dimension information for arrays.
EXTERNAL
OBJECTCODE PBOPWD, ! Global in which word of code to be
! output is set up and passed to the
! output buffering routine ("OBUFFA")
BASE PSYMPTR, ! Global pointing to the symbol table
! entry for the address field of the
! word of code being output
OBUFFA, ! Places data in the peephole buffer
%1503% OIFIW; ! Lights the IFIW bit in a data word
! and calls OBUFFA
OWN
PRVISNX, ! The last ISN for which we generated
! the code "XCT FDDT."
BASE FDDTSYM, ! Pointer to STE for "FDDT."
PREVISN, ! The last ISN for which we made a label
LPRVISN; ! The last ISN for which we listed a label
! in the assembly language listing
GLOBAL ROUTINE INIFDDT=
BEGIN
! Initializes for generation of "XCT FDDT." at the start of each stmnt
! that starts a line. Called if the "TRACE" option of the DEBUG
! switch was specified by the user
EXTERNAL NAME,ENTRY,TBLSEARCH;
PRVISNX_0; !ISN OF THE LAST STMNT FOR WHICH "XCT FORDDT" WAS GENERATED
%(**MAKE SYMBOL TABLE ENTRY FOR "FDDT."**)%
NAME_IDTAB;
ENTRY[0]_SIXBIT'FDDT.';
FDDTSYM_TBLSEARCH();
FDDTSYM[OPERSP]_FNNAME;
%1505% FDDTSYM[IDPSECT] = PSDATA ! Use .DATA.
END; !End of "INIFDDT"
GLOBAL ROUTINE XCTFDDT=
BEGIN
! Generates "XCT FDDT." in front of each source program statement that
! is the 1st statement on a line. Called before code is generated for
! each statement if the flag "DBGTRAC" is set.
EXTERNAL OBUFF;
BIND XCTOCD=#256;
EXTERNAL ISN;
IF .ISN EQL 0 THEN RETURN; !IF THIS STMNT WAS INSERTED BY THE COMPILER
IF .ISN EQL .PRVISNX THEN RETURN; !IF THIS IS NOT THE 1ST STMNT ON THE LINE
%(**GENERATE "XCT FDDT."**)%
PBOPWD_XCTOCD^27;
PSYMPTR_.FDDTSYM;
OBUFF(); !OUTPUT XCT FDDT. TO THE PEEPHOLE BUFFER
! (THESE MUST BE GENERATED PRIOR TO PEEPHOLING)
PRVISNX_.ISN;
END; !Of "XCTFDDT"
GLOBAL ROUTINE DEFISN(ISN)=
BEGIN
! Defines a label for the internal seq number (ie line number) ISN and
! associates that label with the location of the instruction currently
! being written to the REL file. The global HILOC indicates the
! location to be used.
EXTERNAL
HILOC, ! Address of instruction currently being
! output to the REL file
RADIX50, ! Converts a left justified SIXBIT word
! to RADIX 50
ZSYMBOL, ![1512] Buffers a symbol to the REL file
RDATWD; ! Holds the word that ZOUTBLOCK buffers
REGISTER
LABL, ! Used to build SIXBIT for the seq number
! followed by "L" (the label)
T1; ! Holds the ISN as it is being
! decomposed for output
IF .ISN EQL 0 ! Do not generate a label for
THEN RETURN; ! statements inserted by the compiler
IF .ISN EQL .PREVISN ! If there are multiple statements on a line,
THEN RETURN; ! only generate a label for the first one
T1 = PREVISN = .ISN; ! Remember our ISN
! Make the left justified SIXBIT for the ISN followed by "L" (nnnnnL)
LABL=SIXBIT 'L'; ! Put in the L
DO ! Loop for each digit
BEGIN
LABL = .LABL^(-6); ! Shift label built so far
! to the right by 1 char
LABL<30,6> = (.T1 MOD 10)+#20; ! Get the rightmost digit into
! leftmost character of label
T1 = .T1/10; ! Discard digit from number
END
UNTIL .T1 EQL 0;
%1512% ZSYMBOL(LOCDEF,.LABL,.HILOC,PSCODE) ![1512] Output the symbol
END;
GLOBAL ROUTINE INIISNRLBLK=
BEGIN
! Sets up for defining labels corresponding to each line.
PREVISN = 0; ! The last ISN for which a label was made
LPRVISN = 0 ! The last ISN for which a label was listed
! in the assembly language listing
END;
GLOBAL ROUTINE ZOUDLB=
BEGIN
! Inserts into the macro-expanded listing an "L" label inserted for
! the first instruction of a given source line. These labels are
! inserted when the user specifies the "DEBUG" switch. Call with the
! global (register) "R1" set to the ISN of the statement that the
! instruction currently being listed begins.
EXTERNAL LSTOUT,ZOUDECIMAL,HEADCHK;
IF .R1 EQL .LPRVISN
THEN RETURN; !If the previous statement for which we
! listed a label had the same ISN as
! this one, don't make a new label
LPRVISN_.R1;
ZOUDECIMAL(); !LIST THE ISN IN DECIMAL
CHR_"L"; LSTOUT(); ! FOLLOWED BY "L"
CHR_":"; LSTOUT(); ! FOLLOWED BY ":"
CRLF;
HEADCHK(); !CHECK FOR HEADING
CHR_#11; LSTOUT(); LSTOUT(); ! <TAB> <TAB>
END;
GLOBAL ROUTINE DUMPDIM=
BEGIN
! Output dimension information for all arrays if the user specified
! either the "BOUNDS" switch (indicating that bounds checking should
! be performed on all arrays) or the "DEBUG" switch (indicating that
! debugging information should be passed to FORDDT) with the
! "DIMENSIONS" option.
EXTERNAL SYMTBL;
EXTERNAL CGDIMBLOCK; ! Outputs an argument block specifying
! dimension information for a given array
REGISTER BASE SYMPTR; ! Points to the current STE under examiniation
! Unless the user specified either the "DEBUG" switch or the "BOUNDS"
! switch, do not output dimension information.
IF NOT (.FLGREG<DBGDIMN> OR .FLGREG<BOUNDS>)
THEN RETURN;
! Walk through the symbol table and output dimension info for each
! array name found. Must do this since there is no way to directly go
! through the dimension table.
DECR I FROM SSIZ-1 TO 0
DO
BEGIN
SYMPTR_.SYMTBL[.I];
UNTIL .SYMPTR EQL 0 ! Look at each symbol that hashes to
DO ! this entry
BEGIN
IF .SYMPTR[OPRSP1] EQL ARRAYNM1 ! If this is an entry
! for an array name,
THEN CGDIMBLOCK(.SYMPTR); ! Output the arg block
! specifying dimension
! info for this array
SYMPTR_.SYMPTR[CLINK] ! Look at the next STE
! in this bucket
END
END;
END;
ROUTINE OUTPTR(SYMPTR)= ![1503] Moved outside of CGDIMBLOCK
BEGIN
! Outputs a pointer to the variable or constant whose symbol/constant
! table entry is pointed to by "SYMPTR"
PSYMPTR=.SYMPTR; !Ptr to STE for word to be output
PBOPWD=0; !Init word to be output
PBOPWD[OTSADDR]=.PSYMPTR[IDADDR]; !Set address field from STE
%1503% OIFIW() !Output the contents of PBOPWD
END;
GLOBAL ROUTINE CGDIMBLOCK(SYMPTR)= ![1503] Routine reworked by AHM
! Outputs an arg block for PROAR. FORLIB calls generated by PROARRXPN
! in ARRXPN. The arg block specifies the dimension information for
! the array whose STE is pointed to by "SYMPTR". The format for these
! arg blocks is:
! PROAR. argument list
! !=========================================================================!
! ! Array name in SIXBIT !
! !-------------------------------------------------------------------------!
! !1!0! Dim count ! Type !I! ! Base address !
! !-------------------------------------------------------------------------!
!V6!A!F!0!0! ! Ptr to offset (in words) !
!V7!1!0!A!F! ! Ptr to offset (in words) !
! !=========================================================================!
! !1!0! ! Ptr to first lower bound (in items)!
! !-------------------------------------------------------------------------!
! !1!0! ! Ptr to first upper bound (in items)!
! !-------------------------------------------------------------------------!
! !1!0! ! Ptr to first factor (in words) !
! !=========================================================================!
! \ \
! \ More triples for the rest of the dimensions \
! \ \
! !=========================================================================!
!Where:
! A - Is flag for "Array is adjustably dimensioned"
! F - Is flag for "Array is a formal parameter"
! Base address - Is the base address of the array unless the array is
! a formal parameter, in which case "i" is set, and base address
! points to the variable that contains the base address
BEGIN
MAP
BASE SYMPTR; !This formal points to array whose
! bounds are to be checked
EXTERNAL
%1002% EVALTAB EVALU, !Table of type codes
DEFLAB; !Associates the current location with
! a given label
REGISTER
BASE DIMPTR, !Ptr to dimension table entry for the
! array for which dimension information
! is being output
DIMSUBENTRY DIMLSTPTR; !Ptr to the subentry for the dimension
! being output
MACRO !Define flag fields
%1503% AFLAG=0,33,1$, !Flag for "ADJUSTABLY DIMENSIONED"
%1503% FFLAG=0,32,1$; !Flag for "FORMAL ARRAY"
DIMPTR=.SYMPTR[IDDIM]; !Point to the dimension table
DEFLAB(.DIMPTR[ARADLBL]); !Associate the current loc with the
! label to be used on this arg block
! Output 1st word of arg block
PBOPWD=.SYMPTR[IDSYMBOL]; !SIXBIT for array name
PSYMPTR=PBF2NOSYM; ! Tell output module to not relocate
! either half of the word
OBUFFA(); !Write the word out
! Output 2nd word of arg block
PBOPWD=0; !Init word to be output to 0
PBOPWD[OTSCNT]=.DIMPTR[DIMNUM]; !Set up dim count field
%1002% PBOPWD[OTSTYPE]=.EVALU[.SYMPTR[VALTYPE]]; !Type of the array
IF .SYMPTR[FORMLFLG] !Set indirect bit for a formal,
%1503% AND .SYMPTR[VALTYPE] NEQ CHARACTER ! non-character array
THEN PBOPWD[OTSIND]=1;
PBOPWD[OTSADDR]=.SYMPTR[IDADDR]; !Address of array or variable
! holding pointer to array
PSYMPTR=.SYMPTR; !Ptr to STE for the array name
%1503% OIFIW(); !Output PBOPWD as an IFIW
! Output 3rd word of arg block
PBOPWD=0; !Init data word
IF .DIMPTR[ADJDIMFLG] !Are we adjustably dimensioned ?
THEN PBOPWD[AFLAG]=1; !Yes, set the flag
IF .SYMPTR[FORMLFLG] !Are we a formal ?
THEN PBOPWD[FFLAG]=1; !Yes, set the flag
PSYMPTR=.DIMPTR[ARAOFFSET]; !STE for temp holding calculated offset
! or constant table entry for the
! offset (if array is not adj dim)
PBOPWD[OTSADDR]=.PSYMPTR[IDADDR]; !Point to the temp or constant
%1503% OIFIW(); !Output contents of PBOPWD
! Output bounds and factor for each dimension
DIMLSTPTR=DIMPTR[FIRSTDIM]; !Ptr to subentry for 1st dimension
DECR CT FROM .DIMPTR[DIMNUM] TO 1 !Loop for all the dimensions
DO
BEGIN
OUTPTR(.DIMLSTPTR[DIMLB]); !Output the lower bound
OUTPTR(.DIMLSTPTR[DIMUB]); !Output the upper bound
OUTPTR(.DIMLSTPTR[DIMFACTOR]); !Output the factor
DIMLSTPTR=.DIMLSTPTR+DIMSUBSIZE !Point to the next entry
END
END;
END
ELUDOM