Previous | Contents | Index |
The compiler issues an error message if it encounters a CDD/Repository
feature that conflicts with HP Fortran. It ignores any
CDD/Repository features that it does not support.
2.6 Compiler Limits, Diagnostic Messages, and Error Conditions
The following sections discuss the compiler limits and error messages.
2.6.1 Compiler Limits
Table 2-5 lists the limits to the size and complexity of a single HP Fortran program unit and to individual statements contained in it.
The amount of data storage, the size of arrays, and the total size of executable programs are limited only by the amount of process virtual address space available, as determined by process quotas and system parameters.
Language Element | Limit |
---|---|
Actual number of arguments per CALL
or function reference |
255 |
Arguments in a function reference
in a specification expression |
255 |
Array dimensions | 7 |
Array elements per dimension | 9,223,372,036,854,775,807 or process limit |
Constants; character and Hollerith | 2000 characters |
Constants; characters read in list-directed I/O | 2048 characters |
Continuation lines | 511 |
DO and block IF statement nesting (combined) | 128 |
DO loop index variable | 9,223,372,036,854,775,807 or process limit |
Format group nesting | 8 |
Fortran source line length | 132 characters |
INCLUDE file nesting | 20 levels |
Labels in computed or assigned GOTO list | 500 |
Lexical tokens per statement | 3000 |
Parentheses nesting in expressions | 40 |
Structure nesting | 20 |
Symbolic-name length | 63 characters |
On relevant process quotas and system parameters, see Section 1.2.
2.6.2 Compiler Diagnostic Messages and Error Conditions
The HP Fortran compiler identifies syntax errors and violations of language rules in the source program.
If the compiler locates any errors, it writes messages to your default output device; so, if you enter the FORTRAN command interactively, the messages are displayed on your terminal. If the FORTRAN command is executed in a batch job, the messages appear in the log file for the batch job.
A sample message from the compiler as it would appear on a terminal screen follows:
40 FORMAT (I3,) ................^ %F90-W-ERROR, An extra comma appears in the format list. at line number 13 in file DISK$:[USER]SAMP_MESS.FOR;4 |
This sample message consists of the following lines:
The message line has the following format:
%F90-s-ident, message-text |
The facility, F90, follows the percent sign (%). The severity of the message (I for informational, W for warning, E for error, or F for fatal) replaces s. A mnemonic for that message replaces ident. The explanatory text of the message replaces message-text.
Diagnostic messages usually provide enough information for you to determine the cause of an error and correct it. If you compile using the /OPTIMIZE qualifier (the default) and have difficulty determining the cause of an error (possibly because of the optimizations), consider compiling using a lower optimization level or /NOOPTIMIZE.
If the compiler creates a listing file, it also writes the messages to
the listing. The pointer (...1) and messages follow the statement that
caused the error.
2.7 Compiler Output Listing Format
A compiler output listing produced by a FORTRAN command with the /LIST qualifier consists of the following sections:
Section 2.7.1 through Section 2.7.5 describe the compiler listing sections in detail.
The source code section of a compiler output listing displays the source program as it appears in the input file, with the addition of sequential line numbers generated by the compiler. Example 2-1 and Example 2-2 show a sample of a source code section of a free-form compiler output listing.
Example 2-1 Sample Listing of Source Code on OpenVMS I64 |
---|
SIMPLE$MAIN$BLK Source Listing 26-OCT-2004 15:29:44 HP Fortran V8.0-48291 Page 1 26-OCT-2004 15:29:26 DISK$DKA100:[USERNAME.BUG]SIMPLE.F90;1 1 integer i 2 i = 10 3 type *,i 4 end PROGRAM SECTIONS Name Bytes Attributes 1 $LITERAL$ 24 PIC CON REL LCL SHR NOEXE RD NOWRT OCTA 2 $CODE$ 224 PIC CON REL LCL SHR EXE NORD NOWRT OCTA 3 $SBSS$ 12 NOPIC CON REL LCL NOSHR NOEXE RD WRT OCTA Total Space Allocated 260 ENTRY POINTS Address Name 2-00000000 SIMPLE$MAIN VARIABLES Address Type Name 3-00000008 I*4 I |
Example 2-2 Sample Listing of Source Code on OpenVMS Alpha |
---|
RELAX2 Source Listing 19-DEC-2004 16:12:46 HP Fortran V8.x-xxxx Page 1 12-DEC-2004 10:41:04 F90$DISK:[TUCKER]LIST_EX.F90;3 1 SUBROUTINE RELAX2(EPS) 2 INTEGER, PARAMETER :: M=40 3 INTEGER, PARAMETER :: N=60 4 5 COMMON X (M,N) 6 7 LOGICAL DONE 8 10 DONE = .TRUE. 9 10 DO J=1,N-1 11 DO I=1,M-1 12 XNEW = (X(I-1,J)+X(I+1,J)+X(I,J-1)+X(I,J+1))/4 13 IF (ABS(XNEW-X(I,J)) > EPS) DONE = .FALSE. 14 X(I,J) = XNEW 15 END DO 16 END DO 17 18 IF (.NOT. DONE) GO TO 10 19 RETURN 20 END SUBROUTINE |
Compiler-generated line numbers appear in the left margin and are used
with the %LINE prefix in debugger commands. These compiler-generated
line numbers are displayed by compiler-generated messages and certain
run-time error messages. (For more information on messages, see
Appendix C.)
2.7.2 Machine Code Section
The machine code section of a compiler output listing provides a symbolic representation of the compiler-generated object code. The representation of the generated code and data is similar to that of a MACRO assembly listing.
The machine code section is optional. To receive a listing file with a machine code section, you must specify the following:
$ FORTRAN/LIST/MACHINE_CODE |
Example 2-3 shows a sample of part of a machine code section of a compiler output listing for OpenVMS I64 systems.
Example 2-3 Sample (Partial) Listing of Machine Code on OpenVMS I64 |
---|
SIMPLE$MAIN$BLK Machine Code Listing 26-OCT-2004 15:29:34 HP Fortran V8.0-48291 Page 2 26-OCT-2004 15:29:26 DISK$DKA100:[USERNAME.BUG]SIMPLE.F90;1 .psect $CODE$, CON, LCL, SHR, EXE, NOWRT, NOVEC, NOSHORT .proc MAIN__ .align 32 .global MAIN__ .personality DFOR$HANDLER .handlerdata -32 MAIN__: // 000002 { .mii 002C0081A980 0000 alloc r38 = rspfs, 0, 8, 5, 0 0119F8C80300 0001 adds sp = -64, sp // r12 = -64, r12 0108001009C0 0002 mov r39 = gp ;; // r39 = r1 } { .mib 010800C40080 0010 adds r2 = 32, sp // r2 = 32, r12 000188000940 0011 mov r37 = rp // r37 = br0 004000000000 0012 nop.b 0 ;; } { .mii 008CC0200000 0020 st8 [r2] = r0 0120001000C0 0021 add r3 = @ltoff($LITERAL$+16), gp // r3 = @ltoff($LITERAL$+16), r1 012000002640 0022 mov ai = 1 // r25 = 1 } { .mmi 012000014880 0030 mov r34 = 10 ;; 0080C03000C0 0031 ld8 r3 = $LITERAL$ // r3 = [r3] 000008000000 0032 nop.i 0 ;; } { .mfb 010800300A00 0040 mov out0 = r3 // r40 = r3 000008000000 0041 nop.f 0 00A000001000 0042 br.call.sptk.many rp = DFOR$SET_FPE ;; // br0 = DFOR$SET_FPE } { .mii 010802700040 0050 mov gp = r39 // r1 = r39 012000002640 0051 mov ai = 1 ;; // r25 = 1 012000100800 0052 add r32 = @ltoff($LITERAL$+8), gp ;; // r32 = @ltoff($LITERAL$+8), r1 } { .mfb 0080C2000A00 0060 ld8 out0 = $LITERAL$ // r40 = [r32] 000008000000 0061 nop.f 0 00A000001000 0062 br.call.sptk.many rp = // br0 = DFOR$SET_REENTRANCY DFOR$SET_REENTRANCY ;; } { .mii 010802700040 0070 mov gp = r39 // r1 = r39 010800C208C0 0071 adds r35 = 16, sp // r35 = 16, r12 // 000003 010800C40840 0072 adds r33 = 32, sp // r33 = 32, r12 } { .mmi 01200000A640 0080 mov ai = 5 ;; // r25 = 5 012000100900 0081 add r36 = @ltoffx($LITERAL$), gp // r36 = @ltoffx($LITERAL$), r1 010800C20B00 0082 adds out4 = 16, sp // r44 = 16, r12 } { .mlx 0119F80FCA40 0090 adds out1 = -2, r0 // r41 = -2, r0 000000000002 0091 movl out2 = 8716160 ;; // r42 = 8716160 019FF20015 } { .mii 0080C2400AC0 00A0 ld8.mov out3 = [r36], $LITERAL$ 010800C40A00 00A1 adds out0 = 32, sp // r40 = 32, r12 000008000000 00A2 nop.i 0 ;; } { .mmb 008C82344000 00B0 st4 [r35] = r34 008C82100000 00B1 st4 [r33] = r0 00A000001000 00B2 br.call.sptk.many rp = // br0 = DFOR$WRITE_SEQ_LIS DFOR$WRITE_SEQ_LIS ;; } { .mii 012000002200 00C0 mov r8 = 1 // 000004 010802700040 00C1 mov gp = r39 // r1 = r39 // 000003 00015404C000 00C2 mov.i rspfs = r38 ;; // 000004 } { .mib 010800C80300 00D0 adds sp = 64, sp // r12 = 64, r12 000E0014A000 00D1 mov rp = r37 // br0 = r37 000108001100 00D2 br.ret.sptk.many rp ;; // br0 } .endp MAIN__ Routine Size: 224 bytes, Routine Base: $CODE$ + 0000 .psect $SBSS$, CON, LCL, NOSHR, NOEXE, WRT, NOVEC, SHORT .lcomm var$0004, 1, 1 .lcomm fill$$1, 11, 16 .psect $LITERAL$, CON, LCL, SHR, NOEXE, NOWRT, NOVEC, NOSHORT 00010109 0000 string "\X09\X01\X01\X00" 00000000 0008 data8 0x0 // data8 0 00000000 000C 00200000 0010 data8 0x200000 // data8 2097152 00000000 0014 |
The following list explains how generated code and data are represented in machine code listings on OpenVMS I64 systems:
Example 2-4 shows a sample of part of a machine code section of a compiler output listing for OpenVMS Alpha systems.
Example 2-4 Sample (Partial) Listing of Machine Code on OpenVMS Alpha |
---|
RELAX2 Machine Code Listing 19-DEC-2004 16:12:46 HP Fortran V8.x-xxxx Page 3 12-DEC-2004 10:41:04 F90$DISK:[TUCKER]LIST_EX.F90;3 .PSECT $CODE$, OCTA, PIC, CON, REL, LCL, SHR,- EXE, NORD, NOWRT 0000 RELAX2:: 23DEFFC0 0000 LDA SP, -64(SP) 80100000 0004 LDF F0, (R16) ; 000013 A41B0020 0008 LDQ R0, 32(R27) ; 000012 B77E0000 000C STQ R27, (SP) ; 000001 B75E0008 0010 STQ R26, 8(SP) B7BE0010 0014 STQ FP, 16(SP) 9C5E0018 0018 STT F2, 24(SP) 9C7E0020 001C STT F3, 32(SP) 9C9E0028 0020 STT F4, 40(SP) 9CBE0030 0024 STT F5, 48(SP) 9CDE0038 0028 STT F6, 56(SP) 47FE041D 002C MOV SP, FP 803B0028 0030 LDF F1, 40(R27) ; 000012 2FFE0000 0034 UNOP 2FFE0000 0038 UNOP 2FFE0000 003C UNOP 0040 .10: ; 000008 2FFE0000 0040 UNOP 2FFE0000 0044 UNOP 2FFE0000 0048 UNOP 2FFE0000 004C UNOP 203FFFFF 0050 MOV -1, DONE ; -1, R1 47E77411 0054 MOV 59, var$0002 ; 59, R17 ; 000010 47F41412 0058 MOV 160, R18 ; 000014 2FFE0000 005C UNOP 0060 lab$0004: ; 000010 2FFE0000 0060 UNOP 2FFE0000 0064 UNOP 2FFE0000 0068 UNOP 2FFE0000 006C UNOP 40120413 0070 ADDQ R0, R18, R19 47E4F414 0074 MOV 39, var$0003 ; 39, R20 ; 000011 2273FF5C 0078 LDA R19, -164(R19) ; 000012 2FFE0000 007C UNOP 0080 lab$0008: ; 000011 2FFE0000 0080 UNOP 2FFE0000 0084 UNOP 2FFE0000 0088 UNOP 2FFE0000 008C UNOP 81530008 0090 LDF F10, 8(R19) 8193FF64 0094 LDF F12, -156(R19) 47FF0418 0098 CLR R24 ; 000013 81730000 009C LDF F11, (R19) ; 000012 81B300A4 00A0 LDF F13, 164(R19) 81D3000C 00A4 LDF F14, 12(R19) 8213FF68 00A8 LDF F16, -152(R19) 823300A8 00AC LDF F17, 168(R19) 82730010 00B0 LDF F19, 16(R19) 82B3FF6C 00B4 LDF F21, -148(R19) 82D300AC 00B8 LDF F22, 172(R19) 82F30014 00BC LDF F23, 20(R19) 8333FF70 00C0 LDF F25, -144(R19) 835300B0 00C4 LDF F26, 176(R19) 83730018 00C8 LDF F27, 24(R19) . . . Routine Size: 1020 bytes, Routine Base: $CODE$ + 0000 .PSECT $LINK$, OCTA, NOPIC, CON, REL, LCL,- NOSHR, NOEXE, RD, NOWRT 0000 ; Stack-Frame invocation descriptor Entry point: RELAX2 Entry Length: 48 Registers used: R0-R1, R16-R25, R27-FP, F0-F6, F10-F30 Registers saved: FP, F2-F6 Fixed Stack Size: 64 00000000 0020 .ADDRESS $BLANK 00003F80 0028 .LONG X^3F80 ; .F_FLOATING 0.2500000 |
The following list explains how generated code and data are represented in machine code listings on OpenVMS Alpha systems:
The annotations section of the compiler output listing describes special instructions used for optimizations such as prefetching, inlining, and loop unrolling. It is controlled by the /ANNOTATIONS qualifier. See Section 2.3.5.
Example 2-5 shows the list of annotations that is produced from the following source code:
1 2 3 4 5 6 7 287 work1=sqrt((xlatt*real(mindex,LONGreal)) **2+(ylatt*real(nindex,LONGreal))**2+(q-p)**2) 8 9 10 11 12 288 work2=q-p |
Example 2-5 Sample (Partial) Listing of Annotations |
---|
1. Software pipelining across 4 iterations; unrolling loop 2 times; steady state estimated 180 cycles; 0 prefetch iterations 2. Unrolling loop 6 times 3. Prefetching MINDEX, 128 bytes ahead 4. Prefetching NINDEX, 128 bytes ahead 5. Prefetching Q, 128 bytes ahead 6. Write-hinting WORK1, distance 128 7. Prefetching P, 128 bytes ahead 8. Software pipelining across 2 iterations; unrolling loop 2 times; steady state estimated 17 cycles; 0 prefetch iterations 9. Prefetching P, 192 bytes ahead 10. Write-hinting WORK2, distance 128 11. Unrolling loop 7 times 12. Prefetching Q, 192 bytes ahead |
The storage map section of the compiler output listing is printed after each program unit, or library module. It is not generated when a fatal compilation error is encountered.
The storage map section summarizes information in the following categories:
Total Space Allocated nnn |
A heading for an information category is printed in the listing only when entries are generated for that category.
Example 2-6 shows an example of a storage map section.
Example 2-6 Sample Storage Map Section |
---|
RELAX2 Source Listing 19-DEC-2004 16:12:46 HP Fortran v8.x-xxxx Page 1 12-DEC-2004 10:41:04 F90$DISK:[TUCKER]LIST_EX.F90;3 PROGRAM SECTIONS Name Bytes Attributes 1 $CODE$ 1020 PIC CON REL LCL SHR EXE NORD NOWRT OCTA 2 $LINK$ 44 NOPIC CON REL LCL NOSHR NOEXE RD NOWRT OCTA 3 $BLANK 9600 NOPIC OVR REL GBL NOSHR NOEXE RD WRT OCTA Total Space Allocated 10664 ENTRY POINTS Address Name 1-00000000 RELAX2 VARIABLES Address Type Name Address Type Name Address Type Name Address Type Name Address Type Name ** L*4 DONE ** R*4 EPS ** I*4 I ** I*4 J ** R*4 XNEW ARRAYS Address Type Name Bytes Dimensions 3-00000000 R*4 X 9600 (40, 60) LABELS Address Label 1-00000040 10 |
As shown in Example 2-6, a section size is specified as a number of bytes, expressed in decimal. A data address is specified as an offset from the start of a program section, expressed in hexadecimal.
Previous | Next | Contents | Index |