--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+Indirect:
+g77.info-1: 1697
+g77.info-2: 51504
+g77.info-3: 86652
+g77.info-4: 102421
+g77.info-5: 148200
+g77.info-6: 198176
+g77.info-7: 240263
+g77.info-8: 290181
+g77.info-9: 339800
+g77.info-10: 389391
+g77.info-11: 437993
+g77.info-12: 487886
+g77.info-13: 537704
+g77.info-14: 586061
+g77.info-15: 635100
+g77.info-16: 684261
+g77.info-17: 734128
+g77.info-18: 773211
+g77.info-19: 822559
+g77.info-20: 833284
+\1f
+Tag Table:
+(Indirect)
+Node: Top\7f1697
+Node: Copying\7f3654
+Node: Contributors\7f22836
+Node: Funding\7f25868
+Node: Funding GNU Fortran\7f28371
+Node: Look and Feel\7f31054
+Node: Getting Started\7f31556
+Node: What is GNU Fortran?\7f33874
+Node: G77 and GCC\7f43439
+Node: Invoking G77\7f44790
+Node: Option Summary\7f46941
+Node: Overall Options\7f51504
+Node: Shorthand Options\7f57592
+Node: Fortran Dialect Options\7f60070
+Node: Warning Options\7f70755
+Node: Debugging Options\7f79641
+Node: Optimize Options\7f80714
+Node: Preprocessor Options\7f84159
+Node: Directory Options\7f85340
+Node: Code Gen Options\7f86652
+Node: Environment Variables\7f101963
+Node: News\7f102421
+Node: Changes\7f148200
+Node: Language\7f162250
+Node: Direction of Language Development\7f164190
+Node: Standard Support\7f170429
+Node: No Passing External Assumed-length\7f171150
+Node: No Passing Dummy Assumed-length\7f171627
+Node: No Pathological Implied-DO\7f172142
+Node: No Useless Implied-DO\7f172829
+Node: Conformance\7f173560
+Node: Notation Used\7f175583
+Node: Terms and Concepts\7f179788
+Node: Syntactic Items\7f180300
+Node: Statements Comments Lines\7f180982
+Node: Scope of Names and Labels\7f182847
+Node: Characters Lines Sequence\7f183277
+Node: Character Set\7f183858
+Node: Lines\7f184859
+Node: Continuation Line\7f187335
+Node: Statements\7f188290
+Node: Statement Labels\7f189246
+Node: Order\7f189938
+Node: INCLUDE\7f190823
+Node: Data Types and Constants\7f193566
+Node: Types\7f197087
+Node: Double Notation\7f198176
+Node: Star Notation\7f199248
+Node: Kind Notation\7f202193
+Node: Constants\7f210613
+Node: Integer Type\7f211925
+Node: Character Type\7f212523
+Node: Expressions\7f213287
+Node: %LOC()\7f213703
+Node: Specification Statements\7f216404
+Node: NAMELIST\7f216861
+Node: DOUBLE COMPLEX\7f217143
+Node: Control Statements\7f217397
+Node: DO WHILE\7f217889
+Node: END DO\7f218115
+Node: Construct Names\7f219122
+Node: CYCLE and EXIT\7f219862
+Node: Functions and Subroutines\7f222626
+Node: %VAL()\7f223272
+Node: %REF()\7f224636
+Node: %DESCR()\7f226464
+Node: Generics and Specifics\7f228597
+Node: REAL() and AIMAG() of Complex\7f235792
+Node: CMPLX() of DOUBLE PRECISION\7f237625
+Node: MIL-STD 1753\7f239351
+Node: f77/f2c Intrinsics\7f239693
+Node: Table of Intrinsic Functions\7f240263
+Node: Abort Intrinsic\7f256970
+Node: Abs Intrinsic\7f257234
+Node: Access Intrinsic\7f258102
+Node: AChar Intrinsic\7f258938
+Node: ACos Intrinsic\7f259460
+Node: AdjustL Intrinsic\7f259921
+Node: AdjustR Intrinsic\7f260246
+Node: AImag Intrinsic\7f260572
+Node: AInt Intrinsic\7f261377
+Node: Alarm Intrinsic\7f262005
+Node: All Intrinsic\7f262841
+Node: Allocated Intrinsic\7f263153
+Node: ALog Intrinsic\7f263482
+Node: ALog10 Intrinsic\7f263872
+Node: AMax0 Intrinsic\7f264270
+Node: AMax1 Intrinsic\7f264755
+Node: AMin0 Intrinsic\7f265208
+Node: AMin1 Intrinsic\7f265692
+Node: AMod Intrinsic\7f266144
+Node: And Intrinsic\7f266570
+Node: ANInt Intrinsic\7f267076
+Node: Any Intrinsic\7f267840
+Node: ASin Intrinsic\7f268147
+Node: Associated Intrinsic\7f268605
+Node: ATan Intrinsic\7f268939
+Node: ATan2 Intrinsic\7f269405
+Node: BesJ0 Intrinsic\7f269956
+Node: BesJ1 Intrinsic\7f270417
+Node: BesJN Intrinsic\7f270878
+Node: BesY0 Intrinsic\7f271377
+Node: BesY1 Intrinsic\7f271839
+Node: BesYN Intrinsic\7f272301
+Node: Bit_Size Intrinsic\7f272804
+Node: BTest Intrinsic\7f273463
+Node: CAbs Intrinsic\7f274183
+Node: CCos Intrinsic\7f274570
+Node: Ceiling Intrinsic\7f274962
+Node: CExp Intrinsic\7f275284
+Node: Char Intrinsic\7f275676
+Node: ChDir Intrinsic (subroutine)\7f276930
+Node: ChMod Intrinsic (subroutine)\7f277739
+Node: CLog Intrinsic\7f279008
+Node: Cmplx Intrinsic\7f279412
+Node: Complex Intrinsic\7f280213
+Node: Conjg Intrinsic\7f281659
+Node: Cos Intrinsic\7f282083
+Node: CosH Intrinsic\7f282546
+Node: Count Intrinsic\7f282921
+Node: Cpu_Time Intrinsic\7f283239
+Node: CShift Intrinsic\7f283702
+Node: CSin Intrinsic\7f284024
+Node: CSqRt Intrinsic\7f284416
+Node: CTime Intrinsic (subroutine)\7f284826
+Node: CTime Intrinsic (function)\7f285581
+Node: DAbs Intrinsic\7f286215
+Node: DACos Intrinsic\7f286611
+Node: DASin Intrinsic\7f287002
+Node: DATan Intrinsic\7f287394
+Node: DATan2 Intrinsic\7f287787
+Node: Date_and_Time Intrinsic\7f288242
+Node: DbesJ0 Intrinsic\7f288592
+Node: DbesJ1 Intrinsic\7f288985
+Node: DbesJN Intrinsic\7f289371
+Node: DbesY0 Intrinsic\7f289795
+Node: DbesY1 Intrinsic\7f290181
+Node: DbesYN Intrinsic\7f290567
+Node: Dble Intrinsic\7f290989
+Node: DCos Intrinsic\7f291695
+Node: DCosH Intrinsic\7f292079
+Node: DDiM Intrinsic\7f292469
+Node: DErF Intrinsic\7f292901
+Node: DErFC Intrinsic\7f293270
+Node: DExp Intrinsic\7f293645
+Node: Digits Intrinsic\7f294031
+Node: DiM Intrinsic\7f294348
+Node: DInt Intrinsic\7f294847
+Node: DLog Intrinsic\7f295231
+Node: DLog10 Intrinsic\7f295616
+Node: DMax1 Intrinsic\7f296014
+Node: DMin1 Intrinsic\7f296468
+Node: DMod Intrinsic\7f296920
+Node: DNInt Intrinsic\7f297348
+Node: Dot_Product Intrinsic\7f297747
+Node: DProd Intrinsic\7f298087
+Node: DSign Intrinsic\7f298469
+Node: DSin Intrinsic\7f298908
+Node: DSinH Intrinsic\7f299293
+Node: DSqRt Intrinsic\7f299684
+Node: DTan Intrinsic\7f300075
+Node: DTanH Intrinsic\7f300460
+Node: Dtime Intrinsic (subroutine)\7f300864
+Node: EOShift Intrinsic\7f301799
+Node: Epsilon Intrinsic\7f302138
+Node: ErF Intrinsic\7f302462
+Node: ErFC Intrinsic\7f302868
+Node: ETime Intrinsic (subroutine)\7f303426
+Node: ETime Intrinsic (function)\7f304253
+Node: Exit Intrinsic\7f304957
+Node: Exp Intrinsic\7f305434
+Node: Exponent Intrinsic\7f305896
+Node: Fdate Intrinsic (subroutine)\7f306235
+Node: Fdate Intrinsic (function)\7f306923
+Node: FGet Intrinsic (subroutine)\7f307473
+Node: FGetC Intrinsic (subroutine)\7f308310
+Node: Float Intrinsic\7f309187
+Node: Floor Intrinsic\7f309587
+Node: Flush Intrinsic\7f309903
+Node: FNum Intrinsic\7f310482
+Node: FPut Intrinsic (subroutine)\7f310930
+Node: FPutC Intrinsic (subroutine)\7f311727
+Node: Fraction Intrinsic\7f312574
+Node: FSeek Intrinsic\7f312915
+Node: FStat Intrinsic (subroutine)\7f313640
+Node: FStat Intrinsic (function)\7f315109
+Node: FTell Intrinsic (subroutine)\7f316343
+Node: FTell Intrinsic (function)\7f317016
+Node: GError Intrinsic\7f317533
+Node: GetArg Intrinsic\7f317907
+Node: GetCWD Intrinsic (subroutine)\7f318543
+Node: GetCWD Intrinsic (function)\7f319399
+Node: GetEnv Intrinsic\7f320019
+Node: GetGId Intrinsic\7f320606
+Node: GetLog Intrinsic\7f320912
+Node: GetPId Intrinsic\7f321236
+Node: GetUId Intrinsic\7f321544
+Node: GMTime Intrinsic\7f321849
+Node: HostNm Intrinsic (subroutine)\7f322857
+Node: HostNm Intrinsic (function)\7f323729
+Node: Huge Intrinsic\7f324354
+Node: IAbs Intrinsic\7f324677
+Node: IAChar Intrinsic\7f325068
+Node: IAnd Intrinsic\7f325608
+Node: IArgC Intrinsic\7f326096
+Node: IBClr Intrinsic\7f326472
+Node: IBits Intrinsic\7f326982
+Node: IBSet Intrinsic\7f327696
+Node: IChar Intrinsic\7f328197
+Node: IDate Intrinsic (UNIX)\7f329416
+Node: IDiM Intrinsic\7f329997
+Node: IDInt Intrinsic\7f330446
+Node: IDNInt Intrinsic\7f330839
+Node: IEOr Intrinsic\7f331238
+Node: IErrNo Intrinsic\7f331736
+Node: IFix Intrinsic\7f332063
+Node: Imag Intrinsic\7f332451
+Node: ImagPart Intrinsic\7f333456
+Node: Index Intrinsic\7f334482
+Node: Int Intrinsic\7f335035
+Node: Int2 Intrinsic\7f335750
+Node: Int8 Intrinsic\7f336438
+Node: IOr Intrinsic\7f337126
+Node: IRand Intrinsic\7f337606
+Node: IsaTty Intrinsic\7f338526
+Node: IShft Intrinsic\7f338950
+Node: IShftC Intrinsic\7f339800
+Node: ISign Intrinsic\7f340728
+Node: ITime Intrinsic\7f341178
+Node: Kill Intrinsic (subroutine)\7f341580
+Node: Kind Intrinsic\7f342417
+Node: LBound Intrinsic\7f342742
+Node: Len Intrinsic\7f343059
+Node: Len_Trim Intrinsic\7f343695
+Node: LGe Intrinsic\7f344107
+Node: LGt Intrinsic\7f345520
+Node: Link Intrinsic (subroutine)\7f346426
+Node: LLe Intrinsic\7f347391
+Node: LLt Intrinsic\7f348297
+Node: LnBlnk Intrinsic\7f349192
+Node: Loc Intrinsic\7f349595
+Node: Log Intrinsic\7f350026
+Node: Log10 Intrinsic\7f350606
+Node: Logical Intrinsic\7f351179
+Node: Long Intrinsic\7f351502
+Node: LShift Intrinsic\7f352026
+Node: LStat Intrinsic (subroutine)\7f353062
+Node: LStat Intrinsic (function)\7f354818
+Node: LTime Intrinsic\7f356325
+Node: MatMul Intrinsic\7f357329
+Node: Max Intrinsic\7f357647
+Node: Max0 Intrinsic\7f358198
+Node: Max1 Intrinsic\7f358649
+Node: MaxExponent Intrinsic\7f359133
+Node: MaxLoc Intrinsic\7f359473
+Node: MaxVal Intrinsic\7f359800
+Node: MClock Intrinsic\7f360122
+Node: MClock8 Intrinsic\7f360849
+Node: Merge Intrinsic\7f361567
+Node: Min Intrinsic\7f361883
+Node: Min0 Intrinsic\7f362434
+Node: Min1 Intrinsic\7f362885
+Node: MinExponent Intrinsic\7f363369
+Node: MinLoc Intrinsic\7f363709
+Node: MinVal Intrinsic\7f364036
+Node: Mod Intrinsic\7f364355
+Node: Modulo Intrinsic\7f364878
+Node: MvBits Intrinsic\7f365197
+Node: Nearest Intrinsic\7f366063
+Node: NInt Intrinsic\7f366387
+Node: Not Intrinsic\7f367225
+Node: Or Intrinsic\7f367620
+Node: Pack Intrinsic\7f368118
+Node: PError Intrinsic\7f368428
+Node: Precision Intrinsic\7f368882
+Node: Present Intrinsic\7f369217
+Node: Product Intrinsic\7f369547
+Node: Radix Intrinsic\7f369873
+Node: Rand Intrinsic\7f370190
+Node: Random_Number Intrinsic\7f371077
+Node: Random_Seed Intrinsic\7f371430
+Node: Range Intrinsic\7f371778
+Node: Real Intrinsic\7f372099
+Node: RealPart Intrinsic\7f373105
+Node: Rename Intrinsic (subroutine)\7f374138
+Node: Repeat Intrinsic\7f375110
+Node: Reshape Intrinsic\7f375446
+Node: RRSpacing Intrinsic\7f375775
+Node: RShift Intrinsic\7f376110
+Node: Scale Intrinsic\7f377108
+Node: Scan Intrinsic\7f377424
+Node: Second Intrinsic (function)\7f377748
+Node: Second Intrinsic (subroutine)\7f378288
+Node: Selected_Int_Kind Intrinsic\7f378934
+Node: Selected_Real_Kind Intrinsic\7f379325
+Node: Set_Exponent Intrinsic\7f379712
+Node: Shape Intrinsic\7f380069
+Node: Short Intrinsic\7f380392
+Node: Sign Intrinsic\7f381088
+Node: Signal Intrinsic (subroutine)\7f381688
+Node: Sin Intrinsic\7f382987
+Node: SinH Intrinsic\7f383462
+Node: Sleep Intrinsic\7f383835
+Node: Sngl Intrinsic\7f384177
+Node: Spacing Intrinsic\7f384566
+Node: Spread Intrinsic\7f384890
+Node: SqRt Intrinsic\7f385211
+Node: SRand Intrinsic\7f385815
+Node: Stat Intrinsic (subroutine)\7f386192
+Node: Stat Intrinsic (function)\7f387751
+Node: Sum Intrinsic\7f389059
+Node: SymLnk Intrinsic (subroutine)\7f389391
+Node: System Intrinsic (subroutine)\7f390423
+Node: System_Clock Intrinsic\7f391362
+Node: Tan Intrinsic\7f392130
+Node: TanH Intrinsic\7f392590
+Node: Time Intrinsic (UNIX)\7f392972
+Node: Time8 Intrinsic\7f393786
+Node: Tiny Intrinsic\7f394499
+Node: Transfer Intrinsic\7f394814
+Node: Transpose Intrinsic\7f395145
+Node: Trim Intrinsic\7f395479
+Node: TtyNam Intrinsic (subroutine)\7f395809
+Node: TtyNam Intrinsic (function)\7f396508
+Node: UBound Intrinsic\7f397077
+Node: UMask Intrinsic (subroutine)\7f397422
+Node: Unlink Intrinsic (subroutine)\7f398119
+Node: Unpack Intrinsic\7f399017
+Node: Verify Intrinsic\7f399352
+Node: XOr Intrinsic\7f399671
+Node: ZAbs Intrinsic\7f400187
+Node: ZCos Intrinsic\7f400556
+Node: ZExp Intrinsic\7f400929
+Node: ZLog Intrinsic\7f401302
+Node: ZSin Intrinsic\7f401675
+Node: ZSqRt Intrinsic\7f402049
+Node: Scope and Classes of Names\7f402406
+Node: Underscores in Symbol Names\7f402876
+Node: Other Dialects\7f403123
+Node: Source Form\7f404282
+Node: Carriage Returns\7f405633
+Node: Tabs\7f405962
+Node: Short Lines\7f407671
+Node: Long Lines\7f408645
+Node: Ampersands\7f409256
+Node: Trailing Comment\7f409510
+Node: Debug Line\7f410286
+Node: Dollar Signs\7f410955
+Node: Case Sensitivity\7f411241
+Node: VXT Fortran\7f419857
+Node: Double Quote Meaning\7f421040
+Node: Exclamation Point\7f421968
+Node: Fortran 90\7f423011
+Node: Pedantic Compilation\7f424063
+Node: Distensions\7f428027
+Node: Ugly Implicit Argument Conversion\7f429558
+Node: Ugly Assumed-Size Arrays\7f430172
+Node: Ugly Complex Part Extraction\7f431893
+Node: Ugly Null Arguments\7f433515
+Node: Ugly Conversion of Initializers\7f435120
+Node: Ugly Integer Conversions\7f436885
+Node: Ugly Assigned Labels\7f437993
+Node: Compiler\7f439924
+Node: Compiler Limits\7f440530
+Node: Compiler Types\7f441413
+Node: Compiler Constants\7f446112
+Node: Compiler Intrinsics\7f446971
+Node: Intrinsic Groups\7f447898
+Node: Other Intrinsics\7f451339
+Node: ACosD Intrinsic\7f458937
+Node: AIMax0 Intrinsic\7f459218
+Node: AIMin0 Intrinsic\7f459527
+Node: AJMax0 Intrinsic\7f459837
+Node: AJMin0 Intrinsic\7f460147
+Node: ASinD Intrinsic\7f460456
+Node: ATan2D Intrinsic\7f460762
+Node: ATanD Intrinsic\7f461070
+Node: BITest Intrinsic\7f461376
+Node: BJTest Intrinsic\7f461685
+Node: CDAbs Intrinsic\7f461994
+Node: CDCos Intrinsic\7f462367
+Node: CDExp Intrinsic\7f462742
+Node: CDLog Intrinsic\7f463117
+Node: CDSin Intrinsic\7f463492
+Node: CDSqRt Intrinsic\7f463868
+Node: ChDir Intrinsic (function)\7f464261
+Node: ChMod Intrinsic (function)\7f464895
+Node: CosD Intrinsic\7f466007
+Node: DACosD Intrinsic\7f466319
+Node: DASinD Intrinsic\7f466627
+Node: DATan2D Intrinsic\7f466938
+Node: DATanD Intrinsic\7f467252
+Node: Date Intrinsic\7f467561
+Node: DbleQ Intrinsic\7f468190
+Node: DCmplx Intrinsic\7f468494
+Node: DConjg Intrinsic\7f470125
+Node: DCosD Intrinsic\7f470510
+Node: DFloat Intrinsic\7f470816
+Node: DFlotI Intrinsic\7f471188
+Node: DFlotJ Intrinsic\7f471498
+Node: DImag Intrinsic\7f471807
+Node: DReal Intrinsic\7f472184
+Node: DSinD Intrinsic\7f473331
+Node: DTanD Intrinsic\7f473635
+Node: Dtime Intrinsic (function)\7f473950
+Node: FGet Intrinsic (function)\7f474844
+Node: FGetC Intrinsic (function)\7f475617
+Node: FloatI Intrinsic\7f476433
+Node: FloatJ Intrinsic\7f476753
+Node: FPut Intrinsic (function)\7f477072
+Node: FPutC Intrinsic (function)\7f477808
+Node: IDate Intrinsic (VXT)\7f478601
+Node: IIAbs Intrinsic\7f479320
+Node: IIAnd Intrinsic\7f479630
+Node: IIBClr Intrinsic\7f479935
+Node: IIBits Intrinsic\7f480244
+Node: IIBSet Intrinsic\7f480554
+Node: IIDiM Intrinsic\7f480863
+Node: IIDInt Intrinsic\7f481169
+Node: IIDNnt Intrinsic\7f481478
+Node: IIEOr Intrinsic\7f481787
+Node: IIFix Intrinsic\7f482092
+Node: IInt Intrinsic\7f482395
+Node: IIOr Intrinsic\7f482694
+Node: IIQint Intrinsic\7f482994
+Node: IIQNnt Intrinsic\7f483302
+Node: IIShftC Intrinsic\7f483613
+Node: IISign Intrinsic\7f483927
+Node: IMax0 Intrinsic\7f484237
+Node: IMax1 Intrinsic\7f484542
+Node: IMin0 Intrinsic\7f484846
+Node: IMin1 Intrinsic\7f485150
+Node: IMod Intrinsic\7f485453
+Node: INInt Intrinsic\7f485753
+Node: INot Intrinsic\7f486055
+Node: IZExt Intrinsic\7f486355
+Node: JIAbs Intrinsic\7f486658
+Node: JIAnd Intrinsic\7f486962
+Node: JIBClr Intrinsic\7f487267
+Node: JIBits Intrinsic\7f487576
+Node: JIBSet Intrinsic\7f487886
+Node: JIDiM Intrinsic\7f488195
+Node: JIDInt Intrinsic\7f488501
+Node: JIDNnt Intrinsic\7f488810
+Node: JIEOr Intrinsic\7f489119
+Node: JIFix Intrinsic\7f489424
+Node: JInt Intrinsic\7f489727
+Node: JIOr Intrinsic\7f490026
+Node: JIQint Intrinsic\7f490326
+Node: JIQNnt Intrinsic\7f490634
+Node: JIShft Intrinsic\7f490944
+Node: JIShftC Intrinsic\7f491255
+Node: JISign Intrinsic\7f491569
+Node: JMax0 Intrinsic\7f491879
+Node: JMax1 Intrinsic\7f492184
+Node: JMin0 Intrinsic\7f492488
+Node: JMin1 Intrinsic\7f492792
+Node: JMod Intrinsic\7f493095
+Node: JNInt Intrinsic\7f493395
+Node: JNot Intrinsic\7f493697
+Node: JZExt Intrinsic\7f493997
+Node: Kill Intrinsic (function)\7f494310
+Node: Link Intrinsic (function)\7f494992
+Node: QAbs Intrinsic\7f495804
+Node: QACos Intrinsic\7f496114
+Node: QACosD Intrinsic\7f496418
+Node: QASin Intrinsic\7f496726
+Node: QASinD Intrinsic\7f497032
+Node: QATan Intrinsic\7f497340
+Node: QATan2 Intrinsic\7f497646
+Node: QATan2D Intrinsic\7f497956
+Node: QATanD Intrinsic\7f498270
+Node: QCos Intrinsic\7f498579
+Node: QCosD Intrinsic\7f498880
+Node: QCosH Intrinsic\7f499183
+Node: QDiM Intrinsic\7f499486
+Node: QExp Intrinsic\7f499785
+Node: QExt Intrinsic\7f500083
+Node: QExtD Intrinsic\7f500382
+Node: QFloat Intrinsic\7f500686
+Node: QInt Intrinsic\7f500993
+Node: QLog Intrinsic\7f501293
+Node: QLog10 Intrinsic\7f501593
+Node: QMax1 Intrinsic\7f501900
+Node: QMin1 Intrinsic\7f502205
+Node: QMod Intrinsic\7f502508
+Node: QNInt Intrinsic\7f502808
+Node: QSin Intrinsic\7f503110
+Node: QSinD Intrinsic\7f503410
+Node: QSinH Intrinsic\7f503713
+Node: QSqRt Intrinsic\7f504017
+Node: QTan Intrinsic\7f504320
+Node: QTanD Intrinsic\7f504620
+Node: QTanH Intrinsic\7f504923
+Node: Rename Intrinsic (function)\7f505239
+Node: Secnds Intrinsic\7f506044
+Node: Signal Intrinsic (function)\7f506419
+Node: SinD Intrinsic\7f507530
+Node: SnglQ Intrinsic\7f507842
+Node: SymLnk Intrinsic (function)\7f508157
+Node: System Intrinsic (function)\7f509025
+Node: TanD Intrinsic\7f510352
+Node: Time Intrinsic (VXT)\7f510669
+Node: UMask Intrinsic (function)\7f511200
+Node: Unlink Intrinsic (function)\7f511808
+Node: ZExt Intrinsic\7f512537
+Node: Other Compilers\7f512825
+Node: Dropping f2c Compatibility\7f515205
+Node: Compilers Other Than f2c\7f518031
+Node: Other Languages\7f519830
+Node: Interoperating with C and C++\7f520082
+Node: C Interfacing Tools\7f521115
+Node: C Access to Type Information\7f522043
+Node: f2c Skeletons and Prototypes\7f522730
+Node: C++ Considerations\7f524428
+Node: Startup Code\7f525083
+Node: Installation\7f525994
+Node: Prerequisites\7f527150
+Node: Problems Installing\7f535614
+Node: General Problems\7f536240
+Node: GNU C Required\7f537003
+Node: Patching GNU CC Necessary\7f537704
+Node: Building GNU CC Necessary\7f538554
+Node: Missing strtoul\7f538900
+Node: Object File Differences\7f540314
+Node: Cleanup Kills Stage Directories\7f541011
+Node: Missing gperf?\7f541431
+Node: Cross-compiler Problems\7f542819
+Node: Settings\7f545024
+Node: Larger File Unit Numbers\7f546102
+Node: Always Flush Output\7f547685
+Node: Maximum Stackable Size\7f549545
+Node: Floating-point Bit Patterns\7f550401
+Node: Large Initialization\7f551142
+Node: Alpha Problems Fixed\7f552731
+Node: Quick Start\7f553618
+Node: Complete Installation\7f564031
+Node: Unpacking\7f564611
+Node: Merging Distributions\7f567700
+Node: Installing f77\7f573149
+Node: Installing f2c\7f574494
+Node: Patching GNU Fortran\7f577419
+Node: Where to Install\7f578937
+Node: Configuring gcc\7f582282
+Node: Building gcc\7f584054
+Node: Bootstrap Build\7f586061
+Node: Straight Build\7f587807
+Node: Pre-installation Checks\7f589196
+Node: Installation of Binaries\7f592622
+Node: Updating Documentation\7f593983
+Node: Missing bison?\7f594837
+Node: Missing makeinfo?\7f596183
+Node: Distributing Binaries\7f596708
+Node: Debugging and Interfacing\7f602653
+Node: Main Program Unit\7f605337
+Node: Procedures\7f607834
+Node: Functions\7f610495
+Node: Names\7f612113
+Node: Common Blocks\7f615254
+Node: Local Equivalence Areas\7f617287
+Node: Complex Variables\7f619974
+Node: Arrays\7f621304
+Node: Adjustable Arrays\7f624638
+Node: Alternate Entry Points\7f627497
+Node: Alternate Returns\7f634199
+Node: Assigned Statement Labels\7f635100
+Node: Run-time Library Errors\7f636945
+Node: Collected Fortran Wisdom\7f638897
+Node: Advantages Over f2c\7f640333
+Node: Language Extensions\7f641242
+Node: Compiler Options\7f641749
+Node: Compiler Speed\7f642201
+Node: Program Speed\7f642911
+Node: Ease of Debugging\7f644496
+Node: Character and Hollerith Constants\7f646926
+Node: Block Data and Libraries\7f647720
+Node: Loops\7f651044
+Node: Working Programs\7f656260
+Node: Not My Type\7f656940
+Node: Variables Assumed To Be Zero\7f658871
+Node: Variables Assumed To Be Saved\7f659925
+Node: Unwanted Variables\7f661295
+Node: Unused Arguments\7f662175
+Node: Surprising Interpretations of Code\7f662638
+Node: Aliasing Assumed To Work\7f663484
+Node: Output Assumed To Flush\7f669400
+Node: Large File Unit Numbers\7f670806
+Node: Overly Convenient Options\7f672088
+Node: Faster Programs\7f675698
+Node: Aligned Data\7f676144
+Node: Prefer Automatic Uninitialized Variables\7f679988
+Node: Avoid f2c Compatibility\7f681354
+Node: Use Submodel Options\7f681822
+Node: Trouble\7f682645
+Node: But-bugs\7f684261
+Node: Signal 11 and Friends\7f686035
+Node: Cannot Link Fortran Programs\7f688114
+Node: Large Common Blocks\7f689397
+Node: Debugger Problems\7f689823
+Node: NeXTStep Problems\7f690345
+Node: Stack Overflow\7f692167
+Node: Nothing Happens\7f694180
+Node: Strange Behavior at Run Time\7f695794
+Node: Floating-point Errors\7f698087
+Node: Actual Bugs\7f702664
+Node: Missing Features\7f713415
+Node: Better Source Model\7f715132
+Node: Fortran 90 Support\7f716901
+Node: Intrinsics in PARAMETER Statements\7f718002
+Node: SELECT CASE on CHARACTER Type\7f718888
+Node: RECURSIVE Keyword\7f719186
+Node: Increasing Precision/Range\7f719613
+Node: Popular Non-standard Types\7f721150
+Node: Full Support for Compiler Types\7f721567
+Node: Array Bounds Expressions\7f722239
+Node: POINTER Statements\7f722686
+Node: Sensible Non-standard Constructs\7f723569
+Node: FLUSH Statement\7f725894
+Node: Expressions in FORMAT Statements\7f726280
+Node: Explicit Assembler Code\7f727459
+Node: Q Edit Descriptor\7f727748
+Node: Old-style PARAMETER Statements\7f728252
+Node: TYPE and ACCEPT I/O Statements\7f728986
+Node: STRUCTURE UNION RECORD MAP\7f729552
+Node: OPEN CLOSE and INQUIRE Keywords\7f730038
+Node: ENCODE and DECODE\7f730470
+Node: Suppressing Space Padding\7f731571
+Node: Fortran Preprocessor\7f732797
+Node: Bit Operations on Floating-point Data\7f733370
+Node: POSIX Standard\7f733884
+Node: Floating-point Exception Handling\7f734128
+Node: Nonportable Conversions\7f735170
+Node: Large Automatic Arrays\7f735706
+Node: Support for Threads\7f736113
+Node: Gracefully Handle Sensible Bad Code\7f736538
+Node: Non-standard Conversions\7f737293
+Node: Non-standard Intrinsics\7f737636
+Node: Modifying DO Variable\7f738052
+Node: Better Pedantic Compilation\7f738728
+Node: Warn About Implicit Conversions\7f739356
+Node: Invalid Use of Hollerith Constant\7f739943
+Node: Dummy Array Without Dimensioning Dummy\7f740486
+Node: Invalid FORMAT Specifiers\7f741399
+Node: Ambiguous Dialects\7f741800
+Node: Unused Labels\7f742211
+Node: Informational Messages\7f742433
+Node: Uninitialized Variables at Run Time\7f742836
+Node: Bounds Checking at Run Time\7f743443
+Node: Labels Visible to Debugger\7f743891
+Node: Disappointments\7f744297
+Node: Mangling of Names\7f744935
+Node: Multiple Definitions of External Names\7f745785
+Node: Limitation on Implicit Declarations\7f747148
+Node: Non-bugs\7f747432
+Node: Backslash in Constants\7f748557
+Node: Initializing Before Specifying\7f753446
+Node: Context-Sensitive Intrinsicness\7f754588
+Node: Context-Sensitive Constants\7f756484
+Node: Equivalence Versus Equality\7f759441
+Node: Order of Side Effects\7f761951
+Node: Warnings and Errors\7f763679
+Node: Open Questions\7f765363
+Node: Bugs\7f766511
+Node: Bug Criteria\7f768016
+Node: Bug Lists\7f772439
+Node: Bug Reporting\7f773211
+Node: Sending Patches\7f786658
+Node: Service\7f792142
+Node: Adding Options\7f792610
+Node: Projects\7f796659
+Node: Efficiency\7f797504
+Node: Better Optimization\7f800401
+Node: Simplify Porting\7f803771
+Node: More Extensions\7f805526
+Node: Machine Model\7f808727
+Node: Internals Documentation\7f810013
+Node: Internals Improvements\7f810327
+Node: Better Diagnostics\7f813871
+Node: Diagnostics\7f814788
+Node: CMPAMBIG\7f816085
+Node: EXPIMP\7f822559
+Node: INTGLOB\7f823795
+Node: LEX\7f826039
+Node: GLOBALS\7f831431
+Node: Index\7f833284
+\1f
+End Tag Table
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Top, Next: Copying, Up: (DIR)
+
+Introduction
+************
+
+ This manual documents how to run, install and port the GNU Fortran
+compiler, as well as its new features and incompatibilities, and how to
+report bugs. It corresponds to GNU Fortran version 0.5.21.
+
+* Menu:
+
+* Copying:: GNU General Public License says
+ how you can copy and share GNU Fortran.
+* Contributors:: People who have contributed to GNU Fortran.
+* Funding:: How to help assure continued work for free software.
+* Funding GNU Fortran:: How to help assure continued work on GNU Fortran.
+* Look and Feel:: Protect your freedom--fight "look and feel".
+
+* Getting Started:: Finding your way around this manual.
+* What is GNU Fortran?:: How `g77' fits into the universe.
+* G77 and GCC:: You can compile Fortran, C, or other programs.
+* Invoking G77:: Command options supported by `g77'.
+* News:: News about recent releases of `g77'.
+* Changes:: User-visible changes to recent releases of `g77'.
+* Language:: The GNU Fortran language.
+* Compiler:: The GNU Fortran compiler.
+* Other Dialects:: Dialects of Fortran supported by `g77'.
+* Other Compilers:: Fortran compilers other than `g77'.
+* Other Languages:: Languages other than Fortran.
+* Installation:: How to configure, compile and install GNU Fortran.
+* Debugging and Interfacing:: How `g77' generates code.
+* Collected Fortran Wisdom:: How to avoid Trouble.
+* Trouble:: If you have trouble with GNU Fortran.
+* Open Questions:: Things we'd like to know.
+* Bugs:: How, why, and where to report bugs.
+* Service:: How to find suppliers of support for GNU Fortran.
+
+* Adding Options:: Guidance on teaching `g77' about new options.
+* Projects:: Projects for `g77' internals hackers.
+
+* M: Diagnostics. Diagnostics produced by `g77'.
+
+* Index:: Index of concepts and symbol names.
+
+\1f
+File: g77.info, Node: Copying, Next: Contributors, Prev: Top, Up: Top
+
+GNU GENERAL PUBLIC LICENSE
+**************************
+
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+========
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it in
+new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software,
+and (2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains a
+ notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The "Program",
+ below, refers to any such program or work, and a "work based on
+ the Program" means either the Program or any derivative work under
+ copyright law: that is to say, a work containing the Program or a
+ portion of it, either verbatim or with modifications and/or
+ translated into another language. (Hereinafter, translation is
+ included without limitation in the term "modification".) Each
+ licensee is addressed as "you".
+
+ Activities other than copying, distribution and modification are
+ not covered by this License; they are outside its scope. The act
+ of running the Program is not restricted, and the output from the
+ Program is covered only if its contents constitute a work based on
+ the Program (independent of having been made by running the
+ Program). Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any
+ warranty; and give any other recipients of the Program a copy of
+ this License along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy,
+ and you may at your option offer warranty protection in exchange
+ for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a. You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b. You must cause any work that you distribute or publish, that
+ in whole or in part contains or is derived from the Program
+ or any part thereof, to be licensed as a whole at no charge
+ to all third parties under the terms of this License.
+
+ c. If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display
+ an announcement including an appropriate copyright notice and
+ a notice that there is no warranty (or else, saying that you
+ provide a warranty) and that users may redistribute the
+ program under these conditions, and telling the user how to
+ view a copy of this License. (Exception: if the Program
+ itself is interactive but does not normally print such an
+ announcement, your work based on the Program is not required
+ to print an announcement.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the
+ Program, and can be reasonably considered independent and separate
+ works in themselves, then this License, and its terms, do not
+ apply to those sections when you distribute them as separate
+ works. But when you distribute the same sections as part of a
+ whole which is a work based on the Program, the distribution of
+ the whole must be on the terms of this License, whose permissions
+ for other licensees extend to the entire whole, and thus to each
+ and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the
+ Program with the Program (or with a work based on the Program) on
+ a volume of a storage or distribution medium does not bring the
+ other work under the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms
+ of Sections 1 and 2 above provided that you also do one of the
+ following:
+
+ a. Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Sections 1 and 2 above on a medium customarily used for
+ software interchange; or,
+
+ b. Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange; or,
+
+ c. Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with
+ such an offer, in accord with Subsection b above.)
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete
+ source code means all the source code for all modules it contains,
+ plus any associated interface definition files, plus the scripts
+ used to control compilation and installation of the executable.
+ However, as a special exception, the source code distributed need
+ not include anything that is normally distributed (in either
+ source or binary form) with the major components (compiler,
+ kernel, and so on) of the operating system on which the executable
+ runs, unless that component itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify
+ or distribute the Program or its derivative works. These actions
+ are prohibited by law if you do not accept this License.
+ Therefore, by modifying or distributing the Program (or any work
+ based on the Program), you indicate your acceptance of this
+ License to do so, and all its terms and conditions for copying,
+ distributing or modifying the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program
+ subject to these terms and conditions. You may not impose any
+ further restrictions on the recipients' exercise of the rights
+ granted herein. You are not responsible for enforcing compliance
+ by third parties to this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent
+ issues), conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot distribute so as to satisfy simultaneously
+ your obligations under this License and any other pertinent
+ obligations, then as a consequence you may not distribute the
+ Program at all. For example, if a patent license would not permit
+ royalty-free redistribution of the Program by all those who
+ receive copies directly or indirectly through you, then the only
+ way you could satisfy both it and this License would be to refrain
+ entirely from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable
+ under any particular circumstance, the balance of the section is
+ intended to apply and the section as a whole is intended to apply
+ in other circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of
+ any such claims; this section has the sole purpose of protecting
+ the integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed
+ to be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces,
+ the original copyright holder who places the Program under this
+ License may add an explicit geographical distribution limitation
+ excluding those countries, so that distribution is permitted only
+ in or among countries not thus excluded. In such case, this
+ License incorporates the limitation as if written in the body of
+ this License.
+
+ 9. The Free Software Foundation may publish revised and/or new
+ versions of the General Public License from time to time. Such
+ new versions will be similar in spirit to the present version, but
+ may differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Program specifies a version number of this License which applies
+ to it and "any later version", you have the option of following
+ the terms and conditions either of that version or of any later
+ version published by the Free Software Foundation. If the Program
+ does not specify a version number of this License, you may choose
+ any version ever published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the
+ author to ask for permission. For software which is copyrighted
+ by the Free Software Foundation, write to the Free Software
+ Foundation; we sometimes make exceptions for this. Our decision
+ will be guided by the two goals of preserving the free status of
+ all derivatives of our free software and of promoting the sharing
+ and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+ NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
+ QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+ SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+ MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+ OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
+ OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+=============================================
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
+ Copyright (C) 19YY NAME OF AUTHOR
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ If the program is interactive, make it output a short notice like
+this when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+ type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+ The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+ You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ SIGNATURE OF TY COON, 1 April 1989
+ Ty Coon, President of Vice
+
+ This General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Library General Public License instead of this License.
+
+\1f
+File: g77.info, Node: Contributors, Next: Funding, Prev: Copying, Up: Top
+
+Contributors to GNU Fortran
+***************************
+
+ In addition to James Craig Burley, who wrote the front end, many
+people have helped create and improve GNU Fortran.
+
+ * The packaging and compiler portions of GNU Fortran are based
+ largely on the GNU CC compiler. *Note Contributors to GNU CC:
+ (gcc)Contributors, for more information.
+
+ * The run-time library used by GNU Fortran is a repackaged version
+ of the `libf2c' library (combined from the `libF77' and `libI77'
+ libraries) provided as part of `f2c', available for free from
+ `netlib' sites on the Internet.
+
+ * Cygnus Support and The Free Software Foundation contributed
+ significant money and/or equipment to Craig's efforts.
+
+ * The following individuals served as alpha testers prior to `g77''s
+ public release. This work consisted of testing, researching,
+ sometimes debugging, and occasionally providing small amounts of
+ code and fixes for `g77', plus offering plenty of helpful advice
+ to Craig:
+
+ Jonathan Corbet
+
+ Dr. Mark Fernyhough
+
+ Takafumi Hayashi (The University of
+ AIzu)--<takafumi@u-aizu.ac.jp>
+
+ Kate Hedstrom
+
+ Michel Kern (INRIA and Rice
+ University)--<Michel.Kern@inria.fr>
+
+ Dr. A. O. V. Le Blanc
+
+ Dave Love
+
+ Rick Lutowski
+
+ Toon Moene
+
+ Rick Niles
+
+ Derk Reefman
+
+ Wayne K. Schroll
+
+ Bill Thorson
+
+ Pedro A. M. Vazquez
+
+ Ian Watson
+
+ * Scott Snyder (<snyder@d0sgif.fnal.gov>) provided the patch to add
+ rudimentary support for `INTEGER*1', `INTEGER*2', and `LOGICAL*1'.
+ This inspired Craig to add further support, even though the
+ resulting support would still be incomplete, because version 0.6
+ is still a ways off.
+
+ * David Ronis (<ronis@onsager.chem.mcgill.ca>) inspired and
+ encouraged Craig to rewrite the documentation in texinfo format by
+ contributing a first pass at a translation of the old
+ `g77-0.5.16/f/DOC' file.
+
+ * Toon Moene (<toon@moene.indiv.nluug.nl>) performed some analysis
+ of generated code as part of an overall project to improve `g77'
+ code generation to at least be as good as `f2c' used in
+ conjunction with `gcc'. So far, this has resulted in the three,
+ somewhat experimental, options added by `g77' to the `gcc'
+ compiler and its back end.
+
+ * John Carr (<jfc@mit.edu>) wrote the alias analysis improvements.
+
+ * Thanks to Mary Cortani and the staff at Craftwork Solutions
+ (<support@craftwork.com>) for all of their support.
+
+ * Many other individuals have helped debug, test, and improve `g77'
+ over the past several years, and undoubtedly more people will be
+ doing so in the future. If you have done so, and would like to
+ see your name listed in the above list, please ask! The default
+ is that people wish to remain anonymous.
+
+\1f
+File: g77.info, Node: Funding, Next: Funding GNU Fortran, Prev: Contributors, Up: Top
+
+Funding Free Software
+*********************
+
+ If you want to have more free software a few years from now, it makes
+sense for you to help encourage people to contribute funds for its
+development. The most effective approach known is to encourage
+commercial redistributors to donate.
+
+ Users of free software systems can boost the pace of development by
+encouraging for-a-fee distributors to donate part of their selling price
+to free software developers--the Free Software Foundation, and others.
+
+ The way to convince distributors to do this is to demand it and
+expect it from them. So when you compare distributors, judge them
+partly by how much they give to free software development. Show
+distributors they must compete to be the one who gives the most.
+
+ To make this approach work, you must insist on numbers that you can
+compare, such as, "We will donate ten dollars to the Frobnitz project
+for each disk sold." Don't be satisfied with a vague promise, such as
+"A portion of the profits are donated," since it doesn't give a basis
+for comparison.
+
+ Even a precise fraction "of the profits from this disk" is not very
+meaningful, since creative accounting and unrelated business decisions
+can greatly alter what fraction of the sales price counts as profit.
+If the price you pay is $50, ten percent of the profit is probably less
+than a dollar; it might be a few cents, or nothing at all.
+
+ Some redistributors do development work themselves. This is useful
+too; but to keep everyone honest, you need to inquire how much they do,
+and what kind. Some kinds of development make much more long-term
+difference than others. For example, maintaining a separate version of
+a program contributes very little; maintaining the standard version of a
+program for the whole community contributes much. Easy new ports
+contribute little, since someone else would surely do them; difficult
+ports such as adding a new CPU to the GNU C compiler contribute more;
+major new features or packages contribute the most.
+
+ By establishing the idea that supporting further development is "the
+proper thing to do" when distributing free software for a fee, we can
+assure a steady flow of resources into making more free software.
+
+ Copyright (C) 1994 Free Software Foundation, Inc.
+ Verbatim copying and redistribution of this section is permitted
+ without royalty; alteration is not permitted.
+
+\1f
+File: g77.info, Node: Funding GNU Fortran, Next: Look and Feel, Prev: Funding, Up: Top
+
+Funding GNU Fortran
+*******************
+
+ Work on GNU Fortran is still being done mostly by its author, James
+Craig Burley (<burley@gnu.ai.mit.edu>), who is a volunteer for, not an
+employee of, the Free Software Foundation (FSF). As with other GNU
+software, funding is important because it can pay for needed equipment,
+personnel, and so on.
+
+ The FSF provides information on the best way to fund ongoing
+development of GNU software (such as GNU Fortran) in documents such as
+the "GNUS Bulletin". Email <gnu@prep.ai.mit.edu> for information on
+funding the FSF.
+
+ To fund specific GNU Fortran work in particular, the FSF might
+provide a means for that, but the FSF does not provide direct funding
+to the author of GNU Fortran to continue his work. The FSF has
+employee salary restrictions that can be incompatible with the
+financial needs of some volunteers, who therefore choose to remain
+volunteers and thus be able to be free to do contract work and
+otherwise make their own schedules for doing GNU work.
+
+ Still, funding the FSF at least indirectly benefits work on specific
+projects like GNU Fortran because it ensures the continuing operation
+of the FSF offices, their workstations, their network connections, and
+so on, which are invaluable to volunteers. (Similarly, hiring Cygnus
+Support can help a project like GNU Fortran--Cygnus has been a
+long-time donor of equipment usage to the author of GNU Fortran, and
+this too has been invaluable--*Note Contributors::.)
+
+ Currently, the only way to directly fund the author of GNU Fortran
+in his work on that project is to hire him for the work you want him to
+do, or donate money to him. Several people have done this already,
+with the result that he has not needed to immediately find contract
+work on a few occasions. If more people did this, he would be able to
+plan on not doing contract work for many months and could thus devote
+that time to work on projects (such as the planned changes for 0.6)
+that require longer timeframes to complete. For the latest information
+on the status of the author, do `finger -l burley@gate.gnu.ai.mit.edu'
+on a UNIX system (or any system with a command like UNIX `finger').
+
+ Another important way to support work on GNU Fortran is to volunteer
+to help out. Work is needed on documentation, testing, porting to
+various machines, and in some cases, coding (although major changes
+planned for version 0.6 make it difficult to add manpower to this area).
+Email <fortran@gnu.ai.mit.edu> to volunteer for this work.
+
+ *Note Funding Free Software: Funding, for more information.
+
+\1f
+File: g77.info, Node: Look and Feel, Next: Getting Started, Prev: Funding GNU Fortran, Up: Top
+
+Protect Your Freedom--Fight "Look And Feel"
+*******************************************
+
+ To preserve the ability to write free software, including
+replacements for proprietary software, authors must be free to
+replicate the user interface to which users of existing software have
+become accustomed.
+
+ *Note Protect Your Freedom--Fight "Look And Feel": (gcc)Look and
+Feel, for more information.
+
+\1f
+File: g77.info, Node: Getting Started, Next: What is GNU Fortran?, Prev: Look and Feel, Up: Top
+
+Getting Started
+***************
+
+ If you don't need help getting started reading the portions of this
+manual that are most important to you, you should skip this portion of
+the manual.
+
+ If you are new to compilers, especially Fortran compilers, or new to
+how compilers are structured under UNIX and UNIX-like systems, you'll
+want to see *Note What is GNU Fortran?::.
+
+ If you are new to GNU compilers, or have used only one GNU compiler
+in the past and not had to delve into how it lets you manage various
+versions and configurations of `gcc', you should see *Note G77 and
+GCC::.
+
+ Everyone except experienced `g77' users should see *Note Invoking
+G77::.
+
+ If you're acquainted with previous versions of `g77', you should see
+*Note News::. Further, if you've actually used previous versions of
+`g77', especially if you've written or modified Fortran code to be
+compiled by previous versions of `g77', you should see *Note Changes::.
+
+ If you intend to write or otherwise compile code that is not already
+strictly conforming ANSI FORTRAN 77--and this is probably everyone--you
+should see *Note Language::.
+
+ If you don't already have `g77' installed on your system, you must
+see *Note Installation::.
+
+ If you run into trouble getting Fortran code to compile, link, run,
+or work properly, you might find answers if you see *Note Debugging and
+Interfacing::, see *Note Collected Fortran Wisdom::, and see *Note
+Trouble::. You might also find that the problems you are encountering
+are bugs in `g77'--see *Note Bugs::, for information on reporting them,
+after reading the other material.
+
+ If you need further help with `g77', or with freely redistributable
+software in general, see *Note Service::.
+
+ If you would like to help the `g77' project, see *Note Funding GNU
+Fortran::, for information on helping financially, and see *Note
+Projects::, for information on helping in other ways.
+
+ If you're generally curious about the future of `g77', see *Note
+Projects::. If you're curious about its past, see *Note Contributors::,
+and see *Note Funding GNU Fortran::.
+
+ To see a few of the questions maintainers of `g77' have, and that
+you might be able to answer, see *Note Open Questions::.
+
+\1f
+File: g77.info, Node: What is GNU Fortran?, Next: G77 and GCC, Prev: Getting Started, Up: Top
+
+What is GNU Fortran?
+********************
+
+ GNU Fortran, or `g77', is designed initially as a free replacement
+for, or alternative to, the UNIX `f77' command. (Similarly, `gcc' is
+designed as a replacement for the UNIX `cc' command.)
+
+ `g77' also is designed to fit in well with the other fine GNU
+compilers and tools.
+
+ Sometimes these design goals conflict--in such cases, resolution
+often is made in favor of fitting in well with Project GNU. These
+cases are usually identified in the appropriate sections of this manual.
+
+ As compilers, `g77', `gcc', and `f77' share the following
+characteristics:
+
+ * They read a user's program, stored in a file and containing
+ instructions written in the appropriate language (Fortran, C, and
+ so on). This file contains "source code".
+
+ * They translate the user's program into instructions a computer can
+ carry out more quickly than it takes to translate the instructions
+ in the first place. These instructions are called "machine
+ code"--code designed to be efficiently translated and processed by
+ a machine such as a computer. Humans usually aren't as good
+ writing machine code as they are at writing Fortran or C, because
+ it is easy to make tiny mistakes writing machine code. When
+ writing Fortran or C, it is easy to make big mistakes.
+
+ * They provide information in the generated machine code that can
+ make it easier to find bugs in the program (using a debugging
+ tool, called a "debugger", such as `gdb').
+
+ * They locate and gather machine code already generated to perform
+ actions requested by statements in the user's program. This
+ machine code is organized into "libraries" and is located and
+ gathered during the "link" phase of the compilation process.
+ (Linking often is thought of as a separate step, because it can be
+ directly invoked via the `ld' command. However, the `g77' and
+ `gcc' commands, as with most compiler commands, automatically
+ perform the linking step by calling on `ld' directly, unless asked
+ to not do so by the user.)
+
+ * They attempt to diagnose cases where the user's program contains
+ incorrect usages of the language. The "diagnostics" produced by
+ the compiler indicate the problem and the location in the user's
+ source file where the problem was first noticed. The user can use
+ this information to locate and fix the problem. (Sometimes an
+ incorrect usage of the language leads to a situation where the
+ compiler can no longer make any sense of what follows--while a
+ human might be able to--and thus ends up complaining about many
+ "problems" it encounters that, in fact, stem from just one
+ problem, usually the first one reported.)
+
+ * They attempt to diagnose cases where the user's program contains a
+ correct usage of the language, but instructs the computer to do
+ something questionable. These diagnostics often are in the form
+ of "warnings", instead of the "errors" that indicate incorrect
+ usage of the language.
+
+ How these actions are performed is generally under the control of
+the user. Using command-line options, the user can specify how
+persnickety the compiler is to be regarding the program (whether to
+diagnose questionable usage of the language), how much time to spend
+making the generated machine code run faster, and so on.
+
+ `g77' consists of several components:
+
+ * A modified version of the `gcc' command, which also might be
+ installed as the system's `cc' command. (In many cases, `cc'
+ refers to the system's "native" C compiler, which might be a
+ non-GNU compiler, or an older version of `gcc' considered more
+ stable or that is used to build the operating system kernel.)
+
+ * The `g77' command itself, which also might be installed as the
+ system's `f77' command.
+
+ * The `libf2c' run-time library. This library contains the machine
+ code needed to support capabilities of the Fortran language that
+ are not directly provided by the machine code generated by the
+ `g77' compilation phase.
+
+ * The compiler itself, internally named `f771'.
+
+ Note that `f771' does not generate machine code directly--it
+ generates "assembly code" that is a more readable form of machine
+ code, leaving the conversion to actual machine code to an
+ "assembler", usually named `as'.
+
+ `gcc' is often thought of as "the C compiler" only, but it does more
+than that. Based on command-line options and the names given for files
+on the command line, `gcc' determines which actions to perform,
+including preprocessing, compiling (in a variety of possible
+languages), assembling, and linking.
+
+ For example, the command `gcc foo.c' "drives" the file `foo.c'
+through the preprocessor `cpp', then the C compiler (internally named
+`cc1'), then the assembler (usually `as'), then the linker (`ld'),
+producing an executable program named `a.out' (on UNIX systems).
+
+ As another example, the command `gcc foo.cc' would do much the same
+as `gcc foo.c', but instead of using the C compiler named `cc1', `gcc'
+would use the C++ compiler (named `cc1plus').
+
+ In a GNU Fortran installation, `gcc' recognizes Fortran source files
+by name just like it does C and C++ source files. It knows to use the
+Fortran compiler named `f771', instead of `cc1' or `cc1plus', to
+compile Fortran files.
+
+ Non-Fortran-related operation of `gcc' is generally unaffected by
+installing the GNU Fortran version of `gcc'. However, without the
+installed version of `gcc' being the GNU Fortran version, `gcc' will
+not be able to compile and link Fortran programs--and since `g77' uses
+`gcc' to do most of the actual work, neither will `g77'!
+
+ The `g77' command is essentially just a front-end for the `gcc'
+command. Fortran users will normally use `g77' instead of `gcc',
+because `g77' knows how to specify the libraries needed to link with
+Fortran programs (`libf2c' and `lm'). `g77' can still compile and link
+programs and source files written in other languages, just like `gcc'.
+
+ The command `g77 -v' is a quick way to display lots of version
+information for the various programs used to compile a typical
+preprocessed Fortran source file--this produces much more output than
+`gcc -v' currently does. (If it produces an error message near the end
+of the output--diagnostics from the linker, usually `ld'--you might
+have an out-of-date `libf2c' that improperly handles complex
+arithmetic.) In the output of this command, the line beginning `GNU
+Fortran Front End' identifies the version number of GNU Fortran;
+immediately preceding that line is a line identifying the version of
+`gcc' with which that version of `g77' was built.
+
+ The `libf2c' library is distributed with GNU Fortran for the
+convenience of its users, but is not part of GNU Fortran. It contains
+the procedures needed by Fortran programs while they are running.
+
+ For example, while code generated by `g77' is likely to do
+additions, subtractions, and multiplications "in line"--in the actual
+compiled code--it is not likely to do trigonometric functions this way.
+
+ Instead, operations like trigonometric functions are compiled by the
+`f771' compiler (invoked by `g77' when compiling Fortran code) into
+machine code that, when run, calls on functions in `libf2c', so
+`libf2c' must be linked with almost every useful program having any
+component compiled by GNU Fortran. (As mentioned above, the `g77'
+command takes care of all this for you.)
+
+ The `f771' program represents most of what is unique to GNU Fortran.
+While much of the `libf2c' component is really part of `f2c', a free
+Fortran-to-C converter distributed by Bellcore (AT&T), plus `libU77',
+provided by Dave Love, and the `g77' command is just a small front-end
+to `gcc', `f771' is a combination of two rather large chunks of code.
+
+ One chunk is the so-called "GNU Back End", or GBE, which knows how
+to generate fast code for a wide variety of processors. The same GBE
+is used by the C, C++, and Fortran compiler programs `cc1', `cc1plus',
+and `f771', plus others. Often the GBE is referred to as the "gcc back
+end" or even just "gcc"--in this manual, the term GBE is used whenever
+the distinction is important.
+
+ The other chunk of `f771' is the majority of what is unique about
+GNU Fortran--the code that knows how to interpret Fortran programs to
+determine what they are intending to do, and then communicate that
+knowledge to the GBE for actual compilation of those programs. This
+chunk is called the "Fortran Front End" (FFE). The `cc1' and `cc1plus'
+programs have their own front ends, for the C and C++ languages,
+respectively. These fronts ends are responsible for diagnosing
+incorrect usage of their respective languages by the programs the
+process, and are responsible for most of the warnings about
+questionable constructs as well. (The GBE handles producing some
+warnings, like those concerning possible references to undefined
+variables.)
+
+ Because so much is shared among the compilers for various languages,
+much of the behavior and many of the user-selectable options for these
+compilers are similar. For example, diagnostics (error messages and
+warnings) are similar in appearance; command-line options like `-Wall'
+have generally similar effects; and the quality of generated code (in
+terms of speed and size) is roughly similar (since that work is done by
+the shared GBE).
+
+\1f
+File: g77.info, Node: G77 and GCC, Next: Invoking G77, Prev: What is GNU Fortran?, Up: Top
+
+Compile Fortran, C, or Other Programs
+*************************************
+
+ A GNU Fortran installation includes a modified version of the `gcc'
+command.
+
+ In a non-Fortran installation, `gcc' recognizes C, C++, and
+Objective-C source files.
+
+ In a GNU Fortran installation, `gcc' also recognizes Fortran source
+files and accepts Fortran-specific command-line options, plus some
+command-line options that are designed to cater to Fortran users but
+apply to other languages as well.
+
+ *Note Compile C; C++; or Objective-C: (gcc)G++ and GCC, for
+information on the way different languages are handled by the GNU CC
+compiler (`gcc').
+
+ Also provided as part of GNU Fortran is the `g77' command. The
+`g77' command is designed to make compiling and linking Fortran
+programs somewhat easier than when using the `gcc' command for these
+tasks. It does this by analyzing the command line somewhat and
+changing it appropriately before submitting it to the `gcc' command.
+
+ Use the `-v' option with `g77' to see what is going on--the first
+line of output is the invocation of the `gcc' command. Use
+`--driver=true' to disable actual invocation of `gcc' (this works
+because `true' is the name of a UNIX command that simply returns
+success status).
+
+\1f
+File: g77.info, Node: Invoking G77, Next: News, Prev: G77 and GCC, Up: Top
+
+GNU Fortran Command Options
+***************************
+
+ The `g77' command supports all the options supported by the `gcc'
+command. *Note GNU CC Command Options: (gcc)Invoking GCC, for
+information on the non-Fortran-specific aspects of the `gcc' command
+(and, therefore, the `g77' command).
+
+ The `g77' command supports one option not supported by the `gcc'
+command:
+
+`--driver=COMMAND'
+ Specifies that COMMAND, rather than `gcc', is to be invoked by
+ `g77' to do its job. For example, within the `gcc' build
+ directory after building GNU Fortran (but without having to
+ install it), `./g77 --driver=./xgcc foo.f -B./'.
+
+ All other options are supported both by `g77' and by `gcc' as
+modified (and reinstalled) by the `g77' distribution. In some cases,
+options have positive and negative forms; the negative form of `-ffoo'
+would be `-fno-foo'. This manual documents only one of these two
+forms, whichever one is not the default.
+
+* Menu:
+
+* Option Summary:: Brief list of all `g77' options,
+ without explanations.
+* Overall Options:: Controlling the kind of output:
+ an executable, object files, assembler files,
+ or preprocessed source.
+* Shorthand Options:: Options that are shorthand for other options.
+* Fortran Dialect Options:: Controlling the variant of Fortran language
+ compiled.
+* Warning Options:: How picky should the compiler be?
+* Debugging Options:: Symbol tables, measurements, and debugging dumps.
+* Optimize Options:: How much optimization?
+* Preprocessor Options:: Controlling header files and macro definitions.
+ Also, getting dependency information for Make.
+* Directory Options:: Where to find header files and libraries.
+ Where to find the compiler executable files.
+* Code Gen Options:: Specifying conventions for function calls, data layout
+ and register usage.
+* Environment Variables:: Env vars that affect GNU Fortran.
+
+\1f
+File: g77.info, Node: Option Summary, Next: Overall Options, Up: Invoking G77
+
+Option Summary
+==============
+
+ Here is a summary of all the options specific to GNU Fortran, grouped
+by type. Explanations are in the following sections.
+
+*Overall Options*
+ *Note Options Controlling the Kind of Output: Overall Options.
+ --driver -fversion -fset-g77-defaults -fno-silent
+
+*Shorthand Options*
+ *Note Shorthand Options::.
+ -ff66 -fno-f66 -ff77 -fno-f77 -fugly -fno-ugly
+
+*Fortran Language Options*
+ *Note Options Controlling Fortran Dialect: Fortran Dialect Options.
+ -ffree-form -fno-fixed-form -ff90
+ -fvxt -fdollar-ok -fno-backslash
+ -fno-ugly-args -fno-ugly-assign -fno-ugly-assumed
+ -fugly-comma -fugly-complex -fugly-init -fugly-logint
+ -fonetrip -ftypeless-boz
+ -fintrin-case-initcap -fintrin-case-upper
+ -fintrin-case-lower -fintrin-case-any
+ -fmatch-case-initcap -fmatch-case-upper
+ -fmatch-case-lower -fmatch-case-any
+ -fsource-case-upper -fsource-case-lower -fsource-case-preserve
+ -fsymbol-case-initcap -fsymbol-case-upper
+ -fsymbol-case-lower -fsymbol-case-any
+ -fcase-strict-upper -fcase-strict-lower
+ -fcase-initcap -fcase-upper -fcase-lower -fcase-preserve
+ -ff2c-intrinsics-delete -ff2c-intrinsics-hide
+ -ff2c-intrinsics-disable -ff2c-intrinsics-enable
+ -ff90-intrinsics-delete -ff90-intrinsics-hide
+ -ff90-intrinsics-disable -ff90-intrinsics-enable
+ -fgnu-intrinsics-delete -fgnu-intrinsics-hide
+ -fgnu-intrinsics-disable -fgnu-intrinsics-enable
+ -fmil-intrinsics-delete -fmil-intrinsics-hide
+ -fmil-intrinsics-disable -fmil-intrinsics-enable
+ -funix-intrinsics-delete -funix-intrinsics-hide
+ -funix-intrinsics-disable -funix-intrinsics-enable
+ -fvxt-intrinsics-delete -fvxt-intrinsics-hide
+ -fvxt-intrinsics-disable -fvxt-intrinsics-enable
+ -ffixed-line-length-N -ffixed-line-length-none
+
+*Warning Options*
+ *Note Options to Request or Suppress Warnings: Warning Options.
+ -fsyntax-only -pedantic -pedantic-errors -fpedantic
+ -w -Wno-globals -Wimplicit -Wunused -Wuninitialized
+ -Wall -Wsurprising
+ -Werror -W
+
+*Debugging Options*
+ *Note Options for Debugging Your Program or GCC: Debugging Options.
+ -g
+
+*Optimization Options*
+ *Note Options that Control Optimization: Optimize Options.
+ -malign-double
+ -ffloat-store -fforce-mem -fforce-addr -fno-inline
+ -ffast-math -fstrength-reduce -frerun-cse-after-loop
+ -fexpensive-optimizations -fdelayed-branch
+ -fschedule-insns -fschedule-insn2 -fcaller-saves
+ -funroll-loops -funroll-all-loops
+ -fno-move-all-movables -fno-reduce-all-givs
+ -fno-rerun-loop-opt
+
+*Directory Options*
+ *Note Options for Directory Search: Directory Options.
+ -IDIR -I-
+
+*Code Generation Options*
+ *Note Options for Code Generation Conventions: Code Gen Options.
+ -fno-automatic -finit-local-zero -fno-f2c
+ -ff2c-library -fno-underscoring -fno-ident
+ -fpcc-struct-return -freg-struct-return
+ -fshort-double -fno-common -fpack-struct
+ -fzeros -fno-second-underscore
+ -fdebug-kludge -fno-emulate-complex
+ -falias-check -fargument-alias
+ -fargument-noalias -fno-argument-noalias-global
+ -fno-globals
+
+* Menu:
+
+* Overall Options:: Controlling the kind of output:
+ an executable, object files, assembler files,
+ or preprocessed source.
+* Shorthand Options:: Options that are shorthand for other options.
+* Fortran Dialect Options:: Controlling the variant of Fortran language
+ compiled.
+* Warning Options:: How picky should the compiler be?
+* Debugging Options:: Symbol tables, measurements, and debugging dumps.
+* Optimize Options:: How much optimization?
+* Preprocessor Options:: Controlling header files and macro definitions.
+ Also, getting dependency information for Make.
+* Directory Options:: Where to find header files and libraries.
+ Where to find the compiler executable files.
+* Code Gen Options:: Specifying conventions for function calls, data layout
+ and register usage.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: SymLnk Intrinsic (subroutine), Next: System Intrinsic (subroutine), Prev: Sum Intrinsic, Up: Table of Intrinsic Functions
+
+SymLnk Intrinsic (subroutine)
+.............................
+
+ CALL SymLnk(PATH1, PATH2, STATUS)
+
+PATH1: `CHARACTER'; scalar; INTENT(IN).
+
+PATH2: `CHARACTER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Makes a symbolic link from file PATH1 to PATH2. A null character
+(`CHAR(0)') marks the end of the names in PATH1 and PATH2--otherwise,
+trailing blanks in PATH1 and PATH2 are ignored. If the STATUS argument
+is supplied, it contains 0 on success or a non-zero error code upon
+return (`ENOSYS' if the system does not provide `symlink(2)').
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note SymLnk
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: System Intrinsic (subroutine), Next: System_Clock Intrinsic, Prev: SymLnk Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+System Intrinsic (subroutine)
+.............................
+
+ CALL System(COMMAND, STATUS)
+
+COMMAND: `CHARACTER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Passes the command COMMAND to a shell (see `system(3)'). If
+argument STATUS is present, it contains the value returned by
+`system(3)', presumably 0 if the shell command succeeded. Note that
+which shell is used to invoke the command is system-dependent and
+environment-dependent.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note System
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: System_Clock Intrinsic, Next: Tan Intrinsic, Prev: System Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+System_Clock Intrinsic
+......................
+
+ CALL System_Clock(COUNT, RATE, MAX)
+
+COUNT: `INTEGER(KIND=1)'; scalar; INTENT(OUT).
+
+RATE: `INTEGER(KIND=1)'; scalar; INTENT(OUT).
+
+MAX: `INTEGER(KIND=1)'; scalar; INTENT(OUT).
+
+Intrinsic groups: `f90'.
+
+Description:
+
+ Returns in COUNT the current value of the system clock; this is the
+value returned by the UNIX function `times(2)' in this implementation,
+but isn't in general. RATE is the number of clock ticks per second and
+MAX is the maximum value this can take, which isn't very useful in this
+implementation since it's just the maximum C `unsigned int' value.
+
+\1f
+File: g77.info, Node: Tan Intrinsic, Next: TanH Intrinsic, Prev: System_Clock Intrinsic, Up: Table of Intrinsic Functions
+
+Tan Intrinsic
+.............
+
+ Tan(X)
+
+Tan: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the tangent of X, an angle measured in radians.
+
+ *Note ATan Intrinsic::, for the inverse of this function.
+
+\1f
+File: g77.info, Node: TanH Intrinsic, Next: Time Intrinsic (UNIX), Prev: Tan Intrinsic, Up: Table of Intrinsic Functions
+
+TanH Intrinsic
+..............
+
+ TanH(X)
+
+TanH: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the hyperbolic tangent of X.
+
+\1f
+File: g77.info, Node: Time Intrinsic (UNIX), Next: Time8 Intrinsic, Prev: TanH Intrinsic, Up: Table of Intrinsic Functions
+
+Time Intrinsic (UNIX)
+.....................
+
+ Time()
+
+Time: `INTEGER(KIND=1)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the current time encoded as an integer (in the manner of the
+UNIX function `time(3)'). This value is suitable for passing to
+`CTIME', `GMTIME', and `LTIME'.
+
+ This intrinsic is not fully portable, such as to systems with 32-bit
+`INTEGER' types but supporting times wider than 32 bits. *Note Time8
+Intrinsic::, for information on a similar intrinsic that might be
+portable to more GNU Fortran implementations, though to fewer Fortran
+compilers.
+
+ For information on other intrinsics with the same name: *Note Time
+Intrinsic (VXT)::.
+
+\1f
+File: g77.info, Node: Time8 Intrinsic, Next: Tiny Intrinsic, Prev: Time Intrinsic (UNIX), Up: Table of Intrinsic Functions
+
+Time8 Intrinsic
+...............
+
+ Time8()
+
+Time8: `INTEGER(KIND=2)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the current time encoded as a long integer (in the manner of
+the UNIX function `time(3)'). This value is suitable for passing to
+`CTIME', `GMTIME', and `LTIME'.
+
+ No Fortran implementations other than GNU Fortran are known to
+support this intrinsic at the time of this writing. *Note Time
+Intrinsic (UNIX)::, for information on a similar intrinsic that might
+be portable to more Fortran compilers, though to fewer GNU Fortran
+implementations.
+
+\1f
+File: g77.info, Node: Tiny Intrinsic, Next: Transfer Intrinsic, Prev: Time8 Intrinsic, Up: Table of Intrinsic Functions
+
+Tiny Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Tiny' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Transfer Intrinsic, Next: Transpose Intrinsic, Prev: Tiny Intrinsic, Up: Table of Intrinsic Functions
+
+Transfer Intrinsic
+..................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Transfer' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: Transpose Intrinsic, Next: Trim Intrinsic, Prev: Transfer Intrinsic, Up: Table of Intrinsic Functions
+
+Transpose Intrinsic
+...................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Transpose' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: Trim Intrinsic, Next: TtyNam Intrinsic (subroutine), Prev: Transpose Intrinsic, Up: Table of Intrinsic Functions
+
+Trim Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Trim' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: TtyNam Intrinsic (subroutine), Next: TtyNam Intrinsic (function), Prev: Trim Intrinsic, Up: Table of Intrinsic Functions
+
+TtyNam Intrinsic (subroutine)
+.............................
+
+ CALL TtyNam(NAME, UNIT)
+
+NAME: `CHARACTER'; scalar; INTENT(OUT).
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Sets NAME to the name of the terminal device open on logical unit
+UNIT or a blank string if UNIT is not connected to a terminal.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine.
+
+ For information on other intrinsics with the same name: *Note TtyNam
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: TtyNam Intrinsic (function), Next: UBound Intrinsic, Prev: TtyNam Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+TtyNam Intrinsic (function)
+...........................
+
+ TtyNam(UNIT)
+
+TtyNam: `CHARACTER*(*)' function.
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the name of the terminal device open on logical unit UNIT or
+a blank string if UNIT is not connected to a terminal.
+
+ For information on other intrinsics with the same name: *Note TtyNam
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: UBound Intrinsic, Next: UMask Intrinsic (subroutine), Prev: TtyNam Intrinsic (function), Up: Table of Intrinsic Functions
+
+UBound Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL UBound' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: UMask Intrinsic (subroutine), Next: Unlink Intrinsic (subroutine), Prev: UBound Intrinsic, Up: Table of Intrinsic Functions
+
+UMask Intrinsic (subroutine)
+............................
+
+ CALL UMask(MASK, OLD)
+
+MASK: `INTEGER'; scalar; INTENT(IN).
+
+OLD: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Sets the file creation mask to MASK and returns the old value in
+argument OLD if it is supplied. See `umask(2)'.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine.
+
+ For information on other intrinsics with the same name: *Note UMask
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Unlink Intrinsic (subroutine), Next: Unpack Intrinsic, Prev: UMask Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Unlink Intrinsic (subroutine)
+.............................
+
+ CALL Unlink(FILE, STATUS)
+
+FILE: `CHARACTER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Unlink the file FILE. A null character (`CHAR(0)') marks the end of
+the name in FILE--otherwise, trailing blanks in FILE are ignored. If
+the STATUS argument is supplied, it contains 0 on success or a non-zero
+error code upon return. See `unlink(2)'.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note Unlink
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Unpack Intrinsic, Next: Verify Intrinsic, Prev: Unlink Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Unpack Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Unpack' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Verify Intrinsic, Next: XOr Intrinsic, Prev: Unpack Intrinsic, Up: Table of Intrinsic Functions
+
+Verify Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Verify' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: XOr Intrinsic, Next: ZAbs Intrinsic, Prev: Verify Intrinsic, Up: Table of Intrinsic Functions
+
+XOr Intrinsic
+.............
+
+ XOr(I, J)
+
+XOr: `INTEGER' or `LOGICAL' function, the exact type being the result
+of cross-promoting the types of all the arguments.
+
+I: `INTEGER' or `LOGICAL'; scalar; INTENT(IN).
+
+J: `INTEGER' or `LOGICAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Returns value resulting from boolean exclusive-OR of pair of bits in
+each of I and J.
+
+\1f
+File: g77.info, Node: ZAbs Intrinsic, Next: ZCos Intrinsic, Prev: XOr Intrinsic, Up: Table of Intrinsic Functions
+
+ZAbs Intrinsic
+..............
+
+ ZAbs(A)
+
+ZAbs: `REAL(KIND=2)' function.
+
+A: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Archaic form of `ABS()' that is specific to one type for A. *Note
+Abs Intrinsic::.
+
+\1f
+File: g77.info, Node: ZCos Intrinsic, Next: ZExp Intrinsic, Prev: ZAbs Intrinsic, Up: Table of Intrinsic Functions
+
+ZCos Intrinsic
+..............
+
+ ZCos(X)
+
+ZCos: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Archaic form of `COS()' that is specific to one type for X. *Note
+Cos Intrinsic::.
+
+\1f
+File: g77.info, Node: ZExp Intrinsic, Next: ZLog Intrinsic, Prev: ZCos Intrinsic, Up: Table of Intrinsic Functions
+
+ZExp Intrinsic
+..............
+
+ ZExp(X)
+
+ZExp: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Archaic form of `EXP()' that is specific to one type for X. *Note
+Exp Intrinsic::.
+
+\1f
+File: g77.info, Node: ZLog Intrinsic, Next: ZSin Intrinsic, Prev: ZExp Intrinsic, Up: Table of Intrinsic Functions
+
+ZLog Intrinsic
+..............
+
+ ZLog(X)
+
+ZLog: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Archaic form of `LOG()' that is specific to one type for X. *Note
+Log Intrinsic::.
+
+\1f
+File: g77.info, Node: ZSin Intrinsic, Next: ZSqRt Intrinsic, Prev: ZLog Intrinsic, Up: Table of Intrinsic Functions
+
+ZSin Intrinsic
+..............
+
+ ZSin(X)
+
+ZSin: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Archaic form of `SIN()' that is specific to one type for X. *Note
+Sin Intrinsic::.
+
+\1f
+File: g77.info, Node: ZSqRt Intrinsic, Prev: ZSin Intrinsic, Up: Table of Intrinsic Functions
+
+ZSqRt Intrinsic
+...............
+
+ ZSqRt(X)
+
+ZSqRt: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Archaic form of `SQRT()' that is specific to one type for X. *Note
+SqRt Intrinsic::.
+
+\1f
+File: g77.info, Node: Scope and Classes of Names, Prev: Functions and Subroutines, Up: Language
+
+Scope and Classes of Symbolic Names
+===================================
+
+ (The following information augments or overrides the information in
+Chapter 18 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 18 of that document otherwise serves as the basis
+for the relevant aspects of GNU Fortran.)
+
+* Menu:
+
+* Underscores in Symbol Names::
+
+\1f
+File: g77.info, Node: Underscores in Symbol Names, Up: Scope and Classes of Names
+
+Underscores in Symbol Names
+---------------------------
+
+ Underscores (`_') are accepted in symbol names after the first
+character (which must be a letter).
+
+\1f
+File: g77.info, Node: Other Dialects, Next: Other Compilers, Prev: Compiler, Up: Top
+
+Other Dialects
+**************
+
+ GNU Fortran supports a variety of features that are not considered
+part of the GNU Fortran language itself, but are representative of
+various dialects of Fortran that `g77' supports in whole or in part.
+
+ Any of the features listed below might be disallowed by `g77' unless
+some command-line option is specified. Currently, some of the features
+are accepted using the default invocation of `g77', but that might
+change in the future.
+
+ *Note: This portion of the documentation definitely needs a lot of
+work!*
+
+* Menu:
+
+* Source Form:: Details of fixed-form and free-form source.
+* Trailing Comment:: Use of `/*' to start a comment.
+* Debug Line:: Use of `D' in column 1.
+* Dollar Signs:: Use of `$' in symbolic names.
+* Case Sensitivity:: Uppercase and lowercase in source files.
+* VXT Fortran:: ...versus the GNU Fortran language.
+* Fortran 90:: ...versus the GNU Fortran language.
+* Pedantic Compilation:: Enforcing the standard.
+* Distensions:: Misfeatures supported by GNU Fortran.
+
+\1f
+File: g77.info, Node: Source Form, Next: Trailing Comment, Up: Other Dialects
+
+Source Form
+===========
+
+ GNU Fortran accepts programs written in either fixed form or free
+form.
+
+ Fixed form corresponds to ANSI FORTRAN 77 (plus popular extensions,
+such as allowing tabs) and Fortran 90's fixed form.
+
+ Free form corresponds to Fortran 90's free form (though possibly not
+entirely up-to-date, and without complaining about some things that for
+which Fortran 90 requires diagnostics, such as the spaces in the
+constant in `R = 3 . 1').
+
+ The way a Fortran compiler views source files depends entirely on the
+implementation choices made for the compiler, since those choices are
+explicitly left to the implementation by the published Fortran
+standards. GNU Fortran currently tries to be somewhat like a few
+popular compilers (`f2c', Digital ("DEC") Fortran, and so on), though a
+cleaner default definition along with more flexibility offered by
+command-line options is likely to be offered in version 0.6.
+
+ This section describes how `g77' interprets source lines.
+
+* Menu:
+
+* Carriage Returns:: Carriage returns ignored.
+* Tabs:: Tabs converted to spaces.
+* Short Lines:: Short lines padded with spaces (fixed-form only).
+* Long Lines:: Long lines truncated.
+* Ampersands:: Special Continuation Lines.
+
+\1f
+File: g77.info, Node: Carriage Returns, Next: Tabs, Up: Source Form
+
+Carriage Returns
+----------------
+
+ Carriage returns (`\r') in source lines are ignored. This is
+somewhat different from `f2c', which seems to treat them as spaces
+outside character/Hollerith constants, and encodes them as `\r' inside
+such constants.
+
+\1f
+File: g77.info, Node: Tabs, Next: Short Lines, Prev: Carriage Returns, Up: Source Form
+
+Tabs
+----
+
+ A source line with a <TAB> character anywhere in it is treated as
+entirely significant--however long it is--instead of ending in column
+72 (for fixed-form source) or 132 (for free-form source). This also is
+different from `f2c', which encodes tabs as `\t' (the ASCII <TAB>
+character) inside character and Hollerith constants, but nevertheless
+seems to treat the column position as if it had been affected by the
+canonical tab positioning.
+
+ `g77' effectively translates tabs to the appropriate number of
+spaces (a la the default for the UNIX `expand' command) before doing
+any other processing, other than (currently) noting whether a tab was
+found on a line and using this information to decide how to interpret
+the length of the line and continued constants.
+
+ Note that this default behavior probably will change for version 0.6,
+when it will presumably be available via a command-line option. The
+default as of version 0.6 is planned to be a "pure visual" model, where
+tabs are immediately converted to spaces and otherwise have no effect,
+so the way a typical user sees source lines produces a consistent
+result no matter how the spacing in those source lines is actually
+implemented via tabs, spaces, and trailing tabs/spaces before newline.
+Command-line options are likely to be added to specify whether all or
+just-tabbed lines are to be extended to 132 or full input-line length,
+and perhaps even an option will be added to specify the truncated-line
+behavior to which some Digital compilers default (and which affects the
+way continued character/Hollerith constants are interpreted).
+
+\1f
+File: g77.info, Node: Short Lines, Next: Long Lines, Prev: Tabs, Up: Source Form
+
+Short Lines
+-----------
+
+ Source lines shorter than the applicable fixed-form length are
+treated as if they were padded with spaces to that length. (None of
+this is relevant to source files written in free form.)
+
+ This affects only continued character and Hollerith constants, and
+is a different interpretation than provided by some other popular
+compilers (although a bit more consistent with the traditional
+punched-card basis of Fortran and the way the Fortran standard
+expressed fixed source form).
+
+ `g77' might someday offer an option to warn about cases where
+differences might be seen as a result of this treatment, and perhaps an
+option to specify the alternate behavior as well.
+
+ Note that this padding cannot apply to lines that are effectively of
+infinite length--such lines are specified using command-line options
+like `-ffixed-line-length-none', for example.
+
+\1f
+File: g77.info, Node: Long Lines, Next: Ampersands, Prev: Short Lines, Up: Source Form
+
+Long Lines
+----------
+
+ Source lines longer than the applicable length are truncated to that
+length. Currently, `g77' does not warn if the truncated characters are
+not spaces, to accommodate existing code written for systems that
+treated truncated text as commentary (especially in columns 73 through
+80).
+
+ *Note Options Controlling Fortran Dialect: Fortran Dialect Options,
+for information on the `-ffixed-line-length-N' option, which can be
+used to set the line length applicable to fixed-form source files.
+
+\1f
+File: g77.info, Node: Ampersands, Prev: Long Lines, Up: Source Form
+
+Ampersand Continuation Line
+---------------------------
+
+ A `&' in column 1 of fixed-form source denotes an arbitrary-length
+continuation line, imitating the behavior of `f2c'.
+
+\1f
+File: g77.info, Node: Trailing Comment, Next: Debug Line, Prev: Source Form, Up: Other Dialects
+
+Trailing Comment
+================
+
+ `g77' supports use of `/*' to start a trailing comment. In the GNU
+Fortran language, `!' is used for this purpose.
+
+ `/*' is not in the GNU Fortran language because the use of `/*' in a
+program might suggest to some readers that a block, not trailing,
+comment is started (and thus ended by `*/', not end of line), since
+that is the meaning of `/*' in C.
+
+ Also, such readers might think they can use `//' to start a trailing
+comment as an alternative to `/*', but `//' already denotes
+concatenation, and such a "comment" might actually result in a program
+that compiles without error (though it would likely behave incorrectly).
+
+\1f
+File: g77.info, Node: Debug Line, Next: Dollar Signs, Prev: Trailing Comment, Up: Other Dialects
+
+Debug Line
+==========
+
+ Use of `D' or `d' as the first character (column 1) of a source line
+denotes a debug line.
+
+ In turn, a debug line is treated as either a comment line or a
+normal line, depending on whether debug lines are enabled.
+
+ When treated as a comment line, a line beginning with `D' or `d' is
+treated as if it the first character was `C' or `c', respectively.
+When treated as a normal line, such a line is treated as if the first
+character was <SPC> (space).
+
+ (Currently, `g77' provides no means for treating debug lines as
+normal lines.)
+
+\1f
+File: g77.info, Node: Dollar Signs, Next: Case Sensitivity, Prev: Debug Line, Up: Other Dialects
+
+Dollar Signs in Symbol Names
+============================
+
+ Dollar signs (`$') are allowed in symbol names (after the first
+character) when the `-fdollar-ok' option is specified.
+
+\1f
+File: g77.info, Node: Case Sensitivity, Next: VXT Fortran, Prev: Dollar Signs, Up: Other Dialects
+
+Case Sensitivity
+================
+
+ GNU Fortran offers the programmer way too much flexibility in
+deciding how source files are to be treated vis-a-vis uppercase and
+lowercase characters. There are 66 useful settings that affect case
+sensitivity, plus 10 settings that are nearly useless, with the
+remaining 116 settings being either redundant or useless.
+
+ None of these settings have any effect on the contents of comments
+(the text after a `c' or `C' in Column 1, for example) or of character
+or Hollerith constants. Note that things like the `E' in the statement
+`CALL FOO(3.2E10)' and the `TO' in `ASSIGN 10 TO LAB' are considered
+built-in keywords, and so are affected by these settings.
+
+ Low-level switches are identified in this section as follows:
+
+ A Source Case Conversion:
+
+ 0 Preserve (see Note 1)
+
+ 1 Convert to Upper Case
+
+ 2 Convert to Lower Case
+
+ B Built-in Keyword Matching:
+
+ 0 Match Any Case (per-character basis)
+
+ 1 Match Upper Case Only
+
+ 2 Match Lower Case Only
+
+ 3 Match InitialCaps Only (see tables for spellings)
+
+ C Built-in Intrinsic Matching:
+
+ 0 Match Any Case (per-character basis)
+
+ 1 Match Upper Case Only
+
+ 2 Match Lower Case Only
+
+ 3 Match InitialCaps Only (see tables for spellings)
+
+ D User-defined Symbol Possibilities (warnings only):
+
+ 0 Allow Any Case (per-character basis)
+
+ 1 Allow Upper Case Only
+
+ 2 Allow Lower Case Only
+
+ 3 Allow InitialCaps Only (see Note 2)
+
+ Note 1: `g77' eventually will support `NAMELIST' in a manner that is
+consistent with these source switches--in the sense that input will be
+expected to meet the same requirements as source code in terms of
+matching symbol names and keywords (for the exponent letters).
+
+ Currently, however, `NAMELIST' is supported by `libf2c', which
+uppercases `NAMELIST' input and symbol names for matching. This means
+not only that `NAMELIST' output currently shows symbol (and keyword)
+names in uppercase even if lower-case source conversion (option A2) is
+selected, but that `NAMELIST' cannot be adequately supported when
+source case preservation (option A0) is selected.
+
+ If A0 is selected, a warning message will be output for each
+`NAMELIST' statement to this effect. The behavior of the program is
+undefined at run time if two or more symbol names appear in a given
+`NAMELIST' such that the names are identical when converted to upper
+case (e.g. `NAMELIST /X/ VAR, Var, var'). For complete and total
+elegance, perhaps there should be a warning when option A2 is selected,
+since the output of NAMELIST is currently in uppercase but will someday
+be lowercase (when a `libg77' is written), but that seems to be
+overkill for a product in beta test.
+
+ Note 2: Rules for InitialCaps names are:
+
+ - Must be a single uppercase letter, *or*
+
+ - Must start with an uppercase letter and contain at least one
+ lowercase letter.
+
+ So `A', `Ab', `ABc', `AbC', and `Abc' are valid InitialCaps names,
+but `AB', `A2', and `ABC' are not. Note that most, but not all,
+built-in names meet these requirements--the exceptions are some of the
+two-letter format specifiers, such as `BN' and `BZ'.
+
+ Here are the names of the corresponding command-line options:
+
+ A0: -fsource-case-preserve
+ A1: -fsource-case-upper
+ A2: -fsource-case-lower
+
+ B0: -fmatch-case-any
+ B1: -fmatch-case-upper
+ B2: -fmatch-case-lower
+ B3: -fmatch-case-initcap
+
+ C0: -fintrin-case-any
+ C1: -fintrin-case-upper
+ C2: -fintrin-case-lower
+ C3: -fintrin-case-initcap
+
+ D0: -fsymbol-case-any
+ D1: -fsymbol-case-upper
+ D2: -fsymbol-case-lower
+ D3: -fsymbol-case-initcap
+
+ Useful combinations of the above settings, along with abbreviated
+option names that set some of these combinations all at once:
+
+ 1: A0-- B0--- C0--- D0--- -fcase-preserve
+ 2: A0-- B0--- C0--- D-1--
+ 3: A0-- B0--- C0--- D--2-
+ 4: A0-- B0--- C0--- D---3
+ 5: A0-- B0--- C-1-- D0---
+ 6: A0-- B0--- C-1-- D-1--
+ 7: A0-- B0--- C-1-- D--2-
+ 8: A0-- B0--- C-1-- D---3
+ 9: A0-- B0--- C--2- D0---
+ 10: A0-- B0--- C--2- D-1--
+ 11: A0-- B0--- C--2- D--2-
+ 12: A0-- B0--- C--2- D---3
+ 13: A0-- B0--- C---3 D0---
+ 14: A0-- B0--- C---3 D-1--
+ 15: A0-- B0--- C---3 D--2-
+ 16: A0-- B0--- C---3 D---3
+ 17: A0-- B-1-- C0--- D0---
+ 18: A0-- B-1-- C0--- D-1--
+ 19: A0-- B-1-- C0--- D--2-
+ 20: A0-- B-1-- C0--- D---3
+ 21: A0-- B-1-- C-1-- D0---
+ 22: A0-- B-1-- C-1-- D-1-- -fcase-strict-upper
+ 23: A0-- B-1-- C-1-- D--2-
+ 24: A0-- B-1-- C-1-- D---3
+ 25: A0-- B-1-- C--2- D0---
+ 26: A0-- B-1-- C--2- D-1--
+ 27: A0-- B-1-- C--2- D--2-
+ 28: A0-- B-1-- C--2- D---3
+ 29: A0-- B-1-- C---3 D0---
+ 30: A0-- B-1-- C---3 D-1--
+ 31: A0-- B-1-- C---3 D--2-
+ 32: A0-- B-1-- C---3 D---3
+ 33: A0-- B--2- C0--- D0---
+ 34: A0-- B--2- C0--- D-1--
+ 35: A0-- B--2- C0--- D--2-
+ 36: A0-- B--2- C0--- D---3
+ 37: A0-- B--2- C-1-- D0---
+ 38: A0-- B--2- C-1-- D-1--
+ 39: A0-- B--2- C-1-- D--2-
+ 40: A0-- B--2- C-1-- D---3
+ 41: A0-- B--2- C--2- D0---
+ 42: A0-- B--2- C--2- D-1--
+ 43: A0-- B--2- C--2- D--2- -fcase-strict-lower
+ 44: A0-- B--2- C--2- D---3
+ 45: A0-- B--2- C---3 D0---
+ 46: A0-- B--2- C---3 D-1--
+ 47: A0-- B--2- C---3 D--2-
+ 48: A0-- B--2- C---3 D---3
+ 49: A0-- B---3 C0--- D0---
+ 50: A0-- B---3 C0--- D-1--
+ 51: A0-- B---3 C0--- D--2-
+ 52: A0-- B---3 C0--- D---3
+ 53: A0-- B---3 C-1-- D0---
+ 54: A0-- B---3 C-1-- D-1--
+ 55: A0-- B---3 C-1-- D--2-
+ 56: A0-- B---3 C-1-- D---3
+ 57: A0-- B---3 C--2- D0---
+ 58: A0-- B---3 C--2- D-1--
+ 59: A0-- B---3 C--2- D--2-
+ 60: A0-- B---3 C--2- D---3
+ 61: A0-- B---3 C---3 D0---
+ 62: A0-- B---3 C---3 D-1--
+ 63: A0-- B---3 C---3 D--2-
+ 64: A0-- B---3 C---3 D---3 -fcase-initcap
+ 65: A-1- B01-- C01-- D01-- -fcase-upper
+ 66: A--2 B0-2- C0-2- D0-2- -fcase-lower
+
+ Number 22 is the "strict" ANSI FORTRAN 77 model wherein all input
+(except comments, character constants, and Hollerith strings) must be
+entered in uppercase. Use `-fcase-strict-upper' to specify this
+combination.
+
+ Number 43 is like Number 22 except all input must be lowercase. Use
+`-fcase-strict-lower' to specify this combination.
+
+ Number 65 is the "classic" ANSI FORTRAN 77 model as implemented on
+many non-UNIX machines whereby all the source is translated to
+uppercase. Use `-fcase-upper' to specify this combination.
+
+ Number 66 is the "canonical" UNIX model whereby all the source is
+translated to lowercase. Use `-fcase-lower' to specify this
+combination.
+
+ There are a few nearly useless combinations:
+
+ 67: A-1- B01-- C01-- D--2-
+ 68: A-1- B01-- C01-- D---3
+ 69: A-1- B01-- C--23 D01--
+ 70: A-1- B01-- C--23 D--2-
+ 71: A-1- B01-- C--23 D---3
+ 72: A--2 B01-- C0-2- D-1--
+ 73: A--2 B01-- C0-2- D---3
+ 74: A--2 B01-- C-1-3 D0-2-
+ 75: A--2 B01-- C-1-3 D-1--
+ 76: A--2 B01-- C-1-3 D---3
+
+ The above allow some programs to be compiled but with restrictions
+that make most useful programs impossible: Numbers 67 and 72 warn about
+*any* user-defined symbol names (such as `SUBROUTINE FOO'); Numbers 68
+and 73 warn about any user-defined symbol names longer than one
+character that don't have at least one non-alphabetic character after
+the first; Numbers 69 and 74 disallow any references to intrinsics; and
+Numbers 70, 71, 75, and 76 are combinations of the restrictions in
+67+69, 68+69, 72+74, and 73+74, respectively.
+
+ All redundant combinations are shown in the above tables anyplace
+where more than one setting is shown for a low-level switch. For
+example, `B0-2-' means either setting 0 or 2 is valid for switch B.
+The "proper" setting in such a case is the one that copies the setting
+of switch A--any other setting might slightly reduce the speed of the
+compiler, though possibly to an unmeasurable extent.
+
+ All remaining combinations are useless in that they prevent
+successful compilation of non-null source files (source files with
+something other than comments).
+
+\1f
+File: g77.info, Node: VXT Fortran, Next: Fortran 90, Prev: Case Sensitivity, Up: Other Dialects
+
+VXT Fortran
+===========
+
+ `g77' supports certain constructs that have different meanings in
+VXT Fortran than they do in the GNU Fortran language.
+
+ Generally, this manual uses the invented term VXT Fortran to refer
+VAX FORTRAN (circa v4). That compiler offered many popular features,
+though not necessarily those that are specific to the VAX processor
+architecture, the VMS operating system, or Digital Equipment
+Corporation's Fortran product line. (VAX and VMS probably are
+trademarks of Digital Equipment Corporation.)
+
+ An extension offered by a Digital Fortran product that also is
+offered by several other Fortran products for different kinds of
+systems is probably going to be considered for inclusion in `g77'
+someday, and is considered a VXT Fortran feature.
+
+ The `-fvxt' option generally specifies that, where the meaning of a
+construct is ambiguous (means one thing in GNU Fortran and another in
+VXT Fortran), the VXT Fortran meaning is to be assumed.
+
+* Menu:
+
+* Double Quote Meaning:: `"2000' as octal constant.
+* Exclamation Point:: `!' in column 6.
+
+\1f
+File: g77.info, Node: Double Quote Meaning, Next: Exclamation Point, Up: VXT Fortran
+
+Meaning of Double Quote
+-----------------------
+
+ `g77' treats double-quote (`"') as beginning an octal constant of
+`INTEGER(KIND=1)' type when the `-fvxt' option is specified. The form
+of this octal constant is
+
+ "OCTAL-DIGITS
+
+where OCTAL-DIGITS is a nonempty string of characters in the set
+`01234567'.
+
+ For example, the `-fvxt' option permits this:
+
+ PRINT *, "20
+ END
+
+The above program would print the value `16'.
+
+ *Note Integer Type::, for information on the preferred construct for
+integer constants specified using GNU Fortran's octal notation.
+
+ (In the GNU Fortran language, the double-quote character (`"')
+delimits a character constant just as does apostrophe (`''). There is
+no way to allow both constructs in the general case, since statements
+like `PRINT *,"2000 !comment?"' would be ambiguous.)
+
+\1f
+File: g77.info, Node: Exclamation Point, Prev: Double Quote Meaning, Up: VXT Fortran
+
+Meaning of Exclamation Point in Column 6
+----------------------------------------
+
+ `g77' treats an exclamation point (`!') in column 6 of a fixed-form
+source file as a continuation character rather than as the beginning of
+a comment (as it does in any other column) when the `-fvxt' option is
+specified.
+
+ The following program, when run, prints a message indicating whether
+it is interpreted according to GNU Fortran (and Fortran 90) rules or
+VXT Fortran rules:
+
+ C234567 (This line begins in column 1.)
+ I = 0
+ !1
+ IF (I.EQ.0) PRINT *, ' I am a VXT Fortran program'
+ IF (I.EQ.1) PRINT *, ' I am a Fortran 90 program'
+ IF (I.LT.0 .OR. I.GT.1) PRINT *, ' I am a HAL 9000 computer'
+ END
+
+ (In the GNU Fortran and Fortran 90 languages, exclamation point is a
+valid character and, unlike space (<SPC>) or zero (`0'), marks a line
+as a continuation line when it appears in column 6.)
+
+\1f
+File: g77.info, Node: Fortran 90, Next: Pedantic Compilation, Prev: VXT Fortran, Up: Other Dialects
+
+Fortran 90
+==========
+
+ The GNU Fortran language includes a number of features that are part
+of Fortran 90, even when the `-ff90' option is not specified. The
+features enabled by `-ff90' are intended to be those that, when `-ff90'
+is not specified, would have another meaning to `g77'--usually meaning
+something invalid in the GNU Fortran language.
+
+ So, the purpose of `-ff90' is not to specify whether `g77' is to
+gratuitously reject Fortran 90 constructs. The `-pedantic' option
+specified with `-fno-f90' is intended to do that, although its
+implementation is certainly incomplete at this point.
+
+ When `-ff90' is specified:
+
+ * The type of `REAL(EXPR)' and `AIMAG(EXPR)', where EXPR is
+ `COMPLEX' type, is the same type as the real part of EXPR.
+
+ For example, assuming `Z' is type `COMPLEX(KIND=2)', `REAL(Z)'
+ would return a value of type `REAL(KIND=2)', not of type
+ `REAL(KIND=1)', since `-ff90' is specified.
+
+\1f
+File: g77.info, Node: Pedantic Compilation, Next: Distensions, Prev: Fortran 90, Up: Other Dialects
+
+Pedantic Compilation
+====================
+
+ The `-fpedantic' command-line option specifies that `g77' is to warn
+about code that is not standard-conforming. This is useful for finding
+some extensions `g77' accepts that other compilers might not accept.
+(Note that the `-pedantic' and `-pedantic-errors' options always imply
+`-fpedantic'.)
+
+ With `-fno-f90' in force, ANSI FORTRAN 77 is used as the standard
+for conforming code. With `-ff90' in force, Fortran 90 is used.
+
+ The constructs for which `g77' issues diagnostics when `-fpedantic'
+and `-fno-f90' are in force are:
+
+ * Automatic arrays, as in
+
+ SUBROUTINE X(N)
+ REAL A(N)
+ ...
+
+ where `A' is not listed in any `ENTRY' statement, and thus is not
+ a dummy argument.
+
+ * The commas in `READ (5), I' and `WRITE (10), J'.
+
+ These commas are disallowed by FORTRAN 77, but, while strictly
+ superfluous, are syntactically elegant, especially given that
+ commas are required in statements such as `READ 99, I' and `PRINT
+ *, J'. Many compilers permit the superfluous commas for this
+ reason.
+
+ * `DOUBLE COMPLEX', either explicitly or implicitly.
+
+ An explicit use of this type is via a `DOUBLE COMPLEX' or
+ `IMPLICIT DOUBLE COMPLEX' statement, for examples.
+
+ An example of an implicit use is the expression `C*D', where `C'
+ is `COMPLEX(KIND=1)' and `D' is `DOUBLE PRECISION'. This
+ expression is prohibited by ANSI FORTRAN 77 because the rules of
+ promotion would suggest that it produce a `DOUBLE COMPLEX'
+ result--a type not provided for by that standard.
+
+ * Automatic conversion of numeric expressions to `INTEGER(KIND=1)'
+ in contexts such as:
+
+ - Array-reference indexes.
+
+ - Alternate-return values.
+
+ - Computed `GOTO'.
+
+ - `FORMAT' run-time expressions (not yet supported).
+
+ - Dimension lists in specification statements.
+
+ - Numbers for I/O statements (such as `READ (UNIT=3.2), I')
+
+ - Sizes of `CHARACTER' entities in specification statements.
+
+ - Kind types in specification entities (a Fortran 90 feature).
+
+ - Initial, terminal, and incrementation parameters for
+ implied-`DO' constructs in `DATA' statements.
+
+ * Automatic conversion of `LOGICAL' expressions to `INTEGER' in
+ contexts such as arithmetic `IF' (where `COMPLEX' expressions are
+ disallowed anyway).
+
+ * Zero-size array dimensions, as in:
+
+ INTEGER I(10,20,4:2)
+
+ * Zero-length `CHARACTER' entities, as in:
+
+ PRINT *, ''
+
+ * Substring operators applied to character constants and named
+ constants, as in:
+
+ PRINT *, 'hello'(3:5)
+
+ * Null arguments passed to statement function, as in:
+
+ PRINT *, FOO(,3)
+
+ * Disagreement among program units regarding whether a given `COMMON'
+ area is `SAVE'd (for targets where program units in a single source
+ file are "glued" together as they typically are for UNIX
+ development environments).
+
+ * Disagreement among program units regarding the size of a named
+ `COMMON' block.
+
+ * Specification statements following first `DATA' statement.
+
+ (In the GNU Fortran language, `DATA I/1/' may be followed by
+ `INTEGER J', but not `INTEGER I'. The `-fpedantic' option
+ disallows both of these.)
+
+ * Semicolon as statement separator, as in:
+
+ CALL FOO; CALL BAR
+
+ * Use of `&' in column 1 of fixed-form source (to indicate
+ continuation).
+
+ * Use of `CHARACTER' constants to initialize numeric entities, and
+ vice versa.
+
+ * Expressions having two arithmetic operators in a row, such as
+ `X*-Y'.
+
+ If `-fpedantic' is specified along with `-ff90', the following
+constructs result in diagnostics:
+
+ * Use of semicolon as a statement separator on a line that has an
+ `INCLUDE' directive.
+
+\1f
+File: g77.info, Node: Distensions, Prev: Pedantic Compilation, Up: Other Dialects
+
+Distensions
+===========
+
+ The `-fugly-*' command-line options determine whether certain
+features supported by VAX FORTRAN and other such compilers, but
+considered too ugly to be in code that can be changed to use safer
+and/or more portable constructs, are accepted. These are humorously
+referred to as "distensions", extensions that just plain look ugly in
+the harsh light of day.
+
+ *Note:* The `-fugly' option, which currently serves as shorthand to
+enable all of the distensions below, is likely to be removed in a
+future version of `g77'. That's because it's likely new distensions
+will be added that conflict with existing ones in terms of assigning
+meaning to a given chunk of code. (Also, it's pretty clear that users
+should not use `-fugly' as shorthand when the next release of `g77'
+might add a distension to that that causes their existing code, when
+recompiled, to behave differently--perhaps even fail to compile or run
+correctly.)
+
+* Menu:
+
+* Ugly Implicit Argument Conversion:: Disabled via `-fno-ugly-args'.
+* Ugly Assumed-Size Arrays:: Enabled via `-fugly-assumed'.
+* Ugly Null Arguments:: Enabled via `-fugly-comma'.
+* Ugly Complex Part Extraction:: Enabled via `-fugly-complex'.
+* Ugly Conversion of Initializers:: Disabled via `-fno-ugly-init'.
+* Ugly Integer Conversions:: Enabled via `-fugly-logint'.
+* Ugly Assigned Labels:: Enabled via `-fugly-assign'.
+
+\1f
+File: g77.info, Node: Ugly Implicit Argument Conversion, Next: Ugly Assumed-Size Arrays, Up: Distensions
+
+Implicit Argument Conversion
+----------------------------
+
+ The `-fno-ugly-args' option disables passing typeless and Hollerith
+constants as actual arguments in procedure invocations. For example:
+
+ CALL FOO(4HABCD)
+ CALL BAR('123'O)
+
+These constructs can be too easily used to create non-portable code,
+but are not considered as "ugly" as others. Further, they are widely
+used in existing Fortran source code in ways that often are quite
+portable. Therefore, they are enabled by default.
+
+\1f
+File: g77.info, Node: Ugly Assumed-Size Arrays, Next: Ugly Null Arguments, Prev: Ugly Implicit Argument Conversion, Up: Distensions
+
+Ugly Assumed-Size Arrays
+------------------------
+
+ The `-fugly-assumed' option enables the treatment of any array with
+a final dimension specified as `1' as an assumed-size array, as if `*'
+had been specified instead.
+
+ For example, `DIMENSION X(1)' is treated as if it had read
+`DIMENSION X(*)' if `X' is listed as a dummy argument in a preceding
+`SUBROUTINE', `FUNCTION', or `ENTRY' statement in the same program unit.
+
+ Use an explicit lower bound to avoid this interpretation. For
+example, `DIMENSION X(1:1)' is never treated as if it had read
+`DIMENSION X(*)' or `DIMENSION X(1:*)'. Nor is `DIMENSION X(2-1)'
+affected by this option, since that kind of expression is unlikely to
+have been intended to designate an assumed-size array.
+
+ This option is used to prevent warnings being issued about apparent
+out-of-bounds reference such as `X(2) = 99'.
+
+ It also prevents the array from being used in contexts that disallow
+assumed-size arrays, such as `PRINT *,X'. In such cases, a diagnostic
+is generated and the source file is not compiled.
+
+ The construct affected by this option is used only in old code that
+pre-exists the widespread acceptance of adjustable and assumed-size
+arrays in the Fortran community.
+
+ *Note:* This option does not affect how `DIMENSION X(1)' is treated
+if `X' is listed as a dummy argument only *after* the `DIMENSION'
+statement (presumably in an `ENTRY' statement). For example,
+`-fugly-assumed' has no effect on the following program unit:
+
+ SUBROUTINE X
+ REAL A(1)
+ RETURN
+ ENTRY Y(A)
+ PRINT *, A
+ END
+
+\1f
+File: g77.info, Node: Ugly Complex Part Extraction, Next: Ugly Conversion of Initializers, Prev: Ugly Null Arguments, Up: Distensions
+
+Ugly Complex Part Extraction
+----------------------------
+
+ The `-fugly-complex' option enables use of the `REAL()' and `AIMAG()'
+intrinsics with arguments that are `COMPLEX' types other than
+`COMPLEX(KIND=1)'.
+
+ With `-ff90' in effect, these intrinsics return the unconverted real
+and imaginary parts (respectively) of their argument.
+
+ With `-fno-f90' in effect, these intrinsics convert the real and
+imaginary parts to `REAL(KIND=1)', and return the result of that
+conversion.
+
+ Due to this ambiguity, the GNU Fortran language defines these
+constructs as invalid, except in the specific case where they are
+entirely and solely passed as an argument to an invocation of the
+`REAL()' intrinsic. For example,
+
+ REAL(REAL(Z))
+
+is permitted even when `Z' is `COMPLEX(KIND=2)' and `-fno-ugly-complex'
+is in effect, because the meaning is clear.
+
+ `g77' enforces this restriction, unless `-fugly-complex' is
+specified, in which case the appropriate interpretation is chosen and
+no diagnostic is issued.
+
+ *Note CMPAMBIG::, for information on how to cope with existing code
+with unclear expectations of `REAL()' and `AIMAG()' with
+`COMPLEX(KIND=2)' arguments.
+
+ *Note RealPart Intrinsic::, for information on the `REALPART()'
+intrinsic, used to extract the real part of a complex expression
+without conversion. *Note ImagPart Intrinsic::, for information on the
+`IMAGPART()' intrinsic, used to extract the imaginary part of a complex
+expression without conversion.
+
+\1f
+File: g77.info, Node: Ugly Null Arguments, Next: Ugly Complex Part Extraction, Prev: Ugly Assumed-Size Arrays, Up: Distensions
+
+Ugly Null Arguments
+-------------------
+
+ The `-fugly-comma' option enables use of a single trailing comma to
+mean "pass an extra trailing null argument" in a list of actual
+arguments to a procedure other than a statement function, and use of an
+empty list of arguments to mean "pass a single null argument".
+
+ (Null arguments often are used in some procedure-calling schemes to
+indicate omitted arguments.)
+
+ For example, `CALL FOO(,)' means "pass two null arguments", rather
+than "pass one null argument". Also, `CALL BAR()' means "pass one null
+argument".
+
+ This construct is considered "ugly" because it does not provide an
+elegant way to pass a single null argument that is syntactically
+distinct from passing no arguments. That is, this construct changes
+the meaning of code that makes no use of the construct.
+
+ So, with `-fugly-comma' in force, `CALL FOO()' and `I = JFUNC()'
+pass a single null argument, instead of passing no arguments as
+required by the Fortran 77 and 90 standards.
+
+ *Note:* Many systems gracefully allow the case where a procedure
+call passes one extra argument that the called procedure does not
+expect.
+
+ So, in practice, there might be no difference in the behavior of a
+program that does `CALL FOO()' or `I = JFUNC()' and is compiled with
+`-fugly-comma' in force as compared to its behavior when compiled with
+the default, `-fno-ugly-comma', in force, assuming `FOO' and `JFUNC' do
+not expect any arguments to be passed.
+
+\1f
+File: g77.info, Node: Ugly Conversion of Initializers, Next: Ugly Integer Conversions, Prev: Ugly Complex Part Extraction, Up: Distensions
+
+Ugly Conversion of Initializers
+-------------------------------
+
+ The constructs disabled by `-fno-ugly-init' are:
+
+ * Use of Hollerith and typeless constants in contexts where they set
+ initial (compile-time) values for variables, arrays, and named
+ constants--that is, `DATA' and `PARAMETER' statements, plus
+ type-declaration statements specifying initial values.
+
+ Here are some sample initializations that are disabled by the
+ `-fno-ugly-init' option:
+
+ PARAMETER (VAL='9A304FFE'X)
+ REAL*8 STRING/8HOUTPUT00/
+ DATA VAR/4HABCD/
+
+ * In the same contexts as above, use of character constants to
+ initialize numeric items and vice versa (one constant per item).
+
+ Here are more sample initializations that are disabled by the
+ `-fno-ugly-init' option:
+
+ INTEGER IA
+ CHARACTER BELL
+ PARAMETER (IA = 'A')
+ PARAMETER (BELL = 7)
+
+ * Use of Hollerith and typeless constants on the right-hand side of
+ assignment statements to numeric types, and in other contexts
+ (such as passing arguments in invocations of intrinsic procedures
+ and statement functions) that are treated as assignments to known
+ types (the dummy arguments, in these cases).
+
+ Here are sample statements that are disabled by the
+ `-fno-ugly-init' option:
+
+ IVAR = 4HABCD
+ PRINT *, IMAX0(2HAB, 2HBA)
+
+ The above constructs, when used, can tend to result in non-portable
+code. But, they are widely used in existing Fortran code in ways that
+often are quite portable. Therefore, they are enabled by default.
+
+\1f
+File: g77.info, Node: Ugly Integer Conversions, Next: Ugly Assigned Labels, Prev: Ugly Conversion of Initializers, Up: Distensions
+
+Ugly Integer Conversions
+------------------------
+
+ The constructs enabled via `-fugly-logint' are:
+
+ * Automatic conversion between `INTEGER' and `LOGICAL' as dictated by
+ context (typically implies nonportable dependencies on how a
+ particular implementation encodes `.TRUE.' and `.FALSE.').
+
+ * Use of a `LOGICAL' variable in `ASSIGN' and assigned-`GOTO'
+ statements.
+
+ The above constructs are disabled by default because use of them
+tends to lead to non-portable code. Even existing Fortran code that
+uses that often turns out to be non-portable, if not outright buggy.
+
+ Some of this is due to differences among implementations as far as
+how `.TRUE.' and `.FALSE.' are encoded as `INTEGER' values--Fortran
+code that assumes a particular coding is likely to use one of the above
+constructs, and is also likely to not work correctly on implementations
+using different encodings.
+
+ *Note Equivalence Versus Equality::, for more information.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Ugly Assigned Labels, Prev: Ugly Integer Conversions, Up: Distensions
+
+Ugly Assigned Labels
+--------------------
+
+ The `-fugly-assign' option forces `g77' to use the same storage for
+assigned labels as it would for a normal assignment to the same
+variable.
+
+ For example, consider the following code fragment:
+
+ I = 3
+ ASSIGN 10 TO I
+
+Normally, for portability and improved diagnostics, `g77' reserves
+distinct storage for a "sibling" of `I', used only for `ASSIGN'
+statements to that variable (along with the corresponding
+assigned-`GOTO' and assigned-`FORMAT'-I/O statements that reference the
+variable).
+
+ However, some code (that violates the ANSI FORTRAN 77 standard)
+attempts to copy assigned labels among variables involved with `ASSIGN'
+statements, as in:
+
+ ASSIGN 10 TO I
+ ISTATE(5) = I
+ ...
+ J = ISTATE(ICUR)
+ GOTO J
+
+Such code doesn't work under `g77' unless `-fugly-assign' is specified
+on the command-line, ensuring that the value of `I' referenced in the
+second line is whatever value `g77' uses to designate statement label
+`10', so the value may be copied into the `ISTATE' array, later
+retrieved into a variable of the appropriate type (`J'), and used as
+the target of an assigned-`GOTO' statement.
+
+ *Note:* To avoid subtle program bugs, when `-fugly-assign' is
+specified, `g77' requires the type of variables specified in
+assigned-label contexts *must* be the same type returned by `%LOC()'.
+On many systems, this type is effectively the same as
+`INTEGER(KIND=1)', while, on others, it is effectively the same as
+`INTEGER(KIND=2)'.
+
+ Do *not* depend on `g77' actually writing valid pointers to these
+variables, however. While `g77' currently chooses that implementation,
+it might be changed in the future.
+
+ *Note Assigned Statement Labels (ASSIGN and GOTO): Assigned
+Statement Labels, for implementation details on assigned-statement
+labels.
+
+\1f
+File: g77.info, Node: Compiler, Next: Other Dialects, Prev: Language, Up: Top
+
+The GNU Fortran Compiler
+************************
+
+ The GNU Fortran compiler, `g77', supports programs written in the
+GNU Fortran language and in some other dialects of Fortran.
+
+ Some aspects of how `g77' works are universal regardless of dialect,
+and yet are not properly part of the GNU Fortran language itself.
+These are described below.
+
+ *Note: This portion of the documentation definitely needs a lot of
+work!*
+
+* Menu:
+
+* Compiler Limits::
+* Compiler Types::
+* Compiler Constants::
+* Compiler Intrinsics::
+
+\1f
+File: g77.info, Node: Compiler Limits, Next: Compiler Types, Up: Compiler
+
+Compiler Limits
+===============
+
+ `g77', as with GNU tools in general, imposes few arbitrary
+restrictions on lengths of identifiers, number of continuation lines,
+number of external symbols in a program, and so on.
+
+ For example, some other Fortran compiler have an option (such as
+`-NlX') to increase the limit on the number of continuation lines.
+Also, some Fortran compilation systems have an option (such as `-NxX')
+to increase the limit on the number of external symbols.
+
+ `g77', `gcc', and GNU `ld' (the GNU linker) have no equivalent
+options, since they do not impose arbitrary limits in these areas.
+
+ `g77' does currently limit the number of dimensions in an array to
+the same degree as do the Fortran standards--seven (7). This
+restriction might well be lifted in a future version.
+
+\1f
+File: g77.info, Node: Compiler Types, Next: Compiler Constants, Prev: Compiler Limits, Up: Compiler
+
+Compiler Types
+==============
+
+ Fortran implementations have a fair amount of freedom given them by
+the standard as far as how much storage space is used and how much
+precision and range is offered by the various types such as
+`LOGICAL(KIND=1)', `INTEGER(KIND=1)', `REAL(KIND=1)', `REAL(KIND=2)',
+`COMPLEX(KIND=1)', and `CHARACTER'. Further, many compilers offer
+so-called `*N' notation, but the interpretation of N varies across
+compilers and target architectures.
+
+ The standard requires that `LOGICAL(KIND=1)', `INTEGER(KIND=1)', and
+`REAL(KIND=1)' occupy the same amount of storage space, and that
+`COMPLEX(KIND=1)' and `REAL(KIND=2)' take twice as much storage space
+as `REAL(KIND=1)'. Further, it requires that `COMPLEX(KIND=1)'
+entities be ordered such that when a `COMPLEX(KIND=1)' variable is
+storage-associated (such as via `EQUIVALENCE') with a two-element
+`REAL(KIND=1)' array named `R', `R(1)' corresponds to the real element
+and `R(2)' to the imaginary element of the `COMPLEX(KIND=1)' variable.
+
+ (Few requirements as to precision or ranges of any of these are
+placed on the implementation, nor is the relationship of storage sizes
+of these types to the `CHARACTER' type specified, by the standard.)
+
+ `g77' follows the above requirements, warning when compiling a
+program requires placement of items in memory that contradict the
+requirements of the target architecture. (For example, a program can
+require placement of a `REAL(KIND=2)' on a boundary that is not an even
+multiple of its size, but still an even multiple of the size of a
+`REAL(KIND=1)' variable. On some target architectures, using the
+canonical mapping of Fortran types to underlying architectural types,
+such placement is prohibited by the machine definition or the
+Application Binary Interface (ABI) in force for the configuration
+defined for building `gcc' and `g77'. `g77' warns about such
+situations when it encounters them.)
+
+ `g77' follows consistent rules for configuring the mapping between
+Fortran types, including the `*N' notation, and the underlying
+architectural types as accessed by a similarly-configured applicable
+version of the `gcc' compiler. These rules offer a widely portable,
+consistent Fortran/C environment, although they might well conflict
+with the expectations of users of Fortran compilers designed and
+written for particular architectures.
+
+ These rules are based on the configuration that is in force for the
+version of `gcc' built in the same release as `g77' (and which was
+therefore used to build both the `g77' compiler components and the
+`libf2c' run-time library):
+
+`REAL(KIND=1)'
+ Same as `float' type.
+
+`REAL(KIND=2)'
+ Same as whatever floating-point type that is twice the size of a
+ `float'--usually, this is a `double'.
+
+`INTEGER(KIND=1)'
+ Same as an integral type that is occupies the same amount of
+ memory storage as `float'--usually, this is either an `int' or a
+ `long int'.
+
+`LOGICAL(KIND=1)'
+ Same `gcc' type as `INTEGER(KIND=1)'.
+
+`INTEGER(KIND=2)'
+ Twice the size, and usually nearly twice the range, as
+ `INTEGER(KIND=1)'--usually, this is either a `long int' or a `long
+ long int'.
+
+`LOGICAL(KIND=2)'
+ Same `gcc' type as `INTEGER(KIND=2)'.
+
+`INTEGER(KIND=3)'
+ Same `gcc' type as signed `char'.
+
+`LOGICAL(KIND=3)'
+ Same `gcc' type as `INTEGER(KIND=3)'.
+
+`INTEGER(KIND=6)'
+ Twice the size, and usually nearly twice the range, as
+ `INTEGER(KIND=3)'--usually, this is a `short'.
+
+`LOGICAL(KIND=6)'
+ Same `gcc' type as `INTEGER(KIND=6)'.
+
+`COMPLEX(KIND=1)'
+ Two `REAL(KIND=1)' scalars (one for the real part followed by one
+ for the imaginary part).
+
+`COMPLEX(KIND=2)'
+ Two `REAL(KIND=2)' scalars.
+
+`NUMERIC-TYPE*N'
+ (Where NUMERIC-TYPE is any type other than `CHARACTER'.) Same as
+ whatever `gcc' type occupies N times the storage space of a `gcc'
+ `char' item.
+
+`DOUBLE PRECISION'
+ Same as `REAL(KIND=2)'.
+
+`DOUBLE COMPLEX'
+ Same as `COMPLEX(KIND=2)'.
+
+ Note that the above are proposed correspondences and might change in
+future versions of `g77'--avoid writing code depending on them.
+
+ Other types supported by `g77' are derived from gcc types such as
+`char', `short', `int', `long int', `long long int', `long double', and
+so on. That is, whatever types `gcc' already supports, `g77' supports
+now or probably will support in a future version. The rules for the
+`NUMERIC-TYPE*N' notation apply to these types, and new values for
+`NUMERIC-TYPE(KIND=N)' will be assigned in a way that encourages
+clarity, consistency, and portability.
+
+\1f
+File: g77.info, Node: Compiler Constants, Next: Compiler Intrinsics, Prev: Compiler Types, Up: Compiler
+
+Compiler Constants
+==================
+
+ `g77' strictly assigns types to *all* constants not documented as
+"typeless" (typeless constants including `'1'Z', for example). Many
+other Fortran compilers attempt to assign types to typed constants
+based on their context. This results in hard-to-find bugs, nonportable
+code, and is not in the spirit (though it strictly follows the letter)
+of the 77 and 90 standards.
+
+ `g77' might offer, in a future release, explicit constructs by which
+a wider variety of typeless constants may be specified, and/or
+user-requested warnings indicating places where `g77' might differ from
+how other compilers assign types to constants.
+
+ *Note Context-Sensitive Constants::, for more information on this
+issue.
+
+\1f
+File: g77.info, Node: Compiler Intrinsics, Prev: Compiler Constants, Up: Compiler
+
+Compiler Intrinsics
+===================
+
+ `g77' offers an ever-widening set of intrinsics. Currently these
+all are procedures (functions and subroutines).
+
+ Some of these intrinsics are unimplemented, but their names reserved
+to reduce future problems with existing code as they are implemented.
+Others are implemented as part of the GNU Fortran language, while yet
+others are provided for compatibility with other dialects of Fortran
+but are not part of the GNU Fortran language.
+
+ To manage these distinctions, `g77' provides intrinsic *groups*, a
+facility that is simply an extension of the intrinsic groups provided
+by the GNU Fortran language.
+
+* Menu:
+
+* Intrinsic Groups:: How intrinsics are grouped for easy management.
+* Other Intrinsics:: Intrinsics other than those in the GNU
+ Fortran language.
+
+\1f
+File: g77.info, Node: Intrinsic Groups, Next: Other Intrinsics, Up: Compiler Intrinsics
+
+Intrinsic Groups
+----------------
+
+ A given specific intrinsic belongs in one or more groups. Each
+group is deleted, disabled, hidden, or enabled by default or a
+command-line option. The meaning of each term follows.
+
+Deleted
+ No intrinsics are recognized as belonging to that group.
+
+Disabled
+ Intrinsics are recognized as belonging to the group, but
+ references to them (other than via the `INTRINSIC' statement) are
+ disallowed through that group.
+
+Hidden
+ Intrinsics in that group are recognized and enabled (if
+ implemented) *only* if the first mention of the actual name of an
+ intrinsic in a program unit is in an `INTRINSIC' statement.
+
+Enabled
+ Intrinsics in that group are recognized and enabled (if
+ implemented).
+
+ The distinction between deleting and disabling a group is illustrated
+by the following example. Assume intrinsic `FOO' belongs only to group
+`FGR'. If group `FGR' is deleted, the following program unit will
+successfully compile, because `FOO()' will be seen as a reference to an
+external function named `FOO':
+
+ PRINT *, FOO()
+ END
+
+If group `FGR' is disabled, compiling the above program will produce
+diagnostics, either because the `FOO' intrinsic is improperly invoked
+or, if properly invoked, it is not enabled. To change the above
+program so it references an external function `FOO' instead of the
+disabled `FOO' intrinsic, add the following line to the top:
+
+ EXTERNAL FOO
+
+So, deleting a group tells `g77' to pretend as though the intrinsics in
+that group do not exist at all, whereas disabling it tells `g77' to
+recognize them as (disabled) intrinsics in intrinsic-like contexts.
+
+ Hiding a group is like enabling it, but the intrinsic must be first
+named in an `INTRINSIC' statement to be considered a reference to the
+intrinsic rather than to an external procedure. This might be the
+"safest" way to treat a new group of intrinsics when compiling old
+code, because it allows the old code to be generally written as if
+those new intrinsics never existed, but to be changed to use them by
+inserting `INTRINSIC' statements in the appropriate places. However,
+it should be the goal of development to use `EXTERNAL' for all names of
+external procedures that might be intrinsic names.
+
+ If an intrinsic is in more than one group, it is enabled if any of
+its containing groups are enabled; if not so enabled, it is hidden if
+any of its containing groups are hidden; if not so hidden, it is
+disabled if any of its containing groups are disabled; if not so
+disabled, it is deleted. This extra complication is necessary because
+some intrinsics, such as `IBITS', belong to more than one group, and
+hence should be enabled if any of the groups to which they belong are
+enabled, and so on.
+
+ The groups are:
+
+`badu77'
+ UNIX intrinsics having inappropriate forms (usually functions that
+ have intended side effects).
+
+`gnu'
+ Intrinsics the GNU Fortran language supports that are extensions to
+ the Fortran standards (77 and 90).
+
+`f2c'
+ Intrinsics supported by AT&T's `f2c' converter and/or `libf2c'.
+
+`f90'
+ Fortran 90 intrinsics.
+
+`mil'
+ MIL-STD 1753 intrinsics (`MVBITS', `IAND', `BTEST', and so on).
+
+`unix'
+ UNIX intrinsics (`IARGC', `EXIT', `ERF', and so on).
+
+`vxt'
+ VAX/VMS FORTRAN (current as of v4) intrinsics.
+
+\1f
+File: g77.info, Node: Other Intrinsics, Prev: Intrinsic Groups, Up: Compiler Intrinsics
+
+Other Intrinsics
+----------------
+
+ `g77' supports intrinsics other than those in the GNU Fortran
+language proper. This set of intrinsics is described below.
+
+ (Note that the empty lines appearing in the menu below are not
+intentional--they result from a bug in the `makeinfo' program.)
+
+* Menu:
+
+
+* ACosD Intrinsic:: (Reserved for future use.)
+
+* AIMax0 Intrinsic:: (Reserved for future use.)
+* AIMin0 Intrinsic:: (Reserved for future use.)
+
+* AJMax0 Intrinsic:: (Reserved for future use.)
+* AJMin0 Intrinsic:: (Reserved for future use.)
+
+* ASinD Intrinsic:: (Reserved for future use.)
+
+* ATan2D Intrinsic:: (Reserved for future use.)
+* ATanD Intrinsic:: (Reserved for future use.)
+
+* BITest Intrinsic:: (Reserved for future use.)
+
+* BJTest Intrinsic:: (Reserved for future use.)
+
+* CDAbs Intrinsic:: Absolute value (archaic).
+* CDCos Intrinsic:: Cosine (archaic).
+* CDExp Intrinsic:: Exponential (archaic).
+* CDLog Intrinsic:: Natural logarithm (archaic).
+* CDSin Intrinsic:: Sine (archaic).
+* CDSqRt Intrinsic:: Square root (archaic).
+
+* ChDir Intrinsic (function):: Change directory.
+
+* ChMod Intrinsic (function):: Change file modes.
+
+* CosD Intrinsic:: (Reserved for future use.)
+
+* DACosD Intrinsic:: (Reserved for future use.)
+
+* DASinD Intrinsic:: (Reserved for future use.)
+
+* DATan2D Intrinsic:: (Reserved for future use.)
+* DATanD Intrinsic:: (Reserved for future use.)
+* Date Intrinsic:: Get current date as dd-Mon-yy.
+
+* DbleQ Intrinsic:: (Reserved for future use.)
+
+* DCmplx Intrinsic:: Construct `COMPLEX(KIND=2)' value.
+* DConjg Intrinsic:: Complex conjugate (archaic).
+
+* DCosD Intrinsic:: (Reserved for future use.)
+
+* DFloat Intrinsic:: Conversion (archaic).
+
+* DFlotI Intrinsic:: (Reserved for future use.)
+* DFlotJ Intrinsic:: (Reserved for future use.)
+
+* DImag Intrinsic:: Convert/extract imaginary part of complex (archaic).
+
+* DReal Intrinsic:: Convert value to type `REAL(KIND=2)'.
+
+* DSinD Intrinsic:: (Reserved for future use.)
+
+* DTanD Intrinsic:: (Reserved for future use.)
+
+* Dtime Intrinsic (function):: Get elapsed time since last time.
+
+* FGet Intrinsic (function):: Read a character from unit 5 stream-wise.
+
+* FGetC Intrinsic (function):: Read a character stream-wise.
+
+* FloatI Intrinsic:: (Reserved for future use.)
+* FloatJ Intrinsic:: (Reserved for future use.)
+
+* FPut Intrinsic (function):: Write a character to unit 6 stream-wise.
+
+* FPutC Intrinsic (function):: Write a character stream-wise.
+
+* IDate Intrinsic (VXT):: Get local time info (VAX/VMS).
+
+* IIAbs Intrinsic:: (Reserved for future use.)
+* IIAnd Intrinsic:: (Reserved for future use.)
+* IIBClr Intrinsic:: (Reserved for future use.)
+* IIBits Intrinsic:: (Reserved for future use.)
+* IIBSet Intrinsic:: (Reserved for future use.)
+* IIDiM Intrinsic:: (Reserved for future use.)
+* IIDInt Intrinsic:: (Reserved for future use.)
+* IIDNnt Intrinsic:: (Reserved for future use.)
+* IIEOr Intrinsic:: (Reserved for future use.)
+* IIFix Intrinsic:: (Reserved for future use.)
+* IInt Intrinsic:: (Reserved for future use.)
+* IIOr Intrinsic:: (Reserved for future use.)
+* IIQint Intrinsic:: (Reserved for future use.)
+* IIQNnt Intrinsic:: (Reserved for future use.)
+* IIShftC Intrinsic:: (Reserved for future use.)
+* IISign Intrinsic:: (Reserved for future use.)
+
+* IMax0 Intrinsic:: (Reserved for future use.)
+* IMax1 Intrinsic:: (Reserved for future use.)
+* IMin0 Intrinsic:: (Reserved for future use.)
+* IMin1 Intrinsic:: (Reserved for future use.)
+* IMod Intrinsic:: (Reserved for future use.)
+
+* INInt Intrinsic:: (Reserved for future use.)
+* INot Intrinsic:: (Reserved for future use.)
+
+* IZExt Intrinsic:: (Reserved for future use.)
+* JIAbs Intrinsic:: (Reserved for future use.)
+* JIAnd Intrinsic:: (Reserved for future use.)
+* JIBClr Intrinsic:: (Reserved for future use.)
+* JIBits Intrinsic:: (Reserved for future use.)
+* JIBSet Intrinsic:: (Reserved for future use.)
+* JIDiM Intrinsic:: (Reserved for future use.)
+* JIDInt Intrinsic:: (Reserved for future use.)
+* JIDNnt Intrinsic:: (Reserved for future use.)
+* JIEOr Intrinsic:: (Reserved for future use.)
+* JIFix Intrinsic:: (Reserved for future use.)
+* JInt Intrinsic:: (Reserved for future use.)
+* JIOr Intrinsic:: (Reserved for future use.)
+* JIQint Intrinsic:: (Reserved for future use.)
+* JIQNnt Intrinsic:: (Reserved for future use.)
+* JIShft Intrinsic:: (Reserved for future use.)
+* JIShftC Intrinsic:: (Reserved for future use.)
+* JISign Intrinsic:: (Reserved for future use.)
+* JMax0 Intrinsic:: (Reserved for future use.)
+* JMax1 Intrinsic:: (Reserved for future use.)
+* JMin0 Intrinsic:: (Reserved for future use.)
+* JMin1 Intrinsic:: (Reserved for future use.)
+* JMod Intrinsic:: (Reserved for future use.)
+* JNInt Intrinsic:: (Reserved for future use.)
+* JNot Intrinsic:: (Reserved for future use.)
+* JZExt Intrinsic:: (Reserved for future use.)
+
+* Kill Intrinsic (function):: Signal a process.
+
+* Link Intrinsic (function):: Make hard link in file system.
+
+* QAbs Intrinsic:: (Reserved for future use.)
+* QACos Intrinsic:: (Reserved for future use.)
+* QACosD Intrinsic:: (Reserved for future use.)
+* QASin Intrinsic:: (Reserved for future use.)
+* QASinD Intrinsic:: (Reserved for future use.)
+* QATan Intrinsic:: (Reserved for future use.)
+* QATan2 Intrinsic:: (Reserved for future use.)
+* QATan2D Intrinsic:: (Reserved for future use.)
+* QATanD Intrinsic:: (Reserved for future use.)
+* QCos Intrinsic:: (Reserved for future use.)
+* QCosD Intrinsic:: (Reserved for future use.)
+* QCosH Intrinsic:: (Reserved for future use.)
+* QDiM Intrinsic:: (Reserved for future use.)
+* QExp Intrinsic:: (Reserved for future use.)
+* QExt Intrinsic:: (Reserved for future use.)
+* QExtD Intrinsic:: (Reserved for future use.)
+* QFloat Intrinsic:: (Reserved for future use.)
+* QInt Intrinsic:: (Reserved for future use.)
+* QLog Intrinsic:: (Reserved for future use.)
+* QLog10 Intrinsic:: (Reserved for future use.)
+* QMax1 Intrinsic:: (Reserved for future use.)
+* QMin1 Intrinsic:: (Reserved for future use.)
+* QMod Intrinsic:: (Reserved for future use.)
+* QNInt Intrinsic:: (Reserved for future use.)
+* QSin Intrinsic:: (Reserved for future use.)
+* QSinD Intrinsic:: (Reserved for future use.)
+* QSinH Intrinsic:: (Reserved for future use.)
+* QSqRt Intrinsic:: (Reserved for future use.)
+* QTan Intrinsic:: (Reserved for future use.)
+* QTanD Intrinsic:: (Reserved for future use.)
+* QTanH Intrinsic:: (Reserved for future use.)
+
+* Rename Intrinsic (function):: Rename file.
+
+* Secnds Intrinsic:: Get local time offset since midnight.
+
+* Signal Intrinsic (function):: Muck with signal handling.
+
+* SinD Intrinsic:: (Reserved for future use.)
+
+* SnglQ Intrinsic:: (Reserved for future use.)
+
+* SymLnk Intrinsic (function):: Make symbolic link in file system.
+
+* System Intrinsic (function):: Invoke shell (system) command.
+
+* TanD Intrinsic:: (Reserved for future use.)
+
+* Time Intrinsic (VXT):: Get the time as a character value.
+
+* UMask Intrinsic (function):: Set file creation permissions mask.
+
+* Unlink Intrinsic (function):: Unlink file.
+
+* ZExt Intrinsic:: (Reserved for future use.)
+
+\1f
+File: g77.info, Node: ACosD Intrinsic, Next: AIMax0 Intrinsic, Up: Other Intrinsics
+
+ACosD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL ACosD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: AIMax0 Intrinsic, Next: AIMin0 Intrinsic, Prev: ACosD Intrinsic, Up: Other Intrinsics
+
+AIMax0 Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL AIMax0' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: AIMin0 Intrinsic, Next: AJMax0 Intrinsic, Prev: AIMax0 Intrinsic, Up: Other Intrinsics
+
+AIMin0 Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL AIMin0' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: AJMax0 Intrinsic, Next: AJMin0 Intrinsic, Prev: AIMin0 Intrinsic, Up: Other Intrinsics
+
+AJMax0 Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL AJMax0' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: AJMin0 Intrinsic, Next: ASinD Intrinsic, Prev: AJMax0 Intrinsic, Up: Other Intrinsics
+
+AJMin0 Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL AJMin0' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: ASinD Intrinsic, Next: ATan2D Intrinsic, Prev: AJMin0 Intrinsic, Up: Other Intrinsics
+
+ASinD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL ASinD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: ATan2D Intrinsic, Next: ATanD Intrinsic, Prev: ASinD Intrinsic, Up: Other Intrinsics
+
+ATan2D Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL ATan2D' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: ATanD Intrinsic, Next: BITest Intrinsic, Prev: ATan2D Intrinsic, Up: Other Intrinsics
+
+ATanD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL ATanD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: BITest Intrinsic, Next: BJTest Intrinsic, Prev: ATanD Intrinsic, Up: Other Intrinsics
+
+BITest Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL BITest' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: BJTest Intrinsic, Next: CDAbs Intrinsic, Prev: BITest Intrinsic, Up: Other Intrinsics
+
+BJTest Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL BJTest' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: CDAbs Intrinsic, Next: CDCos Intrinsic, Prev: BJTest Intrinsic, Up: Other Intrinsics
+
+CDAbs Intrinsic
+...............
+
+ CDAbs(A)
+
+CDAbs: `REAL(KIND=2)' function.
+
+A: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ Archaic form of `ABS()' that is specific to one type for A. *Note
+Abs Intrinsic::.
+
+\1f
+File: g77.info, Node: CDCos Intrinsic, Next: CDExp Intrinsic, Prev: CDAbs Intrinsic, Up: Other Intrinsics
+
+CDCos Intrinsic
+...............
+
+ CDCos(X)
+
+CDCos: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ Archaic form of `COS()' that is specific to one type for X. *Note
+Cos Intrinsic::.
+
+\1f
+File: g77.info, Node: CDExp Intrinsic, Next: CDLog Intrinsic, Prev: CDCos Intrinsic, Up: Other Intrinsics
+
+CDExp Intrinsic
+...............
+
+ CDExp(X)
+
+CDExp: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ Archaic form of `EXP()' that is specific to one type for X. *Note
+Exp Intrinsic::.
+
+\1f
+File: g77.info, Node: CDLog Intrinsic, Next: CDSin Intrinsic, Prev: CDExp Intrinsic, Up: Other Intrinsics
+
+CDLog Intrinsic
+...............
+
+ CDLog(X)
+
+CDLog: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ Archaic form of `LOG()' that is specific to one type for X. *Note
+Log Intrinsic::.
+
+\1f
+File: g77.info, Node: CDSin Intrinsic, Next: CDSqRt Intrinsic, Prev: CDLog Intrinsic, Up: Other Intrinsics
+
+CDSin Intrinsic
+...............
+
+ CDSin(X)
+
+CDSin: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ Archaic form of `SIN()' that is specific to one type for X. *Note
+Sin Intrinsic::.
+
+\1f
+File: g77.info, Node: CDSqRt Intrinsic, Next: ChDir Intrinsic (function), Prev: CDSin Intrinsic, Up: Other Intrinsics
+
+CDSqRt Intrinsic
+................
+
+ CDSqRt(X)
+
+CDSqRt: `COMPLEX(KIND=2)' function.
+
+X: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ Archaic form of `SQRT()' that is specific to one type for X. *Note
+SqRt Intrinsic::.
+
+\1f
+File: g77.info, Node: ChDir Intrinsic (function), Next: ChMod Intrinsic (function), Prev: CDSqRt Intrinsic, Up: Other Intrinsics
+
+ChDir Intrinsic (function)
+..........................
+
+ ChDir(DIR)
+
+ChDir: `INTEGER(KIND=1)' function.
+
+DIR: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Sets the current working directory to be DIR. Returns 0 on success
+or a non-zero error code. See `chdir(3)'.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note ChDir
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: ChMod Intrinsic (function), Next: CosD Intrinsic, Prev: ChDir Intrinsic (function), Up: Other Intrinsics
+
+ChMod Intrinsic (function)
+..........................
+
+ ChMod(NAME, MODE)
+
+ChMod: `INTEGER(KIND=1)' function.
+
+NAME: `CHARACTER'; scalar; INTENT(IN).
+
+MODE: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Changes the access mode of file NAME according to the specification
+MODE, which is given in the format of `chmod(1)'. A null character
+(`CHAR(0)') marks the end of the name in NAME--otherwise, trailing
+blanks in NAME are ignored. Currently, NAME must not contain the
+single quote character.
+
+ Returns 0 on success or a non-zero error code otherwise.
+
+ Note that this currently works by actually invoking `/bin/chmod' (or
+the `chmod' found when the library was configured) and so may fail in
+some circumstances and will, anyway, be slow.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note ChMod
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: CosD Intrinsic, Next: DACosD Intrinsic, Prev: ChMod Intrinsic (function), Up: Other Intrinsics
+
+CosD Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL CosD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: DACosD Intrinsic, Next: DASinD Intrinsic, Prev: CosD Intrinsic, Up: Other Intrinsics
+
+DACosD Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DACosD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: DASinD Intrinsic, Next: DATan2D Intrinsic, Prev: DACosD Intrinsic, Up: Other Intrinsics
+
+DASinD Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DASinD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: DATan2D Intrinsic, Next: DATanD Intrinsic, Prev: DASinD Intrinsic, Up: Other Intrinsics
+
+DATan2D Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DATan2D' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: DATanD Intrinsic, Next: Date Intrinsic, Prev: DATan2D Intrinsic, Up: Other Intrinsics
+
+DATanD Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DATanD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Date Intrinsic, Next: DbleQ Intrinsic, Prev: DATanD Intrinsic, Up: Other Intrinsics
+
+Date Intrinsic
+..............
+
+ CALL Date(DATE)
+
+DATE: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `vxt'.
+
+Description:
+
+ Returns DATE in the form `DD-MMM-YY', representing the numeric day
+of the month DD, a three-character abbreviation of the month name MMM
+and the last two digits of the year YY, e.g. `25-Nov-96'.
+
+ This intrinsic is not recommended, due to the year 2000 approaching.
+*Note CTime Intrinsic (subroutine)::, for information on obtaining more
+digits for the current (or any) date.
+
+\1f
+File: g77.info, Node: DbleQ Intrinsic, Next: DCmplx Intrinsic, Prev: Date Intrinsic, Up: Other Intrinsics
+
+DbleQ Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DbleQ' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: DCmplx Intrinsic, Next: DConjg Intrinsic, Prev: DbleQ Intrinsic, Up: Other Intrinsics
+
+DCmplx Intrinsic
+................
+
+ DCmplx(X, Y)
+
+DCmplx: `COMPLEX(KIND=2)' function.
+
+X: `INTEGER', `REAL', or `COMPLEX'; scalar; INTENT(IN).
+
+Y: `INTEGER' or `REAL'; OPTIONAL (must be omitted if X is `COMPLEX');
+scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ If X is not type `COMPLEX', constructs a value of type
+`COMPLEX(KIND=2)' from the real and imaginary values specified by X and
+Y, respectively. If Y is omitted, `0D0' is assumed.
+
+ If X is type `COMPLEX', converts it to type `COMPLEX(KIND=2)'.
+
+ Although this intrinsic is not standard Fortran, it is a popular
+extension offered by many compilers that support `DOUBLE COMPLEX',
+since it offers the easiest way to convert to `DOUBLE COMPLEX' without
+using Fortran 90 features (such as the `KIND=' argument to the
+`CMPLX()' intrinsic).
+
+ (`CMPLX(0D0, 0D0)' returns a single-precision `COMPLEX' result, as
+required by standard FORTRAN 77. That's why so many compilers provide
+`DCMPLX()', since `DCMPLX(0D0, 0D0)' returns a `DOUBLE COMPLEX' result.
+Still, `DCMPLX()' converts even `REAL*16' arguments to their `REAL*8'
+equivalents in most dialects of Fortran, so neither it nor `CMPLX()'
+allow easy construction of arbitrary-precision values without
+potentially forcing a conversion involving extending or reducing
+precision. GNU Fortran provides such an intrinsic, called `COMPLEX()'.)
+
+ *Note Complex Intrinsic::, for information on easily constructing a
+`COMPLEX' value of arbitrary precision from `REAL' arguments.
+
+\1f
+File: g77.info, Node: DConjg Intrinsic, Next: DCosD Intrinsic, Prev: DCmplx Intrinsic, Up: Other Intrinsics
+
+DConjg Intrinsic
+................
+
+ DConjg(Z)
+
+DConjg: `COMPLEX(KIND=2)' function.
+
+Z: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ Archaic form of `CONJG()' that is specific to one type for Z. *Note
+Conjg Intrinsic::.
+
+\1f
+File: g77.info, Node: DCosD Intrinsic, Next: DFloat Intrinsic, Prev: DConjg Intrinsic, Up: Other Intrinsics
+
+DCosD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DCosD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: DFloat Intrinsic, Next: DFlotI Intrinsic, Prev: DCosD Intrinsic, Up: Other Intrinsics
+
+DFloat Intrinsic
+................
+
+ DFloat(A)
+
+DFloat: `REAL(KIND=2)' function.
+
+A: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ Archaic form of `REAL()' that is specific to one type for A. *Note
+Real Intrinsic::.
+
+\1f
+File: g77.info, Node: DFlotI Intrinsic, Next: DFlotJ Intrinsic, Prev: DFloat Intrinsic, Up: Other Intrinsics
+
+DFlotI Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DFlotI' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: DFlotJ Intrinsic, Next: DImag Intrinsic, Prev: DFlotI Intrinsic, Up: Other Intrinsics
+
+DFlotJ Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DFlotJ' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: DImag Intrinsic, Next: DReal Intrinsic, Prev: DFlotJ Intrinsic, Up: Other Intrinsics
+
+DImag Intrinsic
+...............
+
+ DImag(Z)
+
+DImag: `REAL(KIND=2)' function.
+
+Z: `COMPLEX(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `vxt'.
+
+Description:
+
+ Archaic form of `AIMAG()' that is specific to one type for Z. *Note
+AImag Intrinsic::.
+
+\1f
+File: g77.info, Node: DReal Intrinsic, Next: DSinD Intrinsic, Prev: DImag Intrinsic, Up: Other Intrinsics
+
+DReal Intrinsic
+...............
+
+ DReal(A)
+
+DReal: `REAL(KIND=2)' function.
+
+A: `INTEGER', `REAL', or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: `vxt'.
+
+Description:
+
+ Converts A to `REAL(KIND=2)'.
+
+ If A is type `COMPLEX', its real part is converted (if necessary) to
+`REAL(KIND=2)', and its imaginary part is disregarded.
+
+ Although this intrinsic is not standard Fortran, it is a popular
+extension offered by many compilers that support `DOUBLE COMPLEX',
+since it offers the easiest way to extract the real part of a `DOUBLE
+COMPLEX' value without using the Fortran 90 `REAL()' intrinsic in a way
+that produces a return value inconsistent with the way many FORTRAN 77
+compilers handle `REAL()' of a `DOUBLE COMPLEX' value.
+
+ *Note RealPart Intrinsic::, for information on a GNU Fortran
+intrinsic that avoids these areas of confusion.
+
+ *Note Dble Intrinsic::, for information on the standard FORTRAN 77
+replacement for `DREAL()'.
+
+ *Note REAL() and AIMAG() of Complex::, for more information on this
+issue.
+
+\1f
+File: g77.info, Node: DSinD Intrinsic, Next: DTanD Intrinsic, Prev: DReal Intrinsic, Up: Other Intrinsics
+
+DSinD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DSinD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: DTanD Intrinsic, Next: Dtime Intrinsic (function), Prev: DSinD Intrinsic, Up: Other Intrinsics
+
+DTanD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL DTanD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Dtime Intrinsic (function), Next: FGet Intrinsic (function), Prev: DTanD Intrinsic, Up: Other Intrinsics
+
+Dtime Intrinsic (function)
+..........................
+
+ Dtime(TARRAY)
+
+Dtime: `REAL(KIND=1)' function.
+
+TARRAY: `REAL(KIND=1)'; DIMENSION(2); INTENT(OUT).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Initially, return the number of seconds of runtime since the start
+of the process's execution as the function value, and the user and
+system components of this in `TARRAY(1)' and `TARRAY(2)' respectively.
+The functions' value is equal to `TARRAY(1) + TARRAY(2)'.
+
+ Subsequent invocations of `DTIME()' return values accumulated since
+the previous invocation.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note Dtime
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: FGet Intrinsic (function), Next: FGetC Intrinsic (function), Prev: Dtime Intrinsic (function), Up: Other Intrinsics
+
+FGet Intrinsic (function)
+.........................
+
+ FGet(C)
+
+FGet: `INTEGER(KIND=1)' function.
+
+C: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Reads a single character into C in stream mode from unit 5
+(by-passing normal formatted input) using `getc(3)'. Returns 0 on
+success, -1 on end-of-file, and the error code from `ferror(3)'
+otherwise.
+
+ Stream I/O should not be mixed with normal record-oriented
+(formatted or unformatted) I/O on the same unit; the results are
+unpredictable.
+
+ For information on other intrinsics with the same name: *Note FGet
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: FGetC Intrinsic (function), Next: FloatI Intrinsic, Prev: FGet Intrinsic (function), Up: Other Intrinsics
+
+FGetC Intrinsic (function)
+..........................
+
+ FGetC(UNIT, C)
+
+FGetC: `INTEGER(KIND=1)' function.
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+C: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Reads a single character into C in stream mode from unit UNIT
+(by-passing normal formatted output) using `getc(3)'. Returns 0 on
+success, -1 on end-of-file, and the error code from `ferror(3)'
+otherwise.
+
+ Stream I/O should not be mixed with normal record-oriented
+(formatted or unformatted) I/O on the same unit; the results are
+unpredictable.
+
+ For information on other intrinsics with the same name: *Note FGetC
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: FloatI Intrinsic, Next: FloatJ Intrinsic, Prev: FGetC Intrinsic (function), Up: Other Intrinsics
+
+FloatI Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL FloatI' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: FloatJ Intrinsic, Next: FPut Intrinsic (function), Prev: FloatI Intrinsic, Up: Other Intrinsics
+
+FloatJ Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL FloatJ' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: FPut Intrinsic (function), Next: FPutC Intrinsic (function), Prev: FloatJ Intrinsic, Up: Other Intrinsics
+
+FPut Intrinsic (function)
+.........................
+
+ FPut(C)
+
+FPut: `INTEGER(KIND=1)' function.
+
+C: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Writes the single character C in stream mode to unit 6 (by-passing
+normal formatted output) using `getc(3)'. Returns 0 on success, the
+error code from `ferror(3)' otherwise.
+
+ Stream I/O should not be mixed with normal record-oriented
+(formatted or unformatted) I/O on the same unit; the results are
+unpredictable.
+
+ For information on other intrinsics with the same name: *Note FPut
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: FPutC Intrinsic (function), Next: IDate Intrinsic (VXT), Prev: FPut Intrinsic (function), Up: Other Intrinsics
+
+FPutC Intrinsic (function)
+..........................
+
+ FPutC(UNIT, C)
+
+FPutC: `INTEGER(KIND=1)' function.
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+C: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Writes the single character C in stream mode to unit UNIT
+(by-passing normal formatted output) using `putc(3)'. Returns 0 on
+success, the error code from `ferror(3)' otherwise.
+
+ Stream I/O should not be mixed with normal record-oriented
+(formatted or unformatted) I/O on the same unit; the results are
+unpredictable.
+
+ For information on other intrinsics with the same name: *Note FPutC
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: IDate Intrinsic (VXT), Next: IIAbs Intrinsic, Prev: FPutC Intrinsic (function), Up: Other Intrinsics
+
+IDate Intrinsic (VXT)
+.....................
+
+ CALL IDate(M, D, Y)
+
+M: `INTEGER(KIND=1)'; scalar; INTENT(OUT).
+
+D: `INTEGER(KIND=1)'; scalar; INTENT(OUT).
+
+Y: `INTEGER(KIND=1)'; scalar; INTENT(OUT).
+
+Intrinsic groups: `vxt'.
+
+Description:
+
+ Returns the numerical values of the current local time. The month
+(in the range 1-12) is returned in M, the day (in the range 1-7) in D,
+and the year in Y (in the range 0-99).
+
+ This intrinsic is not recommended, due to the year 2000 approaching.
+
+ For information on other intrinsics with the same name: *Note IDate
+Intrinsic (UNIX)::.
+
+\1f
+File: g77.info, Node: IIAbs Intrinsic, Next: IIAnd Intrinsic, Prev: IDate Intrinsic (VXT), Up: Other Intrinsics
+
+IIAbs Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIAbs' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIAnd Intrinsic, Next: IIBClr Intrinsic, Prev: IIAbs Intrinsic, Up: Other Intrinsics
+
+IIAnd Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIAnd' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIBClr Intrinsic, Next: IIBits Intrinsic, Prev: IIAnd Intrinsic, Up: Other Intrinsics
+
+IIBClr Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIBClr' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIBits Intrinsic, Next: IIBSet Intrinsic, Prev: IIBClr Intrinsic, Up: Other Intrinsics
+
+IIBits Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIBits' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIBSet Intrinsic, Next: IIDiM Intrinsic, Prev: IIBits Intrinsic, Up: Other Intrinsics
+
+IIBSet Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIBSet' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIDiM Intrinsic, Next: IIDInt Intrinsic, Prev: IIBSet Intrinsic, Up: Other Intrinsics
+
+IIDiM Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIDiM' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIDInt Intrinsic, Next: IIDNnt Intrinsic, Prev: IIDiM Intrinsic, Up: Other Intrinsics
+
+IIDInt Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIDInt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIDNnt Intrinsic, Next: IIEOr Intrinsic, Prev: IIDInt Intrinsic, Up: Other Intrinsics
+
+IIDNnt Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIDNnt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIEOr Intrinsic, Next: IIFix Intrinsic, Prev: IIDNnt Intrinsic, Up: Other Intrinsics
+
+IIEOr Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIEOr' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIFix Intrinsic, Next: IInt Intrinsic, Prev: IIEOr Intrinsic, Up: Other Intrinsics
+
+IIFix Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIFix' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IInt Intrinsic, Next: IIOr Intrinsic, Prev: IIFix Intrinsic, Up: Other Intrinsics
+
+IInt Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IInt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIOr Intrinsic, Next: IIQint Intrinsic, Prev: IInt Intrinsic, Up: Other Intrinsics
+
+IIOr Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIOr' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIQint Intrinsic, Next: IIQNnt Intrinsic, Prev: IIOr Intrinsic, Up: Other Intrinsics
+
+IIQint Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIQint' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIQNnt Intrinsic, Next: IIShftC Intrinsic, Prev: IIQint Intrinsic, Up: Other Intrinsics
+
+IIQNnt Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIQNnt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IIShftC Intrinsic, Next: IISign Intrinsic, Prev: IIQNnt Intrinsic, Up: Other Intrinsics
+
+IIShftC Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IIShftC' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: IISign Intrinsic, Next: IMax0 Intrinsic, Prev: IIShftC Intrinsic, Up: Other Intrinsics
+
+IISign Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IISign' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IMax0 Intrinsic, Next: IMax1 Intrinsic, Prev: IISign Intrinsic, Up: Other Intrinsics
+
+IMax0 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IMax0' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IMax1 Intrinsic, Next: IMin0 Intrinsic, Prev: IMax0 Intrinsic, Up: Other Intrinsics
+
+IMax1 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IMax1' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IMin0 Intrinsic, Next: IMin1 Intrinsic, Prev: IMax1 Intrinsic, Up: Other Intrinsics
+
+IMin0 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IMin0' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IMin1 Intrinsic, Next: IMod Intrinsic, Prev: IMin0 Intrinsic, Up: Other Intrinsics
+
+IMin1 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IMin1' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IMod Intrinsic, Next: INInt Intrinsic, Prev: IMin1 Intrinsic, Up: Other Intrinsics
+
+IMod Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IMod' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: INInt Intrinsic, Next: INot Intrinsic, Prev: IMod Intrinsic, Up: Other Intrinsics
+
+INInt Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL INInt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: INot Intrinsic, Next: IZExt Intrinsic, Prev: INInt Intrinsic, Up: Other Intrinsics
+
+INot Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL INot' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IZExt Intrinsic, Next: JIAbs Intrinsic, Prev: INot Intrinsic, Up: Other Intrinsics
+
+IZExt Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL IZExt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIAbs Intrinsic, Next: JIAnd Intrinsic, Prev: IZExt Intrinsic, Up: Other Intrinsics
+
+JIAbs Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIAbs' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIAnd Intrinsic, Next: JIBClr Intrinsic, Prev: JIAbs Intrinsic, Up: Other Intrinsics
+
+JIAnd Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIAnd' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIBClr Intrinsic, Next: JIBits Intrinsic, Prev: JIAnd Intrinsic, Up: Other Intrinsics
+
+JIBClr Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIBClr' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIBits Intrinsic, Next: JIBSet Intrinsic, Prev: JIBClr Intrinsic, Up: Other Intrinsics
+
+JIBits Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIBits' to use this name for an
+external procedure.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: JIBSet Intrinsic, Next: JIDiM Intrinsic, Prev: JIBits Intrinsic, Up: Other Intrinsics
+
+JIBSet Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIBSet' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIDiM Intrinsic, Next: JIDInt Intrinsic, Prev: JIBSet Intrinsic, Up: Other Intrinsics
+
+JIDiM Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIDiM' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIDInt Intrinsic, Next: JIDNnt Intrinsic, Prev: JIDiM Intrinsic, Up: Other Intrinsics
+
+JIDInt Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIDInt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIDNnt Intrinsic, Next: JIEOr Intrinsic, Prev: JIDInt Intrinsic, Up: Other Intrinsics
+
+JIDNnt Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIDNnt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIEOr Intrinsic, Next: JIFix Intrinsic, Prev: JIDNnt Intrinsic, Up: Other Intrinsics
+
+JIEOr Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIEOr' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIFix Intrinsic, Next: JInt Intrinsic, Prev: JIEOr Intrinsic, Up: Other Intrinsics
+
+JIFix Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIFix' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JInt Intrinsic, Next: JIOr Intrinsic, Prev: JIFix Intrinsic, Up: Other Intrinsics
+
+JInt Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JInt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIOr Intrinsic, Next: JIQint Intrinsic, Prev: JInt Intrinsic, Up: Other Intrinsics
+
+JIOr Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIOr' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIQint Intrinsic, Next: JIQNnt Intrinsic, Prev: JIOr Intrinsic, Up: Other Intrinsics
+
+JIQint Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIQint' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIQNnt Intrinsic, Next: JIShft Intrinsic, Prev: JIQint Intrinsic, Up: Other Intrinsics
+
+JIQNnt Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIQNnt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIShft Intrinsic, Next: JIShftC Intrinsic, Prev: JIQNnt Intrinsic, Up: Other Intrinsics
+
+JIShft Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIShft' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JIShftC Intrinsic, Next: JISign Intrinsic, Prev: JIShft Intrinsic, Up: Other Intrinsics
+
+JIShftC Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIShftC' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: JISign Intrinsic, Next: JMax0 Intrinsic, Prev: JIShftC Intrinsic, Up: Other Intrinsics
+
+JISign Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JISign' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JMax0 Intrinsic, Next: JMax1 Intrinsic, Prev: JISign Intrinsic, Up: Other Intrinsics
+
+JMax0 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JMax0' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JMax1 Intrinsic, Next: JMin0 Intrinsic, Prev: JMax0 Intrinsic, Up: Other Intrinsics
+
+JMax1 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JMax1' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JMin0 Intrinsic, Next: JMin1 Intrinsic, Prev: JMax1 Intrinsic, Up: Other Intrinsics
+
+JMin0 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JMin0' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JMin1 Intrinsic, Next: JMod Intrinsic, Prev: JMin0 Intrinsic, Up: Other Intrinsics
+
+JMin1 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JMin1' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JMod Intrinsic, Next: JNInt Intrinsic, Prev: JMin1 Intrinsic, Up: Other Intrinsics
+
+JMod Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JMod' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JNInt Intrinsic, Next: JNot Intrinsic, Prev: JMod Intrinsic, Up: Other Intrinsics
+
+JNInt Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JNInt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JNot Intrinsic, Next: JZExt Intrinsic, Prev: JNInt Intrinsic, Up: Other Intrinsics
+
+JNot Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JNot' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: JZExt Intrinsic, Next: Kill Intrinsic (function), Prev: JNot Intrinsic, Up: Other Intrinsics
+
+JZExt Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JZExt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Kill Intrinsic (function), Next: Link Intrinsic (function), Prev: JZExt Intrinsic, Up: Other Intrinsics
+
+Kill Intrinsic (function)
+.........................
+
+ Kill(PID, SIGNAL)
+
+Kill: `INTEGER(KIND=1)' function.
+
+PID: `INTEGER'; scalar; INTENT(IN).
+
+SIGNAL: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Sends the signal specified by SIGNAL to the process PID. Returns 0
+on success or a non-zero error code. See `kill(2)'.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note Kill
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: Link Intrinsic (function), Next: QAbs Intrinsic, Prev: Kill Intrinsic (function), Up: Other Intrinsics
+
+Link Intrinsic (function)
+.........................
+
+ Link(PATH1, PATH2)
+
+Link: `INTEGER(KIND=1)' function.
+
+PATH1: `CHARACTER'; scalar; INTENT(IN).
+
+PATH2: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Makes a (hard) link from file PATH1 to PATH2. A null character
+(`CHAR(0)') marks the end of the names in PATH1 and PATH2--otherwise,
+trailing blanks in PATH1 and PATH2 are ignored. Returns 0 on success
+or a non-zero error code. See `link(2)'.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note Link
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: QAbs Intrinsic, Next: QACos Intrinsic, Prev: Link Intrinsic (function), Up: Other Intrinsics
+
+QAbs Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QAbs' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QACos Intrinsic, Next: QACosD Intrinsic, Prev: QAbs Intrinsic, Up: Other Intrinsics
+
+QACos Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QACos' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QACosD Intrinsic, Next: QASin Intrinsic, Prev: QACos Intrinsic, Up: Other Intrinsics
+
+QACosD Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QACosD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QASin Intrinsic, Next: QASinD Intrinsic, Prev: QACosD Intrinsic, Up: Other Intrinsics
+
+QASin Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QASin' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QASinD Intrinsic, Next: QATan Intrinsic, Prev: QASin Intrinsic, Up: Other Intrinsics
+
+QASinD Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QASinD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QATan Intrinsic, Next: QATan2 Intrinsic, Prev: QASinD Intrinsic, Up: Other Intrinsics
+
+QATan Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QATan' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QATan2 Intrinsic, Next: QATan2D Intrinsic, Prev: QATan Intrinsic, Up: Other Intrinsics
+
+QATan2 Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QATan2' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QATan2D Intrinsic, Next: QATanD Intrinsic, Prev: QATan2 Intrinsic, Up: Other Intrinsics
+
+QATan2D Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QATan2D' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: QATanD Intrinsic, Next: QCos Intrinsic, Prev: QATan2D Intrinsic, Up: Other Intrinsics
+
+QATanD Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QATanD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QCos Intrinsic, Next: QCosD Intrinsic, Prev: QATanD Intrinsic, Up: Other Intrinsics
+
+QCos Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QCos' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QCosD Intrinsic, Next: QCosH Intrinsic, Prev: QCos Intrinsic, Up: Other Intrinsics
+
+QCosD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QCosD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QCosH Intrinsic, Next: QDiM Intrinsic, Prev: QCosD Intrinsic, Up: Other Intrinsics
+
+QCosH Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QCosH' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QDiM Intrinsic, Next: QExp Intrinsic, Prev: QCosH Intrinsic, Up: Other Intrinsics
+
+QDiM Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QDiM' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QExp Intrinsic, Next: QExt Intrinsic, Prev: QDiM Intrinsic, Up: Other Intrinsics
+
+QExp Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QExp' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QExt Intrinsic, Next: QExtD Intrinsic, Prev: QExp Intrinsic, Up: Other Intrinsics
+
+QExt Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QExt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QExtD Intrinsic, Next: QFloat Intrinsic, Prev: QExt Intrinsic, Up: Other Intrinsics
+
+QExtD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QExtD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QFloat Intrinsic, Next: QInt Intrinsic, Prev: QExtD Intrinsic, Up: Other Intrinsics
+
+QFloat Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QFloat' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QInt Intrinsic, Next: QLog Intrinsic, Prev: QFloat Intrinsic, Up: Other Intrinsics
+
+QInt Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QInt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QLog Intrinsic, Next: QLog10 Intrinsic, Prev: QInt Intrinsic, Up: Other Intrinsics
+
+QLog Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QLog' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QLog10 Intrinsic, Next: QMax1 Intrinsic, Prev: QLog Intrinsic, Up: Other Intrinsics
+
+QLog10 Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QLog10' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QMax1 Intrinsic, Next: QMin1 Intrinsic, Prev: QLog10 Intrinsic, Up: Other Intrinsics
+
+QMax1 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QMax1' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QMin1 Intrinsic, Next: QMod Intrinsic, Prev: QMax1 Intrinsic, Up: Other Intrinsics
+
+QMin1 Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QMin1' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QMod Intrinsic, Next: QNInt Intrinsic, Prev: QMin1 Intrinsic, Up: Other Intrinsics
+
+QMod Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QMod' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QNInt Intrinsic, Next: QSin Intrinsic, Prev: QMod Intrinsic, Up: Other Intrinsics
+
+QNInt Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QNInt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QSin Intrinsic, Next: QSinD Intrinsic, Prev: QNInt Intrinsic, Up: Other Intrinsics
+
+QSin Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QSin' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QSinD Intrinsic, Next: QSinH Intrinsic, Prev: QSin Intrinsic, Up: Other Intrinsics
+
+QSinD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QSinD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QSinH Intrinsic, Next: QSqRt Intrinsic, Prev: QSinD Intrinsic, Up: Other Intrinsics
+
+QSinH Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QSinH' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QSqRt Intrinsic, Next: QTan Intrinsic, Prev: QSinH Intrinsic, Up: Other Intrinsics
+
+QSqRt Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QSqRt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QTan Intrinsic, Next: QTanD Intrinsic, Prev: QSqRt Intrinsic, Up: Other Intrinsics
+
+QTan Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QTan' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QTanD Intrinsic, Next: QTanH Intrinsic, Prev: QTan Intrinsic, Up: Other Intrinsics
+
+QTanD Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QTanD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: QTanH Intrinsic, Next: Rename Intrinsic (function), Prev: QTanD Intrinsic, Up: Other Intrinsics
+
+QTanH Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL QTanH' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Rename Intrinsic (function), Next: Secnds Intrinsic, Prev: QTanH Intrinsic, Up: Other Intrinsics
+
+Rename Intrinsic (function)
+...........................
+
+ Rename(PATH1, PATH2)
+
+Rename: `INTEGER(KIND=1)' function.
+
+PATH1: `CHARACTER'; scalar; INTENT(IN).
+
+PATH2: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Renames the file PATH1 to PATH2. A null character (`CHAR(0)') marks
+the end of the names in PATH1 and PATH2--otherwise, trailing blanks in
+PATH1 and PATH2 are ignored. See `rename(2)'. Returns 0 on success or
+a non-zero error code.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note Rename
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: Secnds Intrinsic, Next: Signal Intrinsic (function), Prev: Rename Intrinsic (function), Up: Other Intrinsics
+
+Secnds Intrinsic
+................
+
+ Secnds(T)
+
+Secnds: `REAL(KIND=1)' function.
+
+T: `REAL(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: `vxt'.
+
+Description:
+
+ Returns the local time in seconds since midnight minus the value T.
+
+\1f
+File: g77.info, Node: Signal Intrinsic (function), Next: SinD Intrinsic, Prev: Secnds Intrinsic, Up: Other Intrinsics
+
+Signal Intrinsic (function)
+...........................
+
+ Signal(NUMBER, HANDLER)
+
+Signal: `INTEGER(KIND=1)' function.
+
+NUMBER: `INTEGER'; scalar; INTENT(IN).
+
+HANDLER: Signal handler (`INTEGER FUNCTION' or `SUBROUTINE') or
+dummy/global `INTEGER(KIND=1)' scalar.
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ If HANDLER is a an `EXTERNAL' routine, arranges for it to be invoked
+with a single integer argument (of system-dependent length) when signal
+NUMBER occurs. If NUMBER is an integer, it can be used to turn off
+handling of signal HANDLER or revert to its default action. See
+`signal(2)'.
+
+ Note that HANDLER will be called using C conventions, so its value in
+Fortran terms is obtained by applying `%LOC()' (or LOC()) to it.
+
+ The value returned by `signal(2)' is returned.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note Signal
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: SinD Intrinsic, Next: SnglQ Intrinsic, Prev: Signal Intrinsic (function), Up: Other Intrinsics
+
+SinD Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL SinD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: SnglQ Intrinsic, Next: SymLnk Intrinsic (function), Prev: SinD Intrinsic, Up: Other Intrinsics
+
+SnglQ Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL SnglQ' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: SymLnk Intrinsic (function), Next: System Intrinsic (function), Prev: SnglQ Intrinsic, Up: Other Intrinsics
+
+SymLnk Intrinsic (function)
+...........................
+
+ SymLnk(PATH1, PATH2)
+
+SymLnk: `INTEGER(KIND=1)' function.
+
+PATH1: `CHARACTER'; scalar; INTENT(IN).
+
+PATH2: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Makes a symbolic link from file PATH1 to PATH2. A null character
+(`CHAR(0)') marks the end of the names in PATH1 and PATH2--otherwise,
+trailing blanks in PATH1 and PATH2 are ignored. Returns 0 on success
+or a non-zero error code (`ENOSYS' if the system does not provide
+`symlink(2)').
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note SymLnk
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: System Intrinsic (function), Next: TanD Intrinsic, Prev: SymLnk Intrinsic (function), Up: Other Intrinsics
+
+System Intrinsic (function)
+...........................
+
+ System(COMMAND)
+
+System: `INTEGER(KIND=1)' function.
+
+COMMAND: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Passes the command COMMAND to a shell (see `system(3)'). Returns
+the value returned by `system(3)', presumably 0 if the shell command
+succeeded. Note that which shell is used to invoke the command is
+system-dependent and environment-dependent.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended. However, the function form can be valid in
+cases where the actual side effects performed by the call are
+unimportant to the application.
+
+ For example, on a UNIX system, `SAME = SYSTEM('cmp a b')' does not
+perform any side effects likely to be important to the program, so the
+programmer would not care if the actual system call (and invocation of
+`cmp') was optimized away in a situation where the return value could
+be determined otherwise, or was not actually needed (`SAME' not
+actually referenced after the sample assignment statement).
+
+ For information on other intrinsics with the same name: *Note System
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: TanD Intrinsic, Next: Time Intrinsic (VXT), Prev: System Intrinsic (function), Up: Other Intrinsics
+
+TanD Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL TanD' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Time Intrinsic (VXT), Next: UMask Intrinsic (function), Prev: TanD Intrinsic, Up: Other Intrinsics
+
+Time Intrinsic (VXT)
+....................
+
+ CALL Time(TIME)
+
+TIME: `CHARACTER*8'; scalar; INTENT(OUT).
+
+Intrinsic groups: `vxt'.
+
+Description:
+
+ Returns in TIME a character representation of the current time as
+obtained from `ctime(3)'.
+
+ *Note Fdate Intrinsic (subroutine):: for an equivalent routine.
+
+ For information on other intrinsics with the same name: *Note Time
+Intrinsic (UNIX)::.
+
+\1f
+File: g77.info, Node: UMask Intrinsic (function), Next: Unlink Intrinsic (function), Prev: Time Intrinsic (VXT), Up: Other Intrinsics
+
+UMask Intrinsic (function)
+..........................
+
+ UMask(MASK)
+
+UMask: `INTEGER(KIND=1)' function.
+
+MASK: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Sets the file creation mask to MASK and returns the old value. See
+`umask(2)'.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note UMask
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: Unlink Intrinsic (function), Next: ZExt Intrinsic, Prev: UMask Intrinsic (function), Up: Other Intrinsics
+
+Unlink Intrinsic (function)
+...........................
+
+ Unlink(FILE)
+
+Unlink: `INTEGER(KIND=1)' function.
+
+FILE: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `badu77'.
+
+Description:
+
+ Unlink the file FILE. A null character (`CHAR(0)') marks the end of
+the name in FILE--otherwise, trailing blanks in FILE are ignored.
+Returns 0 on success or a non-zero error code. See `unlink(2)'.
+
+ Due to the side effects performed by this intrinsic, the function
+form is not recommended.
+
+ For information on other intrinsics with the same name: *Note Unlink
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: ZExt Intrinsic, Prev: Unlink Intrinsic (function), Up: Other Intrinsics
+
+ZExt Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL ZExt' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Other Compilers, Next: Other Languages, Prev: Other Dialects, Up: Top
+
+Other Compilers
+***************
+
+ An individual Fortran source file can be compiled to an object
+(`*.o') file instead of to the final program executable. This allows
+several portions of a program to be compiled at different times and
+linked together whenever a new version of the program is needed.
+However, it introduces the issue of "object compatibility" across the
+various object files (and libraries, or `*.a' files) that are linked
+together to produce any particular executable file.
+
+ Object compatibility is an issue when combining, in one program,
+Fortran code compiled by more than one compiler (or more than one
+configuration of a compiler). If the compilers disagree on how to
+transform the names of procedures, there will normally be errors when
+linking such programs. Worse, if the compilers agree on naming, but
+disagree on issues like how to pass parameters, return arguments, and
+lay out `COMMON' areas, the earliest detected errors might be the
+incorrect results produced by the program (and that assumes these
+errors are detected, which is not always the case).
+
+ Normally, `g77' generates code that is object-compatible with code
+generated by a version of `f2c' configured (with, for example, `f2c.h'
+definitions) to be generally compatible with `g77' as built by `gcc'.
+(Normally, `f2c' will, by default, conform to the appropriate
+configuration, but it is possible that older or perhaps even newer
+versions of `f2c', or versions having certain configuration changes to
+`f2c' internals, will produce object files that are incompatible with
+`g77'.)
+
+ For example, a Fortran string subroutine argument will become two
+arguments on the C side: a `char *' and an `int' length.
+
+ Much of this compatibility results from the fact that `g77' uses the
+same run-time library, `libf2c', used by `f2c'.
+
+ Other compilers might or might not generate code that is
+object-compatible with `libf2c' and current `g77', and some might offer
+such compatibility only when explicitly selected via a command-line
+option to the compiler.
+
+ *Note: This portion of the documentation definitely needs a lot of
+work!*
+
+* Menu:
+
+* Dropping f2c Compatibility:: When speed is more important.
+* Compilers Other Than f2c:: Interoperation with code from other compilers.
+
+\1f
+File: g77.info, Node: Dropping f2c Compatibility, Next: Compilers Other Than f2c, Up: Other Compilers
+
+Dropping `f2c' Compatibility
+============================
+
+ Specifying `-fno-f2c' allows `g77' to generate, in some cases,
+faster code, by not needing to allow to the possibility of linking with
+code compiled by `f2c'.
+
+ For example, this affects how `REAL(KIND=1)', `COMPLEX(KIND=1)', and
+`COMPLEX(KIND=2)' functions are called. With `-fno-f2c', they are
+compiled as returning the appropriate `gcc' type (`float', `__complex__
+float', `__complex__ double', in many configurations).
+
+ With `-ff2c' in force, they are compiled differently (with perhaps
+slower run-time performance) to accommodate the restrictions inherent
+in `f2c''s use of K&R C as an intermediate language--`REAL(KIND=1)'
+functions return C's `double' type, while `COMPLEX' functions return
+`void' and use an extra argument pointing to a place for the functions
+to return their values.
+
+ It is possible that, in some cases, leaving `-ff2c' in force might
+produce faster code than using `-fno-f2c'. Feel free to experiment,
+but remember to experiment with changing the way *entire programs and
+their Fortran libraries are compiled* at a time, since this sort of
+experimentation affects the interface of code generated for a Fortran
+source file--that is, it affects object compatibility.
+
+ Note that `f2c' compatibility is a fairly static target to achieve,
+though not necessarily perfectly so, since, like `g77', it is still
+being improved. However, specifying `-fno-f2c' causes `g77' to
+generate code that will probably be incompatible with code generated by
+future versions of `g77' when the same option is in force. You should
+make sure you are always able to recompile complete programs from
+source code when upgrading to new versions of `g77' or `f2c',
+especially when using options such as `-fno-f2c'.
+
+ Therefore, if you are using `g77' to compile libraries and other
+object files for possible future use and you don't want to require
+recompilation for future use with subsequent versions of `g77', you
+might want to stick with `f2c' compatibility for now, and carefully
+watch for any announcements about changes to the `f2c'/`libf2c'
+interface that might affect existing programs (thus requiring
+recompilation).
+
+ It is probable that a future version of `g77' will not, by default,
+generate object files compatible with `f2c', and that version probably
+would no longer use `libf2c'. If you expect to depend on this
+compatibility in the long term, use the options `-ff2c -ff2c-library'
+when compiling all of the applicable code. This should cause future
+versions of `g77' either to produce compatible code (at the expense of
+the availability of some features and performance), or at the very
+least, to produce diagnostics.
+
+\1f
+File: g77.info, Node: Compilers Other Than f2c, Prev: Dropping f2c Compatibility, Up: Other Compilers
+
+Compilers Other Than `f2c'
+==========================
+
+ On systems with Fortran compilers other than `f2c' and `g77', code
+compiled by `g77' is not expected to work well with code compiled by
+the native compiler. (This is true for `f2c'-compiled objects as
+well.) Libraries compiled with the native compiler probably will have
+to be recompiled with `g77' to be used with `g77'-compiled code.
+
+ Reasons for such incompatibilities include:
+
+ * There might be differences in the way names of Fortran procedures
+ are translated for use in the system's object-file format. For
+ example, the statement `CALL FOO' might be compiled by `g77' to
+ call a procedure the linker `ld' sees given the name `_foo_',
+ while the apparently corresponding statement `SUBROUTINE FOO'
+ might be compiled by the native compiler to define the
+ linker-visible name `_foo', or `_FOO_', and so on.
+
+ * There might be subtle type mismatches which cause subroutine
+ arguments and function return values to get corrupted.
+
+ This is why simply getting `g77' to transform procedure names the
+ same way a native compiler does is not usually a good idea--unless
+ some effort has been made to ensure that, aside from the way the
+ two compilers transform procedure names, everything else about the
+ way they generate code for procedure interfaces is identical.
+
+ * Native compilers use libraries of private I/O routines which will
+ not be available at link time unless you have the native
+ compiler--and you would have to explicitly ask for them.
+
+ For example, on the Sun you would have to add `-L/usr/lang/SCx.x
+ -lF77 -lV77' to the link command.
+
+\1f
+File: g77.info, Node: Other Languages, Next: Installation, Prev: Other Compilers, Up: Top
+
+Other Languages
+***************
+
+ *Note: This portion of the documentation definitely needs a lot of
+work!*
+
+* Menu:
+
+* Interoperating with C and C++::
+
+\1f
+File: g77.info, Node: Interoperating with C and C++, Up: Other Languages
+
+Tools and advice for interoperating with C and C++
+==================================================
+
+ The following discussion assumes that you are running `g77' in `f2c'
+compatibility mode, i.e. not using `-fno-f2c'. It provides some advice
+about quick and simple techniques for linking Fortran and C (or C++),
+the most common requirement. For the full story consult the
+description of code generation. *Note Debugging and Interfacing::.
+
+ When linking Fortran and C, it's usually best to use `g77' to do the
+linking so that the correct libraries are included (including the maths
+one). If you're linking with C++ you will want to add `-lstdc++',
+`-lg++' or whatever. If you need to use another driver program (or
+`ld' directly), you can find out what linkage options `g77' passes by
+running `g77 -v'.
+
+* Menu:
+
+* C Interfacing Tools::
+* C Access to Type Information::
+* f2c Skeletons and Prototypes::
+* C++ Considerations::
+* Startup Code::
+
+\1f
+File: g77.info, Node: C Interfacing Tools, Next: C Access to Type Information, Up: Interoperating with C and C++
+
+C Interfacing Tools
+-------------------
+
+ Even if you don't actually use it as a compiler, `f2c' from
+`ftp://ftp.netlib.org/f2c/src', can be a useful tool when you're
+interfacing (linking) Fortran and C. *Note Generating Skeletons and
+Prototypes with `f2c': f2c Skeletons and Prototypes.
+
+ To use `f2c' for this purpose you only need retrieve and build the
+`src' directory from the distribution, consult the `README'
+instructions there for machine-specifics, and install the `f2c' program
+on your path.
+
+ Something else that might be useful is `cfortran.h' from
+`ftp://zebra/desy.de/cfortran'. This is a fairly general tool which
+can be used to generate interfaces for calling in both directions
+between Fortran and C. It can be used in `f2c' mode with
+`g77'--consult its documentation for details.
+
+\1f
+File: g77.info, Node: C Access to Type Information, Next: f2c Skeletons and Prototypes, Prev: C Interfacing Tools, Up: Interoperating with C and C++
+
+Accessing Type Information in C
+-------------------------------
+
+ Generally, C code written to link with `g77' code--calling and/or
+being called from Fortran--should `#include <f2c.h>' to define the C
+versions of the Fortran types. Don't assume Fortran `INTEGER' types
+correspond to C `int's, for instance; instead, declare them as
+`integer', a type defined by `f2c.h'. `f2c.h' is installed where `gcc'
+will find it by default, assuming you use a copy of `gcc' compatible
+with `g77', probably built at the same time as `g77'.
+
+\1f
+File: g77.info, Node: f2c Skeletons and Prototypes, Next: C++ Considerations, Prev: C Access to Type Information, Up: Interoperating with C and C++
+
+Generating Skeletons and Prototypes with `f2c'
+----------------------------------------------
+
+ A simple and foolproof way to write `g77'-callable C routines--e.g.
+to interface with an existing library--is to write a file (named, for
+example, `fred.f') of dummy Fortran skeletons comprising just the
+declaration of the routine(s) and dummy arguments plus `END' statements.
+Then run `f2c' on file `fred.f' to produce `fred.c' into which you can
+edit useful code, confident the calling sequence is correct, at least.
+(There are some errors otherwise commonly made in generating C
+interfaces with f2c conventions, such as not using `doublereal' as the
+return type of a `REAL' `FUNCTION'.)
+
+ `f2c' also can help with calling Fortran from C, using its `-P'
+option to generate C prototypes appropriate for calling the Fortran.(1)
+If the Fortran code containing any routines to be called from C is in
+file `joe.f', use the command `f2c -P joe.f' to generate the file
+`joe.P' containing prototype information. `#include' this in the C
+which has to call the Fortran routines to make sure you get it right.
+
+ *Note Arrays (DIMENSION: Arrays, for information on the differences
+between the way Fortran (including compilers like `g77') and C handle
+arrays.
+
+ ---------- Footnotes ----------
+
+ (1) The files generated like this can also be used for inter-unit
+consistency checking of dummy and actual arguments, although the
+`ftnchek' tool from `ftp://ftp.netlib.org/fortran' or
+`ftp://ftp.dsm.fordham.edu' is probably better for this purpose.
+
+\1f
+File: g77.info, Node: C++ Considerations, Next: Startup Code, Prev: f2c Skeletons and Prototypes, Up: Interoperating with C and C++
+
+C++ Considerations
+------------------
+
+ `f2c' can be used to generate suitable code for compilation with a
+C++ system using the `-C++' option. The important thing about linking
+`g77'-compiled code with C++ is that the prototypes for the `g77'
+routines must specify C linkage to avoid name mangling. So, use an
+`extern "C"' declaration. `f2c''s `-C++' option will take care of this
+when generating skeletons or prototype files as above, and also avoid
+clashes with C++ reserved words in addition to those in C.
+
+\1f
+File: g77.info, Node: Startup Code, Prev: C++ Considerations, Up: Interoperating with C and C++
+
+Startup Code
+------------
+
+ Unlike with some runtime systems, it shouldn't be necessary (unless
+there are bugs) to use a Fortran main program to ensure the
+runtime--specifically the i/o system--is initialized. However, to use
+the `g77' intrinsics `GETARG()' and `IARGC()' the `main()' routine from
+the `libf2c' library must be used, either explicitly or implicitly by
+using a Fortran main program. This `main()' program calls `MAIN__()'
+(where the names are C-type `extern' names, i.e. not mangled). You
+need to provide this nullary procedure as the entry point for your C
+code if using `libf2c''s `main'. In some cases it might be necessary to
+provide a dummy version of this to avoid linkers complaining about
+failure to resolve `MAIN__()' if linking against `libf2c' and not using
+`main()' from it.
+
+\1f
+File: g77.info, Node: Installation, Next: Debugging and Interfacing, Prev: Other Languages, Up: Top
+
+Installing GNU Fortran
+**********************
+
+ The following information describes how to install `g77'.
+
+ The information in this file generally pertains to dealing with
+*source* distributions of `g77' and `gcc'. It is possible that some of
+this information will be applicable to some *binary* distributions of
+these products--however, since these distributions are not made by the
+maintainers of `g77', responsibility for binary distributions rests with
+whoever built and first distributed them.
+
+ Nevertheless, efforts to make `g77' easier to both build and install
+from source and package up as a binary distribution are ongoing.
+
+* Menu:
+
+* Prerequisites:: Make sure your system is ready for `g77'.
+* Problems Installing:: Known trouble areas.
+* Settings:: Changing `g77' internals before building.
+* Quick Start:: The easier procedure for non-experts.
+* Complete Installation:: For experts, or those who want to be: the details.
+* Distributing Binaries:: If you plan on distributing your `g77'.
+
+\1f
+File: g77.info, Node: Prerequisites, Next: Problems Installing, Up: Installation
+
+Prerequisites
+=============
+
+ The procedures described to unpack, configure, build, and install
+`g77' assume your system has certain programs already installed.
+
+ The following prerequisites should be met by your system before you
+follow the `g77' installation instructions:
+
+`gzip'
+ To unpack the `gcc' and `g77' distributions, you'll need the
+ `gunzip' utility in the `gzip' distribution. Most UNIX systems
+ already have `gzip' installed. If yours doesn't, you can get it
+ from the FSF.
+
+ Note that you'll need `tar' and other utilities as well, but all
+ UNIX systems have these. There are GNU versions of all these
+ available--in fact, a complete GNU UNIX system can be put together
+ on most systems, if desired.
+
+ The version of GNU `gzip' used to package this release is 1.24.
+ (The version of GNU `tar' used to package this release is 1.11.2.)
+
+`gcc-2.7.2.3.tar.gz'
+ You need to have this, or some other applicable, version of `gcc'
+ on your system. The version should be an exact copy of a
+ distribution from the FSF. Its size is approximately 7.1MB.
+
+ If you've already unpacked `gcc-2.7.2.3.tar.gz' into a directory
+ (named `gcc-2.7.2.3') called the "source tree" for `gcc', you can
+ delete the distribution itself, but you'll need to remember to
+ skip any instructions to unpack this distribution.
+
+ Without an applicable `gcc' source tree, you cannot build `g77'.
+ You can obtain an FSF distribution of `gcc' from the FSF.
+
+`g77-0.5.21.tar.gz'
+ You probably have already unpacked this package, or you are
+ reading an advance copy of these installation instructions, which
+ are contained in this distribution. The size of this package is
+ approximately 1.5MB.
+
+ You can obtain an FSF distribution of `g77' from the FSF, the same
+ way you obtained `gcc'.
+
+Enough disk space
+ The amount of disk space needed to unpack, build, install, and use
+ `g77' depends on the type of system you're using, how you build
+ `g77', and how much of it you install (primarily, which languages
+ you install).
+
+ The sizes shown below assume all languages distributed in
+ `gcc-2.7.2.3', plus `g77', will be built and installed. These
+ sizes are indicative of GNU/Linux systems on Intel x86 running
+ COFF and on Digital Alpha (AXP) systems running ELF. These should
+ be fairly representative of 32-bit and 64-bit systems,
+ respectively.
+
+ Note that all sizes are approximate and subject to change without
+ notice! They are based on preliminary releases of g77 made shortly
+ before the public beta release.
+
+ -- `gcc' and `g77' distributions occupy 8.6MB packed, 35MB
+ unpacked. These consist of the source code and documentation,
+ plus some derived files (mostly documentation), for `gcc' and
+ `g77'. Any deviations from these numbers for different kinds
+ of systems are likely to be very minor.
+
+ -- A "bootstrap" build requires an additional 67.3MB for a
+ total of 102MB on an ix86, and an additional 98MB for a total
+ of 165MB on an Alpha.
+
+ -- Removing `gcc/stage1' after the build recovers 10.7MB for a
+ total of 91MB on an ix86, and recovers ??MB for a total of
+ ??MB on an Alpha.
+
+ After doing this, the integrity of the build can still be
+ verified via `make compare', and the `gcc' compiler modified
+ and used to build itself for testing fairly quickly, using
+ the copy of the compiler kept in `gcc/stage2'.
+
+ -- Removing `gcc/stage2' after the build further recovers
+ 27.3MB for a total of 64.3MB, and recovers ??MB for a total
+ of ??MB on an Alpha.
+
+ After doing this, the compiler can still be installed,
+ especially if GNU `make' is used to avoid gratuitous rebuilds
+ (or, the installation can be done by hand).
+
+ -- Installing `gcc' and `g77' copies 14.9MB onto the `--prefix'
+ disk for a total of 79.2MB on an ix86, and copies ??MB onto
+ the `--prefix' disk for a total of ??MB on an Alpha.
+
+ After installation, if no further modifications and builds of
+ `gcc' or `g77' are planned, the source and build directory may be
+ removed, leaving the total impact on a system's disk storage as
+ that of the amount copied during installation.
+
+ Systems with the appropriate version of `gcc' installed don't
+ require the complete bootstrap build. Doing a "straight build"
+ requires about as much space as does a bootstrap build followed by
+ removing both the `gcc/stage1' and `gcc/stage2' directories.
+
+ Installing `gcc' and `g77' over existing versions might require
+ less *new* disk space, but note that, unlike many products, `gcc'
+ installs itself in a way that avoids overwriting other installed
+ versions of itself, so that other versions may easily be invoked
+ (via `gcc -V VERSION').
+
+ So, the amount of space saved as a result of having an existing
+ version of `gcc' and `g77' already installed is not
+ much--typically only the command drivers (`gcc', `g77', `g++', and
+ so on, which are small) and the documentation is overwritten by
+ the new installation. The rest of the new installation is done
+ without replacing existing installed versions (assuming they have
+ different version numbers).
+
+`patch'
+ Although you can do everything `patch' does yourself, by hand,
+ without much trouble, having `patch' installed makes installation
+ of new versions of GNU utilities such as `g77' so much easier that
+ it is worth getting. You can obtain `patch' the same way you
+ obtained `gcc' and `g77'.
+
+ In any case, you can apply patches by hand--patch files are
+ designed for humans to read them.
+
+ The version of GNU `patch' used to develop this release is 2.4.
+
+`make'
+ Your system must have `make', and you will probably save yourself
+ a lot of trouble if it is GNU `make' (sometimes referred to as
+ `gmake').
+
+ The version of GNU `make' used to develop this release is 3.73.
+
+`cc'
+ Your system must have a working C compiler.
+
+ *Note Installing GNU CC: (gcc)Installation, for more information
+ on prerequisites for installing `gcc'.
+
+`bison'
+ If you do not have `bison' installed, you can usually work around
+ any need for it, since `g77' itself does not use it, and `gcc'
+ normally includes all files generated by running it in its
+ distribution. You can obtain `bison' the same way you obtained
+ `gcc' and `g77'.
+
+ The version of GNU `bison' used to develop this release is 1.25.
+
+ *Note Missing bison?::, for information on how to work around not
+ having `bison'.
+
+`makeinfo'
+ If you are missing `makeinfo', you can usually work around any
+ need for it. You can obtain `makeinfo' the same way you obtained
+ `gcc' and `g77'.
+
+ The version of GNU `makeinfo' used to develop this release is
+ 1.68, from GNU `texinfo' version 3.11.
+
+ *Note Missing makeinfo?::, for information on getting around the
+ lack of `makeinfo'.
+
+`sed'
+ All UNIX systems have `sed', but some have a broken version that
+ cannot handle configuring, building, or installing `gcc' or `g77'.
+
+ The version of GNU `sed' used to develop this release is 2.05.
+ (Note that GNU `sed' version 3.0 was withdrawn by the FSF--if you
+ happen to have this version installed, replace it with version
+ 2.05 immediately. See a GNU distribution site for further
+ explanation.)
+
+`root' access or equivalent
+ To perform the complete installation procedures on a system, you
+ need to have `root' access to that system, or equivalent access to
+ the `--prefix' directory tree specified on the `configure' command
+ line.
+
+ Portions of the procedure (such as configuring and building `g77')
+ can be performed by any user with enough disk space and virtual
+ memory.
+
+ However, these instructions are oriented towards less-experienced
+ users who want to install `g77' on their own personal systems.
+
+ System administrators with more experience will want to determine
+ for themselves how they want to modify the procedures described
+ below to suit the needs of their installation.
+
+\1f
+File: g77.info, Node: Problems Installing, Next: Settings, Prev: Prerequisites, Up: Installation
+
+Problems Installing
+===================
+
+ This is a list of problems (and some apparent problems which don't
+really mean anything is wrong) that show up when configuring, building,
+installing, or porting GNU Fortran.
+
+ *Note Installation Problems: (gcc)Installation Problems, for more
+information on installation problems that can afflict either `gcc' or
+`g77'.
+
+* Menu:
+
+* General Problems:: Problems afflicting most or all systems.
+* Cross-compiler Problems:: Problems afflicting cross-compilation setups.
+
+\1f
+File: g77.info, Node: General Problems, Next: Cross-compiler Problems, Up: Problems Installing
+
+General Problems
+----------------
+
+ These problems can occur on most or all systems.
+
+* Menu:
+
+* GNU C Required:: Why even ANSI C is not enough.
+* Patching GNU CC Necessary:: Why `gcc' must be patched first.
+* Building GNU CC Necessary:: Why you can't build *just* Fortran.
+* Missing strtoul:: If linking `f771' fails due to an
+ unresolved reference to `strtoul'.
+* Object File Differences:: It's okay that `make compare' will
+ flag `f/zzz.o'.
+* Cleanup Kills Stage Directories:: A minor nit for `g77' developers.
+* Missing gperf?:: When building requires `gperf'.
+
+\1f
+File: g77.info, Node: GNU C Required, Next: Patching GNU CC Necessary, Up: General Problems
+
+GNU C Required
+..............
+
+ Compiling `g77' requires GNU C, not just ANSI C. Fixing this
+wouldn't be very hard (just tedious), but the code using GNU extensions
+to the C language is expected to be rewritten for 0.6 anyway, so there
+are no plans for an interim fix.
+
+ This requirement does not mean you must already have `gcc' installed
+to build `g77'. As long as you have a working C compiler, you can use a
+bootstrap build to automate the process of first building `gcc' using
+the working C compiler you have, then building `g77' and rebuilding
+`gcc' using that just-built `gcc', and so on.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Patching GNU CC Necessary, Next: Building GNU CC Necessary, Prev: GNU C Required, Up: General Problems
+
+Patching GNU CC Necessary
+.........................
+
+ `g77' currently requires application of a patch file to the gcc
+compiler tree. The necessary patches should be folded in to the
+mainline gcc distribution.
+
+ Some combinations of versions of `g77' and `gcc' might actually
+*require* no patches, but the patch files will be provided anyway as
+long as there are more changes expected in subsequent releases. These
+patch files might contain unnecessary, but possibly helpful, patches.
+As a result, it is possible this issue might never be resolved, except
+by eliminating the need for the person configuring `g77' to apply a
+patch by hand, by going to a more automated approach (such as
+configure-time patching).
+
+\1f
+File: g77.info, Node: Building GNU CC Necessary, Next: Missing strtoul, Prev: Patching GNU CC Necessary, Up: General Problems
+
+Building GNU CC Necessary
+.........................
+
+ It should be possible to build the runtime without building `cc1'
+and other non-Fortran items, but, for now, an easy way to do that is
+not yet established.
+
+\1f
+File: g77.info, Node: Missing strtoul, Next: Object File Differences, Prev: Building GNU CC Necessary, Up: General Problems
+
+Missing strtoul
+...............
+
+ On SunOS4 systems, linking the `f771' program produces an error
+message concerning an undefined symbol named `_strtoul'.
+
+ This is not a `g77' bug. *Note Patching GNU Fortran::, for
+information on a workaround provided by `g77'.
+
+ The proper fix is either to upgrade your system to one that provides
+a complete ANSI C environment, or improve `gcc' so that it provides one
+for all the languages and configurations it supports.
+
+ *Note:* In earlier versions of `g77', an automated workaround for
+this problem was attempted. It worked for systems without `_strtoul',
+substituting the incomplete-yet-sufficient version supplied with `g77'
+for those systems. However, the automated workaround failed
+mysteriously for systems that appeared to have conforming ANSI C
+environments, and it was decided that, lacking resources to more fully
+investigate the problem, it was better to not punish users of those
+systems either by requiring them to work around the problem by hand or
+by always substituting an incomplete `strtoul()' implementation when
+their systems had a complete, working one. Unfortunately, this meant
+inconveniencing users of systems not having `strtoul()', but they're
+using obsolete (and generally unsupported) systems anyway.
+
+\1f
+File: g77.info, Node: Object File Differences, Next: Cleanup Kills Stage Directories, Prev: Missing strtoul, Up: General Problems
+
+Object File Differences
+.......................
+
+ A comparison of object files after building Stage 3 during a
+bootstrap build will result in `gcc/f/zzz.o' being flagged as different
+from the Stage 2 version. That is because it contains a string with an
+expansion of the `__TIME__' macro, which expands to the current time of
+day. It is nothing to worry about, since `gcc/f/zzz.c' doesn't contain
+any actual code. It does allow you to override its use of `__DATE__'
+and `__TIME__' by defining macros for the compilation--see the source
+code for details.
+
+\1f
+File: g77.info, Node: Cleanup Kills Stage Directories, Next: Missing gperf?, Prev: Object File Differences, Up: General Problems
+
+Cleanup Kills Stage Directories
+...............................
+
+ It'd be helpful if `g77''s `Makefile.in' or `Make-lang.in' would
+create the various `stageN' directories and their subdirectories, so
+developers and expert installers wouldn't have to reconfigure after
+cleaning up.
+
+\1f
+File: g77.info, Node: Missing gperf?, Prev: Cleanup Kills Stage Directories, Up: General Problems
+
+Missing `gperf'?
+................
+
+ If a build aborts trying to invoke `gperf', that strongly suggests
+an improper method was used to create the `gcc' source directory, such
+as the UNIX `cp -r' command instead of `cp -pr', since this problem
+very likely indicates that the date-time-modified information on the
+`gcc' source files is incorrect.
+
+ The proper solution is to recreate the `gcc' source directory from a
+`gcc' distribution known to be provided by the FSF.
+
+ It is possible you might be able to temporarily work around the
+problem, however, by trying these commands:
+
+ sh# cd gcc
+ sh# touch c-gperf.h
+ sh#
+
+ These commands update the date-time-modified information for the
+file produced by the invocation of `gperf' in the current versions of
+`gcc', so that `make' no longer believes it needs to update it. This
+file should already exist in a `gcc' distribution, but mistakes made
+when copying the `gcc' directory can leave the modification information
+set such that the `gperf' input files look more "recent" than the
+corresponding output files.
+
+ If the above does not work, definitely start from scratch and avoid
+copying the `gcc' using any method that does not reliably preserve
+date-time-modified information, such as the UNIX `cp -r' command.
+
+\1f
+File: g77.info, Node: Cross-compiler Problems, Prev: General Problems, Up: Problems Installing
+
+Cross-compiler Problems
+-----------------------
+
+ `g77' has been in alpha testing since September of 1992, and in
+public beta testing since February of 1995. Alpha testing was done by
+a small number of people worldwide on a fairly wide variety of
+machines, involving self-compilation in most or all cases. Beta
+testing has been done primarily via self-compilation, but in more and
+more cases, cross-compilation (and "criss-cross compilation", where a
+version of a compiler is built on one machine to run on a second and
+generate code that runs on a third) has been tried and has succeeded,
+to varying extents.
+
+ Generally, `g77' can be ported to any configuration to which `gcc',
+`f2c', and `libf2c' can be ported and made to work together, aside from
+the known problems described in this manual. If you want to port `g77'
+to a particular configuration, you should first make sure `gcc' and
+`libf2c' can be ported to that configuration before focusing on `g77',
+because `g77' is so dependent on them.
+
+ Even for cases where `gcc' and `libf2c' work, you might run into
+problems with cross-compilation on certain machines, for several
+reasons.
+
+ * There is one known bug (a design bug to be fixed in 0.6) that
+ prevents configuration of `g77' as a cross-compiler in some cases,
+ though there are assumptions made during configuration that
+ probably make doing non-self-hosting builds a hassle, requiring
+ manual intervention.
+
+ * `gcc' might still have some trouble being configured for certain
+ combinations of machines. For example, it might not know how to
+ handle floating-point constants.
+
+ * Improvements to the way `libf2c' is built could make building
+ `g77' as a cross-compiler easier--for example, passing and using
+ `$(LD)' and `$(AR)' in the appropriate ways.
+
+ * There are still some challenges putting together the right
+ run-time libraries (needed by `libf2c') for a target system,
+ depending on the systems involved in the configuration. (This is
+ a general problem with cross-compilation, and with `gcc' in
+ particular.)
+
+\1f
+File: g77.info, Node: Settings, Next: Quick Start, Prev: Problems Installing, Up: Installation
+
+Changing Settings Before Building
+=================================
+
+ Here are some internal `g77' settings that can be changed by editing
+source files in `gcc/f/' before building.
+
+ This information, and perhaps even these settings, represent
+stop-gap solutions to problems people doing various ports of `g77' have
+encountered. As such, none of the following information is expected to
+be pertinent in future versions of `g77'.
+
+* Menu:
+
+* Larger File Unit Numbers:: Raising `MXUNIT'.
+* Always Flush Output:: Synchronizing write errors.
+* Maximum Stackable Size:: Large arrays forced off the stack.
+* Floating-point Bit Patterns:: Possible programs building `g77'
+ as a cross-compiler.
+* Large Initialization:: Large arrays with `DATA'
+ initialization.
+* Alpha Problems Fixed:: Problems with 64-bit systems like
+ Alphas now fixed?
+
+\1f
+File: g77.info, Node: Larger File Unit Numbers, Next: Always Flush Output, Up: Settings
+
+Larger File Unit Numbers
+------------------------
+
+ As distributed, whether as part of `f2c' or `g77', `libf2c' accepts
+file unit numbers only in the range 0 through 99. For example, a
+statement such as `WRITE (UNIT=100)' causes a run-time crash in
+`libf2c', because the unit number, 100, is out of range.
+
+ If you know that Fortran programs at your installation require the
+use of unit numbers higher than 99, you can change the value of the
+`MXUNIT' macro, which represents the maximum unit number, to an
+appropriately higher value.
+
+ To do this, edit the file `f/runtime/libI77/fio.h' in your `g77'
+source tree, changing the following line:
+
+ #define MXUNIT 100
+
+ Change the line so that the value of `MXUNIT' is defined to be at
+least one *greater* than the maximum unit number used by the Fortran
+programs on your system.
+
+ (For example, a program that does `WRITE (UNIT=255)' would require
+`MXUNIT' set to at least 256 to avoid crashing.)
+
+ Then build or rebuild `g77' as appropriate.
+
+ *Note:* Changing this macro has *no* effect on other limits your
+system might place on the number of files open at the same time. That
+is, the macro might allow a program to do `WRITE (UNIT=100)', but the
+library and operating system underlying `libf2c' might disallow it if
+many other files have already been opened (via `OPEN' or implicitly via
+`READ', `WRITE', and so on). Information on how to increase these
+other limits should be found in your system's documentation.
+
+\1f
+File: g77.info, Node: Always Flush Output, Next: Maximum Stackable Size, Prev: Larger File Unit Numbers, Up: Settings
+
+Always Flush Output
+-------------------
+
+ Some Fortran programs require output (writes) to be flushed to the
+operating system (under UNIX, via the `fflush()' library call) so that
+errors, such as disk full, are immediately flagged via the relevant
+`ERR=' and `IOSTAT=' mechanism, instead of such errors being flagged
+later as subsequent writes occur, forcing the previously written data
+to disk, or when the file is closed.
+
+ Essentially, the difference can be viewed as synchronous error
+reporting (immediate flagging of errors during writes) versus
+asynchronous, or, more precisely, buffered error reporting (detection
+of errors might be delayed).
+
+ `libf2c' supports flagging write errors immediately when it is built
+with the `ALWAYS_FLUSH' macro defined. This results in a `libf2c' that
+runs slower, sometimes quite a bit slower, under certain
+circumstances--for example, accessing files via the networked file
+system NFS--but the effect can be more reliable, robust file I/O.
+
+ If you know that Fortran programs requiring this level of precision
+of error reporting are to be compiled using the version of `g77' you
+are building, you might wish to modify the `g77' source tree so that
+the version of `libf2c' is built with the `ALWAYS_FLUSH' macro defined,
+enabling this behavior.
+
+ To do this, find this line in `f/runtime/configure.in' in your `g77'
+source tree:
+
+ dnl AC_DEFINE(ALWAYS_FLUSH)
+
+ Remove the leading `dnl ', so the line begins with `AC_DEFINE(', and
+run `autoconf' in that file's directory. (Or, if you don't have
+`autoconf', you can modify `f2c.h.in' in the same directory to include
+the line `#define ALWAYS_FLUSH' after `#define F2C_INCLUDE'.)
+
+ Then build or rebuild `g77' as appropriate.
+
+\1f
+File: g77.info, Node: Maximum Stackable Size, Next: Floating-point Bit Patterns, Prev: Always Flush Output, Up: Settings
+
+Maximum Stackable Size
+----------------------
+
+ `g77', on most machines, puts many variables and arrays on the stack
+where possible, and can be configured (by changing
+`FFECOM_sizeMAXSTACKITEM' in `gcc/f/com.c') to force smaller-sized
+entities into static storage (saving on stack space) or permit
+larger-sized entities to be put on the stack (which can improve
+run-time performance, as it presents more opportunities for the GBE to
+optimize the generated code).
+
+ *Note:* Putting more variables and arrays on the stack might cause
+problems due to system-dependent limits on stack size. Also, the value
+of `FFECOM_sizeMAXSTACKITEM' has no effect on automatic variables and
+arrays. *Note But-bugs::, for more information.
+
+\1f
+File: g77.info, Node: Floating-point Bit Patterns, Next: Large Initialization, Prev: Maximum Stackable Size, Up: Settings
+
+Floating-point Bit Patterns
+---------------------------
+
+ The `g77' build will crash if an attempt is made to build it as a
+cross-compiler for a target when `g77' cannot reliably determine the
+bit pattern of floating-point constants for the target. Planned
+improvements for g77-0.6 will give it the capabilities it needs to not
+have to crash the build but rather generate correct code for the target.
+(Currently, `g77' would generate bad code under such circumstances if
+it didn't crash during the build, e.g. when compiling a source file
+that does something like `EQUIVALENCE (I,R)' and `DATA R/9.43578/'.)
+
+\1f
+File: g77.info, Node: Large Initialization, Next: Alpha Problems Fixed, Prev: Floating-point Bit Patterns, Up: Settings
+
+Initialization of Large Aggregate Areas
+---------------------------------------
+
+ A warning message is issued when `g77' sees code that provides
+initial values (e.g. via `DATA') to an aggregate area (`COMMON' or
+`EQUIVALENCE', or even a large enough array or `CHARACTER' variable)
+that is large enough to increase `g77''s compile time by roughly a
+factor of 10.
+
+ This size currently is quite small, since `g77' currently has a
+known bug requiring too much memory and time to handle such cases. In
+`gcc/f/data.c', the macro `FFEDATA_sizeTOO_BIG_INIT_' is defined to the
+minimum size for the warning to appear. The size is specified in
+storage units, which can be bytes, words, or whatever, on a
+case-by-case basis.
+
+ After changing this macro definition, you must (of course) rebuild
+and reinstall `g77' for the change to take effect.
+
+ Note that, as of version 0.5.18, improvements have reduced the scope
+of the problem for *sparse* initialization of large arrays, especially
+those with large, contiguous uninitialized areas. However, the warning
+is issued at a point prior to when `g77' knows whether the
+initialization is sparse, and delaying the warning could mean it is
+produced too late to be helpful.
+
+ Therefore, the macro definition should not be adjusted to reflect
+sparse cases. Instead, adjust it to generate the warning when densely
+initialized arrays begin to cause responses noticeably slower than
+linear performance would suggest.
+
+\1f
+File: g77.info, Node: Alpha Problems Fixed, Prev: Large Initialization, Up: Settings
+
+Alpha Problems Fixed
+--------------------
+
+ `g77' used to warn when it was used to compile Fortran code for a
+target configuration that is not basically a 32-bit machine (such as an
+Alpha, which is a 64-bit machine, especially if it has a 64-bit
+operating system running on it). That was because `g77' was known to
+not work properly on such configurations.
+
+ As of version 0.5.20, `g77' is believed to work well enough on such
+systems. So, the warning is no longer needed or provided.
+
+ However, support for 64-bit systems, especially in areas such as
+cross-compilation and handling of intrinsics, is still incomplete. The
+symptoms are believed to be compile-time diagnostics rather than the
+generation of bad code. It is hoped that version 0.6 will completely
+support 64-bit systems.
+
+\1f
+File: g77.info, Node: Quick Start, Next: Complete Installation, Prev: Settings, Up: Installation
+
+Quick Start
+===========
+
+ This procedure configures, builds, and installs `g77' "out of the
+box" and works on most UNIX systems. Each command is identified by a
+unique number, used in the explanatory text that follows. For the most
+part, the output of each command is not shown, though indications of
+the types of responses are given in a few cases.
+
+ To perform this procedure, the installer must be logged in as user
+`root'. Much of it can be done while not logged in as `root', and
+users experienced with UNIX administration should be able to modify the
+procedure properly to do so.
+
+ Following traditional UNIX conventions, it is assumed that the
+source trees for `g77' and `gcc' will be placed in `/usr/src'. It also
+is assumed that the source distributions themselves already reside in
+`/usr/FSF', a naming convention used by the author of `g77' on his own
+system:
+
+ /usr/FSF/gcc-2.7.2.3.tar.gz
+ /usr/FSF/g77-0.5.21.tar.gz
+
+ Users of the following systems should not blindly follow these
+quick-start instructions, because of problems their systems have coping
+with straightforward installation of `g77':
+
+ * SunOS4
+
+ Instead, see *Note Complete Installation::, for detailed information
+on how to configure, build, and install `g77' for your particular
+system. Also, see *Note Known Causes of Trouble with GNU Fortran:
+Trouble, for information on bugs and other problems known to afflict the
+installation process, and how to report newly discovered ones.
+
+ If your system is *not* on the above list, and *is* a UNIX system or
+one of its variants, you should be able to follow the instructions
+below. If you vary *any* of the steps below, you might run into
+trouble, including possibly breaking existing programs for other users
+of your system. Before doing so, it is wise to review the explanations
+of some of the steps. These explanations follow this list of steps.
+
+ sh[ 1]# cd /usr/src
+
+ sh[ 2]# gunzip -c < /usr/FSF/gcc-2.7.2.3.tar.gz | tar xf -
+ [Might say "Broken pipe"...that is normal on some systems.]
+
+ sh[ 3]# gunzip -c < /usr/FSF/g77-0.5.21.tar.gz | tar xf -
+ ["Broken pipe" again possible.]
+
+ sh[ 4]# ln -s gcc-2.7.2.3 gcc
+
+ sh[ 5]# ln -s g77-0.5.21 g77
+
+ sh[ 6]# mv -i g77/* gcc
+ [No questions should be asked by mv here; or, you made a mistake.]
+
+ sh[ 7]# patch -p1 -V t -d gcc < gcc/f/gbe/2.7.2.3.diff
+ [Unless patch complains about rejected patches, this step worked.]
+
+ sh[ 8]# cd gcc
+ sh[ 9]# touch f77-install-ok
+ [Do not do the above if your system already has an f77
+ command, unless you've checked that overwriting it
+ is okay.]
+
+ sh[10]# touch f2c-install-ok
+ [Do not do the above if your system already has an f2c
+ command, unless you've checked that overwriting it
+ is okay. Else, touch f2c-exists-ok.]
+
+ sh[11]# ./configure --prefix=/usr
+ [Do not do the above if gcc is not installed in /usr/bin.
+ You might need a different --prefix=..., as
+ described below.]
+
+ sh[12]# make bootstrap
+ [This takes a long time, and is where most problems occur.]
+
+ sh[13]# make compare
+ [This verifies that the compiler is `sane'. Only
+ the file `f/zzz.o' (aka `tmp-foo1' and `tmp-foo2')
+ should be in the list of object files this command
+ prints as having different contents. If other files
+ are printed, you have likely found a g77 bug.]
+
+ sh[14]# rm -fr stage1
+
+ sh[15]# make -k install
+ [The actual installation.]
+
+ sh[16]# g77 -v
+ [Verify that g77 is installed, obtain version info.]
+
+ sh[17]#
+
+ *Note Updating Your Info Directory: Updating Documentation, for
+information on how to update your system's top-level `info' directory
+to contain a reference to this manual, so that users of `g77' can
+easily find documentation instead of having to ask you for it.
+
+ Elaborations of many of the above steps follows:
+
+Step 1: `cd /usr/src'
+ You can build `g77' pretty much anyplace. By convention, this
+ manual assumes `/usr/src'. It might be helpful if other users on
+ your system knew where to look for the source code for the
+ installed version of `g77' and `gcc' in any case.
+
+Step 3: `gunzip -d < /usr/FSF/g77-0.5.21.tar.gz | tar xf -'
+ It is not always necessary to obtain the latest version of `g77'
+ as a complete `.tar.gz' file if you have a complete, earlier
+ distribution of `g77'. If appropriate, you can unpack that earlier
+ version of `g77', and then apply the appropriate patches to
+ achieve the same result--a source tree containing version 0.5.21
+ of `g77'.
+
+Step 4: `ln -s gcc-2.7.2.3 gcc'
+
+Step 5: `ln -s g77-0.5.21 g77'
+ These commands mainly help reduce typing, and help reduce visual
+ clutter in examples in this manual showing what to type to install
+ `g77'.
+
+ *Note Unpacking::, for information on using distributions of `g77'
+ made by organizations other than the FSF.
+
+Step 6: `mv -i g77/* gcc'
+ After doing this, you can, if you like, type `rm g77' and `rmdir
+ g77-0.5.21' to remove the empty directory and the symbol link to
+ it. But, it might be helpful to leave them around as quick
+ reminders of which version(s) of `g77' are installed on your
+ system.
+
+ *Note Unpacking::, for information on the contents of the `g77'
+ directory (as merged into the `gcc' directory).
+
+Step 7: `patch -p1 ...'
+ This can produce a wide variety of printed output, from `Hmm, I
+ can't seem to find a patch in there anywhere...' to long lists of
+ messages indicated that patches are being found, applied
+ successfully, and so on.
+
+ If messages about "fuzz", "offset", or especially "reject files"
+ are printed, it might mean you applied the wrong patch file. If
+ you believe this is the case, it is best to restart the sequence
+ after deleting (or at least renaming to unused names) the
+ top-level directories for `g77' and `gcc' and their symbolic links.
+
+ After this command finishes, the `gcc' directory might have old
+ versions of several files as saved by `patch'. To remove these,
+ after `cd gcc', type `rm -i *.~*~'.
+
+ *Note Merging Distributions::, for more information.
+
+Step 9: `touch f77-install-ok'
+ Don't do this if you don't want to overwrite an existing version
+ of `f77' (such as a native compiler, or a script that invokes
+ `f2c'). Otherwise, installation will overwrite the `f77' command
+ and the `f77' man pages with copies of the corresponding `g77'
+ material.
+
+ *Note Installing `f77': Installing f77, for more information.
+
+Step 10: `touch f2c-install-ok'
+ Don't do this if you don't want to overwrite an existing
+ installation of `libf2c' (though, chances are, you do). Instead,
+ `touch f2c-exists-ok' to allow the installation to continue
+ without any error messages about `/usr/lib/libf2c.a' already
+ existing.
+
+ *Note Installing `f2c': Installing f2c, for more information.
+
+Step 11: `./configure --prefix=/usr'
+ This is where you specify that the `g77' executable is to be
+ installed in `/usr/bin/', the `libf2c.a' library is to be
+ installed in `/usr/lib/', and so on.
+
+ You should ensure that any existing installation of the `gcc'
+ executable is in `/usr/bin/'. Otherwise, installing `g77' so that
+ it does not fully replace the existing installation of `gcc' is
+ likely to result in the inability to compile Fortran programs.
+
+ *Note Where in the World Does Fortran (and GNU CC) Go?: Where to
+ Install, for more information on determining where to install
+ `g77'. *Note Configuring gcc::, for more information on the
+ configuration process triggered by invoking the `./configure'
+ script.
+
+Step 12: `make bootstrap'
+ *Note Installing GNU CC: (gcc)Installation, for information on the
+ kinds of diagnostics you should expect during this procedure.
+
+ *Note Building gcc::, for complete `g77'-specific information on
+ this step.
+
+Step 13: `make compare'
+ *Note Where to Port Bugs: Bug Lists, for information on where to
+ report that you observed more than `f/zzz.o' having different
+ contents during this phase.
+
+ *Note How to Report Bugs: Bug Reporting, for information on *how*
+ to report bugs like this.
+
+Step 14: `rm -fr stage1'
+ You don't need to do this, but it frees up disk space.
+
+Step 15: `make -k install'
+ If this doesn't seem to work, try:
+
+ make -k install install-libf77 install-f2c-all
+
+ *Note Installation of Binaries::, for more information.
+
+ *Note Updating Your Info Directory: Updating Documentation, for
+ information on entering this manual into your system's list of
+ texinfo manuals.
+
+Step 16: `g77 -v'
+ If this command prints approximately 25 lines of output, including
+ the GNU Fortran Front End version number (which should be the same
+ as the version number for the version of `g77' you just built and
+ installed) and the version numbers for the three parts of the
+ `libf2c' library (`libF77', `libI77', `libU77'), and those version
+ numbers are all in agreement, then there is a high likelihood that
+ the installation has been successfully completed.
+
+ You might consider doing further testing. For example, log in as
+ a non-privileged user, then create a small Fortran program, such
+ as:
+
+ PROGRAM SMTEST
+ DO 10 I=1, 10
+ PRINT *, 'Hello World #', I
+ 10 CONTINUE
+ END
+
+ Compile, link, and run the above program, and, assuming you named
+ the source file `smtest.f', the session should look like this:
+
+ sh# g77 -o smtest smtest.f
+ sh# ./smtest
+ Hello World # 1
+ Hello World # 2
+ Hello World # 3
+ Hello World # 4
+ Hello World # 5
+ Hello World # 6
+ Hello World # 7
+ Hello World # 8
+ Hello World # 9
+ Hello World # 10
+ sh#
+
+ After proper installation, you don't need to keep your gcc and g77
+ source and build directories around anymore. Removing them can
+ free up a lot of disk space.
+
+\1f
+File: g77.info, Node: Complete Installation, Next: Distributing Binaries, Prev: Quick Start, Up: Installation
+
+Complete Installation
+=====================
+
+ Here is the complete `g77'-specific information on how to configure,
+build, and install `g77'.
+
+* Menu:
+
+* Unpacking::
+* Merging Distributions::
+* f77: Installing f77.
+* f2c: Installing f2c.
+* Patching GNU Fortran::
+* Where to Install::
+* Configuring gcc::
+* Building gcc::
+* Pre-installation Checks::
+* Installation of Binaries::
+* Updating Documentation::
+* bison: Missing bison?.
+* makeinfo: Missing makeinfo?.
+
+\1f
+File: g77.info, Node: Unpacking, Next: Merging Distributions, Up: Complete Installation
+
+Unpacking
+---------
+
+ The `gcc' source distribution is a stand-alone distribution. It is
+designed to be unpacked (producing the `gcc' source tree) and built as
+is, assuming certain prerequisites are met (including the availability
+of compatible UNIX programs such as `make', `cc', and so on).
+
+ However, before building `gcc', you will want to unpack and merge
+the `g77' distribution in with it, so that you build a Fortran-capable
+version of `gcc', which includes the `g77' command, the necessary
+run-time libraries, and this manual.
+
+ Unlike `gcc', the `g77' source distribution is *not* a stand-alone
+distribution. It is designed to be unpacked and, afterwards,
+immediately merged into an applicable `gcc' source tree. That is, the
+`g77' distribution *augments* a `gcc' distribution--without `gcc',
+generally only the documentation is immediately usable.
+
+ A sequence of commands typically used to unpack `gcc' and `g77' is:
+
+ sh# cd /usr/src
+ sh# gunzip -c /usr/FSF/gcc-2.7.2.3.tar.gz | tar xf -
+ sh# gunzip -c /usr/FSF/g77-0.5.21.tar.gz | tar xf -
+ sh# ln -s gcc-2.7.2.3 gcc
+ sh# ln -s g77-0.5.21 g77
+ sh# mv -i g77/* gcc
+
+ *Notes:* The commands beginning with `gunzip...' might print `Broken
+pipe...' as they complete. That is nothing to worry about, unless you
+actually *hear* a pipe breaking. The `ln' commands are helpful in
+reducing typing and clutter in installation examples in this manual.
+Hereafter, the top level of `gcc' source tree is referred to as `gcc',
+and the top level of just the `g77' source tree (prior to issuing the
+`mv' command, above) is referred to as `g77'.
+
+ There are three top-level names in a `g77' distribution:
+
+ g77/COPYING.g77
+ g77/README.g77
+ g77/f
+
+ All three entries should be moved (or copied) into a `gcc' source
+tree (typically named after its version number and as it appears in the
+FSF distributions--e.g. `gcc-2.7.2.3').
+
+ `g77/f' is the subdirectory containing all of the code,
+documentation, and other information that is specific to `g77'. The
+other two files exist to provide information on `g77' to someone
+encountering a `gcc' source tree with `g77' already present, who has
+not yet read these installation instructions and thus needs help
+understanding that the source tree they are looking at does not come
+from a single FSF distribution. They also help people encountering an
+unmerged `g77' source tree for the first time.
+
+ *Note:* Please use *only* `gcc' and `g77' source trees as
+distributed by the FSF. Use of modified versions, such as the
+Pentium-specific-optimization port of `gcc', is likely to result in
+problems that appear to be in the `g77' code but, in fact, are not. Do
+not use such modified versions unless you understand all the
+differences between them and the versions the FSF distributes--in which
+case you should be able to modify the `g77' (or `gcc') source trees
+appropriately so `g77' and `gcc' can coexist as they do in the stock
+FSF distributions.
+
+\1f
+File: g77.info, Node: Merging Distributions, Next: Installing f77, Prev: Unpacking, Up: Complete Installation
+
+Merging Distributions
+---------------------
+
+ After merging the `g77' source tree into the `gcc' source tree, the
+final merge step is done by applying the pertinent patches the `g77'
+distribution provides for the `gcc' source tree.
+
+ Read the file `gcc/f/gbe/README', and apply the appropriate patch
+file for the version of the GNU CC compiler you have, if that exists.
+If the directory exists but the appropriate file does not exist, you
+are using either an old, unsupported version, or a release one that is
+newer than the newest `gcc' version supported by the version of `g77'
+you have.
+
+ As of version 0.5.18, `g77' modifies the version number of `gcc' via
+the pertinent patches. This is done because the resulting version of
+`gcc' is deemed sufficiently different from the vanilla distribution to
+make it worthwhile to present, to the user, information signaling the
+fact that there are some differences.
+
+ GNU version numbers make it easy to figure out whether a particular
+version of a distribution is newer or older than some other version of
+that distribution. The format is, generally, MAJOR.MINOR.PATCH, with
+each field being a decimal number. (You can safely ignore leading
+zeros; for example, 1.5.3 is the same as 1.5.03.) The MAJOR field only
+increases with time. The other two fields are reset to 0 when the
+field to their left is incremented; otherwise, they, too, only increase
+with time. So, version 2.6.2 is newer than version 2.5.8, and version
+3.0 is newer than both. (Trailing `.0' fields often are omitted in
+announcements and in names for distributions and the directories they
+create.)
+
+ If your version of `gcc' is older than the oldest version supported
+by `g77' (as casually determined by listing the contents of
+`gcc/f/gbe/'), you should obtain a newer, supported version of `gcc'.
+(You could instead obtain an older version of `g77', or try and get
+your `g77' to work with the old `gcc', but neither approach is
+recommended, and you shouldn't bother reporting any bugs you find if you
+take either approach, because they're probably already fixed in the
+newer versions you're not using.)
+
+ If your version of `gcc' is newer than the newest version supported
+by `g77', it is possible that your `g77' will work with it anyway. If
+the version number for `gcc' differs only in the PATCH field, you might
+as well try applying the `g77' patch that is for the newest version of
+`gcc' having the same MAJOR and MINOR fields, as this is likely to work.
+
+ So, for example, if a particular version of `g77' has support for
+`gcc' versions 2.7.0 and 2.7.1, it is likely that `gcc-2.7.2' would
+work well with `g77' by using the `2.7.1.diff' patch file provided with
+`g77' (aside from some offsets reported by `patch', which usually are
+harmless).
+
+ However, `gcc-2.8.0' would almost certainly not work with that
+version of `g77' no matter which patch file was used, so a new version
+of `g77' would be needed (and you should wait for it rather than
+bothering the maintainers--*note User-Visible Changes: Changes.).
+
+ This complexity is the result of `gcc' and `g77' being separate
+distributions. By keeping them separate, each product is able to be
+independently improved and distributed to its user base more frequently.
+
+ However, `g77' often requires changes to contemporary versions of
+`gcc'. Also, the GBE interface defined by `gcc' typically undergoes
+some incompatible changes at least every time the MINOR field of the
+version number is incremented, and such changes require corresponding
+changes to the `g77' front end (FFE).
+
+ It is hoped that the GBE interface, and the `gcc' and `g77' products
+in general, will stabilize sufficiently for the need for hand-patching
+to disappear.
+
+ Invoking `patch' as described in `gcc/f/gbe/README' can produce a
+wide variety of printed output, from `Hmm, I can't seem to find a patch
+in there anywhere...' to long lists of messages indicated that patches
+are being found, applied successfully, and so on.
+
+ If messages about "fuzz", "offset", or especially "reject files" are
+printed, it might mean you applied the wrong patch file. If you
+believe this is the case, it is best to restart the sequence after
+deleting (or at least renaming to unused names) the top-level
+directories for `g77' and `gcc' and their symbolic links. That is
+because `patch' might have partially patched some `gcc' source files,
+so reapplying the correct patch file might result in the correct
+patches being applied incorrectly (due to the way `patch' necessarily
+works).
+
+ After `patch' finishes, the `gcc' directory might have old versions
+of several files as saved by `patch'. To remove these, after `cd gcc',
+type `rm -i *.~*~'.
+
+ *Note:* `g77''s configuration file `gcc/f/config-lang.in' ensures
+that the source code for the version of `gcc' being configured has at
+least one indication of being patched as required specifically by `g77'.
+This configuration-time checking should catch failure to apply the
+correct patch and, if so caught, should abort the configuration with an
+explanation. *Please* do not try to disable the check, otherwise `g77'
+might well appear to build and install correctly, and even appear to
+compile correctly, but could easily produce broken code.
+
+ `diff -rcp2N' is used to create the patch files in `gcc/f/gbe/'.
+
+\1f
+File: g77.info, Node: Installing f77, Next: Installing f2c, Prev: Merging Distributions, Up: Complete Installation
+
+Installing `f77'
+----------------
+
+ You should decide whether you want installation of `g77' to also
+install an `f77' command. On systems with a native `f77', this is not
+normally desired, so `g77' does not do this by default.
+
+ If you want `f77' installed, create the file `f77-install-ok' (e.g.
+via the UNIX command `touch f77-install-ok') in the source or build
+top-level directory (the same directory in which the `g77' `f'
+directory resides, not the `f' directory itself), or edit
+`gcc/f/Make-lang.in' and change the definition of the
+`F77_INSTALL_FLAG' macro appropriately.
+
+ Usually, this means that, after typing `cd gcc', you would type
+`touch f77-install-ok'.
+
+ When you enable installation of `f77', either a link to or a direct
+copy of the `g77' command is made. Similarly, `f77.1' is installed as
+a man page.
+
+ (The `uninstall' target in the `gcc/Makefile' also tests this macro
+and file, when invoked, to determine whether to delete the installed
+copies of `f77' and `f77.1'.)
+
+ *Note:* No attempt is yet made to install a program (like a shell
+script) that provides compatibility with any other `f77' programs.
+Only the most rudimentary invocations of `f77' will work the same way
+with `g77'.
+
+\1f
+File: g77.info, Node: Installing f2c, Next: Patching GNU Fortran, Prev: Installing f77, Up: Complete Installation
+
+Installing `f2c'
+----------------
+
+ Currently, `g77' does not include `f2c' itself in its distribution.
+However, it does include a modified version of the `libf2c'. This
+version is normally compatible with `f2c', but has been modified to
+meet the needs of `g77' in ways that might possibly be incompatible
+with some versions or configurations of `f2c'.
+
+ Decide how installation of `g77' should affect any existing
+installation of `f2c' on your system.
+
+ If you do not have `f2c' on your system (e.g. no `/usr/bin/f2c', no
+`/usr/include/f2c.h', and no `/usr/lib/libf2c.a', `/usr/lib/libF77.a',
+or `/usr/lib/libI77.a'), you don't need to be concerned with this item.
+
+ If you do have `f2c' on your system, you need to decide how users of
+`f2c' will be affected by your installing `g77'. Since `g77' is
+currently designed to be object-code-compatible with `f2c' (with very
+few, clear exceptions), users of `f2c' might want to combine
+`f2c'-compiled object files with `g77'-compiled object files in a
+single executable.
+
+ To do this, users of `f2c' should use the same copies of `f2c.h' and
+`libf2c.a' that `g77' uses (and that get built as part of `g77').
+
+ If you do nothing here, the `g77' installation process will not
+overwrite the `include/f2c.h' and `lib/libf2c.a' files with its own
+versions, and in fact will not even install `libf2c.a' for use with the
+newly installed versions of `gcc' and `g77' if it sees that
+`lib/libf2c.a' exists--instead, it will print an explanatory message
+and skip this part of the installation.
+
+ To install `g77''s versions of `f2c.h' and `libf2c.a' in the
+appropriate places, create the file `f2c-install-ok' (e.g. via the UNIX
+command `touch f2c-install-ok') in the source or build top-level
+directory (the same directory in which the `g77' `f' directory resides,
+not the `f' directory itself), or edit `gcc/f/Make-lang.in' and change
+the definition of the `F2C_INSTALL_FLAG' macro appropriately.
+
+ Usually, this means that, after typing `cd gcc', you would type
+`touch f2c-install-ok'.
+
+ Make sure that when you enable the overwriting of `f2c.h' and
+`libf2c.a' as used by `f2c', you have a recent and properly configured
+version of `bin/f2c' so that it generates code that is compatible with
+`g77'.
+
+ If you don't want installation of `g77' to overwrite `f2c''s existing
+installation, but you do want `g77' installation to proceed with
+installation of its own versions of `f2c.h' and `libf2c.a' in places
+where `g77' will pick them up (even when linking `f2c'-compiled object
+files--which might lead to incompatibilities), create the file
+`f2c-exists-ok' (e.g. via the UNIX command `touch f2c-exists-ok') in
+the source or build top-level directory, or edit `gcc/f/Make-lang.in'
+and change the definition of the `F2CLIBOK' macro appropriately.
+
+\1f
+File: g77.info, Node: Patching GNU Fortran, Next: Where to Install, Prev: Installing f2c, Up: Complete Installation
+
+Patching GNU Fortran
+--------------------
+
+ If you're using a SunOS4 system, you'll need to make the following
+change to `gcc/f/proj.h': edit the line reading
+
+ #define FFEPROJ_STRTOUL 1 ...
+
+by replacing the `1' with `0'. Or, you can avoid editing the source by
+adding
+ CFLAGS='-DFFEPROJ_STRTOUL=0 -g -O'
+ to the command line for `make' when you invoke it. (`-g' is the
+default for `CFLAGS'.)
+
+ This causes a minimal version of `strtoul()' provided as part of the
+`g77' distribution to be compiled and linked into whatever `g77'
+programs need it, since some systems (like SunOS4 with only the bundled
+compiler and its runtime) do not provide this function in their system
+libraries.
+
+ Similarly, a minimal version of `bsearch()' is available and can be
+enabled by editing a line similar to the one for `strtoul()' above in
+`gcc/f/proj.h', if your system libraries lack `bsearch()'. The method
+of overriding `X_CFLAGS' may also be used.
+
+ These are not problems with `g77', which requires an ANSI C
+environment. You should upgrade your system to one that provides a
+full ANSI C environment, or encourage the maintainers of `gcc' to
+provide one to all `gcc'-based compilers in future `gcc' distributions.
+
+ *Note Problems Installing::, for more information on why `strtoul()'
+comes up missing and on approaches to dealing with this problem that
+have already been tried.
+
+\1f
+File: g77.info, Node: Where to Install, Next: Configuring gcc, Prev: Patching GNU Fortran, Up: Complete Installation
+
+Where in the World Does Fortran (and GNU CC) Go?
+------------------------------------------------
+
+ Before configuring, you should make sure you know where you want the
+`g77' and `gcc' binaries to be installed after they're built, because
+this information is given to the configuration tool and used during the
+build itself.
+
+ A `g77' installation necessarily requires installation of a
+`g77'-aware version of `gcc', so that the `gcc' command recognizes
+Fortran source files and knows how to compile them.
+
+ For this to work, the version of `gcc' that you will be building as
+part of `g77' *must* be installed as the "active" version of `gcc' on
+the system.
+
+ Sometimes people make the mistake of installing `gcc' as
+`/usr/local/bin/gcc', leaving an older, non-Fortran-aware version in
+`/usr/bin/gcc'. (Or, the opposite happens.) This can result in `g77'
+being unable to compile Fortran source files, because when it calls on
+`gcc' to do the actual compilation, `gcc' complains that it does not
+recognize the language, or the file name suffix.
+
+ So, determine whether `gcc' already is installed on your system,
+and, if so, *where* it is installed, and prepare to configure the new
+version of `gcc' you'll be building so that it installs over the
+existing version of `gcc'.
+
+ You might want to back up your existing copy of `bin/gcc', and the
+entire `lib/' directory, before you perform the actual installation (as
+described in this manual).
+
+ Existing `gcc' installations typically are found in `/usr' or
+`/usr/local'. If you aren't certain where the currently installed
+version of `gcc' and its related programs reside, look at the output of
+this command:
+
+ gcc -v -o /tmp/delete-me -xc /dev/null -xnone
+
+ All sorts of interesting information on the locations of various
+`gcc'-related programs and data files should be visible in the output
+of the above command. (The output also is likely to include a
+diagnostic from the linker, since there's no `main_()' function.)
+However, you do have to sift through it yourself; `gcc' currently
+provides no easy way to ask it where it is installed and where it looks
+for the various programs and data files it calls on to do its work.
+
+ Just *building* `g77' should not overwrite any installed
+programs--but, usually, after you build `g77', you will want to install
+it, so backing up anything it might overwrite is a good idea. (This is
+true for any package, not just `g77', though in this case it is
+intentional that `g77' overwrites `gcc' if it is already installed--it
+is unusual that the installation process for one distribution
+intentionally overwrites a program or file installed by another
+distribution.)
+
+ Another reason to back up the existing version first, or make sure
+you can restore it easily, is that it might be an older version on
+which other users have come to depend for certain behaviors. However,
+even the new version of `gcc' you install will offer users the ability
+to specify an older version of the actual compilation programs if
+desired, and these older versions need not include any `g77' components.
+*Note Specifying Target Machine and Compiler Version: (gcc)Target
+Options, for information on the `-V' option of `gcc'.
+
+\1f
+File: g77.info, Node: Configuring gcc, Next: Building gcc, Prev: Where to Install, Up: Complete Installation
+
+Configuring GNU CC
+------------------
+
+ `g77' is configured automatically when you configure `gcc'. There
+are two parts of `g77' that are configured in two different
+ways--`g77', which "camps on" to the `gcc' configuration mechanism, and
+`libf2c', which uses a variation of the GNU `autoconf' configuration
+system.
+
+ Generally, you shouldn't have to be concerned with either `g77' or
+`libf2c' configuration, unless you're configuring `g77' as a
+cross-compiler. In this case, the `libf2c' configuration, and possibly
+the `g77' and `gcc' configurations as well, might need special
+attention. (This also might be the case if you're porting `gcc' to a
+whole new system--even if it is just a new operating system on an
+existing, supported CPU.)
+
+ To configure the system, see *Note Installing GNU CC:
+(gcc)Installation, following the instructions for running `./configure'.
+Pay special attention to the `--prefix=' option, which you almost
+certainly will need to specify.
+
+ (Note that `gcc' installation information is provided as a straight
+text file in `gcc/INSTALL'.)
+
+ The information printed by the invocation of `./configure' should
+show that the `f' directory (the Fortran language) has been configured.
+If it does not, there is a problem.
+
+ *Note:* Configuring with the `--srcdir' argument is known to work
+with GNU `make', but it is not known to work with other variants of
+`make'. Irix5.2 and SunOS4.1 versions of `make' definitely won't work
+outside the source directory at present. `g77''s portion of the
+`configure' script issues a warning message about this when you
+configure for building binaries outside the source directory.
+
+\1f
+File: g77.info, Node: Building gcc, Next: Pre-installation Checks, Prev: Configuring gcc, Up: Complete Installation
+
+Building GNU CC
+---------------
+
+ Building `g77' requires building enough of `gcc' that these
+instructions assume you're going to build all of `gcc', including
+`g++', `protoize', and so on. You can save a little time and disk
+space by changes the `LANGUAGES' macro definition in `gcc/Makefile.in'
+or `gcc/Makefile', but if you do that, you're on your own. One change
+is almost *certainly* going to cause failures: removing `c' or `f77'
+from the definition of the `LANGUAGES' macro.
+
+ After configuring `gcc', which configures `g77' and `libf2c'
+automatically, you're ready to start the actual build by invoking
+`make'.
+
+ *Note:* You *must* have run `./configure' before you run `make',
+even if you're using an already existing `gcc' development directory,
+because `./configure' does the work to recognize that you've added
+`g77' to the configuration.
+
+ There are two general approaches to building GNU CC from scratch:
+
+"bootstrap"
+ This method uses minimal native system facilities to build a
+ barebones, unoptimized `gcc', that is then used to compile
+ ("bootstrap") the entire system.
+
+"straight"
+ This method assumes a more complete native system exists, and uses
+ that just once to build the entire system.
+
+ On all systems without a recent version of `gcc' already installed,
+the bootstrap method must be used. In particular, `g77' uses
+extensions to the C language offered, apparently, only by `gcc'.
+
+ On most systems with a recent version of `gcc' already installed,
+the straight method can be used. This is an advantage, because it
+takes less CPU time and disk space for the build. However, it does
+require that the system have fairly recent versions of many GNU
+programs and other programs, which are not enumerated here.
+
+* Menu:
+
+* Bootstrap Build:: For all systems.
+* Straight Build:: For systems with a recent version of `gcc'.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Bootstrap Build, Next: Straight Build, Up: Building gcc
+
+Bootstrap Build
+...............
+
+ A complete bootstrap build is done by issuing a command beginning
+with `make bootstrap ...', as described in *Note Installing GNU CC:
+(gcc)Installation. This is the most reliable form of build, but it
+does require the most disk space and CPU time, since the complete system
+is built twice (in Stages 2 and 3), after an initial build (during
+Stage 1) of a minimal `gcc' compiler using the native compiler and
+libraries.
+
+ You might have to, or want to, control the way a bootstrap build is
+done by entering the `make' commands to build each stage one at a time,
+as described in the `gcc' manual. For example, to save time or disk
+space, you might want to not bother doing the Stage 3 build, in which
+case you are assuming that the `gcc' compiler you have built is
+basically sound (because you are giving up the opportunity to compare a
+large number of object files to ensure they're identical).
+
+ To save some disk space during installation, after Stage 2 is built,
+you can type `rm -fr stage1' to remove the binaries built during Stage
+1.
+
+ *Note:* *Note Object File Differences::, for information on expected
+differences in object files produced during Stage 2 and Stage 3 of a
+bootstrap build. These differences will be encountered as a result of
+using the `make compare' or similar command sequence recommended by the
+GNU CC installation documentation.
+
+ Also, *Note Installing GNU CC: (gcc)Installation, for important
+information on building `gcc' that is not described in this `g77'
+manual. For example, explanations of diagnostic messages and whether
+they're expected, or indicate trouble, are found there.
+
+\1f
+File: g77.info, Node: Straight Build, Prev: Bootstrap Build, Up: Building gcc
+
+Straight Build
+..............
+
+ If you have a recent version of `gcc' already installed on your
+system, and if you're reasonably certain it produces code that is
+object-compatible with the version of `gcc' you want to build as part
+of building `g77', you can save time and disk space by doing a straight
+build.
+
+ To build just the C and Fortran compilers and the necessary run-time
+libraries, issue the following command:
+
+ make -k CC=gcc LANGUAGES=f77 all g77
+
+ (The `g77' target is necessary because the `gcc' build procedures
+apparently do not automatically build command drivers for languages in
+subdirectories. It's the `all' target that triggers building
+everything except, apparently, the `g77' command itself.)
+
+ If you run into problems using this method, you have two options:
+
+ * Abandon this approach and do a bootstrap build.
+
+ * Try to make this approach work by diagnosing the problems you're
+ running into and retrying.
+
+ Especially if you do the latter, you might consider submitting any
+solutions as bug/fix reports. *Note Known Causes of Trouble with GNU
+Fortran: Trouble.
+
+ However, understand that many problems preventing a straight build
+from working are not `g77' problems, and, in such cases, are not likely
+to be addressed in future versions of `g77'.
+
+\1f
+File: g77.info, Node: Pre-installation Checks, Next: Installation of Binaries, Prev: Building gcc, Up: Complete Installation
+
+Pre-installation Checks
+-----------------------
+
+ Before installing the system, which includes installing `gcc', you
+might want to do some minimum checking to ensure that some basic things
+work.
+
+ Here are some commands you can try, and output typically printed by
+them when they work:
+
+ sh# cd /usr/src/gcc
+ sh# ./g77 --driver=./xgcc -B./ -v
+ g77 version 0.5.21
+ ./xgcc -B./ -v -fnull-version -o /tmp/gfa18047 ...
+ Reading specs from ./specs
+ gcc version 2.7.2.3.f.1
+ ./cpp -lang-c -v -isystem ./include -undef ...
+ GNU CPP version 2.7.2.3.f.1 (Linux/Alpha)
+ #include "..." search starts here:
+ #include <...> search starts here:
+ ./include
+ /usr/local/include
+ /usr/alpha-unknown-linux/include
+ /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/include
+ /usr/include
+ End of search list.
+ ./f771 /tmp/cca18048.i -fset-g77-defaults -quiet -dumpbase ...
+ GNU F77 version 2.7.2.3.f.1 (Linux/Alpha) compiled ...
+ GNU Fortran Front End version 0.5.21 compiled: ...
+ as -nocpp -o /tmp/cca180481.o /tmp/cca18048.s
+ ld -G 8 -O1 -o /tmp/gfa18047 /usr/lib/crt0.o -L. ...
+ __G77_LIBF77_VERSION__: 0.5.21
+ @(#)LIBF77 VERSION 19970404
+ __G77_LIBI77_VERSION__: 0.5.21
+ @(#) LIBI77 VERSION pjw,dmg-mods 19970816
+ __G77_LIBU77_VERSION__: 0.5.21
+ @(#) LIBU77 VERSION 19970609
+ sh# ./xgcc -B./ -v -o /tmp/delete-me -xc /dev/null -xnone
+ Reading specs from ./specs
+ gcc version 2.7.2.3.f.1
+ ./cpp -lang-c -v -isystem ./include -undef ...
+ GNU CPP version 2.7.2.3.f.1 (Linux/Alpha)
+ #include "..." search starts here:
+ #include <...> search starts here:
+ ./include
+ /usr/local/include
+ /usr/alpha-unknown-linux/include
+ /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/include
+ /usr/include
+ End of search list.
+ ./cc1 /tmp/cca18063.i -quiet -dumpbase null.c -version ...
+ GNU C version 2.7.2.3.f.1 (Linux/Alpha) compiled ...
+ as -nocpp -o /tmp/cca180631.o /tmp/cca18063.s
+ ld -G 8 -O1 -o /tmp/delete-me /usr/lib/crt0.o -L. ...
+ /usr/lib/crt0.o: In function `__start':
+ crt0.S:110: undefined reference to `main'
+ /usr/lib/crt0.o(.lita+0x28): undefined reference to `main'
+ sh#
+
+ (Note that long lines have been truncated, and `...' used to
+indicate such truncations.)
+
+ The above two commands test whether `g77' and `gcc', respectively,
+are able to compile empty (null) source files, whether invocation of
+the C preprocessor works, whether libraries can be linked, and so on.
+
+ If the output you get from either of the above two commands is
+noticeably different, especially if it is shorter or longer in ways
+that do not look consistent with the above sample output, you probably
+should not install `gcc' and `g77' until you have investigated further.
+
+ For example, you could try compiling actual applications and seeing
+how that works. (You might want to do that anyway, even if the above
+tests work.)
+
+ To compile using the not-yet-installed versions of `gcc' and `g77',
+use the following commands to invoke them.
+
+ To invoke `g77', type:
+
+ /usr/src/gcc/g77 --driver=/usr/src/gcc/xgcc -B/usr/src/gcc/ ...
+
+ To invoke `gcc', type:
+
+ /usr/src/gcc/xgcc -B/usr/src/gcc/ ...
+
+\1f
+File: g77.info, Node: Installation of Binaries, Next: Updating Documentation, Prev: Pre-installation Checks, Up: Complete Installation
+
+Installation of Binaries
+------------------------
+
+ After configuring, building, and testing `g77' and `gcc', when you
+are ready to install them on your system, type:
+
+ make -k CC=gcc LANGUAGES=f77 install
+
+ As described in *Note Installing GNU CC: (gcc)Installation, the
+values for the `CC' and `LANGUAGES' macros should be the same as those
+you supplied for the build itself.
+
+ So, the details of the above command might vary if you used a
+bootstrap build (where you might be able to omit both definitions, or
+might have to supply the same definitions you used when building the
+final stage) or if you deviated from the instructions for a straight
+build.
+
+ If the above command does not install `libf2c.a' as expected, try
+this:
+
+ make -k ... install install-libf77 install-f2c-all
+
+ We don't know why some non-GNU versions of `make' sometimes require
+this alternate command, but they do. (Remember to supply the
+appropriate definitions for `CC' and `LANGUAGES' where you see `...' in
+the above command.)
+
+ Note that using the `-k' option tells `make' to continue after some
+installation problems, like not having `makeinfo' installed on your
+system. It might not be necessary for your system.
+
+\1f
+File: g77.info, Node: Updating Documentation, Next: Missing bison?, Prev: Installation of Binaries, Up: Complete Installation
+
+Updating Your Info Directory
+----------------------------
+
+ As part of installing `g77', you should make sure users of `info'
+can easily access this manual on-line. Do this by making sure a line
+such as the following exists in `/usr/info/dir', or in whatever file is
+the top-level file in the `info' directory on your system (perhaps
+`/usr/local/info/dir':
+
+ * g77: (g77). The GNU Fortran programming language.
+
+ If the menu in `dir' is organized into sections, `g77' probably
+belongs in a section with a name such as one of the following:
+
+ * Fortran Programming
+
+ * Writing Programs
+
+ * Programming Languages
+
+ * Languages Other Than C
+
+ * Scientific/Engineering Tools
+
+ * GNU Compilers
+
+\1f
+File: g77.info, Node: Missing bison?, Next: Missing makeinfo?, Prev: Updating Documentation, Up: Complete Installation
+
+Missing `bison'?
+----------------
+
+ If you cannot install `bison', make sure you have started with a
+*fresh* distribution of `gcc', do *not* do `make maintainer-clean' (in
+other versions of `gcc', this was called `make realclean'), and, to
+ensure that `bison' is not invoked by `make' during the build, type
+these commands:
+
+ sh# cd gcc
+ sh# touch bi-parser.c bi-parser.h c-parse.c c-parse.h cexp.c
+ sh# touch cp/parse.c cp/parse.h objc-parse.c
+ sh#
+
+ These commands update the date-time-modified information for all the
+files produced by the various invocations of `bison' in the current
+versions of `gcc', so that `make' no longer believes it needs to update
+them. All of these files should already exist in a `gcc' distribution,
+but the application of patches to upgrade to a newer version can leave
+the modification information set such that the `bison' input files look
+more "recent" than the corresponding output files.
+
+ *Note:* New versions of `gcc' might change the set of files it
+generates by invoking `bison'--if you cannot figure out for yourself
+how to handle such a situation, try an older version of `gcc' until you
+find someone who can (or until you obtain and install `bison').
+
+\1f
+File: g77.info, Node: Missing makeinfo?, Prev: Missing bison?, Up: Complete Installation
+
+Missing `makeinfo'?
+-------------------
+
+ If you cannot install `makeinfo', either use the `-k' option when
+invoking make to specify any of the `install' or related targets, or
+specify `MAKEINFO=echo' on the `make' command line.
+
+ If you fail to do one of these things, some files, like `libf2c.a',
+might not be installed, because the failed attempt by `make' to invoke
+`makeinfo' causes it to cancel any further processing.
+
+\1f
+File: g77.info, Node: Distributing Binaries, Prev: Complete Installation, Up: Installation
+
+Distributing Binaries
+=====================
+
+ If you are building `g77' for distribution to others in binary form,
+first make sure you are aware of your legal responsibilities (read the
+file `gcc/COPYING' thoroughly).
+
+ Then, consider your target audience and decide where `g77' should be
+installed.
+
+ For systems like GNU/Linux that have no native Fortran compiler (or
+where `g77' could be considered the native compiler for Fortran and
+`gcc' for C, etc.), you should definitely configure `g77' for
+installation in `/usr/bin' instead of `/usr/local/bin'. Specify the
+`--prefix=/usr' option when running `./configure'. You might also want
+to set up the distribution so the `f77' command is a link to
+`g77'--just make an empty file named `f77-install-ok' in the source or
+build directory (the one in which the `f' directory resides, not the
+`f' directory itself) when you specify one of the `install' or
+`uninstall' targets in a `make' command.
+
+ For a system that might already have `f2c' installed, you definitely
+will want to make another empty file (in the same directory) named
+either `f2c-exists-ok' or `f2c-install-ok'. Use the former if you
+don't want your distribution to overwrite `f2c'-related files in
+existing systems; use the latter if you want to improve the likelihood
+that users will be able to use both `f2c' and `g77' to compile code for
+a single program without encountering link-time or run-time
+incompatibilities.
+
+ (Make sure you clearly document, in the "advertising" for your
+distribution, how installation of your distribution will affect
+existing installations of `gcc', `f2c', `f77', `libf2c.a', and so on.
+Similarly, you should clearly document any requirements you assume are
+met by users of your distribution.)
+
+ For other systems with native `f77' (and `cc') compilers, configure
+`g77' as you (or most of your audience) would configure `gcc' for their
+installations. Typically this is for installation in `/usr/local', and
+would not include a copy of `g77' named `f77', so users could still use
+the native `f77'.
+
+ In any case, for `g77' to work properly, you *must* ensure that the
+binaries you distribute include:
+
+`bin/g77'
+ This is the command most users use to compile Fortran.
+
+`bin/gcc'
+ This is the command all users use to compile Fortran, either
+ directly or indirectly via the `g77' command. The `bin/gcc'
+ executable file must have been built from a `gcc' source tree into
+ which a `g77' source tree was merged and configured, or it will
+ not know how to compile Fortran programs.
+
+`bin/f77'
+ In installations with no non-GNU native Fortran compiler, this is
+ the same as `bin/g77'. Otherwise, it should be omitted from the
+ distribution, so the one on already on a particular system does
+ not get overwritten.
+
+`info/g77.info*'
+ This is the documentation for `g77'. If it is not included, users
+ will have trouble understanding diagnostics messages and other
+ such things, and will send you a lot of email asking questions.
+
+ Please edit this documentation (by editing `gcc/f/*.texi' and
+ doing `make doc' from the `/usr/src/gcc' directory) to reflect any
+ changes you've made to `g77', or at least to encourage users of
+ your binary distribution to report bugs to you first.
+
+ Also, whether you distribute binaries or install `g77' on your own
+ system, it might be helpful for everyone to add a line listing
+ this manual by name and topic to the top-level `info' node in
+ `/usr/info/dir'. That way, users can find `g77' documentation more
+ easily. *Note Updating Your Info Directory: Updating
+ Documentation.
+
+`man/man1/g77.1'
+ This is the short man page for `g77'. It is out of date, but you
+ might as well include it for people who really like man pages.
+
+`man/man1/f77.1'
+ In installations where `f77' is the same as `g77', this is the
+ same as `man/man1/g77.1'. Otherwise, it should be omitted from
+ the distribution, so the one already on a particular system does
+ not get overwritten.
+
+`lib/gcc-lib/.../f771'
+ This is the actual Fortran compiler.
+
+`lib/gcc-lib/.../libf2c.a'
+ This is the run-time library for `g77'-compiled programs.
+
+ Whether you want to include the slightly updated (and possibly
+improved) versions of `cc1', `cc1plus', and whatever other binaries get
+rebuilt with the changes the GNU Fortran distribution makes to the GNU
+back end, is up to you. These changes are highly unlikely to break any
+compilers, and it is possible they'll fix back-end bugs that can be
+demonstrated using front ends other than GNU Fortran's.
+
+ Please assure users that unless they have a specific need for their
+existing, older versions of `gcc' command, they are unlikely to
+experience any problems by overwriting it with your version--though
+they could certainly protect themselves by making backup copies first!
+Otherwise, users might try and install your binaries in a "safe" place,
+find they cannot compile Fortran programs with your distribution
+(because, perhaps, they're picking up their old version of the `gcc'
+command, which does not recognize Fortran programs), and assume that
+your binaries (or, more generally, GNU Fortran distributions in
+general) are broken, at least for their system.
+
+ Finally, *please* ask for bug reports to go to you first, at least
+until you're sure your distribution is widely used and has been well
+tested. This especially goes for those of you making any changes to
+the `g77' sources to port `g77', e.g. to OS/2.
+<fortran@gnu.ai.mit.edu> has received a fair number of bug reports that
+turned out to be problems with other peoples' ports and distributions,
+about which nothing could be done for the user. Once you are quite
+certain a bug report does not involve your efforts, you can forward it
+to us.
+
+\1f
+File: g77.info, Node: Debugging and Interfacing, Next: Collected Fortran Wisdom, Prev: Installation, Up: Top
+
+Debugging and Interfacing
+*************************
+
+ GNU Fortran currently generates code that is object-compatible with
+the `f2c' converter. Also, it avoids limitations in the current GBE,
+such as the inability to generate a procedure with multiple entry
+points, by generating code that is structured differently (in terms of
+procedure names, scopes, arguments, and so on) than might be expected.
+
+ As a result, writing code in other languages that calls on, is
+called by, or shares in-memory data with `g77'-compiled code generally
+requires some understanding of the way `g77' compiles code for various
+constructs.
+
+ Similarly, using a debugger to debug `g77'-compiled code, even if
+that debugger supports native Fortran debugging, generally requires
+this sort of information.
+
+ This section describes some of the basic information on how `g77'
+compiles code for constructs involving interfaces to other languages
+and to debuggers.
+
+ *Caution:* Much or all of this information pertains to only the
+current release of `g77', sometimes even to using certain compiler
+options with `g77' (such as `-fno-f2c'). Do not write code that
+depends on this information without clearly marking said code as
+nonportable and subject to review for every new release of `g77'. This
+information is provided primarily to make debugging of code generated
+by this particular release of `g77' easier for the user, and partly to
+make writing (generally nonportable) interface code easier. Both of
+these activities require tracking changes in new version of `g77' as
+they are installed, because new versions can change the behaviors
+described in this section.
+
+* Menu:
+
+* Main Program Unit:: How `g77' compiles a main program unit.
+* Procedures:: How `g77' constructs parameter lists
+ for procedures.
+* Functions:: Functions returning floating-point or character data.
+* Names:: Naming of user-defined variables, procedures, etc.
+* Common Blocks:: Accessing common variables while debugging.
+* Local Equivalence Areas:: Accessing `EQUIVALENCE' while debugging.
+* Complex Variables:: How `g77' performs complex arithmetic.
+* Arrays:: Dealing with (possibly multi-dimensional) arrays.
+* Adjustable Arrays:: Special consideration for adjustable arrays.
+* Alternate Entry Points:: How `g77' implements alternate `ENTRY'.
+* Alternate Returns:: How `g77' handles alternate returns.
+* Assigned Statement Labels:: How `g77' handles `ASSIGN'.
+* Run-time Library Errors:: Meanings of some `IOSTAT=' values.
+
+\1f
+File: g77.info, Node: Main Program Unit, Next: Procedures, Up: Debugging and Interfacing
+
+Main Program Unit (PROGRAM)
+===========================
+
+ When `g77' compiles a main program unit, it gives it the public
+procedure name `MAIN__'. The `libf2c' library has the actual `main()'
+procedure as is typical of C-based environments, and it is this
+procedure that performs some initial start-up activity and then calls
+`MAIN__'.
+
+ Generally, `g77' and `libf2c' are designed so that you need not
+include a main program unit written in Fortran in your program--it can
+be written in C or some other language. Especially for I/O handling,
+this is the case, although `g77' version 0.5.16 includes a bug fix for
+`libf2c' that solved a problem with using the `OPEN' statement as the
+first Fortran I/O activity in a program without a Fortran main program
+unit.
+
+ However, if you don't intend to use `g77' (or `f2c') to compile your
+main program unit--that is, if you intend to compile a `main()'
+procedure using some other language--you should carefully examine the
+code for `main()' in `libf2c', found in the source file
+`gcc/f/runtime/libF77/main.c', to see what kinds of things might need
+to be done by your `main()' in order to provide the Fortran environment
+your Fortran code is expecting.
+
+ For example, `libf2c''s `main()' sets up the information used by the
+`IARGC' and `GETARG' intrinsics. Bypassing `libf2c''s `main()' without
+providing a substitute for this activity would mean that invoking
+`IARGC' and `GETARG' would produce undefined results.
+
+ When debugging, one implication of the fact that `main()', which is
+the place where the debugged program "starts" from the debugger's point
+of view, is in `libf2c' is that you won't be starting your Fortran
+program at a point you recognize as your Fortran code.
+
+ The standard way to get around this problem is to set a break point
+(a one-time, or temporary, break point will do) at the entrance to
+`MAIN__', and then run the program. A convenient way to do so is to
+add the `gdb' command
+
+ tbreak MAIN__
+
+to the file `.gdbinit' in the directory in which you're debugging
+(using `gdb').
+
+ After doing this, the debugger will see the current execution point
+of the program as at the beginning of the main program unit of your
+program.
+
+ Of course, if you really want to set a break point at some other
+place in your program and just start the program running, without first
+breaking at `MAIN__', that should work fine.
+
+\1f
+File: g77.info, Node: Procedures, Next: Functions, Prev: Main Program Unit, Up: Debugging and Interfacing
+
+Procedures (SUBROUTINE and FUNCTION)
+====================================
+
+ Currently, `g77' passes arguments via reference--specifically, by
+passing a pointer to the location in memory of a variable, array, array
+element, a temporary location that holds the result of evaluating an
+expression, or a temporary or permanent location that holds the value
+of a constant.
+
+ Procedures that accept `CHARACTER' arguments are implemented by
+`g77' so that each `CHARACTER' argument has two actual arguments.
+
+ The first argument occupies the expected position in the argument
+list and has the user-specified name. This argument is a pointer to an
+array of characters, passed by the caller.
+
+ The second argument is appended to the end of the user-specified
+calling sequence and is named `__g77_length_X', where X is the
+user-specified name. This argument is of the C type `ftnlen' (see
+`gcc/f/runtime/f2c.h.in' for information on that type) and is the
+number of characters the caller has allocated in the array pointed to
+by the first argument.
+
+ A procedure will ignore the length argument if `X' is not declared
+`CHARACTER*(*)', because for other declarations, it knows the length.
+Not all callers necessarily "know" this, however, which is why they all
+pass the extra argument.
+
+ The contents of the `CHARACTER' argument are specified by the
+address passed in the first argument (named after it). The procedure
+can read or write these contents as appropriate.
+
+ When more than one `CHARACTER' argument is present in the argument
+list, the length arguments are appended in the order the original
+arguments appear. So `CALL FOO('HI','THERE')' is implemented in C as
+`foo("hi","there",2,5);', ignoring the fact that `g77' does not provide
+the trailing null bytes on the constant strings (`f2c' does provide
+them, but they are unnecessary in a Fortran environment, and you should
+not expect them to be there).
+
+ Note that the above information applies to `CHARACTER' variables and
+arrays *only*. It does *not* apply to external `CHARACTER' functions
+or to intrinsic `CHARACTER' functions. That is, no second length
+argument is passed to `FOO' in this case:
+
+ CHARACTER X
+ EXTERNAL X
+ CALL FOO(X)
+
+Nor does `FOO' expect such an argument in this case:
+
+ SUBROUTINE FOO(X)
+ CHARACTER X
+ EXTERNAL X
+
+ Because of this implementation detail, if a program has a bug such
+that there is disagreement as to whether an argument is a procedure,
+and the type of the argument is `CHARACTER', subtle symptoms might
+appear.
+
+\1f
+File: g77.info, Node: Functions, Next: Names, Prev: Procedures, Up: Debugging and Interfacing
+
+Functions (FUNCTION and RETURN)
+===============================
+
+ `g77' handles in a special way functions that return the following
+types:
+
+ * `CHARACTER'
+
+ * `COMPLEX'
+
+ * `REAL(KIND=1)'
+
+ For `CHARACTER', `g77' implements a subroutine (a C function
+returning `void') with two arguments prepended: `__g77_result', which
+the caller passes as a pointer to a `char' array expected to hold the
+return value, and `__g77_length', which the caller passes as an
+`ftnlen' value specifying the length of the return value as declared in
+the calling program. For `CHARACTER*(*)', the called function uses
+`__g77_length' to determine the size of the array that `__g77_result'
+points to; otherwise, it ignores that argument.
+
+ For `COMPLEX', when `-ff2c' is in force, `g77' implements a
+subroutine with one argument prepended: `__g77_result', which the
+caller passes as a pointer to a variable of the type of the function.
+The called function writes the return value into this variable instead
+of returning it as a function value. When `-fno-f2c' is in force,
+`g77' implements a `COMPLEX' function as `gcc''s `__complex__ float' or
+`__complex__ double' function (or an emulation thereof, when
+`-femulate-complex' is in effect), returning the result of the function
+in the same way as `gcc' would.
+
+ For `REAL(KIND=1)', when `-ff2c' is in force, `g77' implements a
+function that actually returns `REAL(KIND=2)' (typically C's `double'
+type). When `-fno-f2c' is in force, `REAL(KIND=1)' functions return
+`float'.
+
+\1f
+File: g77.info, Node: Names, Next: Common Blocks, Prev: Functions, Up: Debugging and Interfacing
+
+Names
+=====
+
+ Fortran permits each implementation to decide how to represent names
+as far as how they're seen in other contexts, such as debuggers and
+when interfacing to other languages, and especially as far as how
+casing is handled.
+
+ External names--names of entities that are public, or "accessible",
+to all modules in a program--normally have an underscore (`_') appended
+by `g77', to generate code that is compatible with f2c. External names
+include names of Fortran things like common blocks, external procedures
+(subroutines and functions, but not including statement functions,
+which are internal procedures), and entry point names.
+
+ However, use of the `-fno-underscoring' option disables this kind of
+transformation of external names (though inhibiting the transformation
+certainly improves the chances of colliding with incompatible externals
+written in other languages--but that might be intentional.
+
+ When `-funderscoring' is in force, any name (external or local) that
+already has at least one underscore in it is implemented by `g77' by
+appending two underscores. (This second underscore can be disabled via
+the `-fno-second-underscore' option.) External names are changed this
+way for `f2c' compatibility. Local names are changed this way to avoid
+collisions with external names that are different in the source
+code--`f2c' does the same thing, but there's no compatibility issue
+there except for user expectations while debugging.
+
+ For example:
+
+ Max_Cost = 0
+
+Here, a user would, in the debugger, refer to this variable using the
+name `max_cost__' (or `MAX_COST__' or `Max_Cost__', as described below).
+(We hope to improve `g77' in this regard in the future--don't write
+scripts depending on this behavior! Also, consider experimenting with
+the `-fno-underscoring' option to try out debugging without having to
+massage names by hand like this.)
+
+ `g77' provides a number of command-line options that allow the user
+to control how case mapping is handled for source files. The default
+is the traditional UNIX model for Fortran compilers--names are mapped
+to lower case. Other command-line options can be specified to map
+names to upper case, or to leave them exactly as written in the source
+file.
+
+ For example:
+
+ Foo = 9.436
+
+Here, it is normally the case that the variable assigned will be named
+`foo'. This would be the name to enter when using a debugger to access
+the variable.
+
+ However, depending on the command-line options specified, the name
+implemented by `g77' might instead be `FOO' or even `Foo', thus
+affecting how debugging is done.
+
+ Also:
+
+ Call Foo
+
+This would normally call a procedure that, if it were in a separate C
+program, be defined starting with the line:
+
+ void foo_()
+
+However, `g77' command-line options could be used to change the casing
+of names, resulting in the name `FOO_' or `Foo_' being given to the
+procedure instead of `foo_', and the `-fno-underscoring' option could
+be used to inhibit the appending of the underscore to the name.
+
+\1f
+File: g77.info, Node: Common Blocks, Next: Local Equivalence Areas, Prev: Names, Up: Debugging and Interfacing
+
+Common Blocks (COMMON)
+======================
+
+ `g77' names and lays out `COMMON' areas the same way f2c does, for
+compatibility with f2c.
+
+ Currently, `g77' does not emit "true" debugging information for
+members of a `COMMON' area, due to an apparent bug in the GBE.
+
+ (As of Version 0.5.19, `g77' emits debugging information for such
+members in the form of a constant string specifying the base name of
+the aggregate area and the offset of the member in bytes from the start
+of the area. Use the `-fdebug-kludge' option to enable this behavior.
+In `gdb', use `set language c' before printing the value of the member,
+then `set language fortran' to restore the default language, since
+`gdb' doesn't provide a way to print a readable version of a character
+string in Fortran language mode.
+
+ This kludge will be removed in a future version of `g77' that, in
+conjunction with a contemporary version of `gdb', properly supports
+Fortran-language debugging, including access to members of `COMMON'
+areas.)
+
+ *Note Options for Code Generation Conventions: Code Gen Options, for
+information on the `-fdebug-kludge' option.
+
+ Moreover, `g77' currently implements a `COMMON' area such that its
+type is an array of the C `char' data type.
+
+ So, when debugging, you must know the offset into a `COMMON' area
+for a particular item in that area, and you have to take into account
+the appropriate multiplier for the respective sizes of the types (as
+declared in your code) for the items preceding the item in question as
+compared to the size of the `char' type.
+
+ For example, using default implicit typing, the statement
+
+ COMMON I(15), R(20), T
+
+results in a public 144-byte `char' array named `_BLNK__' with `I'
+placed at `_BLNK__[0]', `R' at `_BLNK__[60]', and `T' at `_BLNK__[140]'.
+(This is assuming that the target machine for the compilation has
+4-byte `INTEGER(KIND=1)' and `REAL(KIND=1)' types.)
+
+\1f
+File: g77.info, Node: Local Equivalence Areas, Next: Complex Variables, Prev: Common Blocks, Up: Debugging and Interfacing
+
+Local Equivalence Areas (EQUIVALENCE)
+=====================================
+
+ `g77' treats storage-associated areas involving a `COMMON' block as
+explained in the section on common blocks.
+
+ A local `EQUIVALENCE' area is a collection of variables and arrays
+connected to each other in any way via `EQUIVALENCE', none of which are
+listed in a `COMMON' statement.
+
+ Currently, `g77' does not emit "true" debugging information for
+members in a local `EQUIVALENCE' area, due to an apparent bug in the
+GBE.
+
+ (As of Version 0.5.19, `g77' does emit debugging information for such
+members in the form of a constant string specifying the base name of
+the aggregate area and the offset of the member in bytes from the start
+of the area. Use the `-fdebug-kludge' option to enable this behavior.
+In `gdb', use `set language c' before printing the value of the member,
+then `set language fortran' to restore the default language, since
+`gdb' doesn't provide a way to print a readable version of a character
+string in Fortran language mode.
+
+ This kludge will be removed in a future version of `g77' that, in
+conjunction with a contemporary version of `gdb', properly supports
+Fortran-language debugging, including access to members of
+`EQUIVALENCE' areas.)
+
+ *Note Options for Code Generation Conventions: Code Gen Options, for
+information on the `-fdebug-kludge' option.
+
+ Moreover, `g77' implements a local `EQUIVALENCE' area such that its
+type is an array of the C `char' data type.
+
+ The name `g77' gives this array of `char' type is `__g77_equiv_X',
+where X is the name of the item that is placed at the beginning (offset
+0) of this array. If more than one such item is placed at the
+beginning, X is the name that sorts to the top in an alphabetical sort
+of the list of such items.
+
+ When debugging, you must therefore access members of `EQUIVALENCE'
+areas by specifying the appropriate `__g77_equiv_X' array section with
+the appropriate offset. See the explanation of debugging `COMMON'
+blocks for info applicable to debugging local `EQUIVALENCE' areas.
+
+ (*Note:* `g77' version 0.5.18 and earlier chose the name for X using
+a different method when more than one name was in the list of names of
+entities placed at the beginning of the array. Though the
+documentation specified that the first name listed in the `EQUIVALENCE'
+statements was chosen for X, `g77' in fact chose the name using a
+method that was so complicated, it seemed easier to change it to an
+alphabetical sort than to describe the previous method in the
+documentation.)
+
+\1f
+File: g77.info, Node: Complex Variables, Next: Arrays, Prev: Local Equivalence Areas, Up: Debugging and Interfacing
+
+Complex Variables (COMPLEX)
+===========================
+
+ As of 0.5.20, `g77' defaults to handling `COMPLEX' types (and
+related intrinsics, constants, functions, and so on) in a manner that
+makes direct debugging involving these types in Fortran language mode
+difficult.
+
+ Essentially, `g77' implements these types using an internal
+construct similar to C's `struct', at least as seen by the `gcc' back
+end.
+
+ Currently, the back end, when outputting debugging info with the
+compiled code for the assembler to digest, does not detect these
+`struct' types as being substitutes for Fortran complex. As a result,
+the Fortran language modes of debuggers such as `gdb' see these types
+as C `struct' types, which they might or might not support.
+
+ Until this is fixed, switch to C language mode to work with entities
+of `COMPLEX' type and then switch back to Fortran language mode
+afterward. (In `gdb', this is accomplished via `set lang c' and either
+`set lang fortran' or `set lang auto'.)
+
+ *Note:* Compiling with the `-fno-emulate-complex' option avoids the
+debugging problem, but is known to cause other problems like compiler
+crashes and generation of incorrect code, so it is not recommended.
+
+\1f
+File: g77.info, Node: Arrays, Next: Adjustable Arrays, Prev: Complex Variables, Up: Debugging and Interfacing
+
+Arrays (DIMENSION)
+==================
+
+ Fortran uses "column-major ordering" in its arrays. This differs
+from other languages, such as C, which use "row-major ordering". The
+difference is that, with Fortran, array elements adjacent to each other
+in memory differ in the *first* subscript instead of the last;
+`A(5,10,20)' immediately follows `A(4,10,20)', whereas with row-major
+ordering it would follow `A(5,10,19)'.
+
+ This consideration affects not only interfacing with and debugging
+Fortran code, it can greatly affect how code is designed and written,
+especially when code speed and size is a concern.
+
+ Fortran also differs from C, a popular language for interfacing and
+to support directly in debuggers, in the way arrays are treated. In C,
+arrays are single-dimensional and have interesting relationships to
+pointers, neither of which is true for Fortran. As a result, dealing
+with Fortran arrays from within an environment limited to C concepts
+can be challenging.
+
+ For example, accessing the array element `A(5,10,20)' is easy enough
+in Fortran (use `A(5,10,20)'), but in C some difficult machinations are
+needed. First, C would treat the A array as a single-dimension array.
+Second, C does not understand low bounds for arrays as does Fortran.
+Third, C assumes a low bound of zero (0), while Fortran defaults to a
+low bound of one (1) and can supports an arbitrary low bound.
+Therefore, calculations must be done to determine what the C equivalent
+of `A(5,10,20)' would be, and these calculations require knowing the
+dimensions of `A'.
+
+ For `DIMENSION A(2:11,21,0:29)', the calculation of the offset of
+`A(5,10,20)' would be:
+
+ (5-2)
+ + (10-1)*(11-2+1)
+ + (20-0)*(11-2+1)*(21-1+1)
+ = 4293
+
+So the C equivalent in this case would be `a[4293]'.
+
+ When using a debugger directly on Fortran code, the C equivalent
+might not work, because some debuggers cannot understand the notion of
+low bounds other than zero. However, unlike `f2c', `g77' does inform
+the GBE that a multi-dimensional array (like `A' in the above example)
+is really multi-dimensional, rather than a single-dimensional array, so
+at least the dimensionality of the array is preserved.
+
+ Debuggers that understand Fortran should have no trouble with
+non-zero low bounds, but for non-Fortran debuggers, especially C
+debuggers, the above example might have a C equivalent of `a[4305]'.
+This calculation is arrived at by eliminating the subtraction of the
+lower bound in the first parenthesized expression on each line--that
+is, for `(5-2)' substitute `(5)', for `(10-1)' substitute `(10)', and
+for `(20-0)' substitute `(20)'. Actually, the implication of this can
+be that the expression `*(&a[2][1][0] + 4293)' works fine, but that
+`a[20][10][5]' produces the equivalent of `*(&a[0][0][0] + 4305)'
+because of the missing lower bounds.
+
+ Come to think of it, perhaps the behavior is due to the debugger
+internally compensating for the lower bounds by offsetting the base
+address of `a', leaving `&a' set lower, in this case, than
+`&a[2][1][0]' (the address of its first element as identified by
+subscripts equal to the corresponding lower bounds).
+
+ You know, maybe nobody really needs to use arrays.
+
+\1f
+File: g77.info, Node: Adjustable Arrays, Next: Alternate Entry Points, Prev: Arrays, Up: Debugging and Interfacing
+
+Adjustable Arrays (DIMENSION)
+=============================
+
+ Adjustable and automatic arrays in Fortran require the implementation
+(in this case, the `g77' compiler) to "memorize" the expressions that
+dimension the arrays each time the procedure is invoked. This is so
+that subsequent changes to variables used in those expressions, made
+during execution of the procedure, do not have any effect on the
+dimensions of those arrays.
+
+ For example:
+
+ REAL ARRAY(5)
+ DATA ARRAY/5*2/
+ CALL X(ARRAY, 5)
+ END
+ SUBROUTINE X(A, N)
+ DIMENSION A(N)
+ N = 20
+ PRINT *, N, A
+ END
+
+Here, the implementation should, when running the program, print
+something like:
+
+ 20 2. 2. 2. 2. 2.
+
+Note that this shows that while the value of `N' was successfully
+changed, the size of the `A' array remained at 5 elements.
+
+ To support this, `g77' generates code that executes before any user
+code (and before the internally generated computed `GOTO' to handle
+alternate entry points, as described below) that evaluates each
+(nonconstant) expression in the list of subscripts for an array, and
+saves the result of each such evaluation to be used when determining
+the size of the array (instead of re-evaluating the expressions).
+
+ So, in the above example, when `X' is first invoked, code is
+executed that copies the value of `N' to a temporary. And that same
+temporary serves as the actual high bound for the single dimension of
+the `A' array (the low bound being the constant 1). Since the user
+program cannot (legitimately) change the value of the temporary during
+execution of the procedure, the size of the array remains constant
+during each invocation.
+
+ For alternate entry points, the code `g77' generates takes into
+account the possibility that a dummy adjustable array is not actually
+passed to the actual entry point being invoked at that time. In that
+case, the public procedure implementing the entry point passes to the
+master private procedure implementing all the code for the entry points
+a `NULL' pointer where a pointer to that adjustable array would be
+expected. The `g77'-generated code doesn't attempt to evaluate any of
+the expressions in the subscripts for an array if the pointer to that
+array is `NULL' at run time in such cases. (Don't depend on this
+particular implementation by writing code that purposely passes `NULL'
+pointers where the callee expects adjustable arrays, even if you know
+the callee won't reference the arrays--nor should you pass `NULL'
+pointers for any dummy arguments used in calculating the bounds of such
+arrays or leave undefined any values used for that purpose in
+COMMON--because the way `g77' implements these things might change in
+the future!)
+
+\1f
+File: g77.info, Node: Alternate Entry Points, Next: Alternate Returns, Prev: Adjustable Arrays, Up: Debugging and Interfacing
+
+Alternate Entry Points (ENTRY)
+==============================
+
+ The GBE does not understand the general concept of alternate entry
+points as Fortran provides via the ENTRY statement. `g77' gets around
+this by using an approach to compiling procedures having at least one
+`ENTRY' statement that is almost identical to the approach used by
+`f2c'. (An alternate approach could be used that would probably
+generate faster, but larger, code that would also be a bit easier to
+debug.)
+
+ Information on how `g77' implements `ENTRY' is provided for those
+trying to debug such code. The choice of implementation seems unlikely
+to affect code (compiled in other languages) that interfaces to such
+code.
+
+ `g77' compiles exactly one public procedure for the primary entry
+point of a procedure plus each `ENTRY' point it specifies, as usual.
+That is, in terms of the public interface, there is no difference
+between
+
+ SUBROUTINE X
+ END
+ SUBROUTINE Y
+ END
+
+and:
+
+ SUBROUTINE X
+ ENTRY Y
+ END
+
+ The difference between the above two cases lies in the code compiled
+for the `X' and `Y' procedures themselves, plus the fact that, for the
+second case, an extra internal procedure is compiled.
+
+ For every Fortran procedure with at least one `ENTRY' statement,
+`g77' compiles an extra procedure named `__g77_masterfun_X', where X is
+the name of the primary entry point (which, in the above case, using
+the standard compiler options, would be `x_' in C).
+
+ This extra procedure is compiled as a private procedure--that is, a
+procedure not accessible by name to separately compiled modules. It
+contains all the code in the program unit, including the code for the
+primary entry point plus for every entry point. (The code for each
+public procedure is quite short, and explained later.)
+
+ The extra procedure has some other interesting characteristics.
+
+ The argument list for this procedure is invented by `g77'. It
+contains a single integer argument named `__g77_which_entrypoint',
+passed by value (as in Fortran's `%VAL()' intrinsic), specifying the
+entry point index--0 for the primary entry point, 1 for the first entry
+point (the first `ENTRY' statement encountered), 2 for the second entry
+point, and so on.
+
+ It also contains, for functions returning `CHARACTER' and (when
+`-ff2c' is in effect) `COMPLEX' functions, and for functions returning
+different types among the `ENTRY' statements (e.g. `REAL FUNCTION R()'
+containing `ENTRY I()'), an argument named `__g77_result' that is
+expected at run time to contain a pointer to where to store the result
+of the entry point. For `CHARACTER' functions, this storage area is an
+array of the appropriate number of characters; for `COMPLEX' functions,
+it is the appropriate area for the return type; for
+multiple-return-type functions, it is a union of all the supported
+return types (which cannot include `CHARACTER', since combining
+`CHARACTER' and non-`CHARACTER' return types via `ENTRY' in a single
+function is not supported by `g77').
+
+ For `CHARACTER' functions, the `__g77_result' argument is followed
+by yet another argument named `__g77_length' that, at run time,
+specifies the caller's expected length of the returned value. Note
+that only `CHARACTER*(*)' functions and entry points actually make use
+of this argument, even though it is always passed by all callers of
+public `CHARACTER' functions (since the caller does not generally know
+whether such a function is `CHARACTER*(*)' or whether there are any
+other callers that don't have that information).
+
+ The rest of the argument list is the union of all the arguments
+specified for all the entry points (in their usual forms, e.g.
+`CHARACTER' arguments have extra length arguments, all appended at the
+end of this list). This is considered the "master list" of arguments.
+
+ The code for this procedure has, before the code for the first
+executable statement, code much like that for the following Fortran
+statement:
+
+ GOTO (100000,100001,100002), __g77_which_entrypoint
+ 100000 ...code for primary entry point...
+ 100001 ...code immediately following first ENTRY statement...
+ 100002 ...code immediately following second ENTRY statement...
+
+(Note that invalid Fortran statement labels and variable names are used
+in the above example to highlight the fact that it represents code
+generated by the `g77' internals, not code to be written by the user.)
+
+ It is this code that, when the procedure is called, picks which
+entry point to start executing.
+
+ Getting back to the public procedures (`x' and `Y' in the original
+example), those procedures are fairly simple. Their interfaces are
+just like they would be if they were self-contained procedures (without
+`ENTRY'), of course, since that is what the callers expect. Their code
+consists of simply calling the private procedure, described above, with
+the appropriate extra arguments (the entry point index, and perhaps a
+pointer to a multiple-type- return variable, local to the public
+procedure, that contains all the supported returnable non-character
+types). For arguments that are not listed for a given entry point that
+are listed for other entry points, and therefore that are in the
+"master list" for the private procedure, null pointers (in C, the
+`NULL' macro) are passed. Also, for entry points that are part of a
+multiple-type- returning function, code is compiled after the call of
+the private procedure to extract from the multi-type union the
+appropriate result, depending on the type of the entry point in
+question, returning that result to the original caller.
+
+ When debugging a procedure containing alternate entry points, you
+can either set a break point on the public procedure itself (e.g. a
+break point on `X' or `Y') or on the private procedure that contains
+most of the pertinent code (e.g. `__g77_masterfun_X'). If you do the
+former, you should use the debugger's command to "step into" the called
+procedure to get to the actual code; with the latter approach, the
+break point leaves you right at the actual code, skipping over the
+public entry point and its call to the private procedure (unless you
+have set a break point there as well, of course).
+
+ Further, the list of dummy arguments that is visible when the
+private procedure is active is going to be the expanded version of the
+list for whichever particular entry point is active, as explained
+above, and the way in which return values are handled might well be
+different from how they would be handled for an equivalent single-entry
+function.
+
+\1f
+File: g77.info, Node: Alternate Returns, Next: Assigned Statement Labels, Prev: Alternate Entry Points, Up: Debugging and Interfacing
+
+Alternate Returns (SUBROUTINE and RETURN)
+=========================================
+
+ Subroutines with alternate returns (e.g. `SUBROUTINE X(*)' and `CALL
+X(*50)') are implemented by `g77' as functions returning the C `int'
+type. The actual alternate-return arguments are omitted from the
+calling sequence. Instead, the caller uses the return value to do a
+rough equivalent of the Fortran computed-`GOTO' statement, as in `GOTO
+(50), X()' in the example above (where `X' is quietly declared as an
+`INTEGER(KIND=1)' function), and the callee just returns whatever
+integer is specified in the `RETURN' statement for the subroutine For
+example, `RETURN 1' is implemented as `X = 1' followed by `RETURN' in
+C, and `RETURN' by itself is `X = 0' and `RETURN').
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Assigned Statement Labels, Next: Run-time Library Errors, Prev: Alternate Returns, Up: Debugging and Interfacing
+
+Assigned Statement Labels (ASSIGN and GOTO)
+===========================================
+
+ For portability to machines where a pointer (such as to a label,
+which is how `g77' implements `ASSIGN' and its relatives, the
+assigned-`GOTO' and assigned-`FORMAT'-I/O statements) is wider
+(bitwise) than an `INTEGER(KIND=1)', `g77' uses a different memory
+location to hold the `ASSIGN'ed value of a variable than it does the
+numerical value in that variable, unless the variable is wide enough
+(can hold enough bits).
+
+ In particular, while `g77' implements
+
+ I = 10
+
+as, in C notation, `i = 10;', it implements
+
+ ASSIGN 10 TO I
+
+as, in GNU's extended C notation (for the label syntax),
+`__g77_ASSIGN_I = &&L10;' (where `L10' is just a massaging of the
+Fortran label `10' to make the syntax C-like; `g77' doesn't actually
+generate the name `L10' or any other name like that, since debuggers
+cannot access labels anyway).
+
+ While this currently means that an `ASSIGN' statement does not
+overwrite the numeric contents of its target variable, *do not* write
+any code depending on this feature. `g77' has already changed this
+implementation across versions and might do so in the future. This
+information is provided only to make debugging Fortran programs
+compiled with the current version of `g77' somewhat easier. If there's
+no debugger-visible variable named `__g77_ASSIGN_I' in a program unit
+that does `ASSIGN 10 TO I', that probably means `g77' has decided it
+can store the pointer to the label directly into `I' itself.
+
+ *Note Ugly Assigned Labels::, for information on a command-line
+option to force `g77' to use the same storage for both normal and
+assigned-label uses of a variable.
+
+\1f
+File: g77.info, Node: Run-time Library Errors, Prev: Assigned Statement Labels, Up: Debugging and Interfacing
+
+Run-time Library Errors
+=======================
+
+ The `libf2c' library currently has the following table to relate
+error code numbers, returned in `IOSTAT=' variables, to messages. This
+information should, in future versions of this document, be expanded
+upon to include detailed descriptions of each message.
+
+ In line with good coding practices, any of the numbers in the list
+below should *not* be directly written into Fortran code you write.
+Instead, make a separate `INCLUDE' file that defines `PARAMETER' names
+for them, and use those in your code, so you can more easily change the
+actual numbers in the future.
+
+ The information below is culled from the definition of `F_err' in
+`f/runtime/libI77/err.c' in the `g77' source tree.
+
+ 100: "error in format"
+ 101: "illegal unit number"
+ 102: "formatted io not allowed"
+ 103: "unformatted io not allowed"
+ 104: "direct io not allowed"
+ 105: "sequential io not allowed"
+ 106: "can't backspace file"
+ 107: "null file name"
+ 108: "can't stat file"
+ 109: "unit not connected"
+ 110: "off end of record"
+ 111: "truncation failed in endfile"
+ 112: "incomprehensible list input"
+ 113: "out of free space"
+ 114: "unit not connected"
+ 115: "read unexpected character"
+ 116: "bad logical input field"
+ 117: "bad variable type"
+ 118: "bad namelist name"
+ 119: "variable not in namelist"
+ 120: "no end record"
+ 121: "variable count incorrect"
+ 122: "subscript for scalar variable"
+ 123: "invalid array section"
+ 124: "substring out of bounds"
+ 125: "subscript out of bounds"
+ 126: "can't read file"
+ 127: "can't write file"
+ 128: "'new' file exists"
+ 129: "can't append to file"
+ 130: "non-positive record number"
+ 131: "I/O started while already doing I/O"
+
+\1f
+File: g77.info, Node: Collected Fortran Wisdom, Next: Trouble, Prev: Debugging and Interfacing, Up: Top
+
+Collected Fortran Wisdom
+************************
+
+ Most users of `g77' can be divided into two camps:
+
+ * Those writing new Fortran code to be compiled by `g77'.
+
+ * Those using `g77' to compile existing, "legacy" code.
+
+ Users writing new code generally understand most of the necessary
+aspects of Fortran to write "mainstream" code, but often need help
+deciding how to handle problems, such as the construction of libraries
+containing `BLOCK DATA'.
+
+ Users dealing with "legacy" code sometimes don't have much
+experience with Fortran, but believe that the code they're compiling
+already works when compiled by other compilers (and might not
+understand why, as is sometimes the case, it doesn't work when compiled
+by `g77').
+
+ The following information is designed to help users do a better job
+coping with existing, "legacy" Fortran code, and with writing new code
+as well.
+
+* Menu:
+
+* Advantages Over f2c:: If `f2c' is so great, why `g77'?
+* Block Data and Libraries:: How `g77' solves a common problem.
+* Loops:: Fortran `DO' loops surprise many people.
+* Working Programs:: Getting programs to work should be done first.
+* Overly Convenient Options:: Temptations to avoid, habits to not form.
+* Faster Programs:: Everybody wants these, but at what cost?
+
+\1f
+File: g77.info, Node: Advantages Over f2c, Next: Block Data and Libraries, Up: Collected Fortran Wisdom
+
+Advantages Over f2c
+===================
+
+ Without `f2c', `g77' would have taken much longer to do and probably
+not been as good for quite a while. Sometimes people who notice how
+much `g77' depends on, and documents encouragement to use, `f2c' ask
+why `g77' was created if `f2c' already existed.
+
+ This section gives some basic answers to these questions, though it
+is not intended to be comprehensive.
+
+* Menu:
+
+* Language Extensions:: Features used by Fortran code.
+* Compiler Options:: Features helpful during development.
+* Compiler Speed:: Speed of the compilation process.
+* Program Speed:: Speed of the generated, optimized code.
+* Ease of Debugging:: Debugging ease-of-use at the source level.
+* Character and Hollerith Constants:: A byte saved is a byte earned.
+
+\1f
+File: g77.info, Node: Language Extensions, Next: Compiler Options, Up: Advantages Over f2c
+
+Language Extensions
+-------------------
+
+ `g77' offers several extensions to the Fortran language that `f2c'
+doesn't.
+
+ However, `f2c' offers a few that `g77' doesn't, like fairly complete
+support for `INTEGER*2'. It is expected that `g77' will offer some or
+all of these missing features at some time in the future. (Version
+0.5.18 of `g77' offers some rudimentary support for some of these
+features.)
+
+\1f
+File: g77.info, Node: Compiler Options, Next: Compiler Speed, Prev: Language Extensions, Up: Advantages Over f2c
+
+Compiler Options
+----------------
+
+ `g77' offers a whole bunch of compiler options that `f2c' doesn't.
+
+ However, `f2c' offers a few that `g77' doesn't, like an option to
+generate code to check array subscripts at run time. It is expected
+that `g77' will offer some or all of these missing options at some time
+in the future.
+
+\1f
+File: g77.info, Node: Compiler Speed, Next: Program Speed, Prev: Compiler Options, Up: Advantages Over f2c
+
+Compiler Speed
+--------------
+
+ Saving the steps of writing and then rereading C code is a big reason
+why `g77' should be able to compile code much faster than using `f2c'
+in conjunction with the equivalent invocation of `gcc'.
+
+ However, due to `g77''s youth, lots of self-checking is still being
+performed. As a result, this improvement is as yet unrealized (though
+the potential seems to be there for quite a big speedup in the future).
+It is possible that, as of version 0.5.18, `g77' is noticeably faster
+compiling many Fortran source files than using `f2c' in conjunction
+with `gcc'.
+
+\1f
+File: g77.info, Node: Program Speed, Next: Ease of Debugging, Prev: Compiler Speed, Up: Advantages Over f2c
+
+Program Speed
+-------------
+
+ `g77' has the potential to better optimize code than `f2c', even
+when `gcc' is used to compile the output of `f2c', because `f2c' must
+necessarily translate Fortran into a somewhat lower-level language (C)
+that cannot preserve all the information that is potentially useful for
+optimization, while `g77' can gather, preserve, and transmit that
+information directly to the GBE.
+
+ For example, `g77' implements `ASSIGN' and assigned `GOTO' using
+direct assignment of pointers to labels and direct jumps to labels,
+whereas `f2c' maps the assigned labels to integer values and then uses
+a C `switch' statement to encode the assigned `GOTO' statements.
+
+ However, as is typical, theory and reality don't quite match, at
+least not in all cases, so it is still the case that `f2c' plus `gcc'
+can generate code that is faster than `g77'.
+
+ Version 0.5.18 of `g77' offered default settings and options, via
+patches to the `gcc' back end, that allow for better program speed,
+though some of these improvements also affected the performance of
+programs translated by `f2c' and then compiled by `g77''s version of
+`gcc'.
+
+ Version 0.5.20 of `g77' offers further performance improvements, at
+least one of which (alias analysis) is not generally applicable to
+`f2c' (though `f2c' could presumably be changed to also take advantage
+of this new capability of the `gcc' back end, assuming this is made
+available in an upcoming release of `gcc').
+
+\1f
+File: g77.info, Node: Ease of Debugging, Next: Character and Hollerith Constants, Prev: Program Speed, Up: Advantages Over f2c
+
+Ease of Debugging
+-----------------
+
+ Because `g77' compiles directly to assembler code like `gcc',
+instead of translating to an intermediate language (C) as does `f2c',
+support for debugging can be better for `g77' than `f2c'.
+
+ However, although `g77' might be somewhat more "native" in terms of
+debugging support than `f2c' plus `gcc', there still are a lot of
+things "not quite right". Many of the important ones should be
+resolved in the near future.
+
+ For example, `g77' doesn't have to worry about reserved names like
+`f2c' does. Given `FOR = WHILE', `f2c' must necessarily translate this
+to something *other* than `for = while;', because C reserves those
+words.
+
+ However, `g77' does still uses things like an extra level of
+indirection for `ENTRY'-laden procedures--in this case, because the
+back end doesn't yet support multiple entry points.
+
+ Another example is that, given
+
+ COMMON A, B
+ EQUIVALENCE (B, C)
+
+the `g77' user should be able to access the variables directly, by name,
+without having to traverse C-like structures and unions, while `f2c' is
+unlikely to ever offer this ability (due to limitations in the C
+language).
+
+ However, due to apparent bugs in the back end, `g77' currently
+doesn't take advantage of this facility at all--it doesn't emit any
+debugging information for `COMMON' and `EQUIVALENCE' areas, other than
+information on the array of `char' it creates (and, in the case of
+local `EQUIVALENCE', names) for each such area.
+
+ Yet another example is arrays. `g77' represents them to the debugger
+using the same "dimensionality" as in the source code, while `f2c' must
+necessarily convert them all to one-dimensional arrays to fit into the
+confines of the C language. However, the level of support offered by
+debuggers for interactive Fortran-style access to arrays as compiled by
+`g77' can vary widely. In some cases, it can actually be an advantage
+that `f2c' converts everything to widely supported C semantics.
+
+ In fairness, `g77' could do many of the things `f2c' does to get
+things working at least as well as `f2c'--for now, the developers
+prefer making `g77' work the way they think it is supposed to, and
+finding help improving the other products (the back end of `gcc';
+`gdb'; and so on) to get things working properly.
+
+\1f
+File: g77.info, Node: Character and Hollerith Constants, Prev: Ease of Debugging, Up: Advantages Over f2c
+
+Character and Hollerith Constants
+---------------------------------
+
+ To avoid the extensive hassle that would be needed to avoid this,
+`f2c' uses C character constants to encode character and Hollerith
+constants. That means a constant like `'HELLO'' is translated to
+`"hello"' in C, which further means that an extra null byte is present
+at the end of the constant. This null byte is superfluous.
+
+ `g77' does not generate such null bytes. This represents significant
+savings of resources, such as on systems where `/dev/null' or
+`/dev/zero' represent bottlenecks in the systems' performance, because
+`g77' simply asks for fewer zeros from the operating system than `f2c'.
+
+\1f
+File: g77.info, Node: Block Data and Libraries, Next: Loops, Prev: Advantages Over f2c, Up: Collected Fortran Wisdom
+
+Block Data and Libraries
+========================
+
+ To ensure that block data program units are linked, especially a
+concern when they are put into libraries, give each one a name (as in
+`BLOCK DATA FOO') and make sure there is an `EXTERNAL FOO' statement in
+every program unit that uses any common block initialized by the
+corresponding `BLOCK DATA'. `g77' currently compiles a `BLOCK DATA' as
+if it were a `SUBROUTINE', that is, it generates an actual procedure
+having the appropriate name. The procedure does nothing but return
+immediately if it happens to be called. For `EXTERNAL FOO', where
+`FOO' is not otherwise referenced in the same program unit, `g77'
+assumes there exists a `BLOCK DATA FOO' in the program and ensures that
+by generating a reference to it so the linker will make sure it is
+present. (Specifically, `g77' outputs in the data section a static
+pointer to the external name `FOO'.)
+
+ The implementation `g77' currently uses to make this work is one of
+the few things not compatible with `f2c' as currently shipped. `f2c'
+currently does nothing with `EXTERNAL FOO' except issue a warning that
+`FOO' is not otherwise referenced, and for `BLOCK DATA FOO', f2c
+doesn't generate a dummy procedure with the name `FOO'. The upshot is
+that you shouldn't mix `f2c' and `g77' in this particular case. If you
+use f2c to compile `BLOCK DATA FOO', then any `g77'-compiled program
+unit that says `EXTERNAL FOO' will result in an unresolved reference
+when linked. If you do the opposite, then `FOO' might not be linked in
+under various circumstances (such as when `FOO' is in a library, or
+you're using a "clever" linker--so clever, it produces a broken program
+with little or no warning by omitting initializations of global data
+because they are contained in unreferenced procedures).
+
+ The changes you make to your code to make `g77' handle this
+situation, however, appear to be a widely portable way to handle it.
+That is, many systems permit it (as they should, since the FORTRAN 77
+standard permits `EXTERNAL FOO' when `FOO' is a block data program
+unit), and of the ones that might not link `BLOCK DATA FOO' under some
+circumstances, most of them appear to do so once `EXTERNAL FOO' is
+present in the appropriate program units.
+
+ Here is the recommended approach to modifying a program containing a
+program unit such as the following:
+
+ BLOCK DATA FOO
+ COMMON /VARS/ X, Y, Z
+ DATA X, Y, Z / 3., 4., 5. /
+ END
+
+If the above program unit might be placed in a library module, then
+ensure that every program unit in every program that references that
+particular `COMMON' area uses the `EXTERNAL' statement to force the
+area to be initialized.
+
+ For example, change a program unit that starts with
+
+ INTEGER FUNCTION CURX()
+ COMMON /VARS/ X, Y, Z
+ CURX = X
+ END
+
+so that it uses the `EXTERNAL' statement, as in:
+
+ INTEGER FUNCTION CURX()
+ COMMON /VARS/ X, Y, Z
+ EXTERNAL FOO
+ CURX = X
+ END
+
+That way, `CURX' is compiled by `g77' (and many other compilers) so
+that the linker knows it must include `FOO', the `BLOCK DATA' program
+unit that sets the initial values for the variables in `VAR', in the
+executable program.
+
+\1f
+File: g77.info, Node: Loops, Next: Working Programs, Prev: Block Data and Libraries, Up: Collected Fortran Wisdom
+
+Loops
+=====
+
+ The meaning of a `DO' loop in Fortran is precisely specified in the
+Fortran standard...and is quite different from what many programmers
+might expect.
+
+ In particular, Fortran `DO' loops are implemented as if the number
+of trips through the loop is calculated *before* the loop is entered.
+
+ The number of trips for a loop is calculated from the START, END,
+and INCREMENT values specified in a statement such as:
+
+ DO ITER = START, END, INCREMENT
+
+The trip count is evaluated using a fairly simple formula based on the
+three values following the `=' in the statement, and it is that trip
+count that is effectively decremented during each iteration of the loop.
+If, at the beginning of an iteration of the loop, the trip count is
+zero or negative, the loop terminates. The per-loop-iteration
+modifications to ITER are not related to determining whether to
+terminate the loop.
+
+ There are two important things to remember about the trip count:
+
+ * It can be *negative*, in which case it is treated as if it was
+ zero--meaning the loop is not executed at all.
+
+ * The type used to *calculate* the trip count is the same type as
+ ITER, but the final calculation, and thus the type of the trip
+ count itself, always is `INTEGER(KIND=1)'.
+
+ These two items mean that there are loops that cannot be written in
+straightforward fashion using the Fortran `DO'.
+
+ For example, on a system with the canonical 32-bit two's-complement
+implementation of `INTEGER(KIND=1)', the following loop will not work:
+
+ DO I = -2000000000, 2000000000
+
+Although the START and END values are well within the range of
+`INTEGER(KIND=1)', the *trip count* is not. The expected trip count is
+40000000001, which is outside the range of `INTEGER(KIND=1)' on many
+systems.
+
+ Instead, the above loop should be constructed this way:
+
+ I = -2000000000
+ DO
+ IF (I .GT. 2000000000) EXIT
+ ...
+ I = I + 1
+ END DO
+
+The simple `DO' construct and the `EXIT' statement (used to leave the
+innermost loop) are F90 features that `g77' supports.
+
+ Some Fortran compilers have buggy implementations of `DO', in that
+they don't follow the standard. They implement `DO' as a
+straightforward translation to what, in C, would be a `for' statement.
+Instead of creating a temporary variable to hold the trip count as
+calculated at run time, these compilers use the iteration variable ITER
+to control whether the loop continues at each iteration.
+
+ The bug in such an implementation shows up when the trip count is
+within the range of the type of ITER, but the magnitude of `ABS(END) +
+ABS(INCR)' exceeds that range. For example:
+
+ DO I = 2147483600, 2147483647
+
+A loop started by the above statement will work as implemented by
+`g77', but the use, by some compilers, of a more C-like implementation
+akin to
+
+ for (i = 2147483600; i <= 2147483647; ++i)
+
+produces a loop that does not terminate, because `i' can never be
+greater than 2147483647, since incrementing it beyond that value
+overflows `i', setting it to -2147483648. This is a large, negative
+number that still is less than 2147483647.
+
+ Another example of unexpected behavior of `DO' involves using a
+nonintegral iteration variable ITER, that is, a `REAL' variable.
+Consider the following program:
+
+ DATA BEGIN, END, STEP /.1, .31, .007/
+ DO 10 R = BEGIN, END, STEP
+ IF (R .GT. END) PRINT *, R, ' .GT. ', END, '!!'
+ PRINT *,R
+ 10 CONTINUE
+ PRINT *,'LAST = ',R
+ IF (R .LE. END) PRINT *, R, ' .LE. ', END, '!!'
+ END
+
+A C-like view of `DO' would hold that the two "exclamatory" `PRINT'
+statements are never executed. However, this is the output of running
+the above program as compiled by `g77' on a GNU/Linux ix86 system:
+
+ .100000001
+ .107000001
+ .114
+ .120999999
+ ...
+ .289000005
+ .296000004
+ .303000003
+ LAST = .310000002
+ .310000002 .LE. .310000002!!
+
+ Note that one of the two checks in the program turned up an apparent
+violation of the programmer's expectation--yet, the loop is correctly
+implemented by `g77', in that it has 30 iterations. This trip count of
+30 is correct when evaluated using the floating-point representations
+for the BEGIN, END, and INCR values (.1, .31, .007) on GNU/Linux ix86
+are used. On other systems, an apparently more accurate trip count of
+31 might result, but, nevertheless, `g77' is faithfully following the
+Fortran standard, and the result is not what the author of the sample
+program above apparently expected. (Such other systems might, for
+different values in the `DATA' statement, violate the other
+programmer's expectation, for example.)
+
+ Due to this combination of imprecise representation of
+floating-point values and the often-misunderstood interpretation of
+`DO' by standard-conforming compilers such as `g77', use of `DO' loops
+with `REAL' iteration variables is not recommended. Such use can be
+caught by specifying `-Wsurprising'. *Note Warning Options::, for more
+information on this option.
+
+\1f
+File: g77.info, Node: Working Programs, Next: Overly Convenient Options, Prev: Loops, Up: Collected Fortran Wisdom
+
+Working Programs
+================
+
+ Getting Fortran programs to work in the first place can be quite a
+challenge--even when the programs already work on other systems, or
+when using other compilers.
+
+ `g77' offers some facilities that might be useful for tracking down
+bugs in such programs.
+
+* Menu:
+
+* Not My Type::
+* Variables Assumed To Be Zero::
+* Variables Assumed To Be Saved::
+* Unwanted Variables::
+* Unused Arguments::
+* Surprising Interpretations of Code::
+* Aliasing Assumed To Work::
+* Output Assumed To Flush::
+* Large File Unit Numbers::
+
+\1f
+File: g77.info, Node: Not My Type, Next: Variables Assumed To Be Zero, Up: Working Programs
+
+Not My Type
+-----------
+
+ A fruitful source of bugs in Fortran source code is use, or mis-use,
+of Fortran's implicit-typing feature, whereby the type of a variable,
+array, or function is determined by the first character of its name.
+
+ Simple cases of this include statements like `LOGX=9.227', without a
+statement such as `REAL LOGX'. In this case, `LOGX' is implicitly
+given `INTEGER(KIND=1)' type, with the result of the assignment being
+that it is given the value `9'.
+
+ More involved cases include a function that is defined starting with
+a statement like `DOUBLE PRECISION FUNCTION IPS(...)'. Any caller of
+this function that does not also declare `IPS' as type `DOUBLE
+PRECISION' (or, in GNU Fortran, `REAL(KIND=2)') is likely to assume it
+returns `INTEGER', or some other type, leading to invalid results or
+even program crashes.
+
+ The `-Wimplicit' option might catch failures to properly specify the
+types of variables, arrays, and functions in the code.
+
+ However, in code that makes heavy use of Fortran's implicit-typing
+facility, this option might produce so many warnings about cases that
+are working, it would be hard to find the one or two that represent
+bugs. This is why so many experienced Fortran programmers strongly
+recommend widespread use of the `IMPLICIT NONE' statement, despite it
+not being standard FORTRAN 77, to completely turn off implicit typing.
+(`g77' supports `IMPLICIT NONE', as do almost all FORTRAN 77 compilers.)
+
+ Note that `-Wimplicit' catches only implicit typing of *names*. It
+does not catch implicit typing of expressions such as `X**(2/3)'. Such
+expressions can be buggy as well--in fact, `X**(2/3)' is equivalent to
+`X**0', due to the way Fortran expressions are given types and then
+evaluated. (In this particular case, the programmer probably wanted
+`X**(2./3.)'.)
+
+\1f
+File: g77.info, Node: Variables Assumed To Be Zero, Next: Variables Assumed To Be Saved, Prev: Not My Type, Up: Working Programs
+
+Variables Assumed To Be Zero
+----------------------------
+
+ Many Fortran programs were developed on systems that provided
+automatic initialization of all, or some, variables and arrays to zero.
+As a result, many of these programs depend, sometimes inadvertently, on
+this behavior, though to do so violates the Fortran standards.
+
+ You can ask `g77' for this behavior by specifying the
+`-finit-local-zero' option when compiling Fortran code. (You might
+want to specify `-fno-automatic' as well, to avoid code-size inflation
+for non-optimized compilations.)
+
+ Note that a program that works better when compiled with the
+`-finit-local-zero' option is almost certainly depending on a
+particular system's, or compiler's, tendency to initialize some
+variables to zero. It might be worthwhile finding such cases and
+fixing them, using techniques such as compiling with the `-O
+-Wuninitialized' options using `g77'.
+
+\1f
+File: g77.info, Node: Variables Assumed To Be Saved, Next: Unwanted Variables, Prev: Variables Assumed To Be Zero, Up: Working Programs
+
+Variables Assumed To Be Saved
+-----------------------------
+
+ Many Fortran programs were developed on systems that saved the
+values of all, or some, variables and arrays across procedure calls.
+As a result, many of these programs depend, sometimes inadvertently, on
+being able to assign a value to a variable, perform a `RETURN' to a
+calling procedure, and, upon subsequent invocation, reference the
+previously assigned variable to obtain the value.
+
+ They expect this despite not using the `SAVE' statement to specify
+that the value in a variable is expected to survive procedure returns
+and calls. Depending on variables and arrays to retain values across
+procedure calls without using `SAVE' to require it violates the Fortran
+standards.
+
+ You can ask `g77' to assume `SAVE' is specified for all relevant
+(local) variables and arrays by using the `-fno-automatic' option.
+
+ Note that a program that works better when compiled with the
+`-fno-automatic' option is almost certainly depending on not having to
+use the `SAVE' statement as required by the Fortran standard. It might
+be worthwhile finding such cases and fixing them, using techniques such
+as compiling with the `-O -Wuninitialized' options using `g77'.
+
+\1f
+File: g77.info, Node: Unwanted Variables, Next: Unused Arguments, Prev: Variables Assumed To Be Saved, Up: Working Programs
+
+Unwanted Variables
+------------------
+
+ The `-Wunused' option can find bugs involving implicit typing,
+sometimes more easily than using `-Wimplicit' in code that makes heavy
+use of implicit typing. An unused variable or array might indicate
+that the spelling for its declaration is different from that of its
+intended uses.
+
+ Other than cases involving typos, unused variables rarely indicate
+actual bugs in a program. However, investigating such cases thoroughly
+has, on occasion, led to the discovery of code that had not been
+completely written--where the programmer wrote declarations as needed
+for the whole algorithm, wrote some or even most of the code for that
+algorithm, then got distracted and forgot that the job was not complete.
+
+\1f
+File: g77.info, Node: Unused Arguments, Next: Surprising Interpretations of Code, Prev: Unwanted Variables, Up: Working Programs
+
+Unused Arguments
+----------------
+
+ As with unused variables, It is possible that unused arguments to a
+procedure might indicate a bug. Compile with `-W -Wunused' option to
+catch cases of unused arguments.
+
+ Note that `-W' also enables warnings regarding overflow of
+floating-point constants under certain circumstances.
+
+\1f
+File: g77.info, Node: Surprising Interpretations of Code, Next: Aliasing Assumed To Work, Prev: Unused Arguments, Up: Working Programs
+
+Surprising Interpretations of Code
+----------------------------------
+
+ The `-Wsuprising' option can help find bugs involving expression
+evaluation or in the way `DO' loops with non-integral iteration
+variables are handled. Cases found by this option might indicate a
+difference of interpretation between the author of the code involved,
+and a standard-conforming compiler such as `g77'. Such a difference
+might produce actual bugs.
+
+ In any case, changing the code to explicitly do what the programmer
+might have expected it to do, so `g77' and other compilers are more
+likely to follow the programmer's expectations, might be worthwhile,
+especially if such changes make the program work better.
+
+\1f
+File: g77.info, Node: Aliasing Assumed To Work, Next: Output Assumed To Flush, Prev: Surprising Interpretations of Code, Up: Working Programs
+
+Aliasing Assumed To Work
+------------------------
+
+ The `-falias-check', `-fargument-alias', `-fargument-noalias', and
+`-fno-argument-noalias-global' options, introduced in version 0.5.20 and
+`g77''s version 2.7.2.2.f.2 of `gcc', control the assumptions regarding
+aliasing (overlapping) of writes and reads to main memory (core) made
+by the `gcc' back end.
+
+ They are effective only when compiling with `-O' (specifying any
+level other than `-O0') or with `-falias-check'.
+
+ The default for Fortran code is `-fargument-noalias-global'. (The
+default for C code and code written in other C-based languages is
+`-fargument-alias'. These defaults apply regardless of whether you use
+`g77' or `gcc' to compile your code.)
+
+ Note that, on some systems, compiling with `-fforce-addr' in effect
+can produce more optimal code when the default aliasing options are in
+effect (and when optimization is enabled).
+
+ If your program is not working when compiled with optimization, it
+is possible it is violating the Fortran standards (77 and 90) by
+relying on the ability to "safely" modify variables and arrays that are
+aliased, via procedure calls, to other variables and arrays, without
+using `EQUIVALENCE' to explicitly set up this kind of aliasing.
+
+ (The FORTRAN 77 standard's prohibition of this sort of overlap,
+generally referred to therein as "storage assocation", appears in
+Sections 15.9.3.6. This prohibition allows implementations, such as
+`g77', to, for example, implement the passing of procedures and even
+values in `COMMON' via copy operations into local, perhaps more
+efficiently accessed temporaries at entry to a procedure, and, where
+appropriate, via copy operations back out to their original locations
+in memory at exit from that procedure, without having to take into
+consideration the order in which the local copies are updated by the
+code, among other things.)
+
+ To test this hypothesis, try compiling your program with the
+`-fargument-alias' option, which causes the compiler to revert to
+assumptions essentially the same as made by versions of `g77' prior to
+0.5.20.
+
+ If the program works using this option, that strongly suggests that
+the bug is in your program. Finding and fixing the bug(s) should
+result in a program that is more standard-conforming and that can be
+compiled by `g77' in a way that results in a faster executable.
+
+ (You might want to try compiling with `-fargument-noalias', a kind
+of half-way point, to see if the problem is limited to aliasing between
+dummy arguments and `COMMON' variables--this option assumes that such
+aliasing is not done, while still allowing aliasing among dummy
+arguments.)
+
+ An example of aliasing that is invalid according to the standards is
+shown in the following program, which might *not* produce the expected
+results when executed:
+
+ I = 1
+ CALL FOO(I, I)
+ PRINT *, I
+ END
+
+ SUBROUTINE FOO(J, K)
+ J = J + K
+ K = J * K
+ PRINT *, J, K
+ END
+
+ The above program attempts to use the temporary aliasing of the `J'
+and `K' arguments in `FOO' to effect a pathological behavior--the
+simultaneous changing of the values of *both* `J' and `K' when either
+one of them is written.
+
+ The programmer likely expects the program to print these values:
+
+ 2 4
+ 4
+
+ However, since the program is not standard-conforming, an
+implementation's behavior when running it is undefined, because
+subroutine `FOO' modifies at least one of the arguments, and they are
+aliased with each other. (Even if one of the assignment statements was
+deleted, the program would still violate these rules. This kind of
+on-the-fly aliasing is permitted by the standard only when none of the
+aliased items are defined, or written, while the aliasing is in effect.)
+
+ As a practical example, an optimizing compiler might schedule the `J
+=' part of the second line of `FOO' *after* the reading of `J' and `K'
+for the `J * K' expression, resulting in the following output:
+
+ 2 2
+ 2
+
+ Essentially, compilers are promised (by the standard and, therefore,
+by programmers who write code they claim to be standard-conforming)
+that if they cannot detect aliasing via static analysis of a single
+program unit's `EQUIVALENCE' and `COMMON' statements, no such aliasing
+exists. In such cases, compilers are free to assume that an assignment
+to one variable will not change the value of another variable, allowing
+it to avoid generating code to re-read the value of the other variable,
+to re-schedule reads and writes, and so on, to produce a faster
+executable.
+
+ The same promise holds true for arrays (as seen by the called
+procedure)--an element of one dummy array cannot be aliased with, or
+overlap, any element of another dummy array or be in a `COMMON' area
+known to the procedure.
+
+ (These restrictions apply only when the procedure defines, or writes
+to, one of the aliased variables or arrays.)
+
+ Unfortunately, there is no way to find *all* possible cases of
+violations of the prohibitions against aliasing in Fortran code.
+Static analysis is certainly imperfect, as is run-time analysis, since
+neither can catch all violations. (Static analysis can catch all
+likely violations, and some that might never actually happen, while
+run-time analysis can catch only those violations that actually happen
+during a particular run. Neither approach can cope with programs
+mixing Fortran code with routines written in other languages, however.)
+
+ Currently, `g77' provides neither static nor run-time facilities to
+detect any cases of this problem, although other products might.
+Run-time facilities are more likely to be offered by future versions of
+`g77', though patches improving `g77' so that it provides either form
+of detection are welcome.
+
+\1f
+File: g77.info, Node: Output Assumed To Flush, Next: Large File Unit Numbers, Prev: Aliasing Assumed To Work, Up: Working Programs
+
+Output Assumed To Flush
+-----------------------
+
+ For several versions prior to 0.5.20, `g77' configured its version
+of the `libf2c' run-time library so that one of its configuration
+macros, `ALWAYS_FLUSH', was defined.
+
+ This was done as a result of a belief that many programs expected
+output to be flushed to the operating system (under UNIX, via the
+`fflush()' library call) with the result that errors, such as disk
+full, would be immediately flagged via the relevant `ERR=' and
+`IOSTAT=' mechanism.
+
+ Because of the adverse effects this approach had on the performance
+of many programs, `g77' no longer configures `libf2c' to always flush
+output.
+
+ If your program depends on this behavior, either insert the
+appropriate `CALL FLUSH' statements, or modify the sources to the
+`libf2c', rebuild and reinstall `g77', and relink your programs with
+the modified library.
+
+ (Ideally, `libf2c' would offer the choice at run-time, so that a
+compile-time option to `g77' or `f2c' could result in generating the
+appropriate calls to flushing or non-flushing library routines.)
+
+ *Note Always Flush Output::, for information on how to modify the
+`g77' source tree so that a version of `libf2c' can be built and
+installed with the `ALWAYS_FLUSH' macro defined.
+
+\1f
+File: g77.info, Node: Large File Unit Numbers, Prev: Output Assumed To Flush, Up: Working Programs
+
+Large File Unit Numbers
+-----------------------
+
+ If your program crashes at run time with a message including the
+text `illegal unit number', that probably is a message from the
+run-time library, `libf2c', used, and distributed with, `g77'.
+
+ The message means that your program has attempted to use a file unit
+number that is out of the range accepted by `libf2c'. Normally, this
+range is 0 through 99, and the high end of the range is controlled by a
+`libf2c' source-file macro named `MXUNIT'.
+
+ If you can easily change your program to use unit numbers in the
+range 0 through 99, you should do so.
+
+ Otherwise, see *Note Larger File Unit Numbers::, for information on
+how to change `MXUNIT' in `libf2c' so you can build and install a new
+version of `libf2c' that supports the larger unit numbers you need.
+
+ *Note:* While `libf2c' places a limit on the range of Fortran
+file-unit numbers, the underlying library and operating system might
+impose different kinds of limits. For example, some systems limit the
+number of files simultaneously open by a running program. Information
+on how to increase these limits should be found in your system's
+documentation.
+
+\1f
+File: g77.info, Node: Overly Convenient Options, Next: Faster Programs, Prev: Working Programs, Up: Collected Fortran Wisdom
+
+Overly Convenient Command-line Options
+======================================
+
+ These options should be used only as a quick-and-dirty way to
+determine how well your program will run under different compilation
+models without having to change the source. Some are more problematic
+than others, depending on how portable and maintainable you want the
+program to be (and, of course, whether you are allowed to change it at
+all is crucial).
+
+ You should not continue to use these command-line options to compile
+a given program, but rather should make changes to the source code:
+
+`-finit-local-zero'
+ (This option specifies that any uninitialized local variables and
+ arrays have default initialization to binary zeros.)
+
+ Many other compilers do this automatically, which means lots of
+ Fortran code developed with those compilers depends on it.
+
+ It is safer (and probably would produce a faster program) to find
+ the variables and arrays that need such initialization and provide
+ it explicitly via `DATA', so that `-finit-local-zero' is not
+ needed.
+
+ Consider using `-Wuninitialized' (which requires `-O') to find
+ likely candidates, but do not specify `-finit-local-zero' or
+ `-fno-automatic', or this technique won't work.
+
+`-fno-automatic'
+ (This option specifies that all local variables and arrays are to
+ be treated as if they were named in `SAVE' statements.)
+
+ Many other compilers do this automatically, which means lots of
+ Fortran code developed with those compilers depends on it.
+
+ The effect of this is that all non-automatic variables and arrays
+ are made static, that is, not placed on the stack or in heap
+ storage. This might cause a buggy program to appear to work
+ better. If so, rather than relying on this command-line option
+ (and hoping all compilers provide the equivalent one), add `SAVE'
+ statements to some or all program unit sources, as appropriate.
+ Consider using `-Wuninitialized' (which requires `-O') to find
+ likely candidates, but do not specify `-finit-local-zero' or
+ `-fno-automatic', or this technique won't work.
+
+ The default is `-fautomatic', which tells `g77' to try and put
+ variables and arrays on the stack (or in fast registers) where
+ possible and reasonable. This tends to make programs faster.
+
+ *Note:* Automatic variables and arrays are not affected by this
+ option. These are variables and arrays that are *necessarily*
+ automatic, either due to explicit statements, or due to the way
+ they are declared. Examples include local variables and arrays
+ not given the `SAVE' attribute in procedures declared `RECURSIVE',
+ and local arrays declared with non-constant bounds (automatic
+ arrays). Currently, `g77' supports only automatic arrays, not
+ `RECURSIVE' procedures or other means of explicitly specifying
+ that variables or arrays are automatic.
+
+`-fugly'
+ Fix the source code so that `-fno-ugly' will work. Note that, for
+ many programs, it is difficult to practically avoid using the
+ features enabled via `-fugly-init', and these features pose the
+ lowest risk of writing nonportable code, among the various "ugly"
+ features.
+
+`-fGROUP-intrinsics-hide'
+ Change the source code to use `EXTERNAL' for any external procedure
+ that might be the name of an intrinsic. It is easy to find these
+ using `-fGROUP-intrinsics-disable'.
+
+\1f
+File: g77.info, Node: Faster Programs, Prev: Overly Convenient Options, Up: Collected Fortran Wisdom
+
+Faster Programs
+===============
+
+ Aside from the usual `gcc' options, such as `-O', `-ffast-math', and
+so on, consider trying some of the following approaches to speed up
+your program (once you get it working).
+
+* Menu:
+
+* Aligned Data::
+* Prefer Automatic Uninitialized Variables::
+* Avoid f2c Compatibility::
+* Use Submodel Options::
+
+\1f
+File: g77.info, Node: Aligned Data, Next: Prefer Automatic Uninitialized Variables, Up: Faster Programs
+
+Aligned Data
+------------
+
+ On some systems, such as those with Pentium Pro CPUs, programs that
+make heavy use of `REAL(KIND=2)' (`DOUBLE PRECISION') might run much
+slower than possible due to the compiler not aligning these 64-bit
+values to 64-bit boundaries in memory. (The effect also is present,
+though to a lesser extent, on the 586 (Pentium) architecture.)
+
+ The Intel x86 architecture generally ensures that these programs will
+work on all its implementations, but particular implementations (such
+as Pentium Pro) perform better with more strict alignment. (Such
+behavior isn't unique to the Intel x86 architecture.) Other
+architectures might *demand* 64-bit alignment of 64-bit data.
+
+ There are a variety of approaches to use to address this problem:
+
+ * Order your `COMMON' and `EQUIVALENCE' areas such that the
+ variables and arrays with the widest alignment guidelines come
+ first.
+
+ For example, on most systems, this would mean placing
+ `COMPLEX(KIND=2)', `REAL(KIND=2)', and `INTEGER(KIND=2)' entities
+ first, followed by `REAL(KIND=1)', `INTEGER(KIND=1)', and
+ `LOGICAL(KIND=1)' entities, then `INTEGER(KIND=6)' entities, and
+ finally `CHARACTER' and `INTEGER(KIND=3)' entities.
+
+ The reason to use such placement is it makes it more likely that
+ your data will be aligned properly, without requiring you to do
+ detailed analysis of each aggregate (`COMMON' and `EQUIVALENCE')
+ area.
+
+ Specifically, on systems where the above guidelines are
+ appropriate, placing `CHARACTER' entities before `REAL(KIND=2)'
+ entities can work just as well, but only if the number of bytes
+ occupied by the `CHARACTER' entities is divisible by the
+ recommended alignment for `REAL(KIND=2)'.
+
+ By ordering the placement of entities in aggregate areas according
+ to the simple guidelines above, you avoid having to carefully
+ count the number of bytes occupied by each entity to determine
+ whether the actual alignment of each subsequent entity meets the
+ alignment guidelines for the type of that entity.
+
+ If you don't ensure correct alignment of `COMMON' elements, the
+ compiler may be forced by some systems to violate the Fortran
+ semantics by adding padding to get `DOUBLE PRECISION' data
+ properly aligned. If the unfortunate practice is employed of
+ overlaying different types of data in the `COMMON' block, the
+ different variants of this block may become misaligned with
+ respect to each other. Even if your platform doesn't require
+ strict alignment, `COMMON' should be laid out as above for
+ portability. (Unfortunately the FORTRAN 77 standard didn't
+ anticipate this possible requirement, which is
+ compiler-independent on a given platform.)
+
+ * Use the (x86-specific) `-malign-double' option when compiling
+ programs for the Pentium and Pentium Pro architectures (called 586
+ and 686 in the `gcc' configuration subsystem). The warning about
+ this in the `gcc' manual isn't generally relevant to Fortran, but
+ using it will force `COMMON' to be padded if necessary to align
+ `DOUBLE PRECISION' data.
+
+ * Ensure that `crt0.o' or `crt1.o' on your system guarantees a 64-bit
+ aligned stack for `main()'. The recent one from GNU (`glibc2')
+ will do this on x86 systems, but we don't know of any other x86
+ setups where it will be right. Read your system's documentation
+ to determine if it is appropriate to upgrade to a more recent
+ version to obtain the optimal alignment.
+
+ Progress is being made on making this work "out of the box" on
+future versions of `g77', `gcc', and some of the relevant operating
+systems (such as GNU/Linux).
+
+\1f
+File: g77.info, Node: Prefer Automatic Uninitialized Variables, Next: Avoid f2c Compatibility, Prev: Aligned Data, Up: Faster Programs
+
+Prefer Automatic Uninitialized Variables
+----------------------------------------
+
+ If you're using `-fno-automatic' already, you probably should change
+your code to allow compilation with `-fautomatic' (the default), to
+allow the program to run faster.
+
+ Similarly, you should be able to use `-fno-init-local-zero' (the
+default) instead of `-finit-local-zero'. This is because it is rare
+that every variable affected by these options in a given program
+actually needs to be so affected.
+
+ For example, `-fno-automatic', which effectively `SAVE's every local
+non-automatic variable and array, affects even things like `DO'
+iteration variables, which rarely need to be `SAVE'd, and this often
+reduces run-time performances. Similarly, `-fno-init-local-zero'
+forces such variables to be initialized to zero--when `SAVE'd (such as
+when `-fno-automatic'), this by itself generally affects only startup
+time for a program, but when not `SAVE'd, it can slow down the
+procedure every time it is called.
+
+ *Note Overly Convenient Command-Line Options: Overly Convenient
+Options, for information on the `-fno-automatic' and
+`-finit-local-zero' options and how to convert their use into selective
+changes in your own code.
+
+\1f
+File: g77.info, Node: Avoid f2c Compatibility, Next: Use Submodel Options, Prev: Prefer Automatic Uninitialized Variables, Up: Faster Programs
+
+Avoid f2c Compatibility
+-----------------------
+
+ If you aren't linking with any code compiled using `f2c', try using
+the `-fno-f2c' option when compiling *all* the code in your program.
+(Note that `libf2c' is *not* an example of code that is compiled using
+`f2c'--it is compiled by a C compiler, typically `gcc'.)
+
+\1f
+File: g77.info, Node: Use Submodel Options, Prev: Avoid f2c Compatibility, Up: Faster Programs
+
+Use Submodel Options
+--------------------
+
+ Using an appropriate `-m' option to generate specific code for your
+CPU may be worthwhile, though it may mean the executable won't run on
+other versions of the CPU that don't support the same instruction set.
+*Note Hardware Models and Configurations: (gcc)Submodel Options.
+
+ For recent CPUs that don't have explicit support in the released
+version of `gcc', it may still be possible to get improvements. For
+instance, the flags recommended for 586/686 (Pentium(Pro)) chips for
+building the Linux kernel are:
+
+ -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2
+ -fomit-frame-pointer
+
+`-fomit-frame-pointer' will, however, inhibit debugging on x86 systems.
+
+\1f
+File: g77.info, Node: Trouble, Next: Open Questions, Prev: Collected Fortran Wisdom, Up: Top
+
+Known Causes of Trouble with GNU Fortran
+****************************************
+
+ This section describes known problems that affect users of GNU
+Fortran. Most of these are not GNU Fortran bugs per se--if they were,
+we would fix them. But the result for a user might be like the result
+of a bug.
+
+ Some of these problems are due to bugs in other software, some are
+missing features that are too much work to add, and some are places
+where people's opinions differ as to what is best.
+
+ Information on bugs that show up when configuring, porting, building,
+or installing `g77' is not provided here. *Note Problems Installing::.
+
+ To find out about major bugs discovered in the current release and
+possible workarounds for them, retrieve
+`ftp://alpha.gnu.ai.mit.edu/g77.plan'.
+
+ (Note that some of this portion of the manual is lifted directly
+from the `gcc' manual, with minor modifications to tailor it to users
+of `g77'. Anytime a bug seems to have more to do with the `gcc'
+portion of `g77', *Note Known Causes of Trouble with GNU CC:
+(gcc)Trouble.)
+
+* Menu:
+
+* But-bugs:: Bugs really in other programs or elsewhere.
+* Actual Bugs:: Bugs and misfeatures we will fix later.
+* Missing Features:: Features we already know we want to add later.
+* Disappointments:: Regrettable things we can't change.
+* Non-bugs:: Things we think are right, but some others disagree.
+* Warnings and Errors:: Which problems in your code get warnings,
+ and which get errors.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: But-bugs, Next: Actual Bugs, Up: Trouble
+
+Bugs Not In GNU Fortran
+=======================
+
+ These are bugs to which the maintainers often have to reply, "but
+that isn't a bug in `g77'...". Some of these already are fixed in new
+versions of other software; some still need to be fixed; some are
+problems with how `g77' is installed or is being used; some are the
+result of bad hardware that causes software to misbehave in sometimes
+bizarre ways; some just cannot be addressed at this time until more is
+known about the problem.
+
+ Please don't re-report these bugs to the `g77' maintainers--if you
+must remind someone how important it is to you that the problem be
+fixed, talk to the people responsible for the other products identified
+below, but preferably only after you've tried the latest versions of
+those products. The `g77' maintainers have their hands full working on
+just fixing and improving `g77', without serving as a clearinghouse for
+all bugs that happen to affect `g77' users.
+
+ *Note Collected Fortran Wisdom::, for information on behavior of
+Fortran programs, and the programs that compile them, that might be
+*thought* to indicate bugs.
+
+* Menu:
+
+* Signal 11 and Friends:: Strange behavior by any software.
+* Cannot Link Fortran Programs:: Unresolved references.
+* Large Common Blocks:: Problems on older GNU/Linux systems.
+* Debugger Problems:: When the debugger crashes.
+* NeXTStep Problems:: Misbehaving executables.
+* Stack Overflow:: More misbehaving executables.
+* Nothing Happens:: Less behaving executables.
+* Strange Behavior at Run Time:: Executables misbehaving due to
+ bugs in your program.
+* Floating-point Errors:: The results look wrong, but....
+
+\1f
+File: g77.info, Node: Signal 11 and Friends, Next: Cannot Link Fortran Programs, Up: But-bugs
+
+Signal 11 and Friends
+---------------------
+
+ A whole variety of strange behaviors can occur when the software, or
+the way you are using the software, stresses the hardware in a way that
+triggers hardware bugs. This might seem hard to believe, but it
+happens frequently enough that there exist documents explaining in
+detail what the various causes of the problems are, what typical
+symptoms look like, and so on.
+
+ Generally these problems are referred to in this document as "signal
+11" crashes, because the Linux kernel, running on the most popular
+hardware (the Intel x86 line), often stresses the hardware more than
+other popular operating systems. When hardware problems do occur under
+GNU/Linux on x86 systems, these often manifest themselves as "signal 11"
+problems, as illustrated by the following diagnostic:
+
+ sh# g77 myprog.f
+ gcc: Internal compiler error: program f771 got fatal signal 11
+ sh#
+
+ It is *very* important to remember that the above message is *not*
+the only one that indicates a hardware problem, nor does it always
+indicate a hardware problem.
+
+ In particular, on systems other than those running the Linux kernel,
+the message might appear somewhat or very different, as it will if the
+error manifests itself while running a program other than the `g77'
+compiler. For example, it will appear somewhat different when running
+your program, when running Emacs, and so on.
+
+ How to cope with such problems is well beyond the scope of this
+manual.
+
+ However, users of Linux-based systems (such as GNU/Linux) should
+review `http://www.bitwizard.nl/sig11', a source of detailed
+information on diagnosing hardware problems, by recognizing their
+common symptoms.
+
+ Users of other operating systems and hardware might find this
+reference useful as well. If you know of similar material for another
+hardware/software combination, please let us know so we can consider
+including a reference to it in future versions of this manual.
+
+\1f
+File: g77.info, Node: Cannot Link Fortran Programs, Next: Large Common Blocks, Prev: Signal 11 and Friends, Up: But-bugs
+
+Cannot Link Fortran Programs
+----------------------------
+
+ On some systems, perhaps just those with out-of-date (shared?)
+libraries, unresolved-reference errors happen when linking
+`g77'-compiled programs (which should be done using `g77').
+
+ If this happens to you, try appending `-lc' to the command you use
+to link the program, e.g. `g77 foo.f -lc'. `g77' already specifies
+`-lf2c -lm' when it calls the linker, but it cannot also specify `-lc'
+because not all systems have a file named `libc.a'.
+
+ It is unclear at this point whether there are legitimately installed
+systems where `-lf2c -lm' is insufficient to resolve code produced by
+`g77'.
+
+ If your program doesn't link due to unresolved references to names
+like `_main', make sure you're using the `g77' command to do the link,
+since this command ensures that the necessary libraries are loaded by
+specifying `-lf2c -lm' when it invokes the `gcc' command to do the
+actual link. (Use the `-v' option to discover more about what actually
+happens when you use the `g77' and `gcc' commands.)
+
+ Also, try specifying `-lc' as the last item on the `g77' command
+line, in case that helps.
+
+\1f
+File: g77.info, Node: Large Common Blocks, Next: Debugger Problems, Prev: Cannot Link Fortran Programs, Up: But-bugs
+
+Large Common Blocks
+-------------------
+
+ On some older GNU/Linux systems, programs with common blocks larger
+than 16MB cannot be linked without some kind of error message being
+produced.
+
+ This is a bug in older versions of `ld', fixed in more recent
+versions of `binutils', such as version 2.6.
+
+\1f
+File: g77.info, Node: Debugger Problems, Next: NeXTStep Problems, Prev: Large Common Blocks, Up: But-bugs
+
+Debugger Problems
+-----------------
+
+ There are some known problems when using `gdb' on code compiled by
+`g77'. Inadequate investigation as of the release of 0.5.16 results in
+not knowing which products are the culprit, but `gdb-4.14' definitely
+crashes when, for example, an attempt is made to print the contents of
+a `COMPLEX(KIND=2)' dummy array, on at least some GNU/Linux machines,
+plus some others.
+
+\1f
+File: g77.info, Node: NeXTStep Problems, Next: Stack Overflow, Prev: Debugger Problems, Up: But-bugs
+
+NeXTStep Problems
+-----------------
+
+ Developers of Fortran code on NeXTStep (all architectures) have to
+watch out for the following problem when writing programs with large,
+statically allocated (i.e. non-stack based) data structures (common
+blocks, saved arrays).
+
+ Due to the way the native loader (`/bin/ld') lays out data
+structures in virtual memory, it is very easy to create an executable
+wherein the `__DATA' segment overlaps (has addresses in common) with
+the `UNIX STACK' segment.
+
+ This leads to all sorts of trouble, from the executable simply not
+executing, to bus errors. The NeXTStep command line tool `ebadexec'
+points to the problem as follows:
+
+ % /bin/ebadexec a.out
+ /bin/ebadexec: __LINKEDIT segment (truncated address = 0x3de000
+ rounded size = 0x2a000) of executable file: a.out overlaps with UNIX
+ STACK segment (truncated address = 0x400000 rounded size =
+ 0x3c00000) of executable file: a.out
+
+ (In the above case, it is the `__LINKEDIT' segment that overlaps the
+stack segment.)
+
+ This can be cured by assigning the `__DATA' segment (virtual)
+addresses beyond the stack segment. A conservative estimate for this
+is from address 6000000 (hexadecimal) onwards--this has always worked
+for me [Toon Moene]:
+
+ % g77 -segaddr __DATA 6000000 test.f
+ % ebadexec a.out
+ ebadexec: file: a.out appears to be executable
+ %
+
+ Browsing through `gcc/f/Makefile.in', you will find that the `f771'
+program itself also has to be linked with these flags--it has large
+statically allocated data structures. (Version 0.5.18 reduces this
+somewhat, but probably not enough.)
+
+ (The above item was contributed by Toon Moene
+(<toon@moene.indiv.nluug.nl>).)
+
+\1f
+File: g77.info, Node: Stack Overflow, Next: Nothing Happens, Prev: NeXTStep Problems, Up: But-bugs
+
+Stack Overflow
+--------------
+
+ `g77' code might fail at runtime (probably with a "segmentation
+violation") due to overflowing the stack. This happens most often on
+systems with an environment that provides substantially more heap space
+(for use when arbitrarily allocating and freeing memory) than stack
+space.
+
+ Often this can be cured by increasing or removing your shell's limit
+on stack usage, typically using `limit stacksize' (in `csh' and
+derivatives) or `ulimit -s' (in `sh' and derivatives).
+
+ Increasing the allowed stack size might, however, require changing
+some operating system or system configuration parameters.
+
+ You might be able to work around the problem by compiling with the
+`-fno-automatic' option to reduce stack usage, probably at the expense
+of speed.
+
+ *Note Maximum Stackable Size::, for information on patching `g77' to
+use different criteria for placing local non-automatic variables and
+arrays on the stack.
+
+ However, if your program uses large automatic arrays (for example,
+has declarations like `REAL A(N)' where `A' is a local array and `N' is
+a dummy or `COMMON' variable that can have a large value), neither use
+of `-fno-automatic', nor changing the cut-off point for `g77' for using
+the stack, will solve the problem by changing the placement of these
+large arrays, as they are *necessarily* automatic.
+
+ `g77' currently provides no means to specify that automatic arrays
+are to be allocated on the heap instead of the stack. So, other than
+increasing the stack size, your best bet is to change your source code
+to avoid large automatic arrays. Methods for doing this currently are
+outside the scope of this document.
+
+ (*Note:* If your system puts stack and heap space in the same memory
+area, such that they are effectively combined, then a stack overflow
+probably indicates a program that is either simply too large for the
+system, or buggy.)
+
+\1f
+File: g77.info, Node: Nothing Happens, Next: Strange Behavior at Run Time, Prev: Stack Overflow, Up: But-bugs
+
+Nothing Happens
+---------------
+
+ It is occasionally reported that a "simple" program, such as a
+"Hello, World!" program, does nothing when it is run, even though the
+compiler reported no errors, despite the program containing nothing
+other than a simple `PRINT' statement.
+
+ This most often happens because the program has been compiled and
+linked on a UNIX system and named `test', though other names can lead
+to similarly unexpected run-time behavior on various systems.
+
+ Essentially this problem boils down to giving your program a name
+that is already known to the shell you are using to identify some other
+program, which the shell continues to execute instead of your program
+when you invoke it via, for example:
+
+ sh# test
+ sh#
+
+ Under UNIX and many other system, a simple command name invokes a
+searching mechanism that might well not choose the program located in
+the current working directory if there is another alternative (such as
+the `test' command commonly installed on UNIX systems).
+
+ The reliable way to invoke a program you just linked in the current
+directory under UNIX is to specify it using an explicit pathname, as in:
+
+ sh# ./test
+ Hello, World!
+ sh#
+
+ Users who encounter this problem should take the time to read up on
+how their shell searches for commands, how to set their search path,
+and so on. The relevant UNIX commands to learn about include `man',
+`info' (on GNU systems), `setenv' (or `set' and `env'), `which', and
+`find'.
+
+\1f
+File: g77.info, Node: Strange Behavior at Run Time, Next: Floating-point Errors, Prev: Nothing Happens, Up: But-bugs
+
+Strange Behavior at Run Time
+----------------------------
+
+ `g77' code might fail at runtime with "segmentation violation", "bus
+error", or even something as subtle as a procedure call overwriting a
+variable or array element that it is not supposed to touch.
+
+ These can be symptoms of a wide variety of actual bugs that occurred
+earlier during the program's run, but manifested themselves as
+*visible* problems some time later.
+
+ Overflowing the bounds of an array--usually by writing beyond the
+end of it--is one of two kinds of bug that often occurs in Fortran code.
+
+ The other kind of bug is a mismatch between the actual arguments
+passed to a procedure and the dummy arguments as declared by that
+procedure.
+
+ Both of these kinds of bugs, and some others as well, can be
+difficult to track down, because the bug can change its behavior, or
+even appear to not occur, when using a debugger.
+
+ That is, these bugs can be quite sensitive to data, including data
+representing the placement of other data in memory (that is, pointers,
+such as the placement of stack frames in memory).
+
+ Plans call for improving `g77' so that it can offer the ability to
+catch and report some of these problems at compile, link, or run time,
+such as by generating code to detect references to beyond the bounds of
+an array, or checking for agreement between calling and called
+procedures.
+
+ In the meantime, finding and fixing the programming bugs that lead
+to these behaviors is, ultimately, the user's responsibility, as
+difficult as that task can sometimes be.
+
+ One runtime problem that has been observed might have a simple
+solution. If a formatted `WRITE' produces an endless stream of spaces,
+check that your program is linked against the correct version of the C
+library. The configuration process takes care to account for your
+system's normal `libc' not being ANSI-standard, which will otherwise
+cause this behaviour. If your system's default library is
+ANSI-standard and you subsequently link against a non-ANSI one, there
+might be problems such as this one.
+
+ Specifically, on Solaris2 systems, avoid picking up the `BSD'
+library from `/usr/ucblib'.
+
+\1f
+File: g77.info, Node: Floating-point Errors, Prev: Strange Behavior at Run Time, Up: But-bugs
+
+Floating-point Errors
+---------------------
+
+ Some programs appear to produce inconsistent floating-point results
+compiled by `g77' versus by other compilers.
+
+ Often the reason for this behavior is the fact that floating-point
+values are represented on almost all Fortran systems by
+*approximations*, and these approximations are inexact even for
+apparently simple values like 0.1, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.9,
+1.1, and so on. Most Fortran systems, including all current ports of
+`g77', use binary arithmetic to represent these approximations.
+
+ Therefore, the exact value of any floating-point approximation as
+manipulated by `g77'-compiled code is representable by adding some
+combination of the values 1.0, 0.5, 0.25, 0.125, and so on (just keep
+dividing by two) through the precision of the fraction (typically
+around 23 bits for `REAL(KIND=1)', 52 for `REAL(KIND=2)'), then
+multiplying the sum by a integral power of two (in Fortran, by `2**N')
+that typically is between -127 and +128 for `REAL(KIND=1)' and -1023
+and +1024 for `REAL(KIND=2)', then multiplying by -1 if the number is
+negative.
+
+ So, a value like 0.2 is exactly represented in decimal--since it is
+a fraction, `2/10', with a denomenator that is compatible with the base
+of the number system (base 10). However, `2/10' cannot be represented
+by any finite number of sums of any of 1.0, 0.5, 0.25, and so on, so
+0.2 cannot be exactly represented in binary notation.
+
+ (On the other hand, decimal notation can represent any binary number
+in a finite number of digits. Decimal notation cannot do so with
+ternary, or base-3, notation, which would represent floating-point
+numbers as sums of any of `1/1', `1/3', `1/9', and so on. After all,
+no finite number of decimal digits can exactly represent `1/3'.
+Fortunately, few systems use ternary notation.)
+
+ Moreover, differences in the way run-time I/O libraries convert
+between these approximations and the decimal representation often used
+by programmers and the programs they write can result in apparent
+differences between results that do not actually exist, or exist to
+such a small degree that they usually are not worth worrying about.
+
+ For example, consider the following program:
+
+ PRINT *, 0.2
+ END
+
+ When compiled by `g77', the above program might output `0.20000003',
+while another compiler might produce a executable that outputs `0.2'.
+
+ This particular difference is due to the fact that, currently,
+conversion of floating-point values by the `libf2c' library, used by
+`g77', handles only double-precision values.
+
+ Since `0.2' in the program is a single-precision value, it is
+converted to double precision (still in binary notation) before being
+converted back to decimal. The conversion to binary appends _binary_
+zero digits to the original value--which, again, is an inexact
+approximation of 0.2--resulting in an approximation that is much less
+exact than is connoted by the use of double precision.
+
+ (The appending of binary zero digits has essentially the same effect
+as taking a particular decimal approximation of `1/3', such as
+`0.3333333', and appending decimal zeros to it, producing
+`0.33333330000000000'. Treating the resulting decimal approximation as
+if it really had 18 or so digits of valid precision would make it seem
+a very poor approximation of `1/3'.)
+
+ As a result of converting the single-precision approximation to
+double precision by appending binary zeros, the conversion of the
+resulting double-precision value to decimal produces what looks like an
+incorrect result, when in fact the result is *inexact*, and is probably
+no less inaccurate or imprecise an approximation of 0.2 than is
+produced by other compilers that happen to output the converted value
+as "exactly" `0.2'. (Some compilers behave in a way that can make them
+appear to retain more accuracy across a conversion of a single-precision
+constant to double precision. *Note Context-Sensitive Constants::, to
+see why this practice is illusory and even dangerous.)
+
+ Note that a more exact approximation of the constant is computed
+when the program is changed to specify a double-precision constant:
+
+ PRINT *, 0.2D0
+ END
+
+ Future versions of `g77' and/or `libf2c' might convert
+single-precision values directly to decimal, instead of converting them
+to double precision first. This would tend to result in output that is
+more consistent with that produced by some other Fortran
+implementations.
+
+\1f
+File: g77.info, Node: Actual Bugs, Next: Missing Features, Prev: But-bugs, Up: Trouble
+
+Actual Bugs We Haven't Fixed Yet
+================================
+
+ This section identifies bugs that `g77' *users* might run into.
+This includes bugs that are actually in the `gcc' back end (GBE) or in
+`libf2c', because those sets of code are at least somewhat under the
+control of (and necessarily intertwined with) `g77', so it isn't worth
+separating them out.
+
+ For information on bugs that might afflict people who configure,
+port, build, and install `g77', *Note Problems Installing::.
+
+ * `g77''s version of `gcc', and probably `g77' itself, cannot be
+ reliably used with the `-O2' option (or higher) on Digital
+ Semiconductor Alpha AXP machines. The problem is most immediately
+ noticed in differences discovered by `make compare' following a
+ bootstrap build using `-O2'. It also manifests itself as a
+ failure to compile `DATA' statements such as `DATA R/7./'
+ correctly; in this case, `R' might be initialized to `4.0'.
+
+ Until this bug is fixed, use only `-O1' or no optimization.
+
+ * A code-generation bug afflicts Intel x86 targets when `-O2' is
+ specified compiling, for example, an old version of the `DNRM2'
+ routine. The x87 coprocessor stack is being somewhat mismanaged
+ in cases where assigned `GOTO' and `ASSIGN' are involved.
+
+ Version 0.5.21 of `g77' contains an initial effort to fix the
+ problem, but this effort is incomplete, and a more complete fix is
+ planned for the next release.
+
+ * Work is needed on the `SIGNAL()' intrinsic to ensure that pointers
+ and integers are properly handled on all targets, including 64-bit
+ machines.
+
+ * When using `-fugly-comma', `g77' assumes an extra `%VAL(0)'
+ argument is to be passed to intrinsics taking no arguments, such
+ as `IARGC()', which in turn reject such a call. Although this has
+ been worked around for 0.5.18 due to changes in the handling of
+ intrinsics, `g77' needs to do the ugly-argument-appending trick
+ only for external-function invocation, as this would probably be
+ more consistent with compilers that default to using that trick.
+
+ * Something about `g77''s straightforward handling of label
+ references and definitions sometimes prevents the GBE from
+ unrolling loops. Until this is solved, try inserting or removing
+ `CONTINUE' statements as the terminal statement, using the `END DO'
+ form instead, and so on. (Probably improved, but not wholly
+ fixed, in 0.5.21.)
+
+ * The `g77' command itself should more faithfully process options
+ the way the `gcc' command does. For example, `gcc' accepts
+ abbreviated forms of long options, `g77' generally doesn't.
+
+ * Some confusion in diagnostics concerning failing `INCLUDE'
+ statements from within `INCLUDE''d or `#include''d files.
+
+ * `g77' assumes that `INTEGER(KIND=1)' constants range from `-2**31'
+ to `2**31-1' (the range for two's-complement 32-bit values),
+ instead of determining their range from the actual range of the
+ type for the configuration (and, someday, for the constant).
+
+ Further, it generally doesn't implement the handling of constants
+ very well in that it makes assumptions about the configuration
+ that it no longer makes regarding variables (types).
+
+ Included with this item is the fact that `g77' doesn't recognize
+ that, on IEEE-754/854-compliant systems, `0./0.' should produce a
+ NaN and no warning instead of the value `0.' and a warning. This
+ is to be fixed in version 0.6, when `g77' will use the `gcc' back
+ end's constant-handling mechanisms to replace its own.
+
+ * `g77' uses way too much memory and CPU time to process large
+ aggregate areas having any initialized elements.
+
+ For example, `REAL A(1000000)' followed by `DATA A(1)/1/' takes up
+ way too much time and space, including the size of the generated
+ assembler file. This is to be mitigated somewhat in version 0.6.
+
+ Version 0.5.18 improves cases like this--specifically, cases of
+ *sparse* initialization that leave large, contiguous areas
+ uninitialized--significantly. However, even with the
+ improvements, these cases still require too much memory and CPU
+ time.
+
+ (Version 0.5.18 also improves cases where the initial values are
+ zero to a much greater degree, so if the above example ends with
+ `DATA A(1)/0/', the compile-time performance will be about as good
+ as it will ever get, aside from unrelated improvements to the
+ compiler.)
+
+ Note that `g77' does display a warning message to notify the user
+ before the compiler appears to hang. *Note Initialization of
+ Large Aggregate Areas: Large Initialization, for information on
+ how to change the point at which `g77' decides to issue this
+ warning.
+
+ * `g77' doesn't emit variable and array members of common blocks for
+ use with a debugger (the `-g' command-line option). The code is
+ present to do this, but doesn't work with at least one debug
+ format--perhaps it works with others. And it turns out there's a
+ similar bug for local equivalence areas, so that has been disabled
+ as well.
+
+ As of Version 0.5.19, a temporary kludge solution is provided
+ whereby some rudimentary information on a member is written as a
+ string that is the member's value as a character string.
+
+ *Note Options for Code Generation Conventions: Code Gen Options,
+ for information on the `-fdebug-kludge' option.
+
+ * When debugging, after starting up the debugger but before being
+ able to see the source code for the main program unit, the user
+ must currently set a breakpoint at `MAIN__' (or `MAIN___' or
+ `MAIN_' if `MAIN__' doesn't exist) and run the program until it
+ hits the breakpoint. At that point, the main program unit is
+ activated and about to execute its first executable statement, but
+ that's the state in which the debugger should start up, as is the
+ case for languages like C.
+
+ * Debugging `g77'-compiled code using debuggers other than `gdb' is
+ likely not to work.
+
+ Getting `g77' and `gdb' to work together is a known
+ problem--getting `g77' to work properly with other debuggers, for
+ which source code often is unavailable to `g77' developers, seems
+ like a much larger, unknown problem, and is a lower priority than
+ making `g77' and `gdb' work together properly.
+
+ On the other hand, information about problems other debuggers have
+ with `g77' output might make it easier to properly fix `g77', and
+ perhaps even improve `gdb', so it is definitely welcome. Such
+ information might even lead to all relevant products working
+ together properly sooner.
+
+ * `g77' currently inserts needless padding for things like `COMMON
+ A,IPAD' where `A' is `CHARACTER*1' and `IPAD' is `INTEGER(KIND=1)'
+ on machines like x86, because the back end insists that `IPAD' be
+ aligned to a 4-byte boundary, but the processor has no such
+ requirement (though it's good for performance).
+
+ It is possible that this is not a real bug, and could be considered
+ a performance feature, but it might be important to provide the
+ ability to Fortran code to specify minimum padding for aggregate
+ areas such as common blocks--and, certainly, there is the
+ potential, with the current setup, for interface differences in
+ the way such areas are laid out between `g77' and other compilers.
+
+ * Some crashes occur when compiling under Solaris on x86 machines.
+
+ Nothing has been heard about any such problems for some time, so
+ this is considering a closed item as of 0.5.20. Please submit any
+ bug reports pertinent to `g77''s support for Solaris/x86 systems.
+
+ * RS/6000 support is not complete as of the gcc 2.6.3 back end. The
+ 2.7.0 back end appears to fix this problem, or at least mitigate
+ it significantly, but there is at least one known problem that is
+ likely to be a code-generation bug in `gcc-2.7.0' plus
+ `g77-0.5.16'. This problem shows up only when compiling the
+ Fortran program with `-O'.
+
+ Nothing has been heard about any RS/6000 problems for some time,
+ so this is considering a closed item as of 0.5.20. Please submit
+ any bug reports pertinent to `g77''s support for RS/6000 systems.
+
+ * SGI support is known to be a bit buggy. The known problem shows
+ up only when compiling the Fortran program with `-O'.
+
+ It is possible these problems have all been fixed in 0.5.20 by
+ emulating complex arithmetic in the front end. Please submit any
+ bug reports pertinent to `g77''s support for SGI systems.
+
+ * `g77' doesn't work perfectly on 64-bit configurations such as the
+ Alpha. This problem is expected to be largely resolved as of
+ version 0.5.20, and further addressed by 0.5.21. Version 0.6
+ should solve most or all related problems (such as 64-bit machines
+ other than Digital Semiconductor ("DEC") Alphas).
+
+ One known bug that causes a compile-time crash occurs when
+ compiling code such as the following with optimization:
+
+ SUBROUTINE CRASH (TEMP)
+ INTEGER*2 HALF(2)
+ REAL TEMP
+ HALF(1) = NINT (TEMP)
+ END
+
+ It is expected that a future version of `g77' will have a fix for
+ this problem, almost certainly by the time `g77' supports the
+ forthcoming version 2.8.0 of `gcc'.
+
+ * Maintainers of gcc report that the back end definitely has "broken"
+ support for `COMPLEX' types. Based on their input, it seems many
+ of the problems affect only the more-general facilities for gcc's
+ `__complex__' type, such as `__complex__ int' (where the real and
+ imaginary parts are integers) that GNU Fortran does not use.
+
+ Version 0.5.20 of `g77' works around this problem by not using the
+ back end's support for `COMPLEX'. The new option
+ `-fno-emulate-complex' avoids the work-around, reverting to using
+ the same "broken" mechanism as that used by versions of `g77'
+ prior to 0.5.20.
+
+ * There seem to be some problems with passing constants, and perhaps
+ general expressions (other than simple variables/arrays), to
+ procedures when compiling on some systems (such as i386) with
+ `-fPIC', as in when compiling for ELF targets. The symptom is
+ that the assembler complains about invalid opcodes. More
+ investigation is needed, but the problem is almost certainly in
+ the gcc back end, and it apparently occurs only when compiling
+ sufficiently complicated functions *without* the `-O' option.
+
+\1f
+File: g77.info, Node: Missing Features, Next: Disappointments, Prev: Actual Bugs, Up: Trouble
+
+Missing Features
+================
+
+ This section lists features we know are missing from `g77', and
+which we want to add someday. (There is no priority implied in the
+ordering below.)
+
+* Menu:
+
+GNU Fortran language:
+* Better Source Model::
+* Fortran 90 Support::
+* Intrinsics in PARAMETER Statements::
+* SELECT CASE on CHARACTER Type::
+* RECURSIVE Keyword::
+* Popular Non-standard Types::
+* Full Support for Compiler Types::
+* Array Bounds Expressions::
+* POINTER Statements::
+* Sensible Non-standard Constructs::
+* FLUSH Statement::
+* Expressions in FORMAT Statements::
+* Explicit Assembler Code::
+* Q Edit Descriptor::
+
+GNU Fortran dialects:
+* Old-style PARAMETER Statements::
+* TYPE and ACCEPT I/O Statements::
+* STRUCTURE UNION RECORD MAP::
+* OPEN CLOSE and INQUIRE Keywords::
+* ENCODE and DECODE::
+* Suppressing Space Padding::
+* Fortran Preprocessor::
+* Bit Operations on Floating-point Data::
+
+New facilities:
+* POSIX Standard::
+* Floating-point Exception Handling::
+* Nonportable Conversions::
+* Large Automatic Arrays::
+* Support for Threads::
+* Increasing Precision/Range::
+
+Better diagnostics:
+* Gracefully Handle Sensible Bad Code::
+* Non-standard Conversions::
+* Non-standard Intrinsics::
+* Modifying DO Variable::
+* Better Pedantic Compilation::
+* Warn About Implicit Conversions::
+* Invalid Use of Hollerith Constant::
+* Dummy Array Without Dimensioning Dummy::
+* Invalid FORMAT Specifiers::
+* Ambiguous Dialects::
+* Unused Labels::
+* Informational Messages::
+
+Run-time facilities:
+* Uninitialized Variables at Run Time::
+* Bounds Checking at Run Time::
+
+Debugging:
+* Labels Visible to Debugger::
+
+\1f
+File: g77.info, Node: Better Source Model, Next: Fortran 90 Support, Up: Missing Features
+
+Better Source Model
+-------------------
+
+ `g77' needs to provide, as the default source-line model, a "pure
+visual" mode, where the interpretation of a source program in this mode
+can be accurately determined by a user looking at a traditionally
+displayed rendition of the program (assuming the user knows whether the
+program is fixed or free form).
+
+ The design should assume the user cannot tell tabs from spaces and
+cannot see trailing spaces on lines, but has canonical tab stops and,
+for fixed-form source, has the ability to always know exactly where
+column 72 is (since the Fortran standard itself requires this for
+fixed-form source).
+
+ This would change the default treatment of fixed-form source to not
+treat lines with tabs as if they were infinitely long--instead, they
+would end at column 72 just as if the tabs were replaced by spaces in
+the canonical way.
+
+ As part of this, provide common alternate models (Digital, `f2c',
+and so on) via command-line options. This includes allowing
+arbitrarily long lines for free-form source as well as fixed-form
+source and providing various limits and diagnostics as appropriate.
+
+ Also, `g77' should offer, perhaps even default to, warnings when
+characters beyond the last valid column are anything other than spaces.
+This would mean code with "sequence numbers" in columns 73 through 80
+would be rejected, and there's a lot of that kind of code around, but
+one of the most frequent bugs encountered by new users is accidentally
+writing fixed-form source code into and beyond column 73. So, maybe
+the users of old code would be able to more easily handle having to
+specify, say, a `-Wno-col73to80' option.
+
+\1f
+File: g77.info, Node: Fortran 90 Support, Next: Intrinsics in PARAMETER Statements, Prev: Better Source Model, Up: Missing Features
+
+Fortran 90 Support
+------------------
+
+ `g77' does not support many of the features that distinguish Fortran
+90 (and, now, Fortran 95) from ANSI FORTRAN 77.
+
+ Some Fortran 90 features are supported, because they make sense to
+offer even to die-hard users of F77. For example, many of them codify
+various ways F77 has been extended to meet users' needs during its
+tenure, so `g77' might as well offer them as the primary way to meet
+those same needs, even if it offers compatibility with one or more of
+the ways those needs were met by other F77 compilers in the industry.
+
+ Still, many important F90 features are not supported, because no
+attempt has been made to research each and every feature and assess its
+viability in `g77'. In the meantime, users who need those features must
+use Fortran 90 compilers anyway, and the best approach to adding some
+F90 features to GNU Fortran might well be to fund a comprehensive
+project to create GNU Fortran 95.
+
+\1f
+File: g77.info, Node: Intrinsics in PARAMETER Statements, Next: SELECT CASE on CHARACTER Type, Prev: Fortran 90 Support, Up: Missing Features
+
+Intrinsics in `PARAMETER' Statements
+------------------------------------
+
+ `g77' doesn't allow intrinsics in `PARAMETER' statements. This
+feature is considered to be absolutely vital, even though it is not
+standard-conforming, and is scheduled for version 0.6.
+
+ Related to this, `g77' doesn't allow non-integral exponentiation in
+`PARAMETER' statements, such as `PARAMETER (R=2**.25)'. It is unlikely
+`g77' will ever support this feature, as doing it properly requires
+complete emulation of a target computer's floating-point facilities when
+building `g77' as a cross-compiler. But, if the `gcc' back end is
+enhanced to provide such a facility, `g77' will likely use that facility
+in implementing this feature soon afterwards.
+
+\1f
+File: g77.info, Node: SELECT CASE on CHARACTER Type, Next: RECURSIVE Keyword, Prev: Intrinsics in PARAMETER Statements, Up: Missing Features
+
+`SELECT CASE' on `CHARACTER' Type
+---------------------------------
+
+ Character-type selector/cases for `SELECT CASE' currently are not
+supported.
+
+\1f
+File: g77.info, Node: RECURSIVE Keyword, Next: Popular Non-standard Types, Prev: SELECT CASE on CHARACTER Type, Up: Missing Features
+
+`RECURSIVE' Keyword
+-------------------
+
+ `g77' doesn't support the `RECURSIVE' keyword that F90 compilers do.
+Nor does it provide any means for compiling procedures designed to do
+recursion.
+
+ All recursive code can be rewritten to not use recursion, but the
+result is not pretty.
+
+\1f
+File: g77.info, Node: Increasing Precision/Range, Next: Gracefully Handle Sensible Bad Code, Prev: Support for Threads, Up: Missing Features
+
+Increasing Precision/Range
+--------------------------
+
+ Some compilers, such as `f2c', have an option (`-r8' or similar)
+that provides automatic treatment of `REAL' entities such that they
+have twice the storage size, and a corresponding increase in the range
+and precision, of what would normally be the `REAL(KIND=1)' (default
+`REAL') type. (This affects `COMPLEX' the same way.)
+
+ They also typically offer another option (`-i8') to increase
+`INTEGER' entities so they are twice as large (with roughly twice as
+much range).
+
+ (There are potential pitfalls in using these options.)
+
+ `g77' does not yet offer any option that performs these kinds of
+transformations. Part of the problem is the lack of detailed
+specifications regarding exactly how these options affect the
+interpretation of constants, intrinsics, and so on.
+
+ Until `g77' addresses this need, programmers could improve the
+portability of their code by modifying it to not require compile-time
+options to produce correct results. Some free tools are available
+which may help, specifically in Toolpack (which one would expect to be
+sound) and the `fortran' section of the Netlib repository.
+
+ Use of preprocessors can provide a fairly portable means to work
+around the lack of widely portable methods in the Fortran language
+itself (though increasing acceptance of Fortran 90 would alleviate this
+problem).
+
+\1f
+File: g77.info, Node: Popular Non-standard Types, Next: Full Support for Compiler Types, Prev: RECURSIVE Keyword, Up: Missing Features
+
+Popular Non-standard Types
+--------------------------
+
+ `g77' doesn't fully support `INTEGER*2', `LOGICAL*1', and similar.
+Version 0.6 will provide full support for this very popular set of
+features. In the meantime, version 0.5.18 provides rudimentary support
+for them.
+
+\1f
+File: g77.info, Node: Full Support for Compiler Types, Next: Array Bounds Expressions, Prev: Popular Non-standard Types, Up: Missing Features
+
+Full Support for Compiler Types
+-------------------------------
+
+ `g77' doesn't support `INTEGER', `REAL', and `COMPLEX' equivalents
+for *all* applicable back-end-supported types (`char', `short int',
+`int', `long int', `long long int', and `long double'). This means
+providing intrinsic support, and maybe constant support (using F90
+syntax) as well, and, for most machines will result in automatic
+support of `INTEGER*1', `INTEGER*2', `INTEGER*8', maybe even `REAL*16',
+and so on. This is scheduled for version 0.6.
+
+\1f
+File: g77.info, Node: Array Bounds Expressions, Next: POINTER Statements, Prev: Full Support for Compiler Types, Up: Missing Features
+
+Array Bounds Expressions
+------------------------
+
+ `g77' doesn't support more general expressions to dimension arrays,
+such as array element references, function references, etc.
+
+ For example, `g77' currently does not accept the following:
+
+ SUBROUTINE X(M, N)
+ INTEGER N(10), M(N(2), N(1))
+
+\1f
+File: g77.info, Node: POINTER Statements, Next: Sensible Non-standard Constructs, Prev: Array Bounds Expressions, Up: Missing Features
+
+POINTER Statements
+------------------
+
+ `g77' doesn't support pointers or allocatable objects (other than
+automatic arrays). This set of features is probably considered just
+behind intrinsics in `PARAMETER' statements on the list of large,
+important things to add to `g77'.
+
+ In the meantime, consider using the `INTEGER(KIND=7)' declaration to
+specify that a variable must be able to hold a pointer. This construct
+is not portable to other non-GNU compilers, but it is portable to all
+machines GNU Fortran supports when `g77' is used.
+
+ *Note Functions and Subroutines::, for information on `%VAL()',
+`%REF()', and `%DESCR()' constructs, which are useful for passing
+pointers to procedures written in languages other than Fortran.
+
+\1f
+File: g77.info, Node: Sensible Non-standard Constructs, Next: FLUSH Statement, Prev: POINTER Statements, Up: Missing Features
+
+Sensible Non-standard Constructs
+--------------------------------
+
+ `g77' rejects things other compilers accept, like `INTRINSIC
+SQRT,SQRT'. As time permits in the future, some of these things that
+are easy for humans to read and write and unlikely to be intended to
+mean something else will be accepted by `g77' (though `-fpedantic'
+should trigger warnings about such non-standard constructs).
+
+ Until `g77' no longer gratuitously rejects sensible code, you might
+as well fix your code to be more standard-conforming and portable.
+
+ The kind of case that is important to except from the recommendation
+to change your code is one where following good coding rules would
+force you to write non-standard code that nevertheless has a clear
+meaning.
+
+ For example, when writing an `INCLUDE' file that defines a common
+block, it might be appropriate to include a `SAVE' statement for the
+common block (such as `SAVE /CBLOCK/'), so that variables defined in
+the common block retain their values even when all procedures declaring
+the common block become inactive (return to their callers).
+
+ However, putting `SAVE' statements in an `INCLUDE' file would
+prevent otherwise standard-conforming code from also specifying the
+`SAVE' statement, by itself, to indicate that all local variables and
+arrays are to have the `SAVE' attribute.
+
+ For this reason, `g77' already has been changed to allow this
+combination, because although the general problem of gratuitously
+rejecting unambiguous and "safe" constructs still exists in `g77', this
+particular construct was deemed useful enough that it was worth fixing
+`g77' for just this case.
+
+ So, while there is no need to change your code to avoid using this
+particular construct, there might be other, equally appropriate but
+non-standard constructs, that you shouldn't have to stop using just
+because `g77' (or any other compiler) gratuitously rejects it.
+
+ Until the general problem is solved, if you have any such construct
+you believe is worthwhile using (e.g. not just an arbitrary, redundant
+specification of an attribute), please submit a bug report with an
+explanation, so we can consider fixing `g77' just for cases like yours.
+
+\1f
+File: g77.info, Node: FLUSH Statement, Next: Expressions in FORMAT Statements, Prev: Sensible Non-standard Constructs, Up: Missing Features
+
+`FLUSH' Statement
+-----------------
+
+ `g77' could perhaps use a `FLUSH' statement that does what `CALL
+FLUSH' does, but that supports `*' as the unit designator (same unit as
+for `PRINT') and accepts `ERR=' and/or `IOSTAT=' specifiers.
+
+\1f
+File: g77.info, Node: Expressions in FORMAT Statements, Next: Explicit Assembler Code, Prev: FLUSH Statement, Up: Missing Features
+
+Expressions in `FORMAT' Statements
+----------------------------------
+
+ `g77' doesn't support `FORMAT(I<J>)' and the like. Supporting this
+requires a significant redesign or replacement of `libf2c'.
+
+ However, a future version of `g77' might support this construct when
+the expression is constant. For example:
+
+ PARAMETER (IWIDTH = 12)
+ 10 FORMAT (I<IWIDTH>)
+
+ In the meantime, at least for output (`PRINT' and `WRITE'), Fortran
+code making use of this feature can be rewritten to avoid it by
+constructing the `FORMAT' string in a `CHARACTER' variable or array,
+then using that variable or array in place of the `FORMAT' statement
+label to do the original `PRINT' or `WRITE'.
+
+ Many uses of this feature on input can be rewritten this way as
+well, but not all can. For example, this can be rewritten:
+
+ READ 20, I
+ 20 FORMAT (I<J>)
+
+ However, this cannot, in general, be rewritten, especially when
+`ERR=' and `END=' constructs are employed:
+
+ READ 30, J, I
+ 30 FORMAT (I<J>)
+
+\1f
+File: g77.info, Node: Explicit Assembler Code, Next: Q Edit Descriptor, Prev: Expressions in FORMAT Statements, Up: Missing Features
+
+Explicit Assembler Code
+-----------------------
+
+ `g77' needs to provide some way, a la `gcc', for `g77' code to
+specify explicit assembler code.
+
+\1f
+File: g77.info, Node: Q Edit Descriptor, Next: Old-style PARAMETER Statements, Prev: Explicit Assembler Code, Up: Missing Features
+
+Q Edit Descriptor
+-----------------
+
+ The `Q' edit descriptor in `FORMAT's isn't supported. (This is
+meant to get the number of characters remaining in an input record.)
+Supporting this requires a significant redesign or replacement of
+`libf2c'.
+
+ A workaround might be using internal I/O or the stream-based
+intrinsics. *Note FGetC Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: Old-style PARAMETER Statements, Next: TYPE and ACCEPT I/O Statements, Prev: Q Edit Descriptor, Up: Missing Features
+
+Old-style PARAMETER Statements
+------------------------------
+
+ `g77' doesn't accept `PARAMETER I=1'. Supporting this obsolete form
+of the `PARAMETER' statement would not be particularly hard, as most of
+the parsing code is already in place and working.
+
+ Until time/money is spent implementing it, you might as well fix
+your code to use the standard form, `PARAMETER (I=1)' (possibly needing
+`INTEGER I' preceding the `PARAMETER' statement as well, otherwise, in
+the obsolete form of `PARAMETER', the type of the variable is set from
+the type of the constant being assigned to it).
+
+\1f
+File: g77.info, Node: TYPE and ACCEPT I/O Statements, Next: STRUCTURE UNION RECORD MAP, Prev: Old-style PARAMETER Statements, Up: Missing Features
+
+`TYPE' and `ACCEPT' I/O Statements
+----------------------------------
+
+ `g77' doesn't support the I/O statements `TYPE' and `ACCEPT'. These
+are common extensions that should be easy to support, but also are
+fairly easy to work around in user code.
+
+ Generally, any `TYPE fmt,list' I/O statement can be replaced by
+`PRINT fmt,list'. And, any `ACCEPT fmt,list' statement can be replaced
+by `READ fmt,list'.
+
+\1f
+File: g77.info, Node: STRUCTURE UNION RECORD MAP, Next: OPEN CLOSE and INQUIRE Keywords, Prev: TYPE and ACCEPT I/O Statements, Up: Missing Features
+
+`STRUCTURE', `UNION', `RECORD', `MAP'
+-------------------------------------
+
+ `g77' doesn't support `STRUCTURE', `UNION', `RECORD', `MAP'. This
+set of extensions is quite a bit lower on the list of large, important
+things to add to `g77', partly because it requires a great deal of work
+either upgrading or replacing `libf2c'.
+
+\1f
+File: g77.info, Node: OPEN CLOSE and INQUIRE Keywords, Next: ENCODE and DECODE, Prev: STRUCTURE UNION RECORD MAP, Up: Missing Features
+
+`OPEN', `CLOSE', and `INQUIRE' Keywords
+---------------------------------------
+
+ `g77' doesn't have support for keywords such as `DISP='DELETE'' in
+the `OPEN', `CLOSE', and `INQUIRE' statements. These extensions are
+easy to add to `g77' itself, but require much more work on `libf2c'.
+
+\1f
+File: g77.info, Node: ENCODE and DECODE, Next: Suppressing Space Padding, Prev: OPEN CLOSE and INQUIRE Keywords, Up: Missing Features
+
+`ENCODE' and `DECODE'
+---------------------
+
+ `g77' doesn't support `ENCODE' or `DECODE'.
+
+ These statements are best replaced by READ and WRITE statements
+involving internal files (CHARACTER variables and arrays).
+
+ For example, replace a code fragment like
+
+ INTEGER*1 LINE(80)
+ ...
+ DECODE (80, 9000, LINE) A, B, C
+ ...
+ 9000 FORMAT (1X, 3(F10.5))
+
+with:
+
+ CHARACTER*80 LINE
+ ...
+ READ (UNIT=LINE, FMT=9000) A, B, C
+ ...
+ 9000 FORMAT (1X, 3(F10.5))
+
+ Similarly, replace a code fragment like
+
+ INTEGER*1 LINE(80)
+ ...
+ ENCODE (80, 9000, LINE) A, B, C
+ ...
+ 9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
+
+with:
+
+ CHARACTER*80 LINE
+ ...
+ WRITE (UNIT=LINE, FMT=9000) A, B, C
+ ...
+ 9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
+
+ It is entirely possible that `ENCODE' and `DECODE' will be supported
+by a future version of `g77'.
+
+\1f
+File: g77.info, Node: Suppressing Space Padding, Next: Fortran Preprocessor, Prev: ENCODE and DECODE, Up: Missing Features
+
+Suppressing Space Padding of Source Lines
+-----------------------------------------
+
+ `g77' should offer VXT-Fortran-style suppression of virtual spaces
+at the end of a source line if an appropriate command-line option is
+specified.
+
+ This affects cases where a character constant is continued onto the
+next line in a fixed-form source file, as in the following example:
+
+ 10 PRINT *,'HOW MANY
+ 1 SPACES?'
+
+`g77', and many other compilers, virtually extend the continued line
+through column 72 with spaces that become part of the character
+constant, but Digital Fortran normally didn't, leaving only one space
+between `MANY' and `SPACES?' in the output of the above statement.
+
+ Fairly recently, at least one version of Digital Fortran was
+enhanced to provide the other behavior when a command-line option is
+specified, apparently due to demand from readers of the USENET group
+`comp.lang.fortran' to offer conformance to this widespread practice in
+the industry. `g77' should return the favor by offering conformance to
+Digital's approach to handling the above example.
+
+\1f
+File: g77.info, Node: Fortran Preprocessor, Next: Bit Operations on Floating-point Data, Prev: Suppressing Space Padding, Up: Missing Features
+
+Fortran Preprocessor
+--------------------
+
+ `g77' should offer a preprocessor designed specifically for Fortran
+to replace `cpp -traditional'. There are several out there worth
+evaluating, at least.
+
+ Such a preprocessor would recognize Hollerith constants, properly
+parse comments and character constants, and so on. It might also
+recognize, process, and thus preprocess files included via the
+`INCLUDE' directive.
+
+\1f
+File: g77.info, Node: Bit Operations on Floating-point Data, Next: POSIX Standard, Prev: Fortran Preprocessor, Up: Missing Features
+
+Bit Operations on Floating-point Data
+-------------------------------------
+
+ `g77' does not allow `REAL' and other non-integral types for
+arguments to intrinsics like `AND', `OR', and `SHIFT'.
+
+ For example, this program is rejected by `g77', because the
+intrinsic `IAND' does not accept `REAL' arguments:
+
+ DATA A/7.54/, B/9.112/
+ PRINT *, IAND(A, B)
+ END
+
+\1f
+File: g77.info, Node: POSIX Standard, Next: Floating-point Exception Handling, Prev: Bit Operations on Floating-point Data, Up: Missing Features
+
+`POSIX' Standard
+----------------
+
+ `g77' should support the POSIX standard for Fortran.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Floating-point Exception Handling, Next: Nonportable Conversions, Prev: POSIX Standard, Up: Missing Features
+
+Floating-point Exception Handling
+---------------------------------
+
+ The `gcc' backend and, consequently, `g77', currently provides no
+control over whether or not floating-point exceptions are trapped or
+ignored. (Ignoring them typically results in NaN values being
+propagated in systems that conform to IEEE 754.) The behaviour is
+inherited from the system-dependent startup code.
+
+ Most systems provide some C-callable mechanism to change this; this
+can be invoked at startup using `gcc''s `constructor' attribute. For
+example, just compiling and linking the following C code with your
+program will turn on exception trapping for the "common" exceptions on
+an x86-based GNU system:
+
+ #include <fpu_control.h>
+ void __attribute__ ((constructor))
+ trapfpe () {
+ (void) __setfpucw (_FPU_DEFAULT &
+ ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM));
+ }
+
+\1f
+File: g77.info, Node: Nonportable Conversions, Next: Large Automatic Arrays, Prev: Floating-point Exception Handling, Up: Missing Features
+
+Nonportable Conversions
+-----------------------
+
+ `g77' doesn't accept some particularly nonportable, silent data-type
+conversions such as `LOGICAL' to `REAL' (as in `A=.FALSE.', where `A'
+is type `REAL'), that other compilers might quietly accept.
+
+ Some of these conversions are accepted by `g77' when the `-fugly'
+option is specified. Perhaps it should accept more or all of them.
+
+\1f
+File: g77.info, Node: Large Automatic Arrays, Next: Support for Threads, Prev: Nonportable Conversions, Up: Missing Features
+
+Large Automatic Arrays
+----------------------
+
+ Currently, automatic arrays always are allocated on the stack. For
+situations where the stack cannot be made large enough, `g77' should
+offer a compiler option that specifies allocation of automatic arrays
+in heap storage.
+
+\1f
+File: g77.info, Node: Support for Threads, Next: Increasing Precision/Range, Prev: Large Automatic Arrays, Up: Missing Features
+
+Support for Threads
+-------------------
+
+ Neither the code produced by `g77' nor the `libf2c' library are
+thread-safe, nor does `g77' have support for parallel processing (other
+than the instruction-level parallelism available on some processors).
+A package such as PVM might help here.
+
+\1f
+File: g77.info, Node: Gracefully Handle Sensible Bad Code, Next: Non-standard Conversions, Prev: Increasing Precision/Range, Up: Missing Features
+
+Gracefully Handle Sensible Bad Code
+-----------------------------------
+
+ `g77' generally should continue processing for warnings and
+recoverable (user) errors whenever possible--that is, it shouldn't
+gratuitously make bad or useless code.
+
+ For example:
+
+ INTRINSIC ZABS
+ CALL FOO(ZABS)
+ END
+
+When compiling the above with `-ff2c-intrinsics-disable', `g77' should
+indeed complain about passing `ZABS', but it still should compile,
+instead of rejecting the entire `CALL' statement. (Some of this is
+related to improving the compiler internals to improve how statements
+are analyzed.)
+
+\1f
+File: g77.info, Node: Non-standard Conversions, Next: Non-standard Intrinsics, Prev: Gracefully Handle Sensible Bad Code, Up: Missing Features
+
+Non-standard Conversions
+------------------------
+
+ `-Wconversion' and related should flag places where non-standard
+conversions are found. Perhaps much of this would be part of `-Wugly*'.
+
+\1f
+File: g77.info, Node: Non-standard Intrinsics, Next: Modifying DO Variable, Prev: Non-standard Conversions, Up: Missing Features
+
+Non-standard Intrinsics
+-----------------------
+
+ `g77' needs a new option, like `-Wintrinsics', to warn about use of
+non-standard intrinsics without explicit `INTRINSIC' statements for
+them. This would help find code that might fail silently when ported
+to another compiler.
+
+\1f
+File: g77.info, Node: Modifying DO Variable, Next: Better Pedantic Compilation, Prev: Non-standard Intrinsics, Up: Missing Features
+
+Modifying `DO' Variable
+-----------------------
+
+ `g77' should warn about modifying `DO' variables via `EQUIVALENCE'.
+(The internal information gathered to produce this warning might also
+be useful in setting the internal "doiter" flag for a variable or even
+array reference within a loop, since that might produce faster code
+someday.)
+
+ For example, this code is invalid, so `g77' should warn about the
+invalid assignment to `NOTHER':
+
+ EQUIVALENCE (I, NOTHER)
+ DO I = 1, 100
+ IF (I.EQ. 10) NOTHER = 20
+ END DO
+
+\1f
+File: g77.info, Node: Better Pedantic Compilation, Next: Warn About Implicit Conversions, Prev: Modifying DO Variable, Up: Missing Features
+
+Better Pedantic Compilation
+---------------------------
+
+ `g77' needs to support `-fpedantic' more thoroughly, and use it only
+to generate warnings instead of rejecting constructs outright. Have it
+warn: if a variable that dimensions an array is not a dummy or placed
+explicitly in `COMMON' (F77 does not allow it to be placed in `COMMON'
+via `EQUIVALENCE'); if specification statements follow
+statement-function-definition statements; about all sorts of syntactic
+extensions.
+
+\1f
+File: g77.info, Node: Warn About Implicit Conversions, Next: Invalid Use of Hollerith Constant, Prev: Better Pedantic Compilation, Up: Missing Features
+
+Warn About Implicit Conversions
+-------------------------------
+
+ `g77' needs a `-Wpromotions' option to warn if source code appears
+to expect automatic, silent, and somewhat dangerous compiler-assisted
+conversion of `REAL(KIND=1)' constants to `REAL(KIND=2)' based on
+context.
+
+ For example, it would warn about cases like this:
+
+ DOUBLE PRECISION FOO
+ PARAMETER (TZPHI = 9.435784839284958)
+ FOO = TZPHI * 3D0
+
+\1f
+File: g77.info, Node: Invalid Use of Hollerith Constant, Next: Dummy Array Without Dimensioning Dummy, Prev: Warn About Implicit Conversions, Up: Missing Features
+
+Invalid Use of Hollerith Constant
+---------------------------------
+
+ `g77' should disallow statements like `RETURN 2HAB', which are
+invalid in both source forms (unlike `RETURN (2HAB)', which probably
+still makes no sense but at least can be reliably parsed). Fixed-form
+processing rejects it, but not free-form, except in a way that is a bit
+difficult to understand.
+
+\1f
+File: g77.info, Node: Dummy Array Without Dimensioning Dummy, Next: Invalid FORMAT Specifiers, Prev: Invalid Use of Hollerith Constant, Up: Missing Features
+
+Dummy Array Without Dimensioning Dummy
+--------------------------------------
+
+ `g77' should complain when a list of dummy arguments containing an
+adjustable dummy array does not also contain every variable listed in
+the dimension list of the adjustable array.
+
+ Currently, `g77' does complain about a variable that dimensions an
+array but doesn't appear in any dummy list or `COMMON' area, but this
+needs to be extended to catch cases where it doesn't appear in every
+dummy list that also lists any arrays it dimensions.
+
+ For example, `g77' should warn about the entry point `ALT' below,
+since it includes `ARRAY' but not `ISIZE' in its list of arguments:
+
+ SUBROUTINE PRIMARY(ARRAY, ISIZE)
+ REAL ARRAY(ISIZE)
+ ENTRY ALT(ARRAY)
+
+\1f
+File: g77.info, Node: Invalid FORMAT Specifiers, Next: Ambiguous Dialects, Prev: Dummy Array Without Dimensioning Dummy, Up: Missing Features
+
+Invalid FORMAT Specifiers
+-------------------------
+
+ `g77' should check `FORMAT' specifiers for validity as it does
+`FORMAT' statements.
+
+ For example, a diagnostic would be produced for:
+
+ PRINT 'HI THERE!' !User meant PRINT *, 'HI THERE!'
+
+\1f
+File: g77.info, Node: Ambiguous Dialects, Next: Unused Labels, Prev: Invalid FORMAT Specifiers, Up: Missing Features
+
+Ambiguous Dialects
+------------------
+
+ `g77' needs a set of options such as `-Wugly*', `-Wautomatic',
+`-Wvxt', `-Wf90', and so on. These would warn about places in the
+user's source where ambiguities are found, helpful in resolving
+ambiguities in the program's dialect or dialects.
+
+\1f
+File: g77.info, Node: Unused Labels, Next: Informational Messages, Prev: Ambiguous Dialects, Up: Missing Features
+
+Unused Labels
+-------------
+
+ `g77' should warn about unused labels when `-Wunused' is in effect.
+
+\1f
+File: g77.info, Node: Informational Messages, Next: Uninitialized Variables at Run Time, Prev: Unused Labels, Up: Missing Features
+
+Informational Messages
+----------------------
+
+ `g77' needs an option to suppress information messages (notes).
+`-w' does this but also suppresses warnings. The default should be to
+suppress info messages.
+
+ Perhaps info messages should simply be eliminated.
+
+\1f
+File: g77.info, Node: Uninitialized Variables at Run Time, Next: Bounds Checking at Run Time, Prev: Informational Messages, Up: Missing Features
+
+Uninitialized Variables at Run Time
+-----------------------------------
+
+ `g77' needs an option to initialize everything (not otherwise
+explicitly initialized) to "weird" (machine-dependent) values, e.g.
+NaNs, bad (non-`NULL') pointers, and largest-magnitude integers, would
+help track down references to some kinds of uninitialized variables at
+run time.
+
+ Note that use of the options `-O -Wuninitialized' can catch many
+such bugs at compile time.
+
+\1f
+File: g77.info, Node: Bounds Checking at Run Time, Next: Labels Visible to Debugger, Prev: Uninitialized Variables at Run Time, Up: Missing Features
+
+Bounds Checking at Run Time
+---------------------------
+
+ `g77' should offer run-time bounds-checking of array/subscript
+references in a fashion similar to `f2c'.
+
+ Note that `g77' already warns about references to out-of-bounds
+elements of arrays when it detects these at compile time.
+
+\1f
+File: g77.info, Node: Labels Visible to Debugger, Prev: Bounds Checking at Run Time, Up: Missing Features
+
+Labels Visible to Debugger
+--------------------------
+
+ `g77' should output debugging information for statements labels, for
+use by debuggers that know how to support them. Same with weirder
+things like construct names. It is not yet known if any debug formats
+or debuggers support these.
+
+\1f
+File: g77.info, Node: Disappointments, Next: Non-bugs, Prev: Missing Features, Up: Trouble
+
+Disappointments and Misunderstandings
+=====================================
+
+ These problems are perhaps regrettable, but we don't know any
+practical way around them for now.
+
+* Menu:
+
+* Mangling of Names:: `SUBROUTINE FOO' is given
+ external name `foo_'.
+* Multiple Definitions of External Names:: No doing both `COMMON /FOO/'
+ and `SUBROUTINE FOO'.
+* Limitation on Implicit Declarations:: No `IMPLICIT CHARACTER*(*)'.
+
+\1f
+File: g77.info, Node: Mangling of Names, Next: Multiple Definitions of External Names, Up: Disappointments
+
+Mangling of Names in Source Code
+--------------------------------
+
+ The current external-interface design, which includes naming of
+external procedures, COMMON blocks, and the library interface, has
+various usability problems, including things like adding underscores
+where not really necessary (and preventing easier inter-language
+operability) and yet not providing complete namespace freedom for user
+C code linked with Fortran apps (due to the naming of functions in the
+library, among other things).
+
+ Project GNU should at least get all this "right" for systems it
+fully controls, such as the Hurd, and provide defaults and options for
+compatibility with existing systems and interoperability with popular
+existing compilers.
+
+\1f
+File: g77.info, Node: Multiple Definitions of External Names, Next: Limitation on Implicit Declarations, Prev: Mangling of Names, Up: Disappointments
+
+Multiple Definitions of External Names
+--------------------------------------
+
+ `g77' doesn't allow a common block and an external procedure or
+`BLOCK DATA' to have the same name. Some systems allow this, but `g77'
+does not, to be compatible with `f2c'.
+
+ `g77' could special-case the way it handles `BLOCK DATA', since it
+is not compatible with `f2c' in this particular area (necessarily,
+since `g77' offers an important feature here), but it is likely that
+such special-casing would be very annoying to people with programs that
+use `EXTERNAL FOO', with no other mention of `FOO' in the same program
+unit, to refer to external procedures, since the result would be that
+`g77' would treat these references as requests to force-load BLOCK DATA
+program units.
+
+ In that case, if `g77' modified names of `BLOCK DATA' so they could
+have the same names as `COMMON', users would find that their programs
+wouldn't link because the `FOO' procedure didn't have its name
+translated the same way.
+
+ (Strictly speaking, `g77' could emit a
+null-but-externally-satisfying definition of `FOO' with its name
+transformed as if it had been a `BLOCK DATA', but that probably invites
+more trouble than it's worth.)
+
+\1f
+File: g77.info, Node: Limitation on Implicit Declarations, Prev: Multiple Definitions of External Names, Up: Disappointments
+
+Limitation on Implicit Declarations
+-----------------------------------
+
+ `g77' disallows `IMPLICIT CHARACTER*(*)'. This is not
+standard-conforming.
+
+\1f
+File: g77.info, Node: Non-bugs, Next: Warnings and Errors, Prev: Disappointments, Up: Trouble
+
+Certain Changes We Don't Want to Make
+=====================================
+
+ This section lists changes that people frequently request, but which
+we do not make because we think GNU Fortran is better without them.
+
+* Menu:
+
+* Backslash in Constants:: Why `'\\'' is a constant that
+ is one, not two, characters long.
+* Initializing Before Specifying:: Why `DATA VAR/1/' can't precede
+ `COMMON VAR'.
+* Context-Sensitive Intrinsicness:: Why `CALL SQRT' won't work.
+* Context-Sensitive Constants:: Why `9.435784839284958' is a
+ single-precision constant,
+ and might be interpreted as
+ `9.435785' or similar.
+* Equivalence Versus Equality:: Why `.TRUE. .EQ. .TRUE.' won't work.
+* Order of Side Effects:: Why `J = IFUNC() - IFUNC()' might
+ not behave as expected.
+
+\1f
+File: g77.info, Node: Backslash in Constants, Next: Initializing Before Specifying, Up: Non-bugs
+
+Backslash in Constants
+----------------------
+
+ In the opinion of many experienced Fortran users, `-fno-backslash'
+should be the default, not `-fbackslash', as currently set by `g77'.
+
+ First of all, you can always specify `-fno-backslash' to turn off
+this processing.
+
+ Despite not being within the spirit (though apparently within the
+letter) of the ANSI FORTRAN 77 standard, `g77' defaults to
+`-fbackslash' because that is what most UNIX `f77' commands default to,
+and apparently lots of code depends on this feature.
+
+ This is a particularly troubling issue. The use of a C construct in
+the midst of Fortran code is bad enough, worse when it makes existing
+Fortran programs stop working (as happens when programs written for
+non-UNIX systems are ported to UNIX systems with compilers that provide
+the `-fbackslash' feature as the default--sometimes with no option to
+turn it off).
+
+ The author of GNU Fortran wished, for reasons of linguistic purity,
+to make `-fno-backslash' the default for GNU Fortran and thus require
+users of UNIX `f77' and `f2c' to specify `-fbackslash' to get the UNIX
+behavior.
+
+ However, the realization that `g77' is intended as a replacement for
+*UNIX* `f77', caused the author to choose to make `g77' as compatible
+with `f77' as feasible, which meant making `-fbackslash' the default.
+
+ The primary focus on compatibility is at the source-code level, and
+the question became "What will users expect a replacement for `f77' to
+do, by default?" Although at least one UNIX `f77' does not provide
+`-fbackslash' as a default, it appears that the majority of them do,
+which suggests that the majority of code that is compiled by UNIX `f77'
+compilers expects `-fbackslash' to be the default.
+
+ It is probably the case that more code exists that would *not* work
+with `-fbackslash' in force than code that requires it be in force.
+
+ However, most of *that* code is not being compiled with `f77', and
+when it is, new build procedures (shell scripts, makefiles, and so on)
+must be set up anyway so that they work under UNIX. That makes a much
+more natural and safe opportunity for non-UNIX users to adapt their
+build procedures for `g77''s default of `-fbackslash' than would exist
+for the majority of UNIX `f77' users who would have to modify existing,
+working build procedures to explicitly specify `-fbackslash' if that was
+not the default.
+
+ One suggestion has been to configure the default for `-fbackslash'
+(and perhaps other options as well) based on the configuration of `g77'.
+
+ This is technically quite straightforward, but will be avoided even
+in cases where not configuring defaults to be dependent on a particular
+configuration greatly inconveniences some users of legacy code.
+
+ Many users appreciate the GNU compilers because they provide an
+environment that is uniform across machines. These users would be
+inconvenienced if the compiler treated things like the format of the
+source code differently on certain machines.
+
+ Occasionally users write programs intended only for a particular
+machine type. On these occasions, the users would benefit if the GNU
+Fortran compiler were to support by default the same dialect as the
+other compilers on that machine. But such applications are rare. And
+users writing a program to run on more than one type of machine cannot
+possibly benefit from this kind of compatibility. (This is consistent
+with the design goals for `gcc'. To change them for `g77', you must
+first change them for `gcc'. Do not ask the maintainers of `g77' to do
+this for you, or to disassociate `g77' from the widely understood, if
+not widely agreed-upon, goals for GNU compilers in general.)
+
+ This is why GNU Fortran does and will treat backslashes in the same
+fashion on all types of machines (by default). *Note Direction of
+Language Development::, for more information on this overall philosophy
+guiding the development of the GNU Fortran language.
+
+ Of course, users strongly concerned about portability should indicate
+explicitly in their build procedures which options are expected by
+their source code, or write source code that has as few such
+expectations as possible.
+
+ For example, avoid writing code that depends on backslash (`\')
+being interpreted either way in particular, such as by starting a
+program unit with:
+
+ CHARACTER BACKSL
+ PARAMETER (BACKSL = '\\')
+
+Then, use concatenation of `BACKSL' anyplace a backslash is desired.
+In this way, users can write programs which have the same meaning in
+many Fortran dialects.
+
+ (However, this technique does not work for Hollerith constants--which
+is just as well, since the only generally portable uses for Hollerith
+constants are in places where character constants can and should be
+used instead, for readability.)
+
+\1f
+File: g77.info, Node: Initializing Before Specifying, Next: Context-Sensitive Intrinsicness, Prev: Backslash in Constants, Up: Non-bugs
+
+Initializing Before Specifying
+------------------------------
+
+ `g77' does not allow `DATA VAR/1/' to appear in the source code
+before `COMMON VAR', `DIMENSION VAR(10)', `INTEGER VAR', and so on. In
+general, `g77' requires initialization of a variable or array to be
+specified *after* all other specifications of attributes (type, size,
+placement, and so on) of that variable or array are specified (though
+*confirmation* of data type is permitted).
+
+ It is *possible* `g77' will someday allow all of this, even though
+it is not allowed by the FORTRAN 77 standard.
+
+ Then again, maybe it is better to have `g77' always require
+placement of `DATA' so that it can possibly immediately write constants
+to the output file, thus saving time and space.
+
+ That is, `DATA A/1000000*1/' should perhaps always be immediately
+writable to canonical assembler, unless it's already known to be in a
+`COMMON' area following as-yet-uninitialized stuff, and to do this it
+cannot be followed by `COMMON A'.
+
+\1f
+File: g77.info, Node: Context-Sensitive Intrinsicness, Next: Context-Sensitive Constants, Prev: Initializing Before Specifying, Up: Non-bugs
+
+Context-Sensitive Intrinsicness
+-------------------------------
+
+ `g77' treats procedure references to *possible* intrinsic names as
+always enabling their intrinsic nature, regardless of whether the
+*form* of the reference is valid for that intrinsic.
+
+ For example, `CALL SQRT' is interpreted by `g77' as an invalid
+reference to the `SQRT' intrinsic function, because the reference is a
+subroutine invocation.
+
+ First, `g77' recognizes the statement `CALL SQRT' as a reference to
+a *procedure* named `SQRT', not to a *variable* with that name (as it
+would for a statement such as `V = SQRT').
+
+ Next, `g77' establishes that, in the program unit being compiled,
+`SQRT' is an intrinsic--not a subroutine that happens to have the same
+name as an intrinsic (as would be the case if, for example, `EXTERNAL
+SQRT' was present).
+
+ Finally, `g77' recognizes that the *form* of the reference is
+invalid for that particular intrinsic. That is, it recognizes that it
+is invalid for an intrinsic *function*, such as `SQRT', to be invoked as
+a *subroutine*.
+
+ At that point, `g77' issues a diagnostic.
+
+ Some users claim that it is "obvious" that `CALL SQRT' references an
+external subroutine of their own, not an intrinsic function.
+
+ However, `g77' knows about intrinsic subroutines, not just
+functions, and is able to support both having the same names, for
+example.
+
+ As a result of this, `g77' rejects calls to intrinsics that are not
+subroutines, and function invocations of intrinsics that are not
+functions, just as it (and most compilers) rejects invocations of
+intrinsics with the wrong number (or types) of arguments.
+
+ So, use the `EXTERNAL SQRT' statement in a program unit that calls a
+user-written subroutine named `SQRT'.
+
+\1f
+File: g77.info, Node: Context-Sensitive Constants, Next: Equivalence Versus Equality, Prev: Context-Sensitive Intrinsicness, Up: Non-bugs
+
+Context-Sensitive Constants
+---------------------------
+
+ `g77' does not use context to determine the types of constants or
+named constants (`PARAMETER'), except for (non-standard) typeless
+constants such as `'123'O'.
+
+ For example, consider the following statement:
+
+ PRINT *, 9.435784839284958 * 2D0
+
+`g77' will interpret the (truncated) constant `9.435784839284958' as a
+`REAL(KIND=1)', not `REAL(KIND=2)', constant, because the suffix `D0'
+is not specified.
+
+ As a result, the output of the above statement when compiled by
+`g77' will appear to have "less precision" than when compiled by other
+compilers.
+
+ In these and other cases, some compilers detect the fact that a
+single-precision constant is used in a double-precision context and
+therefore interpret the single-precision constant as if it was
+*explicitly* specified as a double-precision constant. (This has the
+effect of appending *decimal*, not *binary*, zeros to the fractional
+part of the number--producing different computational results.)
+
+ The reason this misfeature is dangerous is that a slight, apparently
+innocuous change to the source code can change the computational
+results. Consider:
+
+ REAL ALMOST, CLOSE
+ DOUBLE PRECISION FIVE
+ PARAMETER (ALMOST = 5.000000000001)
+ FIVE = 5
+ CLOSE = 5.000000000001
+ PRINT *, 5.000000000001 - FIVE
+ PRINT *, ALMOST - FIVE
+ PRINT *, CLOSE - FIVE
+ END
+
+Running the above program should result in the same value being printed
+three times. With `g77' as the compiler, it does.
+
+ However, compiled by many other compilers, running the above program
+would print two or three distinct values, because in two or three of
+the statements, the constant `5.000000000001', which on most systems is
+exactly equal to `5.' when interpreted as a single-precision constant,
+is instead interpreted as a double-precision constant, preserving the
+represented precision. However, this "clever" promotion of type does
+not extend to variables or, in some compilers, to named constants.
+
+ Since programmers often are encouraged to replace manifest constants
+or permanently-assigned variables with named constants (`PARAMETER' in
+Fortran), and might need to replace some constants with variables
+having the same values for pertinent portions of code, it is important
+that compilers treat code so modified in the same way so that the
+results of such programs are the same. `g77' helps in this regard by
+treating constants just the same as variables in terms of determining
+their types in a context-independent way.
+
+ Still, there is a lot of existing Fortran code that has been written
+to depend on the way other compilers freely interpret constants' types
+based on context, so anything `g77' can do to help flag cases of this
+in such code could be very helpful.
+
+\1f
+File: g77.info, Node: Equivalence Versus Equality, Next: Order of Side Effects, Prev: Context-Sensitive Constants, Up: Non-bugs
+
+Equivalence Versus Equality
+---------------------------
+
+ Use of `.EQ.' and `.NE.' on `LOGICAL' operands is not supported,
+except via `-fugly', which is not recommended except for legacy code
+(where the behavior expected by the *code* is assumed).
+
+ Legacy code should be changed, as resources permit, to use `.EQV.'
+and `.NEQV.' instead, as these are permitted by the various Fortran
+standards.
+
+ New code should never be written expecting `.EQ.' or `.NE.' to work
+if either of its operands is `LOGICAL'.
+
+ The problem with supporting this "feature" is that there is unlikely
+to be consensus on how it works, as illustrated by the following sample
+program:
+
+ LOGICAL L,M,N
+ DATA L,M,N /3*.FALSE./
+ IF (L.AND.M.EQ.N) PRINT *,'L.AND.M.EQ.N'
+ END
+
+ The issue raised by the above sample program is: what is the
+precedence of `.EQ.' (and `.NE.') when applied to `LOGICAL' operands?
+
+ Some programmers will argue that it is the same as the precedence
+for `.EQ.' when applied to numeric (such as `INTEGER') operands. By
+this interpretation, the subexpression `M.EQ.N' must be evaluated first
+in the above program, resulting in a program that, when run, does not
+execute the `PRINT' statement.
+
+ Other programmers will argue that the precedence is the same as the
+precedence for `.EQV.', which is restricted by the standards to
+`LOGICAL' operands. By this interpretation, the subexpression
+`L.AND.M' must be evaluated first, resulting in a program that *does*
+execute the `PRINT' statement.
+
+ Assigning arbitrary semantic interpretations to syntactic expressions
+that might legitimately have more than one "obvious" interpretation is
+generally unwise.
+
+ The creators of the various Fortran standards have done a good job
+in this case, requiring a distinct set of operators (which have their
+own distinct precedence) to compare `LOGICAL' operands. This
+requirement results in expression syntax with more certain precedence
+(without requiring substantial context), making it easier for
+programmers to read existing code. `g77' will avoid muddying up
+elements of the Fortran language that were well-designed in the first
+place.
+
+ (Ask C programmers about the precedence of expressions such as `(a)
+& (b)' and `(a) - (b)'--they cannot even tell you, without knowing more
+context, whether the `&' and `-' operators are infix (binary) or unary!)
+
+\1f
+File: g77.info, Node: Order of Side Effects, Prev: Equivalence Versus Equality, Up: Non-bugs
+
+Order of Side Effects
+---------------------
+
+ `g77' does not necessarily produce code that, when run, performs
+side effects (such as those performed by function invocations) in the
+same order as in some other compiler--or even in the same order as
+another version, port, or invocation (using different command-line
+options) of `g77'.
+
+ It is never safe to depend on the order of evaluation of side
+effects. For example, an expression like this may very well behave
+differently from one compiler to another:
+
+ J = IFUNC() - IFUNC()
+
+There is no guarantee that `IFUNC' will be evaluated in any particular
+order. Either invocation might happen first. If `IFUNC' returns 5 the
+first time it is invoked, and returns 12 the second time, `J' might end
+up with the value `7', or it might end up with `-7'.
+
+ Generally, in Fortran, procedures with side-effects intended to be
+visible to the caller are best designed as *subroutines*, not functions.
+Examples of such side-effects include:
+
+ * The generation of random numbers that are intended to influence
+ return values.
+
+ * Performing I/O (other than internal I/O to local variables).
+
+ * Updating information in common blocks.
+
+ An example of a side-effect that is not intended to be visible to
+the caller is a function that maintains a cache of recently calculated
+results, intended solely to speed repeated invocations of the function
+with identical arguments. Such a function can be safely used in
+expressions, because if the compiler optimizes away one or more calls
+to the function, operation of the program is unaffected (aside from
+being speeded up).
+
+\1f
+File: g77.info, Node: Warnings and Errors, Prev: Non-bugs, Up: Trouble
+
+Warning Messages and Error Messages
+===================================
+
+ The GNU compiler can produce two kinds of diagnostics: errors and
+warnings. Each kind has a different purpose:
+
+ *Errors* report problems that make it impossible to compile your
+ program. GNU Fortran reports errors with the source file name,
+ line number, and column within the line where the problem is
+ apparent.
+
+ *Warnings* report other unusual conditions in your code that
+ *might* indicate a problem, although compilation can (and does)
+ proceed. Warning messages also report the source file name, line
+ number, and column information, but include the text `warning:' to
+ distinguish them from error messages.
+
+ Warnings might indicate danger points where you should check to make
+sure that your program really does what you intend; or the use of
+obsolete features; or the use of nonstandard features of GNU Fortran.
+Many warnings are issued only if you ask for them, with one of the `-W'
+options (for instance, `-Wall' requests a variety of useful warnings).
+
+ *Note:* Currently, the text of the line and a pointer to the column
+is printed in most `g77' diagnostics. Probably, as of version 0.6,
+`g77' will no longer print the text of the source line, instead printing
+the column number following the file name and line number in a form
+that GNU Emacs recognizes. This change is expected to speed up and
+reduce the memory usage of the `g77' compiler.
+
+ *Note Options to Request or Suppress Warnings: Warning Options, for
+more detail on these and related command-line options.
+
+\1f
+File: g77.info, Node: Open Questions, Next: Bugs, Prev: Trouble, Up: Top
+
+Open Questions
+**************
+
+ Please consider offering useful answers to these questions!
+
+ * How do system administrators and users manage multiple incompatible
+ Fortran compilers on their systems? How can `g77' contribute to
+ this, or at least avoiding intefering with it?
+
+ Currently, `g77' provides rudimentary ways to choose whether to
+ overwrite portions of other Fortran compilation systems (such as
+ the `f77' command and the `libf2c' library). Is this sufficient?
+ What happens when users choose not to overwrite these--does `g77'
+ work properly in all such installations, picking up its own
+ versions, or does it pick up the existing "alien" versions it
+ didn't overwrite with its own, possibly leading to subtle bugs?
+
+ * `LOC()' and other intrinsics are probably somewhat misclassified.
+ Is the a need for more precise classification of intrinsics, and
+ if so, what are the appropriate groupings? Is there a need to
+ individually enable/disable/delete/hide intrinsics from the
+ command line?
+
+\1f
+File: g77.info, Node: Bugs, Next: Service, Prev: Open Questions, Up: Top
+
+Reporting Bugs
+**************
+
+ Your bug reports play an essential role in making GNU Fortran
+reliable.
+
+ When you encounter a problem, the first thing to do is to see if it
+is already known. *Note Trouble::. If it isn't known, then you should
+report the problem.
+
+ Reporting a bug might help you by bringing a solution to your
+problem, or it might not. (If it does not, look in the service
+directory; see *Note Service::.) In any case, the principal function
+of a bug report is to help the entire community by making the next
+version of GNU Fortran work better. Bug reports are your contribution
+to the maintenance of GNU Fortran.
+
+ Since the maintainers are very overloaded, we cannot respond to every
+bug report. However, if the bug has not been fixed, we are likely to
+send you a patch and ask you to tell us whether it works.
+
+ In order for a bug report to serve its purpose, you must include the
+information that makes for fixing the bug.
+
+* Menu:
+
+* Criteria: Bug Criteria. Have you really found a bug?
+* Where: Bug Lists. Where to send your bug report.
+* Reporting: Bug Reporting. How to report a bug effectively.
+* Patches: Sending Patches. How to send a patch for GNU Fortran.
+
+ *Note Known Causes of Trouble with GNU Fortran: Trouble, for
+information on problems we already know about.
+
+ *Note How To Get Help with GNU Fortran: Service, for information on
+where to ask for help.
+
+\1f
+File: g77.info, Node: Bug Criteria, Next: Bug Lists, Up: Bugs
+
+Have You Found a Bug?
+=====================
+
+ If you are not sure whether you have found a bug, here are some
+guidelines:
+
+ * If the compiler gets a fatal signal, for any input whatever, that
+ is a compiler bug. Reliable compilers never crash--they just
+ remain obsolete.
+
+ * If the compiler produces invalid assembly code, for any input
+ whatever, that is a compiler bug, unless the compiler reports
+ errors (not just warnings) which would ordinarily prevent the
+ assembler from being run.
+
+ * If the compiler produces valid assembly code that does not
+ correctly execute the input source code, that is a compiler bug.
+
+ However, you must double-check to make sure, because you might
+ have run into an incompatibility between GNU Fortran and
+ traditional Fortran. These incompatibilities might be considered
+ bugs, but they are inescapable consequences of valuable features.
+
+ Or you might have a program whose behavior is undefined, which
+ happened by chance to give the desired results with another
+ Fortran compiler. It is best to check the relevant Fortran
+ standard thoroughly if it is possible that the program indeed does
+ something undefined.
+
+ After you have localized the error to a single source line, it
+ should be easy to check for these things. If your program is
+ correct and well defined, you have found a compiler bug.
+
+ It might help if, in your submission, you identified the specific
+ language in the relevant Fortran standard that specifies the
+ desired behavior, if it isn't likely to be obvious and agreed-upon
+ by all Fortran users.
+
+ * If the compiler produces an error message for valid input, that is
+ a compiler bug.
+
+ * If the compiler does not produce an error message for invalid
+ input, that is a compiler bug. However, you should note that your
+ idea of "invalid input" might be someone else's idea of "an
+ extension" or "support for traditional practice".
+
+ * If you are an experienced user of Fortran compilers, your
+ suggestions for improvement of GNU Fortran are welcome in any case.
+
+ Many, perhaps most, bug reports against `g77' turn out to be bugs in
+the user's code. While we find such bug reports educational, they
+sometimes take a considerable amount of time to track down or at least
+respond to--time we could be spending making `g77', not some user's
+code, better.
+
+ Some steps you can take to verify that the bug is not certainly in
+the code you're compiling with `g77':
+
+ * Compile your code using the `g77' options `-W -Wall -O'. These
+ options enable many useful warning; the `-O' option enables flow
+ analysis that enables the uninitialized-variable warning.
+
+ If you investigate the warnings and find evidence of possible bugs
+ in your code, fix them first and retry `g77'.
+
+ * Compile your code using the `g77' options `-finit-local-zero',
+ `-fno-automatic', `-ffloat-store', and various combinations
+ thereof.
+
+ If your code works with any of these combinations, that is not
+ proof that the bug isn't in `g77'--a `g77' bug exposed by your
+ code might simply be avoided, or have a different, more subtle
+ effect, when different options are used--but it can be a strong
+ indicator that your code is making unawarranted assumptions about
+ the Fortran dialect and/or underlying machine it is being compiled
+ and run on.
+
+ *Note Overly Convenient Command-Line Options: Overly Convenient
+ Options, for information on the `-fno-automatic' and
+ `-finit-local-zero' options and how to convert their use into
+ selective changes in your own code.
+
+ * Validate your code with `ftnchek' or a similar code-checking tool.
+ `ftncheck' can be found at `ftp://ftp.netlib.org/fortran' or
+ `ftp://ftp.dsm.fordham.edu'.
+
+ * Try your code out using other Fortran compilers, such as `f2c'.
+ If it does not work on at least one other compiler (assuming the
+ compiler supports the features the code needs), that is a strong
+ indicator of a bug in the code.
+
+ However, even if your code works on many compilers *except* `g77',
+ that does *not* mean the bug is in `g77'. It might mean the bug
+ is in your code, and that `g77' simply exposes it more readily
+ than other compilers.
+
+\1f
+File: g77.info, Node: Bug Lists, Next: Bug Reporting, Prev: Bug Criteria, Up: Bugs
+
+Where to Report Bugs
+====================
+
+ Send bug reports for GNU Fortran to <fortran@gnu.ai.mit.edu>.
+
+ Often people think of posting bug reports to a newsgroup instead of
+mailing them. This sometimes appears to work, but it has one problem
+which can be crucial: a newsgroup posting does not contain a mail path
+back to the sender. Thus, if maintainers need more information, they
+might be unable to reach you. For this reason, you should always send
+bug reports by mail to the proper mailing list.
+
+ As a last resort, send bug reports on paper to:
+
+ GNU Compiler Bugs
+ Free Software Foundation
+ 59 Temple Place - Suite 330
+ Boston, MA 02111-1307, USA
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Bug Reporting, Next: Sending Patches, Prev: Bug Lists, Up: Bugs
+
+How to Report Bugs
+==================
+
+ The fundamental principle of reporting bugs usefully is this:
+*report all the facts*. If you are not sure whether to state a fact or
+leave it out, state it!
+
+ Often people omit facts because they think they know what causes the
+problem and they conclude that some details don't matter. Thus, you
+might assume that the name of the variable you use in an example does
+not matter. Well, probably it doesn't, but one cannot be sure.
+Perhaps the bug is a stray memory reference which happens to fetch from
+the location where that name is stored in memory; perhaps, if the name
+were different, the contents of that location would fool the compiler
+into doing the right thing despite the bug. Play it safe and give a
+specific, complete example. That is the easiest thing for you to do,
+and the most helpful.
+
+ Keep in mind that the purpose of a bug report is to enable someone to
+fix the bug if it is not known. It isn't very important what happens if
+the bug is already known. Therefore, always write your bug reports on
+the assumption that the bug is not known.
+
+ Sometimes people give a few sketchy facts and ask, "Does this ring a
+bell?" This cannot help us fix a bug, so it is rarely helpful. We
+respond by asking for enough details to enable us to investigate. You
+might as well expedite matters by sending them to begin with.
+(Besides, there are enough bells ringing around here as it is.)
+
+ Try to make your bug report self-contained. If we have to ask you
+for more information, it is best if you include all the previous
+information in your response, as well as the information that was
+missing.
+
+ Please report each bug in a separate message. This makes it easier
+for us to track which bugs have been fixed and to forward your bugs
+reports to the appropriate maintainer.
+
+ Do not compress and encode any part of your bug report using programs
+such as `uuencode'. If you do so it will slow down the processing of
+your bug. If you must submit multiple large files, use `shar', which
+allows us to read your message without having to run any decompression
+programs.
+
+ (As a special exception for GNU Fortran bug-reporting, at least for
+now, if you are sending more than a few lines of code, if your
+program's source file format contains "interesting" things like
+trailing spaces or strange characters, or if you need to include binary
+data files, it is acceptable to put all the files together in a `tar'
+archive, and, whether you need to do that, it is acceptable to then
+compress the single file (`tar' archive or source file) using `gzip'
+and encode it via `uuencode'. Do not use any MIME stuff--the current
+maintainer can't decode this. Using `compress' instead of `gzip' is
+acceptable, assuming you have licensed the use of the patented
+algorithm in `compress' from Unisys.)
+
+ To enable someone to investigate the bug, you should include all
+these things:
+
+ * The version of GNU Fortran. You can get this by running `g77'
+ with the `-v' option. (Ignore any error messages that might be
+ displayed when the linker is run.)
+
+ Without this, we won't know whether there is any point in looking
+ for the bug in the current version of GNU Fortran.
+
+ * A complete input file that will reproduce the bug. If the bug is
+ in the compiler proper (`f771') and you are using the C
+ preprocessor, run your source file through the C preprocessor by
+ doing `g77 -E SOURCEFILE > OUTFILE', then include the contents of
+ OUTFILE in the bug report. (When you do this, use the same `-I',
+ `-D' or `-U' options that you used in actual compilation.)
+
+ A single statement is not enough of an example. In order to
+ compile it, it must be embedded in a complete file of compiler
+ input; and the bug might depend on the details of how this is done.
+
+ Without a real example one can compile, all anyone can do about
+ your bug report is wish you luck. It would be futile to try to
+ guess how to provoke the bug. For example, bugs in register
+ allocation and reloading frequently depend on every little detail
+ of the function they happen in.
+
+ * Note that you should include with your bug report any files
+ included by the source file (via the `#include' or `INCLUDE'
+ directive) that you send, and any files they include, and so on.
+
+ It is not necessary to replace the `#include' and `INCLUDE'
+ directives with the actual files in the version of the source file
+ that you send, but it might make submitting the bug report easier
+ in the end. However, be sure to *reproduce* the bug using the
+ *exact* version of the source material you submit, to avoid
+ wild-goose chases.
+
+ * The command arguments you gave GNU Fortran to compile that example
+ and observe the bug. For example, did you use `-O'? To guarantee
+ you won't omit something important, list all the options.
+
+ If we were to try to guess the arguments, we would probably guess
+ wrong and then we would not encounter the bug.
+
+ * The type of machine you are using, and the operating system name
+ and version number. (Much of this information is printed by `g77
+ -v'--if you include that, send along any additional info you have
+ that you don't see clearly represented in that output.)
+
+ * The operands you gave to the `configure' command when you installed
+ the compiler.
+
+ * A complete list of any modifications you have made to the compiler
+ source. (We don't promise to investigate the bug unless it
+ happens in an unmodified compiler. But if you've made
+ modifications and don't tell us, then you are sending us on a
+ wild-goose chase.)
+
+ Be precise about these changes. A description in English is not
+ enough--send a context diff for them.
+
+ Adding files of your own (such as a machine description for a
+ machine we don't support) is a modification of the compiler source.
+
+ * Details of any other deviations from the standard procedure for
+ installing GNU Fortran.
+
+ * A description of what behavior you observe that you believe is
+ incorrect. For example, "The compiler gets a fatal signal," or,
+ "The assembler instruction at line 208 in the output is incorrect."
+
+ Of course, if the bug is that the compiler gets a fatal signal,
+ then one can't miss it. But if the bug is incorrect output, the
+ maintainer might not notice unless it is glaringly wrong. None of
+ us has time to study all the assembler code from a 50-line Fortran
+ program just on the chance that one instruction might be wrong.
+ We need *you* to do this part!
+
+ Even if the problem you experience is a fatal signal, you should
+ still say so explicitly. Suppose something strange is going on,
+ such as, your copy of the compiler is out of synch, or you have
+ encountered a bug in the C library on your system. (This has
+ happened!) Your copy might crash and the copy here would not. If
+ you said to expect a crash, then when the compiler here fails to
+ crash, we would know that the bug was not happening. If you don't
+ say to expect a crash, then we would not know whether the bug was
+ happening. We would not be able to draw any conclusion from our
+ observations.
+
+ If the problem is a diagnostic when building GNU Fortran with some
+ other compiler, say whether it is a warning or an error.
+
+ Often the observed symptom is incorrect output when your program
+ is run. Sad to say, this is not enough information unless the
+ program is short and simple. None of us has time to study a large
+ program to figure out how it would work if compiled correctly,
+ much less which line of it was compiled wrong. So you will have
+ to do that. Tell us which source line it is, and what incorrect
+ result happens when that line is executed. A person who
+ understands the program can find this as easily as finding a bug
+ in the program itself.
+
+ * If you send examples of assembler code output from GNU Fortran,
+ please use `-g' when you make them. The debugging information
+ includes source line numbers which are essential for correlating
+ the output with the input.
+
+ * If you wish to mention something in the GNU Fortran source, refer
+ to it by context, not by line number.
+
+ The line numbers in the development sources don't match those in
+ your sources. Your line numbers would convey no convenient
+ information to the maintainers.
+
+ * Additional information from a debugger might enable someone to
+ find a problem on a machine which he does not have available.
+ However, you need to think when you collect this information if
+ you want it to have any chance of being useful.
+
+ For example, many people send just a backtrace, but that is never
+ useful by itself. A simple backtrace with arguments conveys little
+ about GNU Fortran because the compiler is largely data-driven; the
+ same functions are called over and over for different RTL insns,
+ doing different things depending on the details of the insn.
+
+ Most of the arguments listed in the backtrace are useless because
+ they are pointers to RTL list structure. The numeric values of the
+ pointers, which the debugger prints in the backtrace, have no
+ significance whatever; all that matters is the contents of the
+ objects they point to (and most of the contents are other such
+ pointers).
+
+ In addition, most compiler passes consist of one or more loops that
+ scan the RTL insn sequence. The most vital piece of information
+ about such a loop--which insn it has reached--is usually in a
+ local variable, not in an argument.
+
+ What you need to provide in addition to a backtrace are the values
+ of the local variables for several stack frames up. When a local
+ variable or an argument is an RTX, first print its value and then
+ use the GDB command `pr' to print the RTL expression that it points
+ to. (If GDB doesn't run on your machine, use your debugger to call
+ the function `debug_rtx' with the RTX as an argument.) In
+ general, whenever a variable is a pointer, its value is no use
+ without the data it points to.
+
+ Here are some things that are not necessary:
+
+ * A description of the envelope of the bug.
+
+ Often people who encounter a bug spend a lot of time investigating
+ which changes to the input file will make the bug go away and which
+ changes will not affect it.
+
+ This is often time consuming and not very useful, because the way
+ we will find the bug is by running a single example under the
+ debugger with breakpoints, not by pure deduction from a series of
+ examples. You might as well save your time for something else.
+
+ Of course, if you can find a simpler example to report *instead* of
+ the original one, that is a convenience. Errors in the output
+ will be easier to spot, running under the debugger will take less
+ time, etc. Most GNU Fortran bugs involve just one function, so
+ the most straightforward way to simplify an example is to delete
+ all the function definitions except the one where the bug occurs.
+ Those earlier in the file may be replaced by external declarations
+ if the crucial function depends on them. (Exception: inline
+ functions might affect compilation of functions defined later in
+ the file.)
+
+ However, simplification is not vital; if you don't want to do this,
+ report the bug anyway and send the entire test case you used.
+
+ * In particular, some people insert conditionals `#ifdef BUG' around
+ a statement which, if removed, makes the bug not happen. These
+ are just clutter; we won't pay any attention to them anyway.
+ Besides, you should send us preprocessor output, and that can't
+ have conditionals.
+
+ * A patch for the bug.
+
+ A patch for the bug is useful if it is a good one. But don't omit
+ the necessary information, such as the test case, on the
+ assumption that a patch is all we need. We might see problems
+ with your patch and decide to fix the problem another way, or we
+ might not understand it at all.
+
+ Sometimes with a program as complicated as GNU Fortran it is very
+ hard to construct an example that will make the program follow a
+ certain path through the code. If you don't send the example, we
+ won't be able to construct one, so we won't be able to verify that
+ the bug is fixed.
+
+ And if we can't understand what bug you are trying to fix, or why
+ your patch should be an improvement, we won't install it. A test
+ case will help us to understand.
+
+ *Note Sending Patches::, for guidelines on how to make it easy for
+ us to understand and install your patches.
+
+ * A guess about what the bug is or what it depends on.
+
+ Such guesses are usually wrong. Even the maintainer can't guess
+ right about such things without first using the debugger to find
+ the facts.
+
+ * A core dump file.
+
+ We have no way of examining a core dump for your type of machine
+ unless we have an identical system--and if we do have one, we
+ should be able to reproduce the crash ourselves.
+
+\1f
+File: g77.info, Node: Sending Patches, Prev: Bug Reporting, Up: Bugs
+
+Sending Patches for GNU Fortran
+===============================
+
+ If you would like to write bug fixes or improvements for the GNU
+Fortran compiler, that is very helpful. Send suggested fixes to the
+bug report mailing list, <fortran@gnu.ai.mit.edu>.
+
+ Please follow these guidelines so we can study your patches
+efficiently. If you don't follow these guidelines, your information
+might still be useful, but using it will take extra work. Maintaining
+GNU Fortran is a lot of work in the best of circumstances, and we can't
+keep up unless you do your best to help.
+
+ * Send an explanation with your changes of what problem they fix or
+ what improvement they bring about. For a bug fix, just include a
+ copy of the bug report, and explain why the change fixes the bug.
+
+ (Referring to a bug report is not as good as including it, because
+ then we will have to look it up, and we have probably already
+ deleted it if we've already fixed the bug.)
+
+ * Always include a proper bug report for the problem you think you
+ have fixed. We need to convince ourselves that the change is
+ right before installing it. Even if it is right, we might have
+ trouble judging it if we don't have a way to reproduce the problem.
+
+ * Include all the comments that are appropriate to help people
+ reading the source in the future understand why this change was
+ needed.
+
+ * Don't mix together changes made for different reasons. Send them
+ *individually*.
+
+ If you make two changes for separate reasons, then we might not
+ want to install them both. We might want to install just one. If
+ you send them all jumbled together in a single set of diffs, we
+ have to do extra work to disentangle them--to figure out which
+ parts of the change serve which purpose. If we don't have time
+ for this, we might have to ignore your changes entirely.
+
+ If you send each change as soon as you have written it, with its
+ own explanation, then the two changes never get tangled up, and we
+ can consider each one properly without any extra work to
+ disentangle them.
+
+ Ideally, each change you send should be impossible to subdivide
+ into parts that we might want to consider separately, because each
+ of its parts gets its motivation from the other parts.
+
+ * Send each change as soon as that change is finished. Sometimes
+ people think they are helping us by accumulating many changes to
+ send them all together. As explained above, this is absolutely
+ the worst thing you could do.
+
+ Since you should send each change separately, you might as well
+ send it right away. That gives us the option of installing it
+ immediately if it is important.
+
+ * Use `diff -c' to make your diffs. Diffs without context are hard
+ for us to install reliably. More than that, they make it hard for
+ us to study the diffs to decide whether we want to install them.
+ Unidiff format is better than contextless diffs, but not as easy
+ to read as `-c' format.
+
+ If you have GNU `diff', use `diff -cp', which shows the name of the
+ function that each change occurs in. (The maintainer of GNU
+ Fortran currently uses `diff -rcp2N'.)
+
+ * Write the change log entries for your changes. We get lots of
+ changes, and we don't have time to do all the change log writing
+ ourselves.
+
+ Read the `ChangeLog' file to see what sorts of information to put
+ in, and to learn the style that we use. The purpose of the change
+ log is to show people where to find what was changed. So you need
+ to be specific about what functions you changed; in large
+ functions, it's often helpful to indicate where within the
+ function the change was.
+
+ On the other hand, once you have shown people where to find the
+ change, you need not explain its purpose. Thus, if you add a new
+ function, all you need to say about it is that it is new. If you
+ feel that the purpose needs explaining, it probably does--but the
+ explanation will be much more useful if you put it in comments in
+ the code.
+
+ If you would like your name to appear in the header line for who
+ made the change, send us the header line.
+
+ * When you write the fix, keep in mind that we can't install a
+ change that would break other systems.
+
+ People often suggest fixing a problem by changing
+ machine-independent files such as `toplev.c' to do something
+ special that a particular system needs. Sometimes it is totally
+ obvious that such changes would break GNU Fortran for almost all
+ users. We can't possibly make a change like that. At best it
+ might tell us how to write another patch that would solve the
+ problem acceptably.
+
+ Sometimes people send fixes that *might* be an improvement in
+ general--but it is hard to be sure of this. It's hard to install
+ such changes because we have to study them very carefully. Of
+ course, a good explanation of the reasoning by which you concluded
+ the change was correct can help convince us.
+
+ The safest changes are changes to the configuration files for a
+ particular machine. These are safe because they can't create new
+ bugs on other machines.
+
+ Please help us keep up with the workload by designing the patch in
+ a form that is good to install.
+
+\1f
+File: g77.info, Node: Service, Next: Adding Options, Prev: Bugs, Up: Top
+
+How To Get Help with GNU Fortran
+********************************
+
+ If you need help installing, using or changing GNU Fortran, there
+are two ways to find it:
+
+ * Look in the service directory for someone who might help you for a
+ fee. The service directory is found in the file named `SERVICE'
+ in the GNU CC distribution.
+
+ * Send a message to <fortran@gnu.ai.mit.edu>.
+
+\1f
+File: g77.info, Node: Adding Options, Next: Projects, Prev: Service, Up: Top
+
+Adding Options
+**************
+
+ To add a new command-line option to `g77', first decide what kind of
+option you wish to add. Search the `g77' and `gcc' documentation for
+one or more options that is most closely like the one you want to add
+(in terms of what kind of effect it has, and so on) to help clarify its
+nature.
+
+ * *Fortran options* are options that apply only when compiling
+ Fortran programs. They are accepted by `g77' and `gcc', but they
+ apply only when compiling Fortran programs.
+
+ * *Compiler options* are options that apply when compiling most any
+ kind of program.
+
+ *Fortran options* are listed in the file `gcc/f/lang-options.h',
+which is used during the build of `gcc' to build a list of all options
+that are accepted by at least one language's compiler. This list goes
+into the `lang_options' array in `gcc/toplev.c', which uses this array
+to determine whether a particular option should be offered to the
+linked-in front end for processing by calling `lang_option_decode',
+which, for `g77', is in `gcc/f/com.c' and just calls
+`ffe_decode_option'.
+
+ If the linked-in front end "rejects" a particular option passed to
+it, `toplev.c' just ignores the option, because *some* language's
+compiler is willing to accept it.
+
+ This allows commands like `gcc -fno-asm foo.c bar.f' to work, even
+though Fortran compilation does not currently support the `-fno-asm'
+option; even though the `f771' version of `lang_decode_option' rejects
+`-fno-asm', `toplev.c' doesn't produce a diagnostic because some other
+language (C) does accept it.
+
+ This also means that commands like `g77 -fno-asm foo.f' yield no
+diagnostics, despite the fact that no phase of the command was able to
+recognize and process `-fno-asm'--perhaps a warning about this would be
+helpful if it were possible.
+
+ Code that processes Fortran options is found in `gcc/f/top.c',
+function `ffe_decode_option'. This code needs to check positive and
+negative forms of each option.
+
+ The defaults for Fortran options are set in their global
+definitions, also found in `gcc/f/top.c'. Many of these defaults are
+actually macros defined in `gcc/f/target.h', since they might be
+machine-specific. However, since, in practice, GNU compilers should
+behave the same way on all configurations (especially when it comes to
+language constructs), the practice of setting defaults in `target.h' is
+likely to be deprecated and, ultimately, stopped in future versions of
+`g77'.
+
+ Accessor macros for Fortran options, used by code in the `g77' FFE,
+are defined in `gcc/f/top.h'.
+
+ *Compiler options* are listed in `gcc/toplev.c' in the array
+`f_options'. An option not listed in `lang_options' is looked up in
+`f_options' and handled from there.
+
+ The defaults for compiler options are set in the global definitions
+for the corresponding variables, some of which are in `gcc/toplev.c'.
+
+ You can set different defaults for *Fortran-oriented* or
+*Fortran-reticent* compiler options by changing the way `f771' handles
+the `-fset-g77-defaults' option, which is always provided as the first
+option when called by `g77' or `gcc'.
+
+ This code is in `ffe_decode_options' in `gcc/f/top.c'. Have it
+change just the variables that you want to default to a different
+setting for Fortran compiles compared to compiles of other languages.
+
+ The `-fset-g77-defaults' option is passed to `f771' automatically
+because of the specification information kept in `gcc/f/lang-specs.h'.
+This file tells the `gcc' command how to recognize, in this case,
+Fortran source files (those to be preprocessed, and those that are
+not), and further, how to invoke the appropriate programs (including
+`f771') to process those source files.
+
+ It is in `gcc/f/lang-specs.h' that `-fset-g77-defaults',
+`-fversion', and other options are passed, as appropriate, even when
+the user has not explicitly specified them. Other "internal" options
+such as `-quiet' also are passed via this mechanism.
+
+\1f
+File: g77.info, Node: Projects, Next: Diagnostics, Prev: Adding Options, Up: Top
+
+Projects
+********
+
+ If you want to contribute to `g77' by doing research, design,
+specification, documentation, coding, or testing, the following
+information should give you some ideas.
+
+* Menu:
+
+* Efficiency:: Make `g77' itself compile code faster.
+* Better Optimization:: Teach `g77' to generate faster code.
+* Simplify Porting:: Make `g77' easier to configure, build,
+ and install.
+* More Extensions:: Features many users won't know to ask for.
+* Machine Model:: `g77' should better leverage `gcc'.
+* Internals Documentation:: Make maintenance easier.
+* Internals Improvements:: Make internals more robust.
+* Better Diagnostics:: Make using `g77' on new code easier.
+
+\1f
+File: g77.info, Node: Efficiency, Next: Better Optimization, Up: Projects
+
+Improve Efficiency
+==================
+
+ Don't bother doing any performance analysis until most of the
+following items are taken care of, because there's no question they
+represent serious space/time problems, although some of them show up
+only given certain kinds of (popular) input.
+
+ * Improve `malloc' package and its uses to specify more info about
+ memory pools and, where feasible, use obstacks to implement them.
+
+ * Skip over uninitialized portions of aggregate areas (arrays,
+ `COMMON' areas, `EQUIVALENCE' areas) so zeros need not be output.
+ This would reduce memory usage for large initialized aggregate
+ areas, even ones with only one initialized element.
+
+ As of version 0.5.18, a portion of this item has already been
+ accomplished.
+
+ * Prescan the statement (in `sta.c') so that the nature of the
+ statement is determined as much as possible by looking entirely at
+ its form, and not looking at any context (previous statements,
+ including types of symbols). This would allow ripping out of the
+ statement-confirmation, symbol retraction/confirmation, and
+ diagnostic inhibition mechanisms. Plus, it would result in
+ much-improved diagnostics. For example, `CALL
+ some-intrinsic(...)', where the intrinsic is not a subroutine
+ intrinsic, would result actual error instead of the
+ unimplemented-statement catch-all.
+
+ * Throughout `g77', don't pass line/column pairs where a simple
+ `ffewhere' type, which points to the error as much as is desired
+ by the configuration, will do, and don't pass `ffelexToken' types
+ where a simple `ffewhere' type will do. Then, allow new default
+ configuration of `ffewhere' such that the source line text is not
+ preserved, and leave it to things like Emacs' next-error function
+ to point to them (now that `next-error' supports column, or,
+ perhaps, character-offset, numbers). The change in calling
+ sequences should improve performance somewhat, as should not
+ having to save source lines. (Whether this whole item will
+ improve performance is questionable, but it should improve
+ maintainability.)
+
+ * Handle `DATA (A(I),I=1,1000000)/1000000*2/' more efficiently,
+ especially as regards the assembly output. Some of this might
+ require improving the back end, but lots of improvement in
+ space/time required in `g77' itself can be fairly easily obtained
+ without touching the back end. Maybe type-conversion, where
+ necessary, can be speeded up as well in cases like the one shown
+ (converting the `2' into `2.').
+
+ * If analysis shows it to be worthwhile, optimize `lex.c'.
+
+ * Consider redesigning `lex.c' to not need any feedback during
+ tokenization, by keeping track of enough parse state on its own.
+
+\1f
+File: g77.info, Node: Better Optimization, Next: Simplify Porting, Prev: Efficiency, Up: Projects
+
+Better Optimization
+===================
+
+ Much of this work should be put off until after `g77' has all the
+features necessary for its widespread acceptance as a useful F77
+compiler. However, perhaps this work can be done in parallel during
+the feature-adding work.
+
+ * Do the equivalent of the trick of putting `extern inline' in front
+ of every function definition in `libf2c' and #include'ing the
+ resulting file in `f2c'+`gcc'--that is, inline all
+ run-time-library functions that are at all worth inlining. (Some
+ of this has already been done, such as for integral
+ exponentiation.)
+
+ * When doing `CHAR_VAR = CHAR_FUNC(...)', and it's clear that types
+ line up and `CHAR_VAR' is addressable or not a `VAR_DECL', make
+ `CHAR_VAR', not a temporary, be the receiver for `CHAR_FUNC'.
+ (This is now done for `COMPLEX' variables.)
+
+ * Design and implement Fortran-specific optimizations that don't
+ really belong in the back end, or where the front end needs to
+ give the back end more info than it currently does.
+
+ * Design and implement a new run-time library interface, with the
+ code going into `libgcc' so no special linking is required to link
+ Fortran programs using standard language features. This library
+ would speed up lots of things, from I/O (using precompiled formats,
+ doing just one, or, at most, very few, calls for arrays or array
+ sections, and so on) to general computing (array/section
+ implementations of various intrinsics, implementation of commonly
+ performed loops that aren't likely to be optimally compiled
+ otherwise, etc.).
+
+ Among the important things the library would do are:
+
+ * Be a one-stop-shop-type library, hence shareable and usable
+ by all, in that what are now library-build-time options in
+ `libf2c' would be moved at least to the `g77' compile phase,
+ if not to finer grains (such as choosing how list-directed
+ I/O formatting is done by default at `OPEN' time, for
+ preconnected units via options or even statements in the main
+ program unit, maybe even on a per-I/O basis with appropriate
+ pragma-like devices).
+
+ * Probably requiring the new library design, change interface to
+ normally have `COMPLEX' functions return their values in the way
+ `gcc' would if they were declared `__complex__ float', rather than
+ using the mechanism currently used by `CHARACTER' functions
+ (whereby the functions are compiled as returning void and their
+ first arg is a pointer to where to store the result). (Don't
+ append underscores to external names for `COMPLEX' functions in
+ some cases once `g77' uses `gcc' rather than `f2c' calling
+ conventions.)
+
+ * Do something useful with `doiter' references where possible. For
+ example, `CALL FOO(I)' cannot modify `I' if within a `DO' loop
+ that uses `I' as the iteration variable, and the back end might
+ find that info useful in determining whether it needs to read `I'
+ back into a register after the call. (It normally has to do that,
+ unless it knows `FOO' never modifies its passed-by-reference
+ argument, which is rarely the case for Fortran-77 code.)
+
+\1f
+File: g77.info, Node: Simplify Porting, Next: More Extensions, Prev: Better Optimization, Up: Projects
+
+Simplify Porting
+================
+
+ Making `g77' easier to configure, port, build, and install, either
+as a single-system compiler or as a cross-compiler, would be very
+useful.
+
+ * A new library (replacing `libf2c') should improve portability as
+ well as produce more optimal code. Further, `g77' and the new
+ library should conspire to simplify naming of externals, such as
+ by removing unnecessarily added underscores, and to
+ reduce/eliminate the possibility of naming conflicts, while making
+ debugger more straightforward.
+
+ Also, it should make multi-language applications more feasible,
+ such as by providing Fortran intrinsics that get Fortran unit
+ numbers given C `FILE *' descriptors.
+
+ * Possibly related to a new library, `g77' should produce the
+ equivalent of a `gcc' `main(argc, argv)' function when it compiles
+ a main program unit, instead of compiling something that must be
+ called by a library implementation of `main()'.
+
+ This would do many useful things such as provide more flexibility
+ in terms of setting up exception handling, not requiring
+ programmers to start their debugging sessions with `breakpoint
+ MAIN__' followed by `run', and so on.
+
+ * The GBE needs to understand the difference between alignment
+ requirements and desires. For example, on Intel x86 machines,
+ `g77' currently imposes overly strict alignment requirements, due
+ to the back end, but it would be useful for Fortran and C
+ programmers to be able to override these *recommendations* as long
+ as they don't violate the actual processor *requirements*.
+
+\1f
+File: g77.info, Node: More Extensions, Next: Machine Model, Prev: Simplify Porting, Up: Projects
+
+More Extensions
+===============
+
+ These extensions are not the sort of things users ask for "by name",
+but they might improve the usability of `g77', and Fortran in general,
+in the long run. Some of these items really pertain to improving `g77'
+internals so that some popular extensions can be more easily supported.
+
+ * Look through all the documentation on the GNU Fortran language,
+ dialects, compiler, missing features, bugs, and so on. Many
+ mentions of incomplete or missing features are sprinkled
+ throughout. It is not worth repeating them here.
+
+ * Support arbitrary operands for concatenation, even in contexts
+ where run-time allocation is required.
+
+ * Consider adding a `NUMERIC' type to designate typeless numeric
+ constants, named and unnamed. The idea is to provide a
+ forward-looking, effective replacement for things like the
+ old-style `PARAMETER' statement when people really need
+ typelessness in a maintainable, portable, clearly documented way.
+ Maybe `TYPELESS' would include `CHARACTER', `POINTER', and
+ whatever else might come along. (This is not really a call for
+ polymorphism per se, just an ability to express limited, syntactic
+ polymorphism.)
+
+ * Support `OPEN(...,KEY=(...),...)'.
+
+ * Support arbitrary file unit numbers, instead of limiting them to 0
+ through `MXUNIT-1'. (This is a `libf2c' issue.)
+
+ * `OPEN(NOSPANBLOCKS,...)' is treated as
+ `OPEN(UNIT=NOSPANBLOCKS,...)', so a later `UNIT=' in the first
+ example is invalid. Make sure this is what users of this feature
+ would expect.
+
+ * Currently `g77' disallows `READ(1'10)' since it is an obnoxious
+ syntax, but supporting it might be pretty easy if needed. More
+ details are needed, such as whether general expressions separated
+ by an apostrophe are supported, or maybe the record number can be
+ a general expression, and so on.
+
+ * Support `STRUCTURE', `UNION', `MAP', and `RECORD' fully.
+ Currently there is no support at all for `%FILL' in `STRUCTURE'
+ and related syntax, whereas the rest of the stuff has at least
+ some parsing support. This requires either major changes to
+ `libf2c' or its replacement.
+
+ * F90 and `g77' probably disagree about label scoping relative to
+ `INTERFACE' and `END INTERFACE', and their contained procedure
+ interface bodies (blocks?).
+
+ * `ENTRY' doesn't support F90 `RESULT()' yet, since that was added
+ after S8.112.
+
+ * Empty-statement handling (10 ;;CONTINUE;;) probably isn't
+ consistent with the final form of the standard (it was vague at
+ S8.112).
+
+ * It seems to be an "open" question whether a file, immediately
+ after being `OPEN'ed,is positioned at the beginning, the end, or
+ wherever--it might be nice to offer an option of opening to
+ "undefined" status, requiring an explicit absolute-positioning
+ operation to be performed before any other (besides `CLOSE') to
+ assist in making applications port to systems (some IBM?) that
+ `OPEN' to the end of a file or some such thing.
+
+\1f
+File: g77.info, Node: Machine Model, Next: Internals Documentation, Prev: More Extensions, Up: Projects
+
+Machine Model
+=============
+
+ This items pertain to generalizing `g77''s view of the machine model
+to more fully accept whatever the GBE provides it via its configuration.
+
+ * Switch to using `REAL_VALUE_TYPE' to represent floating-point
+ constants exclusively so the target float format need not be
+ required. This means changing the way `g77' handles
+ initialization of aggregate areas having more than one type, such
+ as `REAL' and `INTEGER', because currently it initializes them as
+ if they were arrays of `char' and uses the bit patterns of the
+ constants of the various types in them to determine what to stuff
+ in elements of the arrays.
+
+ * Rely more and more on back-end info and capabilities, especially
+ in the area of constants (where having the `g77' front-end's IL
+ just store the appropriate tree nodes containing constants might
+ be best).
+
+ * Suite of C and Fortran programs that a user/administrator can run
+ on a machine to help determine the configuration for `g77' before
+ building and help determine if the compiler works (especially with
+ whatever libraries are installed) after building.
+
+\1f
+File: g77.info, Node: Internals Documentation, Next: Internals Improvements, Prev: Machine Model, Up: Projects
+
+Internals Documentation
+=======================
+
+ Better info on how `g77' works and how to port it is needed. Much
+of this should be done only after the redesign planned for 0.6 is
+complete.
+
+\1f
+File: g77.info, Node: Internals Improvements, Next: Better Diagnostics, Prev: Internals Documentation, Up: Projects
+
+Internals Improvements
+======================
+
+ Some more items that would make `g77' more reliable and easier to
+maintain:
+
+ * Generally make expression handling focus more on critical syntax
+ stuff, leaving semantics to callers. For example, anything a
+ caller can check, semantically, let it do so, rather than having
+ `expr.c' do it. (Exceptions might include things like diagnosing
+ `FOO(I--K:)=BAR' where `FOO' is a `PARAMETER'--if it seems
+ important to preserve the left-to-right-in-source order of
+ production of diagnostics.)
+
+ * Come up with better naming conventions for `-D' to establish
+ requirements to achieve desired implementation dialect via
+ `proj.h'.
+
+ * Clean up used tokens and `ffewhere's in `ffeglobal_terminate_1'.
+
+ * Replace `sta.c' `outpooldisp' mechanism with `malloc_pool_use'.
+
+ * Check for `opANY' in more places in `com.c', `std.c', and `ste.c',
+ and get rid of the `opCONVERT(opANY)' kludge (after determining if
+ there is indeed no real need for it).
+
+ * Utility to read and check `bad.def' messages and their references
+ in the code, to make sure calls are consistent with message
+ templates.
+
+ * Search and fix `&ffe...' and similar so that `ffe...ptr...' macros
+ are available instead (a good argument for wishing this could have
+ written all this stuff in C++, perhaps). On the other hand, it's
+ questionable whether this sort of improvement is really necessary,
+ given the availability of tools such as Emacs and Perl, which make
+ finding any address-taking of structure members easy enough?
+
+ * Some modules truly export the member names of their structures
+ (and the structures themselves), maybe fix this, and fix other
+ modules that just appear to as well (by appending `_', though it'd
+ be ugly and probably not worth the time).
+
+ * Implement C macros `RETURNS(value)' and `SETS(something,value)' in
+ `proj.h' and use them throughout `g77' source code (especially in
+ the definitions of access macros in `.h' files) so they can be
+ tailored to catch code writing into a `RETURNS()' or reading from
+ a `SETS()'.
+
+ * Decorate throughout with `const' and other such stuff.
+
+ * All F90 notational derivations in the source code are still based
+ on the S8.112 version of the draft standard. Probably should
+ update to the official standard, or put documentation of the rules
+ as used in the code...uh...in the code.
+
+ * Some `ffebld_new' calls (those outside of `ffeexpr.c' or inside
+ but invoked via paths not involving `ffeexpr_lhs' or
+ `ffeexpr_rhs') might be creating things in improper pools, leading
+ to such things staying around too long or (doubtful, but possible
+ and dangerous) not long enough.
+
+ * Some `ffebld_list_new' (or whatever) calls might not be matched by
+ `ffebld_list_bottom' (or whatever) calls, which might someday
+ matter. (It definitely is not a problem just yet.)
+
+ * Probably not doing clean things when we fail to `EQUIVALENCE'
+ something due to alignment/mismatch or other problems--they end up
+ without `ffestorag' objects, so maybe the backend (and other parts
+ of the front end) can notice that and handle like an `opANY' (do
+ what it wants, just don't complain or crash). Most of this seems
+ to have been addressed by now, but a code review wouldn't hurt.
+
+\1f
+File: g77.info, Node: Better Diagnostics, Prev: Internals Improvements, Up: Projects
+
+Better Diagnostics
+==================
+
+ These are things users might not ask about, or that need to be
+looked into, before worrying about. Also here are items that involve
+reducing unnecessary diagnostic clutter.
+
+ * When `FUNCTION' and `ENTRY' point types disagree (`CHARACTER'
+ lengths, type classes, and so on), `ANY'-ize the offending `ENTRY'
+ point and any *new* dummies it specifies.
+
+ * Speed up and improve error handling for data when repeat-count is
+ specified. For example, don't output 20 unnecessary messages
+ after the first necessary one for:
+
+ INTEGER X(20)
+ CONTINUE
+ DATA (X(I), J= 1, 20) /20*5/
+ END
+
+ (The `CONTINUE' statement ensures the `DATA' statement is
+ processed in the context of executable, not specification,
+ statements.)
+
+\1f
+File: g77.info, Node: Diagnostics, Next: Index, Prev: Projects, Up: Top
+
+Diagnostics
+***********
+
+ Some diagnostics produced by `g77' require sufficient explanation
+that the explanations are given below, and the diagnostics themselves
+identify the appropriate explanation.
+
+ Identification uses the GNU Info format--specifically, the `info'
+command that displays the explanation is given in within square
+brackets in the diagnostic. For example:
+
+ foo.f:5: Invalid statement [info -f g77 M FOOEY]
+
+ More details about the above diagnostic is found in the `g77' Info
+documentation, menu item `M', submenu item `FOOEY', which is displayed
+by typing the UNIX command `info -f g77 M FOOEY'.
+
+ Other Info readers, such as EMACS, may be just as easily used to
+display the pertinent node. In the above example, `g77' is the Info
+document name, `M' is the top-level menu item to select, and, in that
+node (named `Diagnostics', the name of this chapter, which is the very
+text you're reading now), `FOOEY' is the menu item to select.
+
+* Menu:
+
+* CMPAMBIG:: Ambiguous use of intrinsic.
+* EXPIMP:: Intrinsic used explicitly and implicitly.
+* INTGLOB:: Intrinsic also used as name of global.
+* LEX:: Various lexer messages
+* GLOBALS:: Disagreements about globals.
+
+\1f
+File: g77.info, Node: CMPAMBIG, Next: EXPIMP, Up: Diagnostics
+
+`CMPAMBIG'
+==========
+
+ Ambiguous use of intrinsic INTRINSIC ...
+
+ The type of the argument to the invocation of the INTRINSIC
+intrinsic is a `COMPLEX' type other than `COMPLEX(KIND=1)'. Typically,
+it is `COMPLEX(KIND=2)', also known as `DOUBLE COMPLEX'.
+
+ The interpretation of this invocation depends on the particular
+dialect of Fortran for which the code was written. Some dialects
+convert the real part of the argument to `REAL(KIND=1)', thus losing
+precision; other dialects, and Fortran 90, do no such conversion.
+
+ So, GNU Fortran rejects such invocations except under certain
+circumstances, to avoid making an incorrect assumption that results in
+generating the wrong code.
+
+ To determine the dialect of the program unit, perhaps even whether
+that particular invocation is properly coded, determine how the result
+of the intrinsic is used.
+
+ The result of INTRINSIC is expected (by the original programmer) to
+be `REAL(KIND=1)' (the non-Fortran-90 interpretation) if:
+
+ * It is passed as an argument to a procedure that explicitly or
+ implicitly declares that argument `REAL(KIND=1)'.
+
+ For example, a procedure with no `DOUBLE PRECISION' or `IMPLICIT
+ DOUBLE PRECISION' statement specifying the dummy argument
+ corresponding to an actual argument of `REAL(Z)', where `Z' is
+ declared `DOUBLE COMPLEX', strongly suggests that the programmer
+ expected `REAL(Z)' to return `REAL(KIND=1)' instead of
+ `REAL(KIND=2)'.
+
+ * It is used in a context that would otherwise not include any
+ `REAL(KIND=2)' but where treating the INTRINSIC invocation as
+ `REAL(KIND=2)' would result in unnecessary promotions and
+ (typically) more expensive operations on the wider type.
+
+ For example:
+
+ DOUBLE COMPLEX Z
+ ...
+ R(1) = T * REAL(Z)
+
+ The above example suggests the programmer expected the real part
+ of `Z' to be converted to `REAL(KIND=1)' before being multiplied
+ by `T' (presumed, along with `R' above, to be type `REAL(KIND=1)').
+
+ Otherwise, the conversion would have to be delayed until after the
+ multiplication, requiring not only an extra conversion (of `T' to
+ `REAL(KIND=2)'), but a (typically) more expensive multiplication
+ (a double-precision multiplication instead of a single-precision
+ one).
+
+ The result of INTRINSIC is expected (by the original programmer) to
+be `REAL(KIND=2)' (the Fortran 90 interpretation) if:
+
+ * It is passed as an argument to a procedure that explicitly or
+ implicitly declares that argument `REAL(KIND=2)'.
+
+ For example, a procedure specifying a `DOUBLE PRECISION' dummy
+ argument corresponding to an actual argument of `REAL(Z)', where
+ `Z' is declared `DOUBLE COMPLEX', strongly suggests that the
+ programmer expected `REAL(Z)' to return `REAL(KIND=2)' instead of
+ `REAL(KIND=1)'.
+
+ * It is used in an expression context that includes other
+ `REAL(KIND=2)' operands, or is assigned to a `REAL(KIND=2)'
+ variable or array element.
+
+ For example:
+
+ DOUBLE COMPLEX Z
+ DOUBLE PRECISION R, T
+ ...
+ R(1) = T * REAL(Z)
+
+ The above example suggests the programmer expected the real part
+ of `Z' to *not* be converted to `REAL(KIND=1)' by the `REAL()'
+ intrinsic.
+
+ Otherwise, the conversion would have to be immediately followed by
+ a conversion back to `REAL(KIND=2)', losing the original, full
+ precision of the real part of `Z', before being multiplied by `T'.
+
+ Once you have determined whether a particular invocation of INTRINSIC
+expects the Fortran 90 interpretation, you can:
+
+ * Change it to `DBLE(EXPR)' (if INTRINSIC is `REAL') or
+ `DIMAG(EXPR)' (if INTRINSIC is `AIMAG') if it expected the Fortran
+ 90 interpretation.
+
+ This assumes EXPR is `COMPLEX(KIND=2)'--if it is some other type,
+ such as `COMPLEX*32', you should use the appropriate intrinsic,
+ such as the one to convert to `REAL*16' (perhaps `DBLEQ()' in
+ place of `DBLE()', and `QIMAG()' in place of `DIMAG()').
+
+ * Change it to `REAL(INTRINSIC(EXPR))', otherwise. This converts to
+ `REAL(KIND=1)' in all working Fortran compilers.
+
+ If you don't want to change the code, and you are certain that all
+ambiguous invocations of INTRINSIC in the source file have the same
+expectation regarding interpretation, you can:
+
+ * Compile with the `g77' option `-ff90', to enable the Fortran 90
+ interpretation.
+
+ * Compile with the `g77' options `-fno-f90 -fugly-complex', to
+ enable the non-Fortran-90 interpretations.
+
+ *Note REAL() and AIMAG() of Complex::, for more information on this
+issue.
+
+ Note: If the above suggestions don't produce enough evidence as to
+whether a particular program expects the Fortran 90 interpretation of
+this ambiguous invocation of INTRINSIC, there is one more thing you can
+try.
+
+ If you have access to most or all the compilers used on the program
+to create successfully tested and deployed executables, read the
+documentation for, and *also* test out, each compiler to determine how
+it treats the INTRINSIC intrinsic in this case. (If all the compilers
+don't agree on an interpretation, there might be lurking bugs in the
+deployed versions of the program.)
+
+ The following sample program might help:
+
+ PROGRAM JCB003
+ C
+ C Written by James Craig Burley 1997-02-23.
+ C Contact via Internet email: burley@gnu.ai.mit.edu
+ C
+ C Determine how compilers handle non-standard REAL
+ C and AIMAG on DOUBLE COMPLEX operands.
+ C
+ DOUBLE COMPLEX Z
+ REAL R
+ Z = (3.3D0, 4.4D0)
+ R = Z
+ CALL DUMDUM(Z, R)
+ R = REAL(Z) - R
+ IF (R .NE. 0.) PRINT *, 'REAL() is Fortran 90'
+ IF (R .EQ. 0.) PRINT *, 'REAL() is not Fortran 90'
+ R = 4.4D0
+ CALL DUMDUM(Z, R)
+ R = AIMAG(Z) - R
+ IF (R .NE. 0.) PRINT *, 'AIMAG() is Fortran 90'
+ IF (R .EQ. 0.) PRINT *, 'AIMAG() is not Fortran 90'
+ END
+ C
+ C Just to make sure compiler doesn't use naive flow
+ C analysis to optimize away careful work above,
+ C which might invalidate results....
+ C
+ SUBROUTINE DUMDUM(Z, R)
+ DOUBLE COMPLEX Z
+ REAL R
+ END
+
+ If the above program prints contradictory results on a particular
+compiler, run away!
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: EXPIMP, Next: INTGLOB, Prev: CMPAMBIG, Up: Diagnostics
+
+`EXPIMP'
+========
+
+ Intrinsic INTRINSIC referenced ...
+
+ The INTRINSIC is explicitly declared in one program unit in the
+source file and implicitly used as an intrinsic in another program unit
+in the same source file.
+
+ This diagnostic is designed to catch cases where a program might
+depend on using the name INTRINSIC as an intrinsic in one program unit
+and as a global name (such as the name of a subroutine or function) in
+another, but `g77' recognizes the name as an intrinsic in both cases.
+
+ After verifying that the program unit making implicit use of the
+intrinsic is indeed written expecting the intrinsic, add an `INTRINSIC
+INTRINSIC' statement to that program unit to prevent this warning.
+
+ This and related warnings are disabled by using the `-Wno-globals'
+option when compiling.
+
+ Note that this warning is not issued for standard intrinsics.
+Standard intrinsics include those described in the FORTRAN 77 standard
+and, if `-ff90' is specified, those described in the Fortran 90
+standard. Such intrinsics are not as likely to be confused with user
+procedures as intrinsics provided as extensions to the standard by
+`g77'.
+
+\1f
+File: g77.info, Node: INTGLOB, Next: LEX, Prev: EXPIMP, Up: Diagnostics
+
+`INTGLOB'
+=========
+
+ Same name `INTRINSIC' given ...
+
+ The name INTRINSIC is used for a global entity (a common block or a
+program unit) in one program unit and implicitly used as an intrinsic
+in another program unit.
+
+ This diagnostic is designed to catch cases where a program intends
+to use a name entirely as a global name, but `g77' recognizes the name
+as an intrinsic in the program unit that references the name, a
+situation that would likely produce incorrect code.
+
+ For example:
+
+ INTEGER FUNCTION TIME()
+ ...
+ END
+ ...
+ PROGRAM SAMP
+ INTEGER TIME
+ PRINT *, 'Time is ', TIME()
+ END
+
+ The above example defines a program unit named `TIME', but the
+reference to `TIME' in the main program unit `SAMP' is normally treated
+by `g77' as a reference to the intrinsic `TIME()' (unless a
+command-line option that prevents such treatment has been specified).
+
+ As a result, the program `SAMP' will *not* invoke the `TIME'
+function in the same source file.
+
+ Since `g77' recognizes `libU77' procedures as intrinsics, and since
+some existing code uses the same names for its own procedures as used
+by some `libU77' procedures, this situation is expected to arise often
+enough to make this sort of warning worth issuing.
+
+ After verifying that the program unit making implicit use of the
+intrinsic is indeed written expecting the intrinsic, add an `INTRINSIC
+INTRINSIC' statement to that program unit to prevent this warning.
+
+ Or, if you believe the program unit is designed to invoke the
+program-defined procedure instead of the intrinsic (as recognized by
+`g77'), add an `EXTERNAL INTRINSIC' statement to the program unit that
+references the name to prevent this warning.
+
+ This and related warnings are disabled by using the `-Wno-globals'
+option when compiling.
+
+ Note that this warning is not issued for standard intrinsics.
+Standard intrinsics include those described in the FORTRAN 77 standard
+and, if `-ff90' is specified, those described in the Fortran 90
+standard. Such intrinsics are not as likely to be confused with user
+procedures as intrinsics provided as extensions to the standard by
+`g77'.
+
+\1f
+File: g77.info, Node: LEX, Next: GLOBALS, Prev: INTGLOB, Up: Diagnostics
+
+`LEX'
+=====
+
+ Unrecognized character ...
+ Invalid first character ...
+ Line too long ...
+ Non-numeric character ...
+ Continuation indicator ...
+ Label at ... invalid with continuation line indicator ...
+ Character constant ...
+ Continuation line ...
+ Statement at ... begins with invalid token
+
+ Although the diagnostics identify specific problems, they can be
+produced when general problems such as the following occur:
+
+ * The source file contains something other than Fortran code.
+
+ If the code in the file does not look like many of the examples
+ elsewhere in this document, it might not be Fortran code. (Note
+ that Fortran code often is written in lower case letters, while
+ the examples in this document use upper case letters, for
+ stylistic reasons.)
+
+ For example, if the file contains lots of strange-looking
+ characters, it might be APL source code; if it contains lots of
+ parentheses, it might be Lisp source code; if it contains lots of
+ bugs, it might be C++ source code.
+
+ * The source file contains free-form Fortran code, but `-ffree-form'
+ was not specified on the command line to compile it.
+
+ Free form is a newer form for Fortran code. The older, classic
+ form is called fixed form.
+
+ Fixed-form code is visually fairly distinctive, because numerical
+ labels and comments are all that appear in the first five columns
+ of a line, the sixth column is reserved to denote continuation
+ lines, and actual statements start at or beyond column 7. Spaces
+ generally are not significant, so if you see statements such as
+ `REALX,Y' and `DO10I=1,100', you are looking at fixed-form code.
+ Comment lines are indicated by the letter `C' or the symbol `*' in
+ column 1. (Some code uses `!' or `/*' to begin in-line comments,
+ which many compilers support.)
+
+ Free-form code is distinguished from fixed-form source primarily
+ by the fact that statements may start anywhere. (If lots of
+ statements start in columns 1 through 6, that's a strong indicator
+ of free-form source.) Consecutive keywords must be separated by
+ spaces, so `REALX,Y' is not valid, while `REAL X,Y' is. There are
+ no comment lines per se, but `!' starts a comment anywhere in a
+ line (other than within a character or hollerith constant).
+
+ *Note Source Form::, for more information.
+
+ * The source file is in fixed form and has been edited without
+ sensitivity to the column requirements.
+
+ Statements in fixed-form code must be entirely contained within
+ columns 7 through 72 on a given line. Starting them "early" is
+ more likely to result in diagnostics than finishing them "late",
+ though both kinds of errors are often caught at compile time.
+
+ For example, if the following code fragment is edited by following
+ the commented instructions literally, the result, shown afterward,
+ would produce a diagnostic when compiled:
+
+ C On XYZZY systems, remove "C" on next line:
+ C CALL XYZZY_RESET
+
+ The result of editing the above line might be:
+
+ C On XYZZY systems, remove "C" on next line:
+ CALL XYZZY_RESET
+
+ However, that leaves the first `C' in the `CALL' statement in
+ column 6, making it a comment line, which is not really what the
+ author intended, and which is likely to result in one of the
+ above-listed diagnostics.
+
+ *Replacing* the `C' in column 1 with a space is the proper change
+ to make, to ensure the `CALL' keyword starts in or after column 7.
+
+ Another common mistake like this is to forget that fixed-form
+ source lines are significant through only column 72, and that,
+ normally, any text beyond column 72 is ignored or is diagnosed at
+ compile time.
+
+ *Note Source Form::, for more information.
+
+ * The source file requires preprocessing, and the preprocessing is
+ not being specified at compile time.
+
+ A source file containing lines beginning with `#define',
+ `#include', `#if', and so on is likely one that requires
+ preprocessing.
+
+ If the file's suffix is `.f' or `.for', the file will normally be
+ compiled *without* preprocessing by `g77'.
+
+ Change the file's suffix from `.f' to `.F' (or, on systems with
+ case-insensitive file names, to `.fpp') or from `.for' to `.fpp'.
+ `g77' compiles files with such names *with* preprocessing.
+
+ Or, learn how to use `gcc''s `-x' option to specify the language
+ `f77-cpp-input' for Fortran files that require preprocessing.
+ *Note gcc: (Using and Porting GNU CC)Overall Options.
+
+ * The source file is preprocessed, and the results of preprocessing
+ result in syntactic errors that are not necessarily obvious to
+ someone examining the source file itself.
+
+ Examples of errors resulting from preprocessor macro expansion
+ include exceeding the line-length limit, improperly starting,
+ terminating, or incorporating the apostrophe or double-quote in a
+ character constant, improperly forming a hollerith constant, and
+ so on.
+
+ *Note Options Controlling the Kind of Output: Overall Options, for
+ suggestions about how to use, and not use, preprocessing for
+ Fortran code.
+
+\1f
+File: g77.info, Node: GLOBALS, Prev: LEX, Up: Diagnostics
+
+`GLOBALS'
+=========
+
+ Global name NAME defined at ... already defined...
+ Global name NAME at ... has different type...
+ Too many arguments passed to NAME at ...
+ Too few arguments passed to NAME at ...
+ Argument #N of NAME is ...
+
+ These messages all identify disagreements about the global procedure
+named NAME among different program units (usually including NAME
+itself).
+
+ These disagreements, if not diagnosed, could result in a compiler
+crash if the compiler attempted to inline a reference to NAME within a
+calling program unit that disagreed with the NAME program unit
+regarding whether the procedure is a subroutine or function, the type
+of the return value of the procedure (if it is a function), the number
+of arguments the procedure accepts, or the type of each argument.
+
+ Such disagreements *should* be fixed in the Fortran code itself.
+However, if that is not immediately practical, and the code has been
+working for some time, it is possible it will work when compiled by
+`g77' with the `-fno-globals' option.
+
+ The `-fno-globals' option disables these diagnostics, and also
+disables all inlining of references to global procedures to avoid
+compiler crashes. The diagnostics are actually produced, but as
+warnings, unless the `-Wno-globals' option also is specified.
+
+ After using `-fno-globals' to work around these problems, it is wise
+to stop using that option and address them by fixing the Fortran code,
+because such problems, while they might not actually result in bugs on
+some systems, indicate that the code is not as portable as it could be.
+In particular, the code might appear to work on a particular system,
+but have bugs that affect the reliability of the data without
+exhibiting any other outward manifestations of the bugs.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Overall Options, Next: Shorthand Options, Prev: Option Summary, Up: Invoking G77
+
+Options Controlling the Kind of Output
+======================================
+
+ Compilation can involve as many as four stages: preprocessing, code
+generation (often what is really meant by the term "compilation"),
+assembly, and linking, always in that order. The first three stages
+apply to an individual source file, and end by producing an object
+file; linking combines all the object files (those newly compiled, and
+those specified as input) into an executable file.
+
+ For any given input file, the file name suffix determines what kind
+of program is contained in the file--that is, the language in which the
+program is written is generally indicated by the suffix. Suffixes
+specific to GNU Fortran are listed below. *Note gcc: (Using and
+Porting GNU CC)Overall Options, for information on suffixes recognized
+by GNU CC.
+
+`FILE.f'
+
+`FILE.for'
+ Fortran source code that should not be preprocessed.
+
+ Such source code cannot contain any preprocessor directives, such
+ as `#include', `#define', `#if', and so on.
+
+`FILE.F'
+
+`FILE.fpp'
+ Fortran source code that must be preprocessed (by the C
+ preprocessor `cpp', which is part of GNU CC).
+
+ Note that preprocessing is not extended to the contents of files
+ included by the `INCLUDE' directive--the `#include' preprocessor
+ directive must be used instead.
+
+`FILE.r'
+ Ratfor source code, which must be preprocessed by the `ratfor'
+ command, which is available separately (as it is not yet part of
+ the GNU Fortran distribution).
+
+ UNIX users typically use the `FILE.f' and `FILE.F' nomenclature.
+Users of other operating systems, especially those that cannot
+distinguish upper-case letters from lower-case letters in their file
+names, typically use the `FILE.for' and `FILE.fpp' nomenclature.
+
+ Use of the preprocessor `cpp' allows use of C-like constructs such
+as `#define' and `#include', but can lead to unexpected, even mistaken,
+results due to Fortran's source file format. It is recommended that
+use of the C preprocessor be limited to `#include' and, in conjunction
+with `#define', only `#if' and related directives, thus avoiding
+in-line macro expansion entirely. This recommendation applies
+especially when using the traditional fixed source form. With free
+source form, fewer unexpected transformations are likely to happen, but
+use of constructs such as Hollerith and character constants can
+nevertheless present problems, especially when these are continued
+across multiple source lines. These problems result, primarily, from
+differences between the way such constants are interpreted by the C
+preprocessor and by a Fortran compiler.
+
+ Another example of a problem that results from using the C
+preprocessor is that a Fortran comment line that happens to contain any
+characters "interesting" to the C preprocessor, such as a backslash at
+the end of the line, is not recognized by the preprocessor as a comment
+line, so instead of being passed through "raw", the line is edited
+according to the rules for the preprocessor. For example, the
+backslash at the end of the line is removed, along with the subsequent
+newline, resulting in the next line being effectively commented
+out--unfortunate if that line is a non-comment line of important code!
+
+ *Note:* The `-traditional' and `-undef' flags are supplied to `cpp'
+by default, to avoid unpleasant surprises. *Note Options Controlling
+the Preprocessor: (gcc)Preprocessor Options. This means that ANSI C
+preprocessor features (such as the `#' operator) aren't available, and
+only variables in the C reserved namespace (generally, names with a
+leading underscore) are liable to substitution by C predefines. Thus,
+if you want to do system-specific tests, use, for example, `#ifdef
+__linux__' rather than `#ifdef linux'. Use the `-v' option to see
+exactly how the preprocessor is invoked.
+
+ The following options that affect overall processing are recognized
+by the `g77' and `gcc' commands in a GNU Fortran installation:
+
+`--driver=COMMAND'
+ This works when invoking only the `g77' command, not when invoking
+ the `gcc' command. *Note GNU Fortran Command Options: Invoking
+ G77, for information on this option.
+
+`-fversion'
+ Ensure that the `g77'-specific version of the compiler phase is
+ reported, if run. (This is supplied automatically when `-v' or
+ `--verbose' is specified as a command-line option for `g77' or
+ `gcc' and when the resulting commands compile Fortran source
+ files.)
+
+`-fset-g77-defaults'
+ Set up whatever `gcc' options are to apply to Fortran
+ compilations, and avoid running internal consistency checks that
+ might take some time.
+
+ As of version 0.5.20, this is equivalent to `-fmove-all-movables
+ -freduce-all-givs -frerun-loop-opt -fargument-noalias-global'.
+
+ This option is supplied automatically when compiling Fortran code
+ via the `g77' or `gcc' command. The description of this option is
+ provided so that users seeing it in the output of, say, `g77 -v'
+ understand why it is there.
+
+ Also, developers who run `f771' directly might want to specify it
+ by hand to get the same defaults as they would running `f771' via
+ `g77' or `gcc'. However, such developers should, after linking a
+ new `f771' executable, invoke it without this option once, e.g.
+ via `./f771 -quiet < /dev/null', to ensure that they have not
+ introduced any internal inconsistencies (such as in the table of
+ intrinsics) before proceeding--`g77' will crash with a diagnostic
+ if it detects an inconsistency.
+
+`-fno-silent'
+ Print (to `stderr') the names of the program units as they are
+ compiled, in a form similar to that used by popular UNIX `f77'
+ implementations and `f2c'.
+
+ *Note Options Controlling the Kind of Output: (gcc)Overall Options,
+for information on more options that control the overall operation of
+the `gcc' command (and, by extension, the `g77' command).
+
+\1f
+File: g77.info, Node: Shorthand Options, Next: Fortran Dialect Options, Prev: Overall Options, Up: Invoking G77
+
+Shorthand Options
+=================
+
+ The following options serve as "shorthand" for other options
+accepted by the compiler:
+
+`-fugly'
+ Specify that certain "ugly" constructs are to be quietly accepted.
+ Same as:
+
+ -fugly-args -fugly-assign -fugly-assumed
+ -fugly-comma -fugly-complex -fugly-init
+ -fugly-logint
+
+ These constructs are considered inappropriate to use in new or
+ well-maintained portable Fortran code, but widely used in old code.
+ *Note Distensions::, for more information.
+
+ *Note:* The `-fugly' option is likely to be removed in a future
+ version. Implicitly enabling all the `-fugly-*' options is
+ unlikely to be feasible, or sensible, in the future, so users
+ should learn to specify only those `-fugly-*' options they really
+ need for a particular source file.
+
+`-fno-ugly'
+ Specify that all "ugly" constructs are to be noisily rejected.
+ Same as:
+
+ -fno-ugly-args -fno-ugly-assign -fno-ugly-assumed
+ -fno-ugly-comma -fno-ugly-complex -fno-ugly-init
+ -fno-ugly-logint
+
+ *Note Distensions::, for more information.
+
+`-ff66'
+ Specify that the program is written in idiomatic FORTRAN 66. Same
+ as `-fonetrip -fugly-assumed'.
+
+ The `-fno-f66' option is the inverse of `-ff66'. As such, it is
+ the same as `-fno-onetrip -fno-ugly-assumed'.
+
+ The meaning of this option is likely to be refined as future
+ versions of `g77' provide more compatibility with other existing
+ and obsolete Fortran implementations.
+
+`-ff77'
+ Specify that the program is written in idiomatic UNIX FORTRAN 77
+ and/or the dialect accepted by the `f2c' product. Same as
+ `-fbackslash -fno-typeless-boz'.
+
+ The meaning of this option is likely to be refined as future
+ versions of `g77' provide more compatibility with other existing
+ and obsolete Fortran implementations.
+
+`-fno-f77'
+ The `-fno-f77' option is *not* the inverse of `-ff77'. It
+ specifies that the program is not written in idiomatic UNIX
+ FORTRAN 77 or `f2c', but in a more widely portable dialect.
+ `-fno-f77' is the same as `-fno-backslash'.
+
+ The meaning of this option is likely to be refined as future
+ versions of `g77' provide more compatibility with other existing
+ and obsolete Fortran implementations.
+
+\1f
+File: g77.info, Node: Fortran Dialect Options, Next: Warning Options, Prev: Shorthand Options, Up: Invoking G77
+
+Options Controlling Fortran Dialect
+===================================
+
+ The following options control the dialect of Fortran that the
+compiler accepts:
+
+`-ffree-form'
+
+`-fno-fixed-form'
+ Specify that the source file is written in free form (introduced
+ in Fortran 90) instead of the more-traditional fixed form.
+
+`-ff90'
+ Allow certain Fortran-90 constructs.
+
+ This option controls whether certain Fortran 90 constructs are
+ recognized. (Other Fortran 90 constructs might or might not be
+ recognized depending on other options such as `-fvxt',
+ `-ff90-intrinsics-enable', and the current level of support for
+ Fortran 90.)
+
+ *Note Fortran 90::, for more information.
+
+`-fvxt'
+ Specify the treatment of certain constructs that have different
+ meanings depending on whether the code is written in GNU Fortran
+ (based on FORTRAN 77 and akin to Fortran 90) or VXT Fortran (more
+ like VAX FORTRAN).
+
+ The default is `-fno-vxt'. `-fvxt' specifies that the VXT Fortran
+ interpretations for those constructs are to be chosen.
+
+ *Note VXT Fortran::, for more information.
+
+`-fdollar-ok'
+ Allow `$' as a valid character in a symbol name.
+
+`-fno-backslash'
+ Specify that `\' is not to be specially interpreted in character
+ and Hollerith constants a la C and many UNIX Fortran compilers.
+
+ For example, with `-fbackslash' in effect, `A\nB' specifies three
+ characters, with the second one being newline. With
+ `-fno-backslash', it specifies four characters, `A', `\', `n', and
+ `B'.
+
+ Note that `g77' implements a fairly general form of backslash
+ processing that is incompatible with the narrower forms supported
+ by some other compilers. For example, `'A\003B'' is a
+ three-character string in `g77', whereas other compilers that
+ support backslash might not support the three-octal-digit form,
+ and thus treat that string as longer than three characters.
+
+ *Note Backslash in Constants::, for information on why
+ `-fbackslash' is the default instead of `-fno-backslash'.
+
+`-fno-ugly-args'
+ Disallow passing Hollerith and typeless constants as actual
+ arguments (for example, `CALL FOO(4HABCD)').
+
+ *Note Ugly Implicit Argument Conversion::, for more information.
+
+`-fugly-assign'
+ Use the same storage for a given variable regardless of whether it
+ is used to hold an assigned-statement label (as in `ASSIGN 10 TO
+ I') or used to hold numeric data (as in `I = 3').
+
+ *Note Ugly Assigned Labels::, for more information.
+
+`-fugly-assumed'
+ Assume any dummy array with a final dimension specified as `1' is
+ really an assumed-size array, as if `*' had been specified for the
+ final dimension instead of `1'.
+
+ For example, `DIMENSION X(1)' is treated as if it had read
+ `DIMENSION X(*)'.
+
+ *Note Ugly Assumed-Size Arrays::, for more information.
+
+`-fugly-comma'
+ Treat a trailing comma in an argument list as specification of a
+ trailing null argument, and treat an empty argument list as
+ specification of a single null argument.
+
+ For example, `CALL FOO(,)' is treated as `CALL FOO(%VAL(0),
+ %VAL(0))'. That is, *two* null arguments are specified by the
+ procedure call when `-fugly-comma' is in force. And `F = FUNC()'
+ is treated as `F = FUNC(%VAL(0))'.
+
+ The default behavior, `-fno-ugly-comma', is to ignore a single
+ trailing comma in an argument list.
+
+ *Note Ugly Null Arguments::, for more information.
+
+`-fugly-complex'
+ Do not complain about `REAL(EXPR)' or `AIMAG(EXPR)' when EXPR is a
+ `COMPLEX' type other than `COMPLEX(KIND=1)'--usually this is used
+ to permit `COMPLEX(KIND=2)' (`DOUBLE COMPLEX') operands.
+
+ The `-ff90' option controls the interpretation of this construct.
+
+ *Note Ugly Complex Part Extraction::, for more information.
+
+`-fno-ugly-init'
+ Disallow use of Hollerith and typeless constants as initial values
+ (in `PARAMETER' and `DATA' statements), and use of character
+ constants to initialize numeric types and vice versa.
+
+ For example, `DATA I/'F'/, CHRVAR/65/, J/4HABCD/' is disallowed by
+ `-fno-ugly-init'.
+
+ *Note Ugly Conversion of Initializers::, for more information.
+
+`-fugly-logint'
+ Treat `INTEGER' and `LOGICAL' variables and expressions as
+ potential stand-ins for each other.
+
+ For example, automatic conversion between `INTEGER' and `LOGICAL'
+ is enabled, for many contexts, via this option.
+
+ *Note Ugly Integer Conversions::, for more information.
+
+`-fonetrip'
+ Imperative executable `DO' loops are to be executed at least once
+ each time they are reached.
+
+ ANSI FORTRAN 77 and more recent versions of the Fortran standard
+ specify that the body of an imperative `DO' loop is not executed
+ if the number of iterations calculated from the parameters of the
+ loop is less than 1. (For example, `DO 10 I = 1, 0'.) Such a
+ loop is called a "zero-trip loop".
+
+ Prior to ANSI FORTRAN 77, many compilers implemented `DO' loops
+ such that the body of a loop would be executed at least once, even
+ if the iteration count was zero. Fortran code written assuming
+ this behavior is said to require "one-trip loops". For example,
+ some code written to the FORTRAN 66 standard expects this behavior
+ from its `DO' loops, although that standard did not specify this
+ behavior.
+
+ The `-fonetrip' option specifies that the source file(s) being
+ compiled require one-trip loops.
+
+ This option affects only those loops specified by the (imperative)
+ `DO' statement and by implied-`DO' lists in I/O statements. Loops
+ specified by implied-`DO' lists in `DATA' and specification
+ (non-executable) statements are not affected.
+
+`-ftypeless-boz'
+ Specifies that prefix-radix non-decimal constants, such as
+ `Z'ABCD'', are typeless instead of `INTEGER(KIND=1)'.
+
+ You can test for yourself whether a particular compiler treats the
+ prefix form as `INTEGER(KIND=1)' or typeless by running the
+ following program:
+
+ EQUIVALENCE (I, R)
+ R = Z'ABCD1234'
+ J = Z'ABCD1234'
+ IF (J .EQ. I) PRINT *, 'Prefix form is TYPELESS'
+ IF (J .NE. I) PRINT *, 'Prefix form is INTEGER'
+ END
+
+ Reports indicate that many compilers process this form as
+ `INTEGER(KIND=1)', though a few as typeless, and at least one
+ based on a command-line option specifying some kind of
+ compatibility.
+
+`-fintrin-case-initcap'
+
+`-fintrin-case-upper'
+
+`-fintrin-case-lower'
+
+`-fintrin-case-any'
+ Specify expected case for intrinsic names. `-fintrin-case-lower'
+ is the default.
+
+`-fmatch-case-initcap'
+
+`-fmatch-case-upper'
+
+`-fmatch-case-lower'
+
+`-fmatch-case-any'
+ Specify expected case for keywords. `-fmatch-case-lower' is the
+ default.
+
+`-fsource-case-upper'
+
+`-fsource-case-lower'
+
+`-fsource-case-preserve'
+ Specify whether source text other than character and Hollerith
+ constants is to be translated to uppercase, to lowercase, or
+ preserved as is. `-fsource-case-lower' is the default.
+
+`-fsymbol-case-initcap'
+
+`-fsymbol-case-upper'
+
+`-fsymbol-case-lower'
+
+`-fsymbol-case-any'
+ Specify valid cases for user-defined symbol names.
+ `-fsymbol-case-any' is the default.
+
+`-fcase-strict-upper'
+ Same as `-fintrin-case-upper -fmatch-case-upper
+ -fsource-case-preserve -fsymbol-case-upper'. (Requires all
+ pertinent source to be in uppercase.)
+
+`-fcase-strict-lower'
+ Same as `-fintrin-case-lower -fmatch-case-lower
+ -fsource-case-preserve -fsymbol-case-lower'. (Requires all
+ pertinent source to be in lowercase.)
+
+`-fcase-initcap'
+ Same as `-fintrin-case-initcap -fmatch-case-initcap
+ -fsource-case-preserve -fsymbol-case-initcap'. (Requires all
+ pertinent source to be in initial capitals, as in `Print
+ *,SqRt(Value)'.)
+
+`-fcase-upper'
+ Same as `-fintrin-case-any -fmatch-case-any -fsource-case-upper
+ -fsymbol-case-any'. (Maps all pertinent source to uppercase.)
+
+`-fcase-lower'
+ Same as `-fintrin-case-any -fmatch-case-any -fsource-case-lower
+ -fsymbol-case-any'. (Maps all pertinent source to lowercase.)
+
+`-fcase-preserve'
+ Same as `-fintrin-case-any -fmatch-case-any -fsource-case-preserve
+ -fsymbol-case-any'. (Preserves all case in user-defined symbols,
+ while allowing any-case matching of intrinsics and keywords. For
+ example, `call Foo(i,I)' would pass two *different* variables
+ named `i' and `I' to a procedure named `Foo'.)
+
+`-ff2c-intrinsics-delete'
+
+`-ff2c-intrinsics-hide'
+
+`-ff2c-intrinsics-disable'
+
+`-ff2c-intrinsics-enable'
+ Specify status of f2c-specific intrinsics.
+ `-ff2c-intrinsics-enable' is the default.
+
+`-ff90-intrinsics-delete'
+
+`-ff90-intrinsics-hide'
+
+`-ff90-intrinsics-disable'
+
+`-ff90-intrinsics-enable'
+ Specify status of F90-specific intrinsics.
+ `-ff90-intrinsics-enable' is the default.
+
+`-fgnu-intrinsics-delete'
+
+`-fgnu-intrinsics-hide'
+
+`-fgnu-intrinsics-disable'
+
+`-fgnu-intrinsics-enable'
+ Specify status of Digital's COMPLEX-related intrinsics.
+ `-fgnu-intrinsics-enable' is the default.
+
+`-fmil-intrinsics-delete'
+
+`-fmil-intrinsics-hide'
+
+`-fmil-intrinsics-disable'
+
+`-fmil-intrinsics-enable'
+ Specify status of MIL-STD-1753-specific intrinsics.
+ `-fmil-intrinsics-enable' is the default.
+
+`-funix-intrinsics-delete'
+
+`-funix-intrinsics-hide'
+
+`-funix-intrinsics-disable'
+
+`-funix-intrinsics-enable'
+ Specify status of UNIX intrinsics. `-funix-intrinsics-enable' is
+ the default.
+
+`-fvxt-intrinsics-delete'
+
+`-fvxt-intrinsics-hide'
+
+`-fvxt-intrinsics-disable'
+
+`-fvxt-intrinsics-enable'
+ Specify status of VXT intrinsics. `-fvxt-intrinsics-enable' is
+ the default.
+
+`-ffixed-line-length-N'
+ Set column after which characters are ignored in typical fixed-form
+ lines in the source file, and through which spaces are assumed (as
+ if padded to that length) after the ends of short fixed-form lines.
+
+ Popular values for N include 72 (the standard and the default), 80
+ (card image), and 132 (corresponds to "extended-source" options in
+ some popular compilers). N may be `none', meaning that the entire
+ line is meaningful and that continued character constants never
+ have implicit spaces appended to them to fill out the line.
+ `-ffixed-line-length-0' means the same thing as
+ `-ffixed-line-length-none'.
+
+ *Note Source Form::, for more information.
+
+\1f
+File: g77.info, Node: Warning Options, Next: Debugging Options, Prev: Fortran Dialect Options, Up: Invoking G77
+
+Options to Request or Suppress Warnings
+=======================================
+
+ Warnings are diagnostic messages that report constructions which are
+not inherently erroneous but which are risky or suggest there might
+have been an error.
+
+ You can request many specific warnings with options beginning `-W',
+for example `-Wimplicit' to request warnings on implicit declarations.
+Each of these specific warning options also has a negative form
+beginning `-Wno-' to turn off warnings; for example, `-Wno-implicit'.
+This manual lists only one of the two forms, whichever is not the
+default.
+
+ These options control the amount and kinds of warnings produced by
+GNU Fortran:
+
+`-fsyntax-only'
+ Check the code for syntax errors, but don't do anything beyond
+ that.
+
+`-pedantic'
+ Issue warnings for uses of extensions to ANSI FORTRAN 77.
+ `-pedantic' also applies to C-language constructs where they occur
+ in GNU Fortran source files, such as use of `\e' in a character
+ constant within a directive like `#include'.
+
+ Valid ANSI FORTRAN 77 programs should compile properly with or
+ without this option. However, without this option, certain GNU
+ extensions and traditional Fortran features are supported as well.
+ With this option, many of them are rejected.
+
+ Some users try to use `-pedantic' to check programs for strict ANSI
+ conformance. They soon find that it does not do quite what they
+ want--it finds some non-ANSI practices, but not all. However,
+ improvements to `g77' in this area are welcome.
+
+`-pedantic-errors'
+ Like `-pedantic', except that errors are produced rather than
+ warnings.
+
+`-fpedantic'
+ Like `-pedantic', but applies only to Fortran constructs.
+
+`-w'
+ Inhibit all warning messages.
+
+`-Wno-globals'
+ Inhibit warnings about use of a name as both a global name (a
+ subroutine, function, or block data program unit, or a common
+ block) and implicitly as the name of an intrinsic in a source file.
+
+ Also inhibit warnings about inconsistent invocations and/or
+ definitions of global procedures (function and subroutines). Such
+ inconsistencies include different numbers of arguments and
+ different types of arguments.
+
+`-Wimplicit'
+ Warn whenever a variable, array, or function is implicitly
+ declared. Has an effect similar to using the `IMPLICIT NONE'
+ statement in every program unit. (Some Fortran compilers provide
+ this feature by an option named `-u' or `/WARNINGS=DECLARATIONS'.)
+
+`-Wunused'
+ Warn whenever a variable is unused aside from its declaration.
+
+`-Wuninitialized'
+ Warn whenever an automatic variable is used without first being
+ initialized.
+
+ These warnings are possible only in optimizing compilation,
+ because they require data-flow information that is computed only
+ when optimizing. If you don't specify `-O', you simply won't get
+ these warnings.
+
+ These warnings occur only for variables that are candidates for
+ register allocation. Therefore, they do not occur for a variable
+ whose address is taken, or whose size is other than 1, 2, 4 or 8
+ bytes. Also, they do not occur for arrays, even when they are in
+ registers.
+
+ Note that there might be no warning about a variable that is used
+ only to compute a value that itself is never used, because such
+ computations may be deleted by data-flow analysis before the
+ warnings are printed.
+
+ These warnings are made optional because GNU Fortran is not smart
+ enough to see all the reasons why the code might be correct
+ despite appearing to have an error. Here is one example of how
+ this can happen:
+
+ SUBROUTINE DISPAT(J)
+ IF (J.EQ.1) I=1
+ IF (J.EQ.2) I=4
+ IF (J.EQ.3) I=5
+ CALL FOO(I)
+ END
+
+ If the value of `J' is always 1, 2 or 3, then `I' is always
+ initialized, but GNU Fortran doesn't know this. Here is another
+ common case:
+
+ SUBROUTINE MAYBE(FLAG)
+ LOGICAL FLAG
+ IF (FLAG) VALUE = 9.4
+ ...
+ IF (FLAG) PRINT *, VALUE
+ END
+
+ This has no bug because `VALUE' is used only if it is set.
+
+`-Wall'
+ The `-Wunused' and `-Wuninitialized' options combined. These are
+ all the options which pertain to usage that we recommend avoiding
+ and that we believe is easy to avoid. (As more warnings are added
+ to `g77', some might be added to the list enabled by `-Wall'.)
+
+ The remaining `-W...' options are not implied by `-Wall' because
+they warn about constructions that we consider reasonable to use, on
+occasion, in clean programs.
+
+`-Wsurprising'
+ Warn about "suspicious" constructs that are interpreted by the
+ compiler in a way that might well be surprising to someone reading
+ the code. These differences can result in subtle,
+ compiler-dependent (even machine-dependent) behavioral differences.
+ The constructs warned about include:
+
+ * Expressions having two arithmetic operators in a row, such as
+ `X*-Y'. Such a construct is nonstandard, and can produce
+ unexpected results in more complicated situations such as
+ `X**-Y*Z'. `g77', along with many other compilers, interprets
+ this example differently than many programmers, and a few
+ other compilers. Specifically, `g77' interprets `X**-Y*Z' as
+ `(X**(-Y))*Z', while others might think it should be
+ interpreted as `X**(-(Y*Z))'.
+
+ A revealing example is the constant expression `2**-2*1.',
+ which `g77' evaluates to .25, while others might evaluate it
+ to 0., the difference resulting from the way precedence
+ affects type promotion.
+
+ (The `-fpedantic' option also warns about expressions having
+ two arithmetic operators in a row.)
+
+ * Expressions with a unary minus followed by an operand and then
+ a binary operator other than plus or minus. For example,
+ `-2**2' produces a warning, because the precedence is
+ `-(2**2)', yielding -4, not `(-2)**2', which yields 4, and
+ which might represent what a programmer expects.
+
+ An example of an expression producing different results in a
+ surprising way is `-I*S', where I holds the value
+ `-2147483648' and S holds `0.5'. On many systems, negating I
+ results in the same value, not a positive number, because it
+ is already the lower bound of what an `INTEGER(KIND=1)'
+ variable can hold. So, the expression evaluates to a
+ positive number, while the "expected" interpretation,
+ `(-I)*S', would evaluate to a negative number.
+
+ Even cases such as `-I*J' produce warnings, even though, in
+ most configurations and situations, there is no computational
+ difference between the results of the two
+ interpretations--the purpose of this warning is to warn about
+ differing interpretations and encourage a better style of
+ coding, not to identify only those places where bugs might
+ exist in the user's code.
+
+ * `DO' loops with `DO' variables that are not of integral
+ type--that is, using `REAL' variables as loop control
+ variables. Although such loops can be written to work in the
+ "obvious" way, the way `g77' is required by the Fortran
+ standard to interpret such code is likely to be quite
+ different from the way many programmers expect. (This is
+ true of all `DO' loops, but the differences are pronounced
+ for non-integral loop control variables.)
+
+ *Note Loops::, for more information.
+
+`-Werror'
+ Make all warnings into errors.
+
+`-W'
+ Turns on "extra warnings" and, if optimization is specified via
+ `-O', the `-Wuninitialized' option. (This might change in future
+ versions of `g77'.)
+
+ "Extra warnings" are issued for:
+
+ * Unused parameters to a procedure (when `-Wunused' also is
+ specified).
+
+ * Overflows involving floating-point constants (not available
+ for certain configurations).
+
+ *Note Options to Request or Suppress Warnings: (gcc)Warning Options,
+for information on more options offered by the GBE shared by `g77',
+`gcc', and other GNU compilers.
+
+ Some of these have no effect when compiling programs written in
+Fortran:
+
+`-Wcomment'
+
+`-Wformat'
+
+`-Wparentheses'
+
+`-Wswitch'
+
+`-Wtraditional'
+
+`-Wshadow'
+
+`-Wid-clash-LEN'
+
+`-Wlarger-than-LEN'
+
+`-Wconversion'
+
+`-Waggregate-return'
+
+`-Wredundant-decls'
+ These options all could have some relevant meaning for GNU Fortran
+ programs, but are not yet supported.
+
+\1f
+File: g77.info, Node: Debugging Options, Next: Optimize Options, Prev: Warning Options, Up: Invoking G77
+
+Options for Debugging Your Program or GNU Fortran
+=================================================
+
+ GNU Fortran has various special options that are used for debugging
+either your program or `g77'.
+
+`-g'
+ Produce debugging information in the operating system's native
+ format (stabs, COFF, XCOFF, or DWARF). GDB can work with this
+ debugging information.
+
+ Support for this option in Fortran programs is incomplete. In
+ particular, names of variables and arrays in common blocks or that
+ are storage-associated via `EQUIVALENCE' are unavailable to the
+ debugger.
+
+ However, version 0.5.19 of `g77' does provide this information in
+ a rudimentary way, as controlled by the `-fdebug-kludge' option.
+
+ *Note Options for Code Generation Conventions: Code Gen Options,
+ for more information.
+
+ *Note Options for Debugging Your Program or GNU CC: (gcc)Debugging
+Options, for more information on debugging options.
+
+\1f
+File: g77.info, Node: Optimize Options, Next: Preprocessor Options, Prev: Debugging Options, Up: Invoking G77
+
+Options That Control Optimization
+=================================
+
+ Most Fortran users will want to use no optimization when developing
+and testing programs, and use `-O' or `-O2' when compiling programs for
+late-cycle testing and for production use.
+
+ The following flags have particular applicability when compiling
+Fortran programs:
+
+`-malign-double'
+ (Intel 386 architecture only.)
+
+ Noticeably improves performance of `g77' programs making heavy use
+ of `REAL(KIND=2)' (`DOUBLE PRECISION') data on some systems. In
+ particular, systems using Pentium, Pentium Pro, 586, and 686
+ implementations of the i386 architecture execute programs faster
+ when `REAL(KIND=2)' (`DOUBLE PRECISION') data are aligned on
+ 64-bit boundaries in memory.
+
+ This option can, at least, make benchmark results more consistent
+ across various system configurations, versions of the program, and
+ data sets.
+
+ *Note:* The warning in the `gcc' documentation about this option
+ does not apply, generally speaking, to Fortran code compiled by
+ `g77'.
+
+ *Also note:* `g77' fixes a `gcc' backend bug to allow
+ `-malign-double' to work generally, not just with
+ statically-allocated data.
+
+ *Also also note:* The negative form of `-malign-double' is
+ `-mno-align-double', not `-benign-double'.
+
+`-ffloat-store'
+ Might help a Fortran program that depends on exact IEEE conformance
+ on some machines, but might slow down a program that doesn't.
+
+`-fforce-mem'
+
+`-fforce-addr'
+ Might improve optimization of loops.
+
+`-fno-inline'
+ Don't compile statement functions inline. Might reduce the size
+ of a program unit--which might be at expense of some speed (though
+ it should compile faster). Note that if you are not optimizing,
+ no functions can be expanded inline.
+
+`-ffast-math'
+ Might allow some programs designed to not be too dependent on IEEE
+ behavior for floating-point to run faster, or die trying.
+
+`-fstrength-reduce'
+ Might make some loops run faster.
+
+`-frerun-cse-after-loop'
+
+`-fexpensive-optimizations'
+
+`-fdelayed-branch'
+
+`-fschedule-insns'
+
+`-fschedule-insns2'
+
+`-fcaller-saves'
+ Might improve performance on some code.
+
+`-funroll-loops'
+ Definitely improves performance on some code.
+
+`-funroll-all-loops'
+ Definitely improves performance on some code.
+
+`-fno-move-all-movables'
+
+`-fno-reduce-all-givs'
+
+`-fno-rerun-loop-opt'
+ Each of these might improve performance on some code.
+
+ Analysis of Fortran code optimization and the resulting
+ optimizations triggered by the above options were contributed by
+ Toon Moene (<toon@moene.indiv.nluug.nl>).
+
+ These three options are intended to be removed someday, once they
+ have helped determine the efficacy of various approaches to
+ improving the performance of Fortran code.
+
+ Please let us know how use of these options affects the
+ performance of your production code. We're particularly
+ interested in code that runs faster when these options are
+ *disabled*, and in non-Fortran code that benefits when they are
+ *enabled* via the above `gcc' command-line options.
+
+ *Note Options That Control Optimization: (gcc)Optimize Options, for
+more information on options to optimize the generated machine code.
+
+\1f
+File: g77.info, Node: Preprocessor Options, Next: Directory Options, Prev: Optimize Options, Up: Invoking G77
+
+Options Controlling the Preprocessor
+====================================
+
+ These options control the C preprocessor, which is run on each C
+source file before actual compilation.
+
+ *Note Options Controlling the Preprocessor: (gcc)Preprocessor
+Options, for information on C preprocessor options.
+
+ Some of these options also affect how `g77' processes the `INCLUDE'
+directive. Since this directive is processed even when preprocessing
+is not requested, it is not described in this section. *Note Options
+for Directory Search: Directory Options, for information on how `g77'
+processes the `INCLUDE' directive.
+
+ However, the `INCLUDE' directive does not apply preprocessing to the
+contents of the included file itself.
+
+ Therefore, any file that contains preprocessor directives (such as
+`#include', `#define', and `#if') must be included via the `#include'
+directive, not via the `INCLUDE' directive. Therefore, any file
+containing preprocessor directives, if included, is necessarily
+included by a file that itself contains preprocessor directives.
+
+\1f
+File: g77.info, Node: Directory Options, Next: Code Gen Options, Prev: Preprocessor Options, Up: Invoking G77
+
+Options for Directory Search
+============================
+
+ These options affect how the `cpp' preprocessor searches for files
+specified via the `#include' directive. Therefore, when compiling
+Fortran programs, they are meaningful when the preproecssor is used.
+
+ Some of these options also affect how `g77' searches for files
+specified via the `INCLUDE' directive, although files included by that
+directive are not, themselves, preprocessed. These options are:
+
+`-I-'
+
+`-IDIR'
+ These affect interpretation of the `INCLUDE' directive (as well as
+ of the `#include' directive of the `cpp' preprocessor).
+
+ Note that `-IDIR' must be specified *without* any spaces between
+ `-I' and the directory name--that is, `-Ifoo/bar' is valid, but
+ `-I foo/bar' is rejected by the `g77' compiler (though the
+ preprocessor supports the latter form). Also note that the
+ general behavior of `-I' and `INCLUDE' is pretty much the same as
+ of `-I' with `#include' in the `cpp' preprocessor, with regard to
+ looking for `header.gcc' files and other such things.
+
+ *Note Options for Directory Search: (gcc)Directory Options, for
+ information on the `-I' option.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Index, Prev: Diagnostics, Up: Top
+
+Index
+*****
+
+* Menu:
+
+* #define: Overall Options.
+* #if: Overall Options.
+* #include: Overall Options.
+* #include directive: Bug Reporting.
+* $: Dollar Signs.
+* %DESCR() construct: %DESCR().
+* %LOC() construct: %LOC().
+* %REF() construct: %REF().
+* %VAL() construct: %VAL().
+* *N notation <1>: Compiler Types.
+* *N notation: Star Notation.
+* --driver option <1>: Invoking G77.
+* --driver option: G77 and GCC.
+* -falias-check option <1>: Aliasing Assumed To Work.
+* -falias-check option: Code Gen Options.
+* -fargument-alias option <1>: Aliasing Assumed To Work.
+* -fargument-alias option: Code Gen Options.
+* -fargument-noalias option <1>: Aliasing Assumed To Work.
+* -fargument-noalias option: Code Gen Options.
+* -fcaller-saves option: Optimize Options.
+* -fcase-initcap option: Fortran Dialect Options.
+* -fcase-lower option: Fortran Dialect Options.
+* -fcase-preserve option: Fortran Dialect Options.
+* -fcase-strict-lower option: Fortran Dialect Options.
+* -fcase-strict-upper option: Fortran Dialect Options.
+* -fcase-upper option: Fortran Dialect Options.
+* -fdebug-kludge option: Code Gen Options.
+* -fdelayed-branch option: Optimize Options.
+* -fdollar-ok option: Fortran Dialect Options.
+* -fexpensive-optimizations option: Optimize Options.
+* -ff2c-intrinsics-delete option: Fortran Dialect Options.
+* -ff2c-intrinsics-disable option: Fortran Dialect Options.
+* -ff2c-intrinsics-enable option: Fortran Dialect Options.
+* -ff2c-intrinsics-hide option: Fortran Dialect Options.
+* -ff2c-library option: Code Gen Options.
+* -ff66 option: Shorthand Options.
+* -ff77 option: Shorthand Options.
+* -ff90 option: Fortran Dialect Options.
+* -ff90-intrinsics-delete option: Fortran Dialect Options.
+* -ff90-intrinsics-disable option: Fortran Dialect Options.
+* -ff90-intrinsics-enable option: Fortran Dialect Options.
+* -ff90-intrinsics-hide option: Fortran Dialect Options.
+* -ffast-math option: Optimize Options.
+* -ffixed-line-length-N option: Fortran Dialect Options.
+* -ffloat-store option: Optimize Options.
+* -fforce-addr option: Optimize Options.
+* -fforce-mem option: Optimize Options.
+* -ffree-form option: Fortran Dialect Options.
+* -fgnu-intrinsics-delete option: Fortran Dialect Options.
+* -fgnu-intrinsics-disable option: Fortran Dialect Options.
+* -fgnu-intrinsics-enable option: Fortran Dialect Options.
+* -fgnu-intrinsics-hide option: Fortran Dialect Options.
+* -fGROUP-intrinsics-hide option: Overly Convenient Options.
+* -finit-local-zero option <1>: Overly Convenient Options.
+* -finit-local-zero option: Code Gen Options.
+* -fintrin-case-any option: Fortran Dialect Options.
+* -fintrin-case-initcap option: Fortran Dialect Options.
+* -fintrin-case-lower option: Fortran Dialect Options.
+* -fintrin-case-upper option: Fortran Dialect Options.
+* -fmatch-case-any option: Fortran Dialect Options.
+* -fmatch-case-initcap option: Fortran Dialect Options.
+* -fmatch-case-lower option: Fortran Dialect Options.
+* -fmatch-case-upper option: Fortran Dialect Options.
+* -fmil-intrinsics-delete option: Fortran Dialect Options.
+* -fmil-intrinsics-disable option: Fortran Dialect Options.
+* -fmil-intrinsics-enable option: Fortran Dialect Options.
+* -fmil-intrinsics-hide option: Fortran Dialect Options.
+* -fno-argument-noalias-global option <1>: Aliasing Assumed To Work.
+* -fno-argument-noalias-global option: Code Gen Options.
+* -fno-automatic option <1>: Overly Convenient Options.
+* -fno-automatic option: Code Gen Options.
+* -fno-backslash option: Fortran Dialect Options.
+* -fno-common option: Code Gen Options.
+* -fno-emulate-complex option: Code Gen Options.
+* -fno-f2c option <1>: Avoid f2c Compatibility.
+* -fno-f2c option: Code Gen Options.
+* -fno-f77 option: Shorthand Options.
+* -fno-fixed-form option: Fortran Dialect Options.
+* -fno-globals option: Code Gen Options.
+* -fno-ident option: Code Gen Options.
+* -fno-inline option: Optimize Options.
+* -fno-move-all-movables option: Optimize Options.
+* -fno-reduce-all-givs option: Optimize Options.
+* -fno-rerun-loop-opt option: Optimize Options.
+* -fno-second-underscore: f2c Skeletons and Prototypes.
+* -fno-second-underscore option <1>: Names.
+* -fno-second-underscore option: Code Gen Options.
+* -fno-silent option: Overall Options.
+* -fno-ugly option: Shorthand Options.
+* -fno-ugly-args option: Fortran Dialect Options.
+* -fno-ugly-init option: Fortran Dialect Options.
+* -fno-underscoring option <1>: Names.
+* -fno-underscoring option: Code Gen Options.
+* -fonetrip option: Fortran Dialect Options.
+* -fpack-struct option: Code Gen Options.
+* -fpcc-struct-return option: Code Gen Options.
+* -fpedantic option: Warning Options.
+* -fPIC option: Actual Bugs.
+* -freg-struct-return option: Code Gen Options.
+* -frerun-cse-after-loop option: Optimize Options.
+* -fschedule-insns option: Optimize Options.
+* -fschedule-insns2 option: Optimize Options.
+* -fset-g77-defaults option: Overall Options.
+* -fshort-double option: Code Gen Options.
+* -fsource-case-lower option: Fortran Dialect Options.
+* -fsource-case-preserve option: Fortran Dialect Options.
+* -fsource-case-upper option: Fortran Dialect Options.
+* -fstrength-reduce option: Optimize Options.
+* -fsymbol-case-any option: Fortran Dialect Options.
+* -fsymbol-case-initcap option: Fortran Dialect Options.
+* -fsymbol-case-lower option: Fortran Dialect Options.
+* -fsymbol-case-upper option: Fortran Dialect Options.
+* -fsyntax-only option: Warning Options.
+* -ftypeless-boz option: Fortran Dialect Options.
+* -fugly option <1>: Overly Convenient Options.
+* -fugly option: Shorthand Options.
+* -fugly-assign option: Fortran Dialect Options.
+* -fugly-assumed option: Fortran Dialect Options.
+* -fugly-comma option <1>: Actual Bugs.
+* -fugly-comma option: Fortran Dialect Options.
+* -fugly-complex option: Fortran Dialect Options.
+* -fugly-logint option: Fortran Dialect Options.
+* -funix-intrinsics-delete option: Fortran Dialect Options.
+* -funix-intrinsics-disable option: Fortran Dialect Options.
+* -funix-intrinsics-enable option: Fortran Dialect Options.
+* -funix-intrinsics-hide option: Fortran Dialect Options.
+* -funroll-all-loops option: Optimize Options.
+* -funroll-loops option: Optimize Options.
+* -fversion option: Overall Options.
+* -fvxt option: Fortran Dialect Options.
+* -fvxt-intrinsics-delete option: Fortran Dialect Options.
+* -fvxt-intrinsics-disable option: Fortran Dialect Options.
+* -fvxt-intrinsics-enable option: Fortran Dialect Options.
+* -fvxt-intrinsics-hide option: Fortran Dialect Options.
+* -fzeros option: Code Gen Options.
+* -g option: Debugging Options.
+* -I- option: Directory Options.
+* -i8: Increasing Precision/Range.
+* -Idir option: Directory Options.
+* -malign-double option <1>: Aligned Data.
+* -malign-double option: Optimize Options.
+* -Nl option: Compiler Limits.
+* -Nx option: Compiler Limits.
+* -O2: Actual Bugs.
+* -pedantic option: Warning Options.
+* -pedantic-errors option: Warning Options.
+* -r8: Increasing Precision/Range.
+* -u option: Warning Options.
+* -v option: G77 and GCC.
+* -W option: Warning Options.
+* -w option: Warning Options.
+* -Waggregate-return option: Warning Options.
+* -Wall option: Warning Options.
+* -Wcomment option: Warning Options.
+* -Wconversion option: Warning Options.
+* -Werror option: Warning Options.
+* -Wformat option: Warning Options.
+* -Wid-clash-LEN option: Warning Options.
+* -Wimplicit option: Warning Options.
+* -Wlarger-than-LEN option: Warning Options.
+* -Wno-globals option: Warning Options.
+* -Wparentheses option: Warning Options.
+* -Wredundant-decls option: Warning Options.
+* -Wshadow option: Warning Options.
+* -Wsurprising option: Warning Options.
+* -Wswitch option: Warning Options.
+* -Wtraditional option: Warning Options.
+* -Wuninitialized option: Warning Options.
+* -Wunused option: Warning Options.
+* .EQV., with integer operands: Equivalence Versus Equality.
+* .F filename suffix: Overall Options.
+* .fpp filename suffix: Overall Options.
+* .gdbinit: Main Program Unit.
+* .r filename suffix: Overall Options.
+* /WARNINGS=DECLARATIONS switch: Warning Options.
+* 586/686 CPUs: Use Submodel Options.
+* 64-bit systems: Alpha Problems Fixed.
+* _strtoul: Missing strtoul.
+* `infinite spaces' printed: Strange Behavior at Run Time.
+* Abort intrinsic: Abort Intrinsic.
+* Abs intrinsic: Abs Intrinsic.
+* ACCEPT statement: TYPE and ACCEPT I/O Statements.
+* Access intrinsic: Access Intrinsic.
+* AChar intrinsic: AChar Intrinsic.
+* ACos intrinsic: ACos Intrinsic.
+* ACosD intrinsic: ACosD Intrinsic.
+* adding options: Adding Options.
+* adjustable arrays: Adjustable Arrays.
+* AdjustL intrinsic: AdjustL Intrinsic.
+* AdjustR intrinsic: AdjustR Intrinsic.
+* aggregate initialization: Large Initialization.
+* AImag intrinsic: AImag Intrinsic.
+* AIMAG intrinsic: REAL() and AIMAG() of Complex.
+* AIMax0 intrinsic: AIMax0 Intrinsic.
+* AIMin0 intrinsic: AIMin0 Intrinsic.
+* AInt intrinsic: AInt Intrinsic.
+* AJMax0 intrinsic: AJMax0 Intrinsic.
+* AJMin0 intrinsic: AJMin0 Intrinsic.
+* Alarm intrinsic: Alarm Intrinsic.
+* aliasing: Aliasing Assumed To Work.
+* aligned data: Aligned Data.
+* aligned stack: Aligned Data.
+* All intrinsic: All Intrinsic.
+* all warnings: Warning Options.
+* Allocated intrinsic: Allocated Intrinsic.
+* ALog intrinsic: ALog Intrinsic.
+* ALog10 intrinsic: ALog10 Intrinsic.
+* Alpha: Actual Bugs.
+* Alpha, support <1>: Actual Bugs.
+* Alpha, support: Alpha Problems Fixed.
+* alternate entry points: Alternate Entry Points.
+* alternate returns: Alternate Returns.
+* ALWAYS_FLUSH <1>: Output Assumed To Flush.
+* ALWAYS_FLUSH: Always Flush Output.
+* AMax0 intrinsic: AMax0 Intrinsic.
+* AMax1 intrinsic: AMax1 Intrinsic.
+* AMin0 intrinsic: AMin0 Intrinsic.
+* AMin1 intrinsic: AMin1 Intrinsic.
+* AMod intrinsic: AMod Intrinsic.
+* ampersand continuation line: Ampersands.
+* AND intrinsic: Bit Operations on Floating-point Data.
+* And intrinsic: And Intrinsic.
+* ANInt intrinsic: ANInt Intrinsic.
+* ANSI FORTRAN 77 standard: Language.
+* ANSI FORTRAN 77 support: Standard Support.
+* anti-aliasing: Aliasing Assumed To Work.
+* Any intrinsic: Any Intrinsic.
+* arguments, null: Ugly Null Arguments.
+* arguments, omitting: Ugly Null Arguments.
+* arguments, unused <1>: Unused Arguments.
+* arguments, unused: Warning Options.
+* array bounds, adjustable: Array Bounds Expressions.
+* array elements, in adjustable array bounds: Array Bounds Expressions.
+* array ordering: Arrays.
+* arrays: Arrays.
+* arrays, adjustable: Adjustable Arrays.
+* arrays, assumed-size: Ugly Assumed-Size Arrays.
+* arrays, automatic <1>: Large Automatic Arrays.
+* arrays, automatic <2>: Stack Overflow.
+* arrays, automatic <3>: Overly Convenient Options.
+* arrays, automatic: Adjustable Arrays.
+* arrays, dimensioning: Adjustable Arrays.
+* as command: What is GNU Fortran?.
+* ASin intrinsic: ASin Intrinsic.
+* ASinD intrinsic: ASinD Intrinsic.
+* assembler: What is GNU Fortran?.
+* assembly code: What is GNU Fortran?.
+* assembly code, invalid: Bug Criteria.
+* ASSIGN statement <1>: Assigned Statement Labels.
+* ASSIGN statement: Ugly Assigned Labels.
+* assigned labels: Ugly Assigned Labels.
+* assigned statement labels: Assigned Statement Labels.
+* Associated intrinsic: Associated Intrinsic.
+* association, storage: Aliasing Assumed To Work.
+* assumed-size arrays: Ugly Assumed-Size Arrays.
+* ATan intrinsic: ATan Intrinsic.
+* ATan2 intrinsic: ATan2 Intrinsic.
+* ATan2D intrinsic: ATan2D Intrinsic.
+* ATanD intrinsic: ATanD Intrinsic.
+* automatic arrays <1>: Large Automatic Arrays.
+* automatic arrays <2>: Stack Overflow.
+* automatic arrays <3>: Overly Convenient Options.
+* automatic arrays: Adjustable Arrays.
+* back end, gcc: What is GNU Fortran?.
+* backslash <1>: Backslash in Constants.
+* backslash: Fortran Dialect Options.
+* backtrace for bug reports: Bug Reporting.
+* basic concepts: What is GNU Fortran?.
+* beginners: Getting Started.
+* BesJ0 intrinsic: BesJ0 Intrinsic.
+* BesJ1 intrinsic: BesJ1 Intrinsic.
+* BesJN intrinsic: BesJN Intrinsic.
+* BesY0 intrinsic: BesY0 Intrinsic.
+* BesY1 intrinsic: BesY1 Intrinsic.
+* BesYN intrinsic: BesYN Intrinsic.
+* binaries, distributing: Distributing Binaries.
+* bison: Missing bison?.
+* bit patterns: Floating-point Bit Patterns.
+* Bit_Size intrinsic: Bit_Size Intrinsic.
+* BITest intrinsic: BITest Intrinsic.
+* BJTest intrinsic: BJTest Intrinsic.
+* blanks (spaces) <1>: Lines.
+* blanks (spaces): Character Set.
+* block data: Multiple Definitions of External Names.
+* block data and libraries: Block Data and Libraries.
+* BLOCK DATA statement <1>: Multiple Definitions of External Names.
+* BLOCK DATA statement: Block Data and Libraries.
+* bootstrap build: Bootstrap Build.
+* BTest intrinsic: BTest Intrinsic.
+* bug criteria: Bug Criteria.
+* bug report mailing lists: Bug Lists.
+* bugs: Bugs.
+* bugs, finding: What is GNU Fortran?.
+* bugs, known: Trouble.
+* build, bootstrap: Bootstrap Build.
+* build, straight: Straight Build.
+* building g77: Building gcc.
+* building gcc <1>: Building gcc.
+* building gcc: Building GNU CC Necessary.
+* bus error <1>: Strange Behavior at Run Time.
+* bus error: NeXTStep Problems.
+* but-bugs: But-bugs.
+* C library: Strange Behavior at Run Time.
+* C preprocessor: Overall Options.
+* C routines calling Fortran: Debugging and Interfacing.
+* C++: C++ Considerations.
+* C++, linking with: Interoperating with C and C++.
+* C, linking with: Interoperating with C and C++.
+* CAbs intrinsic: CAbs Intrinsic.
+* calling C routines: Debugging and Interfacing.
+* card image: Fortran Dialect Options.
+* carriage returns: Carriage Returns.
+* case sensitivity: Case Sensitivity.
+* cc1 program: What is GNU Fortran?.
+* cc1plus program: What is GNU Fortran?.
+* CCos intrinsic: CCos Intrinsic.
+* CDAbs intrinsic: CDAbs Intrinsic.
+* CDCos intrinsic: CDCos Intrinsic.
+* CDExp intrinsic: CDExp Intrinsic.
+* CDLog intrinsic: CDLog Intrinsic.
+* CDSin intrinsic: CDSin Intrinsic.
+* CDSqRt intrinsic: CDSqRt Intrinsic.
+* Ceiling intrinsic: Ceiling Intrinsic.
+* CExp intrinsic: CExp Intrinsic.
+* cfortran.h: C Interfacing Tools.
+* changes, user-visible: Changes.
+* Char intrinsic: Char Intrinsic.
+* character constants <1>: Character and Hollerith Constants.
+* character constants <2>: Ugly Conversion of Initializers.
+* character constants <3>: Double Quote Meaning.
+* character constants: Fortran Dialect Options.
+* character set: Fortran Dialect Options.
+* CHARACTER*(*): More Extensions.
+* CHARACTER, null: Character Type.
+* characters: Character Set.
+* characters, comment: Exclamation Point.
+* characters, continuation: Exclamation Point.
+* ChDir intrinsic <1>: ChDir Intrinsic (function).
+* ChDir intrinsic: ChDir Intrinsic (subroutine).
+* ChMod intrinsic <1>: ChMod Intrinsic (function).
+* ChMod intrinsic: ChMod Intrinsic (subroutine).
+* CLog intrinsic: CLog Intrinsic.
+* CLOSE statement: OPEN CLOSE and INQUIRE Keywords.
+* Cmplx intrinsic: Cmplx Intrinsic.
+* CMPLX intrinsic: CMPLX() of DOUBLE PRECISION.
+* code generation conventions: Code Gen Options.
+* code generation, improving: Better Optimization.
+* code generator: What is GNU Fortran?.
+* code, assembly: What is GNU Fortran?.
+* code, displaying main source: Actual Bugs.
+* code, distributing: Distributing Binaries.
+* code, in-line: What is GNU Fortran?.
+* code, legacy: Collected Fortran Wisdom.
+* code, machine: What is GNU Fortran?.
+* code, modifying <1>: Unpacking.
+* code, modifying: Overall Options.
+* code, source <1>: Unpacking.
+* code, source <2>: Case Sensitivity.
+* code, source <3>: Source Form.
+* code, source <4>: Lines.
+* code, source: What is GNU Fortran?.
+* code, stack variables: Maximum Stackable Size.
+* code, user: Cannot Link Fortran Programs.
+* code, writing: Collected Fortran Wisdom.
+* column-major ordering: Arrays.
+* columns 73 through 80: Better Source Model.
+* command options: Invoking G77.
+* commands, as: What is GNU Fortran?.
+* commands, f77: Installing f77.
+* commands, g77 <1>: G77 and GCC.
+* commands, g77: What is GNU Fortran?.
+* commands, gcc <1>: G77 and GCC.
+* commands, gcc: What is GNU Fortran?.
+* commands, gdb: What is GNU Fortran?.
+* commands, ld: What is GNU Fortran?.
+* commas, trailing: Ugly Null Arguments.
+* comment character: Exclamation Point.
+* comments, trailing: Statements Comments Lines.
+* common blocks <1>: Mangling of Names.
+* common blocks <2>: Actual Bugs.
+* common blocks <3>: Common Blocks.
+* common blocks: Debugging Options.
+* common blocks, large: Large Common Blocks.
+* COMMON statement <1>: Multiple Definitions of External Names.
+* COMMON statement: Common Blocks.
+* COMMON, layout: Aligned Data.
+* comparing logical expressions: Equivalence Versus Equality.
+* compatibility, f2c <1>: Avoid f2c Compatibility.
+* compatibility, f2c <2>: Block Data and Libraries.
+* compatibility, f2c <3>: Code Gen Options.
+* compatibility, f2c <4>: Shorthand Options.
+* compatibility, f2c: Overall Options.
+* compatibility, f77: Shorthand Options.
+* compatibility, FORTRAN 66 <1>: Fortran Dialect Options.
+* compatibility, FORTRAN 66: Shorthand Options.
+* compatibility, FORTRAN 77: Standard Support.
+* compatibility, Fortran 90: Fortran 90.
+* compilation status: Overall Options.
+* compilation, in-line: Optimize Options.
+* compilation, pedantic: Pedantic Compilation.
+* compiler bugs, reporting: Bug Reporting.
+* compiler limits: Compiler Limits.
+* compiler memory usage: Actual Bugs.
+* compiler speed: Actual Bugs.
+* compilers: What is GNU Fortran?.
+* compiling programs: G77 and GCC.
+* Complex intrinsic: Complex Intrinsic.
+* COMPLEX intrinsics: Fortran Dialect Options.
+* COMPLEX statement: Complex Variables.
+* COMPLEX support: Actual Bugs.
+* complex values: Ugly Complex Part Extraction.
+* complex variables: Complex Variables.
+* COMPLEX(KIND=1) type: Compiler Types.
+* COMPLEX(KIND=2) type: Compiler Types.
+* components of g77: What is GNU Fortran?.
+* concatenation: More Extensions.
+* concepts, basic: What is GNU Fortran?.
+* conformance, IEEE: Optimize Options.
+* Conjg intrinsic: Conjg Intrinsic.
+* constants <1>: Compiler Constants.
+* constants: Constants.
+* constants, character <1>: Character and Hollerith Constants.
+* constants, character <2>: Ugly Conversion of Initializers.
+* constants, character: Double Quote Meaning.
+* constants, context-sensitive: Context-Sensitive Constants.
+* constants, Hollerith <1>: Character and Hollerith Constants.
+* constants, Hollerith <2>: Ugly Conversion of Initializers.
+* constants, Hollerith: Ugly Implicit Argument Conversion.
+* constants, integer: Actual Bugs.
+* constants, octal: Double Quote Meaning.
+* constants, prefix-radix: Fortran Dialect Options.
+* constants, types: Fortran Dialect Options.
+* construct names: Construct Names.
+* context-sensitive constants: Context-Sensitive Constants.
+* context-sensitive intrinsics: Context-Sensitive Intrinsicness.
+* continuation character: Exclamation Point.
+* continuation line, ampersand: Ampersands.
+* continuation lines, number of: Continuation Line.
+* contributors: Contributors.
+* conversions, nonportable: Nonportable Conversions.
+* core dump: Bug Criteria.
+* Cos intrinsic: Cos Intrinsic.
+* CosD intrinsic: CosD Intrinsic.
+* CosH intrinsic: CosH Intrinsic.
+* Count intrinsic: Count Intrinsic.
+* cpp preprocessor: Overall Options.
+* cpp program <1>: Bug Reporting.
+* cpp program <2>: Preprocessor Options.
+* cpp program <3>: Overall Options.
+* cpp program: What is GNU Fortran?.
+* Cpu_Time intrinsic: Cpu_Time Intrinsic.
+* Cray pointers: POINTER Statements.
+* creating patch files: Merging Distributions.
+* credits: Contributors.
+* cross-compiler, building: Floating-point Bit Patterns.
+* cross-compiler, problems: Cross-compiler Problems.
+* CShift intrinsic: CShift Intrinsic.
+* CSin intrinsic: CSin Intrinsic.
+* CSqRt intrinsic: CSqRt Intrinsic.
+* CTime intrinsic <1>: CTime Intrinsic (function).
+* CTime intrinsic: CTime Intrinsic (subroutine).
+* DAbs intrinsic: DAbs Intrinsic.
+* DACos intrinsic: DACos Intrinsic.
+* DACosD intrinsic: DACosD Intrinsic.
+* DASin intrinsic: DASin Intrinsic.
+* DASinD intrinsic: DASinD Intrinsic.
+* DATA statement <1>: Actual Bugs.
+* DATA statement: Code Gen Options.
+* data types: Compiler Types.
+* data, aligned: Aligned Data.
+* data, overwritten: Strange Behavior at Run Time.
+* DATan intrinsic: DATan Intrinsic.
+* DATan2 intrinsic: DATan2 Intrinsic.
+* DATan2D intrinsic: DATan2D Intrinsic.
+* DATanD intrinsic: DATanD Intrinsic.
+* Date intrinsic: Date Intrinsic.
+* Date_and_Time intrinsic: Date_and_Time Intrinsic.
+* DbesJ0 intrinsic: DbesJ0 Intrinsic.
+* DbesJ1 intrinsic: DbesJ1 Intrinsic.
+* DbesJN intrinsic: DbesJN Intrinsic.
+* DbesY0 intrinsic: DbesY0 Intrinsic.
+* DbesY1 intrinsic: DbesY1 Intrinsic.
+* DbesYN intrinsic: DbesYN Intrinsic.
+* Dble intrinsic: Dble Intrinsic.
+* DbleQ intrinsic: DbleQ Intrinsic.
+* DCmplx intrinsic: DCmplx Intrinsic.
+* DConjg intrinsic: DConjg Intrinsic.
+* DCos intrinsic: DCos Intrinsic.
+* DCosD intrinsic: DCosD Intrinsic.
+* DCosH intrinsic: DCosH Intrinsic.
+* DDiM intrinsic: DDiM Intrinsic.
+* debug line: Debug Line.
+* debug_rtx: Bug Reporting.
+* debugger <1>: Actual Bugs.
+* debugger: What is GNU Fortran?.
+* debugging <1>: Actual Bugs.
+* debugging <2>: Names.
+* debugging <3>: Main Program Unit.
+* debugging: Debugging and Interfacing.
+* debugging information options: Debugging Options.
+* debugging main source code: Actual Bugs.
+* DECODE statement: ENCODE and DECODE.
+* deleted intrinsics: Intrinsic Groups.
+* DErF intrinsic: DErF Intrinsic.
+* DErFC intrinsic: DErFC Intrinsic.
+* DExp intrinsic: DExp Intrinsic.
+* DFloat intrinsic: DFloat Intrinsic.
+* DFlotI intrinsic: DFlotI Intrinsic.
+* DFlotJ intrinsic: DFlotJ Intrinsic.
+* diagnostics: Diagnostics.
+* diagnostics, incorrect: What is GNU Fortran?.
+* dialect options: Fortran Dialect Options.
+* differences between object files: Object File Differences.
+* Digital Fortran features: Fortran Dialect Options.
+* Digits intrinsic: Digits Intrinsic.
+* DiM intrinsic: DiM Intrinsic.
+* DImag intrinsic: DImag Intrinsic.
+* DIMENSION statement <1>: Array Bounds Expressions.
+* DIMENSION statement <2>: Adjustable Arrays.
+* DIMENSION statement: Arrays.
+* DIMENSION X(1): Ugly Assumed-Size Arrays.
+* dimensioning arrays: Adjustable Arrays.
+* DInt intrinsic: DInt Intrinsic.
+* direction of language development: Direction of Language Development.
+* directive, #include: Bug Reporting.
+* directive, INCLUDE <1>: Bug Reporting.
+* directive, INCLUDE <2>: Directory Options.
+* directive, INCLUDE: Preprocessor Options.
+* directory options: Directory Options.
+* directory search paths for inclusion: Directory Options.
+* directory, updating info: Updating Documentation.
+* disabled intrinsics: Intrinsic Groups.
+* disk full <1>: Output Assumed To Flush.
+* disk full: Always Flush Output.
+* displaying main source code: Actual Bugs.
+* disposition of files: OPEN CLOSE and INQUIRE Keywords.
+* distensions: Distensions.
+* distributions, unpacking: Unpacking.
+* distributions, why separate: Merging Distributions.
+* DLog intrinsic: DLog Intrinsic.
+* DLog10 intrinsic: DLog10 Intrinsic.
+* DMax1 intrinsic: DMax1 Intrinsic.
+* DMin1 intrinsic: DMin1 Intrinsic.
+* DMod intrinsic: DMod Intrinsic.
+* DNInt intrinsic: DNInt Intrinsic.
+* DNRM2: Actual Bugs.
+* DO loops, one-trip: Fortran Dialect Options.
+* DO statement <1>: Loops.
+* DO statement: Warning Options.
+* DO WHILE: DO WHILE.
+* documentation: Updating Documentation.
+* dollar sign <1>: Dollar Signs.
+* dollar sign: Fortran Dialect Options.
+* Dot_Product intrinsic: Dot_Product Intrinsic.
+* DOUBLE COMPLEX: DOUBLE COMPLEX.
+* DOUBLE COMPLEX type: Compiler Types.
+* DOUBLE PRECISION type: Compiler Types.
+* double quotes: Double Quote Meaning.
+* DProd intrinsic: DProd Intrinsic.
+* DReal intrinsic: DReal Intrinsic.
+* driver, gcc command as: What is GNU Fortran?.
+* DSign intrinsic: DSign Intrinsic.
+* DSin intrinsic: DSin Intrinsic.
+* DSinD intrinsic: DSinD Intrinsic.
+* DSinH intrinsic: DSinH Intrinsic.
+* DSqRt intrinsic: DSqRt Intrinsic.
+* DTan intrinsic: DTan Intrinsic.
+* DTanD intrinsic: DTanD Intrinsic.
+* DTanH intrinsic: DTanH Intrinsic.
+* Dtime intrinsic <1>: Dtime Intrinsic (function).
+* Dtime intrinsic: Dtime Intrinsic (subroutine).
+* dummies, unused: Warning Options.
+* effecting IMPLICIT NONE: Warning Options.
+* efficiency: Efficiency.
+* ELF support: Actual Bugs.
+* empty CHARACTER strings: Character Type.
+* enabled intrinsics: Intrinsic Groups.
+* ENCODE statement: ENCODE and DECODE.
+* END DO: END DO.
+* entry points: Alternate Entry Points.
+* ENTRY statement: Alternate Entry Points.
+* environment variables: Environment Variables.
+* EOShift intrinsic: EOShift Intrinsic.
+* Epsilon intrinsic: Epsilon Intrinsic.
+* equivalence areas <1>: Actual Bugs.
+* equivalence areas <2>: Local Equivalence Areas.
+* equivalence areas: Debugging Options.
+* EQUIVALENCE statement: Local Equivalence Areas.
+* ErF intrinsic: ErF Intrinsic.
+* ErFC intrinsic: ErFC Intrinsic.
+* error messages <1>: Warnings and Errors.
+* error messages: Run-time Library Errors.
+* error messages, incorrect: What is GNU Fortran?.
+* error values: Run-time Library Errors.
+* errors, linker: Large Common Blocks.
+* ETime intrinsic <1>: ETime Intrinsic (function).
+* ETime intrinsic: ETime Intrinsic (subroutine).
+* exceptions, floating point: Floating-point Exception Handling.
+* exclamation points: Exclamation Point.
+* executable file: What is GNU Fortran?.
+* Exit intrinsic: Exit Intrinsic.
+* Exp intrinsic: Exp Intrinsic.
+* Exponent intrinsic: Exponent Intrinsic.
+* extended-source option: Fortran Dialect Options.
+* extensions, file name: Overall Options.
+* extensions, more: More Extensions.
+* extensions, VXT: VXT Fortran.
+* external names: Mangling of Names.
+* extra warnings: Warning Options.
+* f2c: Increasing Precision/Range.
+* f2c compatibility <1>: Avoid f2c Compatibility.
+* f2c compatibility <2>: Block Data and Libraries.
+* f2c compatibility <3>: Debugging and Interfacing.
+* f2c compatibility <4>: Code Gen Options.
+* f2c compatibility <5>: Shorthand Options.
+* f2c compatibility: Overall Options.
+* f2c intrinsics: Fortran Dialect Options.
+* F2C_INSTALL_FLAG: Installing f2c.
+* F2CLIBOK: Installing f2c.
+* f77 command: Installing f77.
+* f77 compatibility: Shorthand Options.
+* f77 support: Backslash in Constants.
+* f771 program: What is GNU Fortran?.
+* f771, linking error for: Missing strtoul.
+* F77_INSTALL_FLAG: Installing f77.
+* fatal signal: Bug Criteria.
+* Fdate intrinsic <1>: Fdate Intrinsic (function).
+* Fdate intrinsic: Fdate Intrinsic (subroutine).
+* features, language: Direction of Language Development.
+* features, ugly <1>: Distensions.
+* features, ugly: Shorthand Options.
+* FFE: What is GNU Fortran?.
+* FFECOM_sizeMAXSTACKITEM: Maximum Stackable Size.
+* fflush() <1>: Output Assumed To Flush.
+* fflush(): Always Flush Output.
+* FGet intrinsic <1>: FGet Intrinsic (function).
+* FGet intrinsic: FGet Intrinsic (subroutine).
+* FGetC intrinsic <1>: FGetC Intrinsic (function).
+* FGetC intrinsic: FGetC Intrinsic (subroutine).
+* file format not recognized: What is GNU Fortran?.
+* file name extension: Overall Options.
+* file name suffix: Overall Options.
+* file type: Overall Options.
+* file, source: What is GNU Fortran?.
+* files, executable: What is GNU Fortran?.
+* files, source <1>: Source Form.
+* files, source: Lines.
+* fixed form <1>: Source Form.
+* fixed form <2>: Lines.
+* fixed form: Fortran Dialect Options.
+* fixed-form line length: Fortran Dialect Options.
+* Float intrinsic: Float Intrinsic.
+* FloatI intrinsic: FloatI Intrinsic.
+* floating point exceptions: Floating-point Exception Handling.
+* floating-point bit patterns: Floating-point Bit Patterns.
+* floating-point errors: Floating-point Errors.
+* FloatJ intrinsic: FloatJ Intrinsic.
+* Floor intrinsic: Floor Intrinsic.
+* Flush intrinsic: Flush Intrinsic.
+* flushing output <1>: Output Assumed To Flush.
+* flushing output: Always Flush Output.
+* FNum intrinsic: FNum Intrinsic.
+* FORMAT statement <1>: Q Edit Descriptor.
+* FORMAT statement: Expressions in FORMAT Statements.
+* FORTRAN 66 <1>: Fortran Dialect Options.
+* FORTRAN 66: Shorthand Options.
+* FORTRAN 77 compatibility: Standard Support.
+* Fortran 90 compatibility: Fortran 90.
+* Fortran 90 features: Fortran Dialect Options.
+* Fortran 90 intrinsics: Fortran Dialect Options.
+* Fortran 90 support: Fortran 90 Support.
+* Fortran preprocessor: Overall Options.
+* FPE handling: Floating-point Exception Handling.
+* FPut intrinsic <1>: FPut Intrinsic (function).
+* FPut intrinsic: FPut Intrinsic (subroutine).
+* FPutC intrinsic <1>: FPutC Intrinsic (function).
+* FPutC intrinsic: FPutC Intrinsic (subroutine).
+* Fraction intrinsic: Fraction Intrinsic.
+* free form <1>: Source Form.
+* free form <2>: Lines.
+* free form: Fortran Dialect Options.
+* front end, g77: What is GNU Fortran?.
+* FSeek intrinsic: FSeek Intrinsic.
+* FSF, funding the: Funding GNU Fortran.
+* FStat intrinsic <1>: FStat Intrinsic (function).
+* FStat intrinsic: FStat Intrinsic (subroutine).
+* FTell intrinsic <1>: FTell Intrinsic (function).
+* FTell intrinsic: FTell Intrinsic (subroutine).
+* function references, in adjustable array bounds: Array Bounds Expressions.
+* FUNCTION statement <1>: Functions.
+* FUNCTION statement: Procedures.
+* functions: Functions.
+* functions, mistyped: Not My Type.
+* funding improvements: Funding GNU Fortran.
+* funding the FSF: Funding GNU Fortran.
+* g77 command <1>: G77 and GCC.
+* g77 command: What is GNU Fortran?.
+* g77 front end: What is GNU Fortran?.
+* g77 options, --driver <1>: Invoking G77.
+* g77 options, --driver: G77 and GCC.
+* g77 options, -v: G77 and GCC.
+* g77 version number: Merging Distributions.
+* g77, components of: What is GNU Fortran?.
+* g77, installation of: Installation of Binaries.
+* GBE <1>: Patching GNU CC Necessary.
+* GBE: What is GNU Fortran?.
+* gcc back end: What is GNU Fortran?.
+* gcc command <1>: G77 and GCC.
+* gcc command: What is GNU Fortran?.
+* gcc command as driver: What is GNU Fortran?.
+* gcc not recognizing Fortran source: What is GNU Fortran?.
+* gcc version numbering: Merging Distributions.
+* gcc versions supported by g77: Merging Distributions.
+* gcc will not compile Fortran programs: Where to Install.
+* gcc, building: Building GNU CC Necessary.
+* gcc, installation of: Installation of Binaries.
+* gdb command: What is GNU Fortran?.
+* gdb support: Debugger Problems.
+* generic intrinsics: Generics and Specifics.
+* GError intrinsic: GError Intrinsic.
+* GetArg intrinsic: GetArg Intrinsic.
+* GETARG() intrinsic: Main Program Unit.
+* GetCWD intrinsic <1>: GetCWD Intrinsic (function).
+* GetCWD intrinsic: GetCWD Intrinsic (subroutine).
+* GetEnv intrinsic: GetEnv Intrinsic.
+* GetGId intrinsic: GetGId Intrinsic.
+* GetLog intrinsic: GetLog Intrinsic.
+* GetPId intrinsic: GetPId Intrinsic.
+* getting started: Getting Started.
+* GetUId intrinsic: GetUId Intrinsic.
+* global names, warning <1>: Code Gen Options.
+* global names, warning: Warning Options.
+* GMTime intrinsic: GMTime Intrinsic.
+* GNU Back End (GBE): What is GNU Fortran?.
+* GNU C required: GNU C Required.
+* GNU Fortran command options: Invoking G77.
+* GNU Fortran Front End (FFE): What is GNU Fortran?.
+* GNU version numbering: Merging Distributions.
+* GOTO statement: Assigned Statement Labels.
+* gperf: Missing gperf?.
+* groups of intrinsics: Intrinsic Groups.
+* hardware errors: Signal 11 and Friends.
+* hidden intrinsics: Intrinsic Groups.
+* Hollerith constants <1>: Character and Hollerith Constants.
+* Hollerith constants <2>: Ugly Conversion of Initializers.
+* Hollerith constants <3>: Ugly Implicit Argument Conversion.
+* Hollerith constants: Fortran Dialect Options.
+* HostNm intrinsic <1>: HostNm Intrinsic (function).
+* HostNm intrinsic: HostNm Intrinsic (subroutine).
+* Huge intrinsic: Huge Intrinsic.
+* I/O, errors: Run-time Library Errors.
+* I/O, flushing <1>: Output Assumed To Flush.
+* I/O, flushing: Always Flush Output.
+* IAbs intrinsic: IAbs Intrinsic.
+* IAChar intrinsic: IAChar Intrinsic.
+* IAnd intrinsic: IAnd Intrinsic.
+* IArgC intrinsic: IArgC Intrinsic.
+* IARGC() intrinsic: Main Program Unit.
+* IBClr intrinsic: IBClr Intrinsic.
+* IBits intrinsic: IBits Intrinsic.
+* IBSet intrinsic: IBSet Intrinsic.
+* IChar intrinsic: IChar Intrinsic.
+* IDate intrinsic <1>: IDate Intrinsic (VXT).
+* IDate intrinsic: IDate Intrinsic (UNIX).
+* IDiM intrinsic: IDiM Intrinsic.
+* IDInt intrinsic: IDInt Intrinsic.
+* IDNInt intrinsic: IDNInt Intrinsic.
+* IEEE conformance: Optimize Options.
+* IEOr intrinsic: IEOr Intrinsic.
+* IErrNo intrinsic: IErrNo Intrinsic.
+* IFix intrinsic: IFix Intrinsic.
+* IIAbs intrinsic: IIAbs Intrinsic.
+* IIAnd intrinsic: IIAnd Intrinsic.
+* IIBClr intrinsic: IIBClr Intrinsic.
+* IIBits intrinsic: IIBits Intrinsic.
+* IIBSet intrinsic: IIBSet Intrinsic.
+* IIDiM intrinsic: IIDiM Intrinsic.
+* IIDInt intrinsic: IIDInt Intrinsic.
+* IIDNnt intrinsic: IIDNnt Intrinsic.
+* IIEOr intrinsic: IIEOr Intrinsic.
+* IIFix intrinsic: IIFix Intrinsic.
+* IInt intrinsic: IInt Intrinsic.
+* IIOr intrinsic: IIOr Intrinsic.
+* IIQint intrinsic: IIQint Intrinsic.
+* IIQNnt intrinsic: IIQNnt Intrinsic.
+* IIShftC intrinsic: IIShftC Intrinsic.
+* IISign intrinsic: IISign Intrinsic.
+* illegal unit number <1>: Large File Unit Numbers.
+* illegal unit number: Larger File Unit Numbers.
+* Imag intrinsic: Imag Intrinsic.
+* imaginary part: Ugly Complex Part Extraction.
+* imaginary part of complex: Complex Variables.
+* ImagPart intrinsic: ImagPart Intrinsic.
+* IMax0 intrinsic: IMax0 Intrinsic.
+* IMax1 intrinsic: IMax1 Intrinsic.
+* IMin0 intrinsic: IMin0 Intrinsic.
+* IMin1 intrinsic: IMin1 Intrinsic.
+* IMod intrinsic: IMod Intrinsic.
+* IMPLICIT CHARACTER*(*) statement: Limitation on Implicit Declarations.
+* implicit declaration, warning: Warning Options.
+* IMPLICIT NONE, similar effect: Warning Options.
+* implicit typing: Not My Type.
+* improvements, funding: Funding GNU Fortran.
+* in-line code: What is GNU Fortran?.
+* in-line compilation: Optimize Options.
+* INCLUDE: INCLUDE.
+* INCLUDE directive <1>: Bug Reporting.
+* INCLUDE directive <2>: Directory Options.
+* INCLUDE directive: Preprocessor Options.
+* included files: Bug Reporting.
+* inclusion, directory search paths for: Directory Options.
+* inconsistent floating-point results: Floating-point Errors.
+* incorrect diagnostics: What is GNU Fortran?.
+* incorrect error messages: What is GNU Fortran?.
+* incorrect use of language: What is GNU Fortran?.
+* increasing maximum unit number <1>: Large File Unit Numbers.
+* increasing maximum unit number: Larger File Unit Numbers.
+* increasing precision: Increasing Precision/Range.
+* increasing range: Increasing Precision/Range.
+* Index intrinsic: Index Intrinsic.
+* info, updating directory: Updating Documentation.
+* INInt intrinsic: INInt Intrinsic.
+* initialization: Actual Bugs.
+* initialization of local variables: Code Gen Options.
+* initialization, runtime: Startup Code.
+* initialization, statement placement: Initializing Before Specifying.
+* INot intrinsic: INot Intrinsic.
+* INQUIRE statement: OPEN CLOSE and INQUIRE Keywords.
+* installation of binaries: Installation of Binaries.
+* installation problems: Problems Installing.
+* installation trouble: Trouble.
+* installing GNU Fortran: Installation.
+* installing, checking before: Pre-installation Checks.
+* Int intrinsic: Int Intrinsic.
+* Int2 intrinsic: Int2 Intrinsic.
+* Int8 intrinsic: Int8 Intrinsic.
+* integer constants: Actual Bugs.
+* INTEGER(KIND=1) type: Compiler Types.
+* INTEGER(KIND=2) type: Compiler Types.
+* INTEGER(KIND=3) type: Compiler Types.
+* INTEGER(KIND=6) type: Compiler Types.
+* INTEGER*2 support: Popular Non-standard Types.
+* interfacing: Debugging and Interfacing.
+* intrinsics, Abort: Abort Intrinsic.
+* intrinsics, Abs: Abs Intrinsic.
+* intrinsics, Access: Access Intrinsic.
+* intrinsics, AChar: AChar Intrinsic.
+* intrinsics, ACos: ACos Intrinsic.
+* intrinsics, ACosD: ACosD Intrinsic.
+* intrinsics, AdjustL: AdjustL Intrinsic.
+* intrinsics, AdjustR: AdjustR Intrinsic.
+* intrinsics, AImag: AImag Intrinsic.
+* intrinsics, AIMAG: REAL() and AIMAG() of Complex.
+* intrinsics, AIMax0: AIMax0 Intrinsic.
+* intrinsics, AIMin0: AIMin0 Intrinsic.
+* intrinsics, AInt: AInt Intrinsic.
+* intrinsics, AJMax0: AJMax0 Intrinsic.
+* intrinsics, AJMin0: AJMin0 Intrinsic.
+* intrinsics, Alarm: Alarm Intrinsic.
+* intrinsics, All: All Intrinsic.
+* intrinsics, Allocated: Allocated Intrinsic.
+* intrinsics, ALog: ALog Intrinsic.
+* intrinsics, ALog10: ALog10 Intrinsic.
+* intrinsics, AMax0: AMax0 Intrinsic.
+* intrinsics, AMax1: AMax1 Intrinsic.
+* intrinsics, AMin0: AMin0 Intrinsic.
+* intrinsics, AMin1: AMin1 Intrinsic.
+* intrinsics, AMod: AMod Intrinsic.
+* intrinsics, AND: Bit Operations on Floating-point Data.
+* intrinsics, And: And Intrinsic.
+* intrinsics, ANInt: ANInt Intrinsic.
+* intrinsics, Any: Any Intrinsic.
+* intrinsics, ASin: ASin Intrinsic.
+* intrinsics, ASinD: ASinD Intrinsic.
+* intrinsics, Associated: Associated Intrinsic.
+* intrinsics, ATan: ATan Intrinsic.
+* intrinsics, ATan2: ATan2 Intrinsic.
+* intrinsics, ATan2D: ATan2D Intrinsic.
+* intrinsics, ATanD: ATanD Intrinsic.
+* intrinsics, BesJ0: BesJ0 Intrinsic.
+* intrinsics, BesJ1: BesJ1 Intrinsic.
+* intrinsics, BesJN: BesJN Intrinsic.
+* intrinsics, BesY0: BesY0 Intrinsic.
+* intrinsics, BesY1: BesY1 Intrinsic.
+* intrinsics, BesYN: BesYN Intrinsic.
+* intrinsics, Bit_Size: Bit_Size Intrinsic.
+* intrinsics, BITest: BITest Intrinsic.
+* intrinsics, BJTest: BJTest Intrinsic.
+* intrinsics, BTest: BTest Intrinsic.
+* intrinsics, CAbs: CAbs Intrinsic.
+* intrinsics, CCos: CCos Intrinsic.
+* intrinsics, CDAbs: CDAbs Intrinsic.
+* intrinsics, CDCos: CDCos Intrinsic.
+* intrinsics, CDExp: CDExp Intrinsic.
+* intrinsics, CDLog: CDLog Intrinsic.
+* intrinsics, CDSin: CDSin Intrinsic.
+* intrinsics, CDSqRt: CDSqRt Intrinsic.
+* intrinsics, Ceiling: Ceiling Intrinsic.
+* intrinsics, CExp: CExp Intrinsic.
+* intrinsics, Char: Char Intrinsic.
+* intrinsics, ChDir <1>: ChDir Intrinsic (function).
+* intrinsics, ChDir: ChDir Intrinsic (subroutine).
+* intrinsics, ChMod <1>: ChMod Intrinsic (function).
+* intrinsics, ChMod: ChMod Intrinsic (subroutine).
+* intrinsics, CLog: CLog Intrinsic.
+* intrinsics, Cmplx: Cmplx Intrinsic.
+* intrinsics, CMPLX: CMPLX() of DOUBLE PRECISION.
+* intrinsics, Complex: Complex Intrinsic.
+* intrinsics, COMPLEX: Fortran Dialect Options.
+* intrinsics, Conjg: Conjg Intrinsic.
+* intrinsics, context-sensitive: Context-Sensitive Intrinsicness.
+* intrinsics, Cos: Cos Intrinsic.
+* intrinsics, CosD: CosD Intrinsic.
+* intrinsics, CosH: CosH Intrinsic.
+* intrinsics, Count: Count Intrinsic.
+* intrinsics, Cpu_Time: Cpu_Time Intrinsic.
+* intrinsics, CShift: CShift Intrinsic.
+* intrinsics, CSin: CSin Intrinsic.
+* intrinsics, CSqRt: CSqRt Intrinsic.
+* intrinsics, CTime <1>: CTime Intrinsic (function).
+* intrinsics, CTime: CTime Intrinsic (subroutine).
+* intrinsics, DAbs: DAbs Intrinsic.
+* intrinsics, DACos: DACos Intrinsic.
+* intrinsics, DACosD: DACosD Intrinsic.
+* intrinsics, DASin: DASin Intrinsic.
+* intrinsics, DASinD: DASinD Intrinsic.
+* intrinsics, DATan: DATan Intrinsic.
+* intrinsics, DATan2: DATan2 Intrinsic.
+* intrinsics, DATan2D: DATan2D Intrinsic.
+* intrinsics, DATanD: DATanD Intrinsic.
+* intrinsics, Date: Date Intrinsic.
+* intrinsics, Date_and_Time: Date_and_Time Intrinsic.
+* intrinsics, DbesJ0: DbesJ0 Intrinsic.
+* intrinsics, DbesJ1: DbesJ1 Intrinsic.
+* intrinsics, DbesJN: DbesJN Intrinsic.
+* intrinsics, DbesY0: DbesY0 Intrinsic.
+* intrinsics, DbesY1: DbesY1 Intrinsic.
+* intrinsics, DbesYN: DbesYN Intrinsic.
+* intrinsics, Dble: Dble Intrinsic.
+* intrinsics, DbleQ: DbleQ Intrinsic.
+* intrinsics, DCmplx: DCmplx Intrinsic.
+* intrinsics, DConjg: DConjg Intrinsic.
+* intrinsics, DCos: DCos Intrinsic.
+* intrinsics, DCosD: DCosD Intrinsic.
+* intrinsics, DCosH: DCosH Intrinsic.
+* intrinsics, DDiM: DDiM Intrinsic.
+* intrinsics, deleted: Intrinsic Groups.
+* intrinsics, DErF: DErF Intrinsic.
+* intrinsics, DErFC: DErFC Intrinsic.
+* intrinsics, DExp: DExp Intrinsic.
+* intrinsics, DFloat: DFloat Intrinsic.
+* intrinsics, DFlotI: DFlotI Intrinsic.
+* intrinsics, DFlotJ: DFlotJ Intrinsic.
+* intrinsics, Digits: Digits Intrinsic.
+* intrinsics, DiM: DiM Intrinsic.
+* intrinsics, DImag: DImag Intrinsic.
+* intrinsics, DInt: DInt Intrinsic.
+* intrinsics, disabled: Intrinsic Groups.
+* intrinsics, DLog: DLog Intrinsic.
+* intrinsics, DLog10: DLog10 Intrinsic.
+* intrinsics, DMax1: DMax1 Intrinsic.
+* intrinsics, DMin1: DMin1 Intrinsic.
+* intrinsics, DMod: DMod Intrinsic.
+* intrinsics, DNInt: DNInt Intrinsic.
+* intrinsics, Dot_Product: Dot_Product Intrinsic.
+* intrinsics, DProd: DProd Intrinsic.
+* intrinsics, DReal: DReal Intrinsic.
+* intrinsics, DSign: DSign Intrinsic.
+* intrinsics, DSin: DSin Intrinsic.
+* intrinsics, DSinD: DSinD Intrinsic.
+* intrinsics, DSinH: DSinH Intrinsic.
+* intrinsics, DSqRt: DSqRt Intrinsic.
+* intrinsics, DTan: DTan Intrinsic.
+* intrinsics, DTanD: DTanD Intrinsic.
+* intrinsics, DTanH: DTanH Intrinsic.
+* intrinsics, Dtime <1>: Dtime Intrinsic (function).
+* intrinsics, Dtime: Dtime Intrinsic (subroutine).
+* intrinsics, enabled: Intrinsic Groups.
+* intrinsics, EOShift: EOShift Intrinsic.
+* intrinsics, Epsilon: Epsilon Intrinsic.
+* intrinsics, ErF: ErF Intrinsic.
+* intrinsics, ErFC: ErFC Intrinsic.
+* intrinsics, ETime <1>: ETime Intrinsic (function).
+* intrinsics, ETime: ETime Intrinsic (subroutine).
+* intrinsics, Exit: Exit Intrinsic.
+* intrinsics, Exp: Exp Intrinsic.
+* intrinsics, Exponent: Exponent Intrinsic.
+* intrinsics, f2c: Fortran Dialect Options.
+* intrinsics, Fdate <1>: Fdate Intrinsic (function).
+* intrinsics, Fdate: Fdate Intrinsic (subroutine).
+* intrinsics, FGet <1>: FGet Intrinsic (function).
+* intrinsics, FGet: FGet Intrinsic (subroutine).
+* intrinsics, FGetC <1>: FGetC Intrinsic (function).
+* intrinsics, FGetC: FGetC Intrinsic (subroutine).
+* intrinsics, Float: Float Intrinsic.
+* intrinsics, FloatI: FloatI Intrinsic.
+* intrinsics, FloatJ: FloatJ Intrinsic.
+* intrinsics, Floor: Floor Intrinsic.
+* intrinsics, Flush: Flush Intrinsic.
+* intrinsics, FNum: FNum Intrinsic.
+* intrinsics, Fortran 90: Fortran Dialect Options.
+* intrinsics, FPut <1>: FPut Intrinsic (function).
+* intrinsics, FPut: FPut Intrinsic (subroutine).
+* intrinsics, FPutC <1>: FPutC Intrinsic (function).
+* intrinsics, FPutC: FPutC Intrinsic (subroutine).
+* intrinsics, Fraction: Fraction Intrinsic.
+* intrinsics, FSeek: FSeek Intrinsic.
+* intrinsics, FStat <1>: FStat Intrinsic (function).
+* intrinsics, FStat: FStat Intrinsic (subroutine).
+* intrinsics, FTell <1>: FTell Intrinsic (function).
+* intrinsics, FTell: FTell Intrinsic (subroutine).
+* intrinsics, generic: Generics and Specifics.
+* intrinsics, GError: GError Intrinsic.
+* intrinsics, GetArg: GetArg Intrinsic.
+* intrinsics, GETARG(): Main Program Unit.
+* intrinsics, GetCWD <1>: GetCWD Intrinsic (function).
+* intrinsics, GetCWD: GetCWD Intrinsic (subroutine).
+* intrinsics, GetEnv: GetEnv Intrinsic.
+* intrinsics, GetGId: GetGId Intrinsic.
+* intrinsics, GetLog: GetLog Intrinsic.
+* intrinsics, GetPId: GetPId Intrinsic.
+* intrinsics, GetUId: GetUId Intrinsic.
+* intrinsics, GMTime: GMTime Intrinsic.
+* intrinsics, groups: Intrinsic Groups.
+* intrinsics, groups of: Intrinsic Groups.
+* intrinsics, hidden: Intrinsic Groups.
+* intrinsics, HostNm <1>: HostNm Intrinsic (function).
+* intrinsics, HostNm: HostNm Intrinsic (subroutine).
+* intrinsics, Huge: Huge Intrinsic.
+* intrinsics, IAbs: IAbs Intrinsic.
+* intrinsics, IAChar: IAChar Intrinsic.
+* intrinsics, IAnd: IAnd Intrinsic.
+* intrinsics, IArgC: IArgC Intrinsic.
+* intrinsics, IARGC(): Main Program Unit.
+* intrinsics, IBClr: IBClr Intrinsic.
+* intrinsics, IBits: IBits Intrinsic.
+* intrinsics, IBSet: IBSet Intrinsic.
+* intrinsics, IChar: IChar Intrinsic.
+* intrinsics, IDate <1>: IDate Intrinsic (VXT).
+* intrinsics, IDate: IDate Intrinsic (UNIX).
+* intrinsics, IDiM: IDiM Intrinsic.
+* intrinsics, IDInt: IDInt Intrinsic.
+* intrinsics, IDNInt: IDNInt Intrinsic.
+* intrinsics, IEOr: IEOr Intrinsic.
+* intrinsics, IErrNo: IErrNo Intrinsic.
+* intrinsics, IFix: IFix Intrinsic.
+* intrinsics, IIAbs: IIAbs Intrinsic.
+* intrinsics, IIAnd: IIAnd Intrinsic.
+* intrinsics, IIBClr: IIBClr Intrinsic.
+* intrinsics, IIBits: IIBits Intrinsic.
+* intrinsics, IIBSet: IIBSet Intrinsic.
+* intrinsics, IIDiM: IIDiM Intrinsic.
+* intrinsics, IIDInt: IIDInt Intrinsic.
+* intrinsics, IIDNnt: IIDNnt Intrinsic.
+* intrinsics, IIEOr: IIEOr Intrinsic.
+* intrinsics, IIFix: IIFix Intrinsic.
+* intrinsics, IInt: IInt Intrinsic.
+* intrinsics, IIOr: IIOr Intrinsic.
+* intrinsics, IIQint: IIQint Intrinsic.
+* intrinsics, IIQNnt: IIQNnt Intrinsic.
+* intrinsics, IIShftC: IIShftC Intrinsic.
+* intrinsics, IISign: IISign Intrinsic.
+* intrinsics, Imag: Imag Intrinsic.
+* intrinsics, ImagPart: ImagPart Intrinsic.
+* intrinsics, IMax0: IMax0 Intrinsic.
+* intrinsics, IMax1: IMax1 Intrinsic.
+* intrinsics, IMin0: IMin0 Intrinsic.
+* intrinsics, IMin1: IMin1 Intrinsic.
+* intrinsics, IMod: IMod Intrinsic.
+* intrinsics, Index: Index Intrinsic.
+* intrinsics, INInt: INInt Intrinsic.
+* intrinsics, INot: INot Intrinsic.
+* intrinsics, Int: Int Intrinsic.
+* intrinsics, Int2: Int2 Intrinsic.
+* intrinsics, Int8: Int8 Intrinsic.
+* intrinsics, IOr: IOr Intrinsic.
+* intrinsics, IRand: IRand Intrinsic.
+* intrinsics, IsaTty: IsaTty Intrinsic.
+* intrinsics, IShft: IShft Intrinsic.
+* intrinsics, IShftC: IShftC Intrinsic.
+* intrinsics, ISign: ISign Intrinsic.
+* intrinsics, ITime: ITime Intrinsic.
+* intrinsics, IZExt: IZExt Intrinsic.
+* intrinsics, JIAbs: JIAbs Intrinsic.
+* intrinsics, JIAnd: JIAnd Intrinsic.
+* intrinsics, JIBClr: JIBClr Intrinsic.
+* intrinsics, JIBits: JIBits Intrinsic.
+* intrinsics, JIBSet: JIBSet Intrinsic.
+* intrinsics, JIDiM: JIDiM Intrinsic.
+* intrinsics, JIDInt: JIDInt Intrinsic.
+* intrinsics, JIDNnt: JIDNnt Intrinsic.
+* intrinsics, JIEOr: JIEOr Intrinsic.
+* intrinsics, JIFix: JIFix Intrinsic.
+* intrinsics, JInt: JInt Intrinsic.
+* intrinsics, JIOr: JIOr Intrinsic.
+* intrinsics, JIQint: JIQint Intrinsic.
+* intrinsics, JIQNnt: JIQNnt Intrinsic.
+* intrinsics, JIShft: JIShft Intrinsic.
+* intrinsics, JIShftC: JIShftC Intrinsic.
+* intrinsics, JISign: JISign Intrinsic.
+* intrinsics, JMax0: JMax0 Intrinsic.
+* intrinsics, JMax1: JMax1 Intrinsic.
+* intrinsics, JMin0: JMin0 Intrinsic.
+* intrinsics, JMin1: JMin1 Intrinsic.
+* intrinsics, JMod: JMod Intrinsic.
+* intrinsics, JNInt: JNInt Intrinsic.
+* intrinsics, JNot: JNot Intrinsic.
+* intrinsics, JZExt: JZExt Intrinsic.
+* intrinsics, Kill <1>: Kill Intrinsic (function).
+* intrinsics, Kill: Kill Intrinsic (subroutine).
+* intrinsics, Kind: Kind Intrinsic.
+* intrinsics, LBound: LBound Intrinsic.
+* intrinsics, Len: Len Intrinsic.
+* intrinsics, Len_Trim: Len_Trim Intrinsic.
+* intrinsics, LGe: LGe Intrinsic.
+* intrinsics, LGt: LGt Intrinsic.
+* intrinsics, Link <1>: Link Intrinsic (function).
+* intrinsics, Link: Link Intrinsic (subroutine).
+* intrinsics, LLe: LLe Intrinsic.
+* intrinsics, LLt: LLt Intrinsic.
+* intrinsics, LnBlnk: LnBlnk Intrinsic.
+* intrinsics, Loc: Loc Intrinsic.
+* intrinsics, Log: Log Intrinsic.
+* intrinsics, Log10: Log10 Intrinsic.
+* intrinsics, Logical: Logical Intrinsic.
+* intrinsics, Long: Long Intrinsic.
+* intrinsics, LShift: LShift Intrinsic.
+* intrinsics, LStat <1>: LStat Intrinsic (function).
+* intrinsics, LStat: LStat Intrinsic (subroutine).
+* intrinsics, LTime: LTime Intrinsic.
+* intrinsics, MatMul: MatMul Intrinsic.
+* intrinsics, Max: Max Intrinsic.
+* intrinsics, Max0: Max0 Intrinsic.
+* intrinsics, Max1: Max1 Intrinsic.
+* intrinsics, MaxExponent: MaxExponent Intrinsic.
+* intrinsics, MaxLoc: MaxLoc Intrinsic.
+* intrinsics, MaxVal: MaxVal Intrinsic.
+* intrinsics, MClock: MClock Intrinsic.
+* intrinsics, MClock8: MClock8 Intrinsic.
+* intrinsics, Merge: Merge Intrinsic.
+* intrinsics, MIL-STD 1753: Fortran Dialect Options.
+* intrinsics, Min: Min Intrinsic.
+* intrinsics, Min0: Min0 Intrinsic.
+* intrinsics, Min1: Min1 Intrinsic.
+* intrinsics, MinExponent: MinExponent Intrinsic.
+* intrinsics, MinLoc: MinLoc Intrinsic.
+* intrinsics, MinVal: MinVal Intrinsic.
+* intrinsics, Mod: Mod Intrinsic.
+* intrinsics, Modulo: Modulo Intrinsic.
+* intrinsics, MvBits: MvBits Intrinsic.
+* intrinsics, Nearest: Nearest Intrinsic.
+* intrinsics, NInt: NInt Intrinsic.
+* intrinsics, Not: Not Intrinsic.
+* intrinsics, OR: Bit Operations on Floating-point Data.
+* intrinsics, Or: Or Intrinsic.
+* intrinsics, others: Other Intrinsics.
+* intrinsics, Pack: Pack Intrinsic.
+* intrinsics, PError: PError Intrinsic.
+* intrinsics, Precision: Precision Intrinsic.
+* intrinsics, Present: Present Intrinsic.
+* intrinsics, Product: Product Intrinsic.
+* intrinsics, QAbs: QAbs Intrinsic.
+* intrinsics, QACos: QACos Intrinsic.
+* intrinsics, QACosD: QACosD Intrinsic.
+* intrinsics, QASin: QASin Intrinsic.
+* intrinsics, QASinD: QASinD Intrinsic.
+* intrinsics, QATan: QATan Intrinsic.
+* intrinsics, QATan2: QATan2 Intrinsic.
+* intrinsics, QATan2D: QATan2D Intrinsic.
+* intrinsics, QATanD: QATanD Intrinsic.
+* intrinsics, QCos: QCos Intrinsic.
+* intrinsics, QCosD: QCosD Intrinsic.
+* intrinsics, QCosH: QCosH Intrinsic.
+* intrinsics, QDiM: QDiM Intrinsic.
+* intrinsics, QExp: QExp Intrinsic.
+* intrinsics, QExt: QExt Intrinsic.
+* intrinsics, QExtD: QExtD Intrinsic.
+* intrinsics, QFloat: QFloat Intrinsic.
+* intrinsics, QInt: QInt Intrinsic.
+* intrinsics, QLog: QLog Intrinsic.
+* intrinsics, QLog10: QLog10 Intrinsic.
+* intrinsics, QMax1: QMax1 Intrinsic.
+* intrinsics, QMin1: QMin1 Intrinsic.
+* intrinsics, QMod: QMod Intrinsic.
+* intrinsics, QNInt: QNInt Intrinsic.
+* intrinsics, QSin: QSin Intrinsic.
+* intrinsics, QSinD: QSinD Intrinsic.
+* intrinsics, QSinH: QSinH Intrinsic.
+* intrinsics, QSqRt: QSqRt Intrinsic.
+* intrinsics, QTan: QTan Intrinsic.
+* intrinsics, QTanD: QTanD Intrinsic.
+* intrinsics, QTanH: QTanH Intrinsic.
+* intrinsics, Radix: Radix Intrinsic.
+* intrinsics, Rand: Rand Intrinsic.
+* intrinsics, Random_Number: Random_Number Intrinsic.
+* intrinsics, Random_Seed: Random_Seed Intrinsic.
+* intrinsics, Range: Range Intrinsic.
+* intrinsics, Real: Real Intrinsic.
+* intrinsics, REAL: REAL() and AIMAG() of Complex.
+* intrinsics, RealPart: RealPart Intrinsic.
+* intrinsics, Rename <1>: Rename Intrinsic (function).
+* intrinsics, Rename: Rename Intrinsic (subroutine).
+* intrinsics, Repeat: Repeat Intrinsic.
+* intrinsics, Reshape: Reshape Intrinsic.
+* intrinsics, RRSpacing: RRSpacing Intrinsic.
+* intrinsics, RShift: RShift Intrinsic.
+* intrinsics, Scale: Scale Intrinsic.
+* intrinsics, Scan: Scan Intrinsic.
+* intrinsics, Secnds: Secnds Intrinsic.
+* intrinsics, Second <1>: Second Intrinsic (subroutine).
+* intrinsics, Second: Second Intrinsic (function).
+* intrinsics, Selected_Int_Kind: Selected_Int_Kind Intrinsic.
+* intrinsics, Selected_Real_Kind: Selected_Real_Kind Intrinsic.
+* intrinsics, Set_Exponent: Set_Exponent Intrinsic.
+* intrinsics, Shape: Shape Intrinsic.
+* intrinsics, SHIFT: Bit Operations on Floating-point Data.
+* intrinsics, Short: Short Intrinsic.
+* intrinsics, Sign: Sign Intrinsic.
+* intrinsics, Signal <1>: Signal Intrinsic (function).
+* intrinsics, Signal: Signal Intrinsic (subroutine).
+* intrinsics, SIGNAL(): Actual Bugs.
+* intrinsics, Sin: Sin Intrinsic.
+* intrinsics, SinD: SinD Intrinsic.
+* intrinsics, SinH: SinH Intrinsic.
+* intrinsics, Sleep: Sleep Intrinsic.
+* intrinsics, Sngl: Sngl Intrinsic.
+* intrinsics, SnglQ: SnglQ Intrinsic.
+* intrinsics, Spacing: Spacing Intrinsic.
+* intrinsics, Spread: Spread Intrinsic.
+* intrinsics, SqRt: SqRt Intrinsic.
+* intrinsics, SRand: SRand Intrinsic.
+* intrinsics, Stat <1>: Stat Intrinsic (function).
+* intrinsics, Stat: Stat Intrinsic (subroutine).
+* intrinsics, Sum: Sum Intrinsic.
+* intrinsics, SymLnk <1>: SymLnk Intrinsic (function).
+* intrinsics, SymLnk: SymLnk Intrinsic (subroutine).
+* intrinsics, System <1>: System Intrinsic (function).
+* intrinsics, System: System Intrinsic (subroutine).
+* intrinsics, System_Clock: System_Clock Intrinsic.
+* intrinsics, table of: Table of Intrinsic Functions.
+* intrinsics, Tan: Tan Intrinsic.
+* intrinsics, TanD: TanD Intrinsic.
+* intrinsics, TanH: TanH Intrinsic.
+* intrinsics, Time <1>: Time Intrinsic (VXT).
+* intrinsics, Time: Time Intrinsic (UNIX).
+* intrinsics, Time8: Time8 Intrinsic.
+* intrinsics, Tiny: Tiny Intrinsic.
+* intrinsics, Transfer: Transfer Intrinsic.
+* intrinsics, Transpose: Transpose Intrinsic.
+* intrinsics, Trim: Trim Intrinsic.
+* intrinsics, TtyNam <1>: TtyNam Intrinsic (function).
+* intrinsics, TtyNam: TtyNam Intrinsic (subroutine).
+* intrinsics, UBound: UBound Intrinsic.
+* intrinsics, UMask <1>: UMask Intrinsic (function).
+* intrinsics, UMask: UMask Intrinsic (subroutine).
+* intrinsics, UNIX: Fortran Dialect Options.
+* intrinsics, Unlink <1>: Unlink Intrinsic (function).
+* intrinsics, Unlink: Unlink Intrinsic (subroutine).
+* intrinsics, Unpack: Unpack Intrinsic.
+* intrinsics, Verify: Verify Intrinsic.
+* intrinsics, VXT: Fortran Dialect Options.
+* intrinsics, XOr: XOr Intrinsic.
+* intrinsics, ZAbs: ZAbs Intrinsic.
+* intrinsics, ZCos: ZCos Intrinsic.
+* intrinsics, ZExp: ZExp Intrinsic.
+* intrinsics, ZExt: ZExt Intrinsic.
+* intrinsics, ZLog: ZLog Intrinsic.
+* intrinsics, ZSin: ZSin Intrinsic.
+* intrinsics, ZSqRt: ZSqRt Intrinsic.
+* Introduction: Top.
+* invalid assembly code: Bug Criteria.
+* invalid input: Bug Criteria.
+* IOr intrinsic: IOr Intrinsic.
+* IOSTAT=: Run-time Library Errors.
+* IRand intrinsic: IRand Intrinsic.
+* IsaTty intrinsic: IsaTty Intrinsic.
+* IShft intrinsic: IShft Intrinsic.
+* IShftC intrinsic: IShftC Intrinsic.
+* ISign intrinsic: ISign Intrinsic.
+* ITime intrinsic: ITime Intrinsic.
+* ix86: Actual Bugs.
+* IZExt intrinsic: IZExt Intrinsic.
+* JCB002 program: Generics and Specifics.
+* JCB003 program: CMPAMBIG.
+* JIAbs intrinsic: JIAbs Intrinsic.
+* JIAnd intrinsic: JIAnd Intrinsic.
+* JIBClr intrinsic: JIBClr Intrinsic.
+* JIBits intrinsic: JIBits Intrinsic.
+* JIBSet intrinsic: JIBSet Intrinsic.
+* JIDiM intrinsic: JIDiM Intrinsic.
+* JIDInt intrinsic: JIDInt Intrinsic.
+* JIDNnt intrinsic: JIDNnt Intrinsic.
+* JIEOr intrinsic: JIEOr Intrinsic.
+* JIFix intrinsic: JIFix Intrinsic.
+* JInt intrinsic: JInt Intrinsic.
+* JIOr intrinsic: JIOr Intrinsic.
+* JIQint intrinsic: JIQint Intrinsic.
+* JIQNnt intrinsic: JIQNnt Intrinsic.
+* JIShft intrinsic: JIShft Intrinsic.
+* JIShftC intrinsic: JIShftC Intrinsic.
+* JISign intrinsic: JISign Intrinsic.
+* JMax0 intrinsic: JMax0 Intrinsic.
+* JMax1 intrinsic: JMax1 Intrinsic.
+* JMin0 intrinsic: JMin0 Intrinsic.
+* JMin1 intrinsic: JMin1 Intrinsic.
+* JMod intrinsic: JMod Intrinsic.
+* JNInt intrinsic: JNInt Intrinsic.
+* JNot intrinsic: JNot Intrinsic.
+* JZExt intrinsic: JZExt Intrinsic.
+* keywords, RECURSIVE: RECURSIVE Keyword.
+* Kill intrinsic <1>: Kill Intrinsic (function).
+* Kill intrinsic: Kill Intrinsic (subroutine).
+* Kind intrinsic: Kind Intrinsic.
+* KIND= notation: Kind Notation.
+* known causes of trouble: Trouble.
+* lack of recursion: RECURSIVE Keyword.
+* language dialect options: Fortran Dialect Options.
+* language f77 not recognized: Where to Install.
+* language features: Direction of Language Development.
+* language, incorrect use of: What is GNU Fortran?.
+* LANGUAGES: Building gcc.
+* large aggregate areas: Actual Bugs.
+* large common blocks: Large Common Blocks.
+* large initialization: Large Initialization.
+* layout of common blocks: Aligned Data.
+* LBound intrinsic: LBound Intrinsic.
+* ld can't find _main: Cannot Link Fortran Programs.
+* ld can't find _strtoul: Missing strtoul.
+* ld can't find strange names: Cannot Link Fortran Programs.
+* ld command: What is GNU Fortran?.
+* ld error for f771: Missing strtoul.
+* ld error for user code: Cannot Link Fortran Programs.
+* ld errors: Large Common Blocks.
+* legacy code: Collected Fortran Wisdom.
+* Len intrinsic: Len Intrinsic.
+* Len_Trim intrinsic: Len_Trim Intrinsic.
+* length of source lines: Fortran Dialect Options.
+* letters, lowercase: Case Sensitivity.
+* letters, uppercase: Case Sensitivity.
+* LGe intrinsic: LGe Intrinsic.
+* LGt intrinsic: LGt Intrinsic.
+* libc, non-ANSI or non-default: Strange Behavior at Run Time.
+* libf2c library: What is GNU Fortran?.
+* libraries: What is GNU Fortran?.
+* libraries, containing BLOCK DATA: Block Data and Libraries.
+* libraries, libf2c: What is GNU Fortran?.
+* limits on continuation lines: Continuation Line.
+* limits, compiler: Compiler Limits.
+* line length: Fortran Dialect Options.
+* lines: Lines.
+* lines, continuation: Continuation Line.
+* lines, long: Long Lines.
+* lines, short: Short Lines.
+* Link intrinsic <1>: Link Intrinsic (function).
+* Link intrinsic: Link Intrinsic (subroutine).
+* linker errors: Large Common Blocks.
+* linking: What is GNU Fortran?.
+* linking against non-standard library: Strange Behavior at Run Time.
+* linking error for f771: Missing strtoul.
+* linking error for user code: Cannot Link Fortran Programs.
+* linking with C: Interoperating with C and C++.
+* LLe intrinsic: LLe Intrinsic.
+* LLt intrinsic: LLt Intrinsic.
+* LnBlnk intrinsic: LnBlnk Intrinsic.
+* Loc intrinsic: Loc Intrinsic.
+* local equivalence areas <1>: Actual Bugs.
+* local equivalence areas: Local Equivalence Areas.
+* Log intrinsic: Log Intrinsic.
+* Log10 intrinsic: Log10 Intrinsic.
+* logical expressions, comparing: Equivalence Versus Equality.
+* Logical intrinsic: Logical Intrinsic.
+* LOGICAL(KIND=1) type: Compiler Types.
+* LOGICAL(KIND=2) type: Compiler Types.
+* LOGICAL(KIND=3) type: Compiler Types.
+* LOGICAL(KIND=6) type: Compiler Types.
+* LOGICAL*1 support: Popular Non-standard Types.
+* Long intrinsic: Long Intrinsic.
+* long source lines: Long Lines.
+* loops, speeding up: Optimize Options.
+* loops, unrolling: Optimize Options.
+* lowercase letters: Case Sensitivity.
+* LShift intrinsic: LShift Intrinsic.
+* LStat intrinsic <1>: LStat Intrinsic (function).
+* LStat intrinsic: LStat Intrinsic (subroutine).
+* LTime intrinsic: LTime Intrinsic.
+* machine code: What is GNU Fortran?.
+* macro options: Shorthand Options.
+* main program unit, debugging: Main Program Unit.
+* main(): Main Program Unit.
+* MAIN__(): Main Program Unit.
+* make clean: Cleanup Kills Stage Directories.
+* make compare: Object File Differences.
+* makeinfo: Missing makeinfo?.
+* MAP statement: STRUCTURE UNION RECORD MAP.
+* MatMul intrinsic: MatMul Intrinsic.
+* Max intrinsic: Max Intrinsic.
+* Max0 intrinsic: Max0 Intrinsic.
+* Max1 intrinsic: Max1 Intrinsic.
+* MaxExponent intrinsic: MaxExponent Intrinsic.
+* maximum number of dimensions: Compiler Limits.
+* maximum rank: Compiler Limits.
+* maximum stackable size: Maximum Stackable Size.
+* maximum unit number <1>: Large File Unit Numbers.
+* maximum unit number: Larger File Unit Numbers.
+* MaxLoc intrinsic: MaxLoc Intrinsic.
+* MaxVal intrinsic: MaxVal Intrinsic.
+* MClock intrinsic: MClock Intrinsic.
+* MClock8 intrinsic: MClock8 Intrinsic.
+* memory usage, of compiler: Actual Bugs.
+* memory utilization: Large Initialization.
+* Merge intrinsic: Merge Intrinsic.
+* merging distributions: Merging Distributions.
+* messages, run-time: Run-time Library Errors.
+* messages, warning: Warning Options.
+* messages, warning and error: Warnings and Errors.
+* MIL-STD 1753 <1>: MIL-STD 1753.
+* MIL-STD 1753 <2>: END DO.
+* MIL-STD 1753 <3>: DO WHILE.
+* MIL-STD 1753: Fortran Dialect Options.
+* Min intrinsic: Min Intrinsic.
+* Min0 intrinsic: Min0 Intrinsic.
+* Min1 intrinsic: Min1 Intrinsic.
+* MinExponent intrinsic: MinExponent Intrinsic.
+* MinLoc intrinsic: MinLoc Intrinsic.
+* MinVal intrinsic: MinVal Intrinsic.
+* missing bison: Missing bison?.
+* missing debug features: Debugging Options.
+* missing gperf: Missing gperf?.
+* missing makeinfo: Missing makeinfo?.
+* mistakes: What is GNU Fortran?.
+* mistyped functions: Not My Type.
+* mistyped variables: Not My Type.
+* Mod intrinsic: Mod Intrinsic.
+* modifying g77 <1>: Unpacking.
+* modifying g77: Overall Options.
+* Modulo intrinsic: Modulo Intrinsic.
+* MvBits intrinsic: MvBits Intrinsic.
+* MXUNIT <1>: Large File Unit Numbers.
+* MXUNIT: Larger File Unit Numbers.
+* name space: Mangling of Names.
+* NAMELIST statement: NAMELIST.
+* naming conflicts: Multiple Definitions of External Names.
+* naming issues: Mangling of Names.
+* naming programs test: Nothing Happens.
+* NaN values: Floating-point Exception Handling.
+* native compiler: Installing f77.
+* Nearest intrinsic: Nearest Intrinsic.
+* negative forms of options: Invoking G77.
+* Netlib <1>: Increasing Precision/Range.
+* Netlib: C Interfacing Tools.
+* network file system <1>: Output Assumed To Flush.
+* network file system: Always Flush Output.
+* new users: Getting Started.
+* newbies: Getting Started.
+* NeXTStep problems: NeXTStep Problems.
+* NFS <1>: Output Assumed To Flush.
+* NFS: Always Flush Output.
+* NInt intrinsic: NInt Intrinsic.
+* nonportable conversions: Nonportable Conversions.
+* Not intrinsic: Not Intrinsic.
+* nothing happens: Nothing Happens.
+* null arguments: Ugly Null Arguments.
+* null byte, trailing: Character and Hollerith Constants.
+* null CHARACTER strings: Character Type.
+* number of continuation lines: Continuation Line.
+* number of dimensions, maximum: Compiler Limits.
+* number of trips: Loops.
+* object file, differences: Object File Differences.
+* octal constants: Double Quote Meaning.
+* omitting arguments: Ugly Null Arguments.
+* one-trip DO loops: Fortran Dialect Options.
+* OPEN statement: OPEN CLOSE and INQUIRE Keywords.
+* optimization, better: Better Optimization.
+* optimizations, Pentium <1>: Use Submodel Options.
+* optimizations, Pentium <2>: Aligned Data.
+* optimizations, Pentium: Unpacking.
+* optimize options: Optimize Options.
+* options to control warnings: Warning Options.
+* options, --driver <1>: Invoking G77.
+* options, --driver: G77 and GCC.
+* options, -falias-check <1>: Aliasing Assumed To Work.
+* options, -falias-check: Code Gen Options.
+* options, -fargument-alias <1>: Aliasing Assumed To Work.
+* options, -fargument-alias: Code Gen Options.
+* options, -fargument-noalias <1>: Aliasing Assumed To Work.
+* options, -fargument-noalias: Code Gen Options.
+* options, -fcaller-saves: Optimize Options.
+* options, -fcase-initcap: Fortran Dialect Options.
+* options, -fcase-lower: Fortran Dialect Options.
+* options, -fcase-preserve: Fortran Dialect Options.
+* options, -fcase-strict-lower: Fortran Dialect Options.
+* options, -fcase-strict-upper: Fortran Dialect Options.
+* options, -fcase-upper: Fortran Dialect Options.
+* options, -fdebug-kludge: Code Gen Options.
+* options, -fdelayed-branch: Optimize Options.
+* options, -fdollar-ok: Fortran Dialect Options.
+* options, -fexpensive-optimizations: Optimize Options.
+* options, -ff2c-intrinsics-delete: Fortran Dialect Options.
+* options, -ff2c-intrinsics-disable: Fortran Dialect Options.
+* options, -ff2c-intrinsics-enable: Fortran Dialect Options.
+* options, -ff2c-intrinsics-hide: Fortran Dialect Options.
+* options, -ff2c-library: Code Gen Options.
+* options, -ff66: Shorthand Options.
+* options, -ff77: Shorthand Options.
+* options, -ff90: Fortran Dialect Options.
+* options, -ff90-intrinsics-delete: Fortran Dialect Options.
+* options, -ff90-intrinsics-disable: Fortran Dialect Options.
+* options, -ff90-intrinsics-enable: Fortran Dialect Options.
+* options, -ff90-intrinsics-hide: Fortran Dialect Options.
+* options, -ffast-math: Optimize Options.
+* options, -ffixed-line-length-N: Fortran Dialect Options.
+* options, -ffloat-store: Optimize Options.
+* options, -fforce-addr: Optimize Options.
+* options, -fforce-mem: Optimize Options.
+* options, -ffree-form: Fortran Dialect Options.
+* options, -fgnu-intrinsics-delete: Fortran Dialect Options.
+* options, -fgnu-intrinsics-disable: Fortran Dialect Options.
+* options, -fgnu-intrinsics-enable: Fortran Dialect Options.
+* options, -fgnu-intrinsics-hide: Fortran Dialect Options.
+* options, -fGROUP-intrinsics-hide: Overly Convenient Options.
+* options, -finit-local-zero <1>: Overly Convenient Options.
+* options, -finit-local-zero: Code Gen Options.
+* options, -fintrin-case-any: Fortran Dialect Options.
+* options, -fintrin-case-initcap: Fortran Dialect Options.
+* options, -fintrin-case-lower: Fortran Dialect Options.
+* options, -fintrin-case-upper: Fortran Dialect Options.
+* options, -fmatch-case-any: Fortran Dialect Options.
+* options, -fmatch-case-initcap: Fortran Dialect Options.
+* options, -fmatch-case-lower: Fortran Dialect Options.
+* options, -fmatch-case-upper: Fortran Dialect Options.
+* options, -fmil-intrinsics-delete: Fortran Dialect Options.
+* options, -fmil-intrinsics-disable: Fortran Dialect Options.
+* options, -fmil-intrinsics-enable: Fortran Dialect Options.
+* options, -fmil-intrinsics-hide: Fortran Dialect Options.
+* options, -fno-argument-noalias-global <1>: Aliasing Assumed To Work.
+* options, -fno-argument-noalias-global: Code Gen Options.
+* options, -fno-automatic <1>: Overly Convenient Options.
+* options, -fno-automatic: Code Gen Options.
+* options, -fno-backslash: Fortran Dialect Options.
+* options, -fno-common: Code Gen Options.
+* options, -fno-emulate-complex: Code Gen Options.
+* options, -fno-f2c <1>: Avoid f2c Compatibility.
+* options, -fno-f2c: Code Gen Options.
+* options, -fno-f77: Shorthand Options.
+* options, -fno-fixed-form: Fortran Dialect Options.
+* options, -fno-globals: Code Gen Options.
+* options, -fno-ident: Code Gen Options.
+* options, -fno-inline: Optimize Options.
+* options, -fno-move-all-movables: Optimize Options.
+* options, -fno-reduce-all-givs: Optimize Options.
+* options, -fno-rerun-loop-opt: Optimize Options.
+* options, -fno-second-underscore: Code Gen Options.
+* options, -fno-silent: Overall Options.
+* options, -fno-ugly: Shorthand Options.
+* options, -fno-ugly-args: Fortran Dialect Options.
+* options, -fno-ugly-init: Fortran Dialect Options.
+* options, -fno-underscoring <1>: Names.
+* options, -fno-underscoring: Code Gen Options.
+* options, -fonetrip: Fortran Dialect Options.
+* options, -fpack-struct: Code Gen Options.
+* options, -fpcc-struct-return: Code Gen Options.
+* options, -fpedantic: Warning Options.
+* options, -fPIC: Actual Bugs.
+* options, -freg-struct-return: Code Gen Options.
+* options, -frerun-cse-after-loop: Optimize Options.
+* options, -fschedule-insns: Optimize Options.
+* options, -fschedule-insns2: Optimize Options.
+* options, -fset-g77-defaults: Overall Options.
+* options, -fshort-double: Code Gen Options.
+* options, -fsource-case-lower: Fortran Dialect Options.
+* options, -fsource-case-preserve: Fortran Dialect Options.
+* options, -fsource-case-upper: Fortran Dialect Options.
+* options, -fstrength-reduce: Optimize Options.
+* options, -fsymbol-case-any: Fortran Dialect Options.
+* options, -fsymbol-case-initcap: Fortran Dialect Options.
+* options, -fsymbol-case-lower: Fortran Dialect Options.
+* options, -fsymbol-case-upper: Fortran Dialect Options.
+* options, -fsyntax-only: Warning Options.
+* options, -ftypeless-boz: Fortran Dialect Options.
+* options, -fugly <1>: Overly Convenient Options.
+* options, -fugly: Shorthand Options.
+* options, -fugly-assign: Fortran Dialect Options.
+* options, -fugly-assumed: Fortran Dialect Options.
+* options, -fugly-comma <1>: Actual Bugs.
+* options, -fugly-comma: Fortran Dialect Options.
+* options, -fugly-complex: Fortran Dialect Options.
+* options, -fugly-logint: Fortran Dialect Options.
+* options, -funix-intrinsics-delete: Fortran Dialect Options.
+* options, -funix-intrinsics-disable: Fortran Dialect Options.
+* options, -funix-intrinsics-enable: Fortran Dialect Options.
+* options, -funix-intrinsics-hide: Fortran Dialect Options.
+* options, -funroll-all-loops: Optimize Options.
+* options, -funroll-loops: Optimize Options.
+* options, -fversion: Overall Options.
+* options, -fvxt: Fortran Dialect Options.
+* options, -fvxt-intrinsics-delete: Fortran Dialect Options.
+* options, -fvxt-intrinsics-disable: Fortran Dialect Options.
+* options, -fvxt-intrinsics-enable: Fortran Dialect Options.
+* options, -fvxt-intrinsics-hide: Fortran Dialect Options.
+* options, -fzeros: Code Gen Options.
+* options, -g: Debugging Options.
+* options, -I-: Directory Options.
+* options, -Idir: Directory Options.
+* options, -malign-double <1>: Aligned Data.
+* options, -malign-double: Optimize Options.
+* options, -Nl: Compiler Limits.
+* options, -Nx: Compiler Limits.
+* options, -pedantic: Warning Options.
+* options, -pedantic-errors: Warning Options.
+* options, -v: G77 and GCC.
+* options, -W: Warning Options.
+* options, -w: Warning Options.
+* options, -Waggregate-return: Warning Options.
+* options, -Wall: Warning Options.
+* options, -Wcomment: Warning Options.
+* options, -Wconversion: Warning Options.
+* options, -Werror: Warning Options.
+* options, -Wformat: Warning Options.
+* options, -Wid-clash-LEN: Warning Options.
+* options, -Wimplicit: Warning Options.
+* options, -Wlarger-than-LEN: Warning Options.
+* options, -Wno-globals: Warning Options.
+* options, -Wparentheses: Warning Options.
+* options, -Wredundant-decls: Warning Options.
+* options, -Wshadow: Warning Options.
+* options, -Wsurprising: Warning Options.
+* options, -Wswitch: Warning Options.
+* options, -Wtraditional: Warning Options.
+* options, -Wuninitialized: Warning Options.
+* options, -Wunused: Warning Options.
+* options, adding: Adding Options.
+* options, code generation: Code Gen Options.
+* options, debugging: Debugging Options.
+* options, dialect: Fortran Dialect Options.
+* options, directory search: Directory Options.
+* options, GNU Fortran command: Invoking G77.
+* options, macro: Shorthand Options.
+* options, negative forms: Invoking G77.
+* options, optimization: Optimize Options.
+* options, overall: Overall Options.
+* options, overly convenient: Overly Convenient Options.
+* options, preprocessor: Preprocessor Options.
+* options, shorthand: Shorthand Options.
+* OR intrinsic: Bit Operations on Floating-point Data.
+* Or intrinsic: Or Intrinsic.
+* order of evaluation, side effects: Order of Side Effects.
+* ordering, array: Arrays.
+* other intrinsics: Other Intrinsics.
+* output, flushing <1>: Output Assumed To Flush.
+* output, flushing: Always Flush Output.
+* overall options: Overall Options.
+* overflow: Warning Options.
+* overlapping arguments: Aliasing Assumed To Work.
+* overlays: Aliasing Assumed To Work.
+* overly convenient options: Overly Convenient Options.
+* overwritten data: Strange Behavior at Run Time.
+* Pack intrinsic: Pack Intrinsic.
+* packages: Unpacking.
+* padding: Actual Bugs.
+* parallel processing: Support for Threads.
+* PARAMETER statement <1>: Old-style PARAMETER Statements.
+* PARAMETER statement: Intrinsics in PARAMETER Statements.
+* parameters, unused: Warning Options.
+* patch files: Patching GNU CC Necessary.
+* patch files, creating: Merging Distributions.
+* pedantic compilation: Pedantic Compilation.
+* Pentium optimizations <1>: Use Submodel Options.
+* Pentium optimizations <2>: Aligned Data.
+* Pentium optimizations: Unpacking.
+* PError intrinsic: PError Intrinsic.
+* placing initialization statements: Initializing Before Specifying.
+* POINTER statement: POINTER Statements.
+* pointers <1>: Ugly Assigned Labels.
+* pointers: Kind Notation.
+* porting, simplify: Simplify Porting.
+* pre-installation checks: Pre-installation Checks.
+* Precision intrinsic: Precision Intrinsic.
+* precision, increasing: Increasing Precision/Range.
+* prefix-radix constants: Fortran Dialect Options.
+* preprocessor <1>: Bug Reporting.
+* preprocessor <2>: Overall Options.
+* preprocessor: What is GNU Fortran?.
+* preprocessor options: Preprocessor Options.
+* prerequisites: Prerequisites.
+* Present intrinsic: Present Intrinsic.
+* printing compilation status: Overall Options.
+* printing main source: Actual Bugs.
+* printing version information <1>: Overall Options.
+* printing version information: What is GNU Fortran?.
+* problems installing: Problems Installing.
+* procedures: Procedures.
+* Product intrinsic: Product Intrinsic.
+* PROGRAM statement: Main Program Unit.
+* programs named test: Nothing Happens.
+* programs, cc1: What is GNU Fortran?.
+* programs, cc1plus: What is GNU Fortran?.
+* programs, compiling: G77 and GCC.
+* programs, cpp <1>: Bug Reporting.
+* programs, cpp <2>: Preprocessor Options.
+* programs, cpp <3>: Overall Options.
+* programs, cpp: What is GNU Fortran?.
+* programs, f771: What is GNU Fortran?.
+* programs, ratfor: Overall Options.
+* programs, speeding up: Faster Programs.
+* projects: Projects.
+* Q edit descriptor: Q Edit Descriptor.
+* QAbs intrinsic: QAbs Intrinsic.
+* QACos intrinsic: QACos Intrinsic.
+* QACosD intrinsic: QACosD Intrinsic.
+* QASin intrinsic: QASin Intrinsic.
+* QASinD intrinsic: QASinD Intrinsic.
+* QATan intrinsic: QATan Intrinsic.
+* QATan2 intrinsic: QATan2 Intrinsic.
+* QATan2D intrinsic: QATan2D Intrinsic.
+* QATanD intrinsic: QATanD Intrinsic.
+* QCos intrinsic: QCos Intrinsic.
+* QCosD intrinsic: QCosD Intrinsic.
+* QCosH intrinsic: QCosH Intrinsic.
+* QDiM intrinsic: QDiM Intrinsic.
+* QExp intrinsic: QExp Intrinsic.
+* QExt intrinsic: QExt Intrinsic.
+* QExtD intrinsic: QExtD Intrinsic.
+* QFloat intrinsic: QFloat Intrinsic.
+* QInt intrinsic: QInt Intrinsic.
+* QLog intrinsic: QLog Intrinsic.
+* QLog10 intrinsic: QLog10 Intrinsic.
+* QMax1 intrinsic: QMax1 Intrinsic.
+* QMin1 intrinsic: QMin1 Intrinsic.
+* QMod intrinsic: QMod Intrinsic.
+* QNInt intrinsic: QNInt Intrinsic.
+* QSin intrinsic: QSin Intrinsic.
+* QSinD intrinsic: QSinD Intrinsic.
+* QSinH intrinsic: QSinH Intrinsic.
+* QSqRt intrinsic: QSqRt Intrinsic.
+* QTan intrinsic: QTan Intrinsic.
+* QTanD intrinsic: QTanD Intrinsic.
+* QTanH intrinsic: QTanH Intrinsic.
+* questionable instructions: What is GNU Fortran?.
+* quick start: Quick Start.
+* Radix intrinsic: Radix Intrinsic.
+* Rand intrinsic: Rand Intrinsic.
+* Random_Number intrinsic: Random_Number Intrinsic.
+* Random_Seed intrinsic: Random_Seed Intrinsic.
+* Range intrinsic: Range Intrinsic.
+* range, increasing: Increasing Precision/Range.
+* rank, maximum: Compiler Limits.
+* Ratfor preprocessor: Overall Options.
+* reads and writes, scheduling: Aliasing Assumed To Work.
+* Real intrinsic: Real Intrinsic.
+* REAL intrinsic: REAL() and AIMAG() of Complex.
+* real part: Ugly Complex Part Extraction.
+* REAL(KIND=1) type: Compiler Types.
+* REAL(KIND=2) type: Compiler Types.
+* REAL*16 support: Full Support for Compiler Types.
+* RealPart intrinsic: RealPart Intrinsic.
+* recent versions <1>: Changes.
+* recent versions: News.
+* RECORD statement: STRUCTURE UNION RECORD MAP.
+* recursion, lack of: RECURSIVE Keyword.
+* RECURSIVE keyword: RECURSIVE Keyword.
+* reference works: Language.
+* Rename intrinsic <1>: Rename Intrinsic (function).
+* Rename intrinsic: Rename Intrinsic (subroutine).
+* Repeat intrinsic: Repeat Intrinsic.
+* reporting bugs: Bugs.
+* reporting compilation status: Overall Options.
+* requirements, GNU C: GNU C Required.
+* Reshape intrinsic: Reshape Intrinsic.
+* results, inconsistent: Floating-point Errors.
+* RETURN statement <1>: Alternate Returns.
+* RETURN statement: Functions.
+* return type of functions: Functions.
+* rounding errors: Floating-point Errors.
+* row-major ordering: Arrays.
+* RRSpacing intrinsic: RRSpacing Intrinsic.
+* RS/6000 support: Actual Bugs.
+* RShift intrinsic: RShift Intrinsic.
+* run-time library: What is GNU Fortran?.
+* run-time options: Code Gen Options.
+* runtime initialization: Startup Code.
+* SAVE statement: Code Gen Options.
+* saved variables: Variables Assumed To Be Saved.
+* Scale intrinsic: Scale Intrinsic.
+* Scan intrinsic: Scan Intrinsic.
+* scheduling of reads and writes: Aliasing Assumed To Work.
+* scope <1>: Scope and Classes of Names.
+* scope: Scope of Names and Labels.
+* search path: Directory Options.
+* searching for included files: Directory Options.
+* Secnds intrinsic: Secnds Intrinsic.
+* Second intrinsic <1>: Second Intrinsic (subroutine).
+* Second intrinsic: Second Intrinsic (function).
+* segmentation violation <1>: Strange Behavior at Run Time.
+* segmentation violation <2>: Stack Overflow.
+* segmentation violation <3>: NeXTStep Problems.
+* segmentation violation: Maximum Stackable Size.
+* Selected_Int_Kind intrinsic: Selected_Int_Kind Intrinsic.
+* Selected_Real_Kind intrinsic: Selected_Real_Kind Intrinsic.
+* semicolons: Statements Comments Lines.
+* separate distributions: Merging Distributions.
+* sequence numbers: Better Source Model.
+* Set_Exponent intrinsic: Set_Exponent Intrinsic.
+* SGI support: Actual Bugs.
+* Shape intrinsic: Shape Intrinsic.
+* SHIFT intrinsic: Bit Operations on Floating-point Data.
+* Short intrinsic: Short Intrinsic.
+* short source lines: Short Lines.
+* shorthand options: Shorthand Options.
+* side effects, order of evaluation: Order of Side Effects.
+* Sign intrinsic: Sign Intrinsic.
+* signal 11: Signal 11 and Friends.
+* Signal intrinsic <1>: Signal Intrinsic (function).
+* Signal intrinsic: Signal Intrinsic (subroutine).
+* SIGNAL() intrinsic: Actual Bugs.
+* signature of procedures: Procedures.
+* simplify porting: Simplify Porting.
+* Sin intrinsic: Sin Intrinsic.
+* SinD intrinsic: SinD Intrinsic.
+* SinH intrinsic: SinH Intrinsic.
+* Sleep intrinsic: Sleep Intrinsic.
+* slow compiler: Large Initialization.
+* Sngl intrinsic: Sngl Intrinsic.
+* SnglQ intrinsic: SnglQ Intrinsic.
+* Solaris: Strange Behavior at Run Time.
+* source code <1>: Unpacking.
+* source code <2>: Case Sensitivity.
+* source code <3>: Source Form.
+* source code <4>: Lines.
+* source code: What is GNU Fortran?.
+* source file: What is GNU Fortran?.
+* source file form: Fortran Dialect Options.
+* source file format <1>: Case Sensitivity.
+* source file format <2>: Source Form.
+* source file format <3>: Lines.
+* source file format: Fortran Dialect Options.
+* source form <1>: Source Form.
+* source form: Lines.
+* source lines, long: Long Lines.
+* source lines, short: Short Lines.
+* source tree: Unpacking.
+* space-padding: Short Lines.
+* spaces: Short Lines.
+* spaces, endless printing of: Strange Behavior at Run Time.
+* Spacing intrinsic: Spacing Intrinsic.
+* speed, compiler: Large Initialization.
+* speed, of compiler: Actual Bugs.
+* speeding up loops: Optimize Options.
+* speeding up programs: Faster Programs.
+* Spread intrinsic: Spread Intrinsic.
+* SqRt intrinsic: SqRt Intrinsic.
+* SRand intrinsic: SRand Intrinsic.
+* stack allocation: Maximum Stackable Size.
+* stack overflow: Stack Overflow.
+* stack, 387 coprocessor: Actual Bugs.
+* stack, aligned: Aligned Data.
+* stage directories: Cleanup Kills Stage Directories.
+* standard support: Standard Support.
+* standard, ANSI FORTRAN 77: Language.
+* startup code: Startup Code.
+* Stat intrinsic <1>: Stat Intrinsic (function).
+* Stat intrinsic: Stat Intrinsic (subroutine).
+* statement labels, assigned: Assigned Statement Labels.
+* statements, ACCEPT: TYPE and ACCEPT I/O Statements.
+* statements, ASSIGN <1>: Assigned Statement Labels.
+* statements, ASSIGN: Ugly Assigned Labels.
+* statements, BLOCK DATA <1>: Multiple Definitions of External Names.
+* statements, BLOCK DATA: Block Data and Libraries.
+* statements, CLOSE: OPEN CLOSE and INQUIRE Keywords.
+* statements, COMMON <1>: Multiple Definitions of External Names.
+* statements, COMMON: Common Blocks.
+* statements, COMPLEX: Complex Variables.
+* statements, DATA <1>: Actual Bugs.
+* statements, DATA: Code Gen Options.
+* statements, DECODE: ENCODE and DECODE.
+* statements, DIMENSION <1>: Array Bounds Expressions.
+* statements, DIMENSION <2>: Adjustable Arrays.
+* statements, DIMENSION: Arrays.
+* statements, DO <1>: Loops.
+* statements, DO: Warning Options.
+* statements, ENCODE: ENCODE and DECODE.
+* statements, ENTRY: Alternate Entry Points.
+* statements, EQUIVALENCE: Local Equivalence Areas.
+* statements, FORMAT: Expressions in FORMAT Statements.
+* statements, FUNCTION <1>: Functions.
+* statements, FUNCTION: Procedures.
+* statements, GOTO: Assigned Statement Labels.
+* statements, IMPLICIT CHARACTER*(*): Limitation on Implicit Declarations.
+* statements, INQUIRE: OPEN CLOSE and INQUIRE Keywords.
+* statements, MAP: STRUCTURE UNION RECORD MAP.
+* statements, NAMELIST: NAMELIST.
+* statements, OPEN: OPEN CLOSE and INQUIRE Keywords.
+* statements, PARAMETER <1>: Old-style PARAMETER Statements.
+* statements, PARAMETER: Intrinsics in PARAMETER Statements.
+* statements, POINTER: POINTER Statements.
+* statements, PROGRAM: Main Program Unit.
+* statements, RECORD: STRUCTURE UNION RECORD MAP.
+* statements, RETURN <1>: Alternate Returns.
+* statements, RETURN: Functions.
+* statements, SAVE: Code Gen Options.
+* statements, separated by semicolon: Statements Comments Lines.
+* statements, STRUCTURE: STRUCTURE UNION RECORD MAP.
+* statements, SUBROUTINE <1>: Alternate Returns.
+* statements, SUBROUTINE: Procedures.
+* statements, TYPE: TYPE and ACCEPT I/O Statements.
+* statements, UNION: STRUCTURE UNION RECORD MAP.
+* static variables: Variables Assumed To Be Saved.
+* status, compilation: Overall Options.
+* storage association: Aliasing Assumed To Work.
+* straight build: Straight Build.
+* strings, empty: Character Type.
+* strtoul: Missing strtoul.
+* STRUCTURE statement: STRUCTURE UNION RECORD MAP.
+* structures: Actual Bugs.
+* submodels: Use Submodel Options.
+* SUBROUTINE statement <1>: Alternate Returns.
+* SUBROUTINE statement: Procedures.
+* subroutines: Alternate Returns.
+* suffixes, file name: Overall Options.
+* Sum intrinsic: Sum Intrinsic.
+* SunOS4 <1>: Quick Start.
+* SunOS4: Missing strtoul.
+* support for ANSI FORTRAN 77: Standard Support.
+* support for gcc versions: Merging Distributions.
+* support, Alpha: Actual Bugs.
+* support, COMPLEX: Actual Bugs.
+* support, ELF: Actual Bugs.
+* support, f77: Backslash in Constants.
+* support, Fortran 90: Fortran 90 Support.
+* support, gdb: Debugger Problems.
+* support, RS/6000: Actual Bugs.
+* support, SGI: Actual Bugs.
+* suppressing warnings: Warning Options.
+* symbol names <1>: Names.
+* symbol names: Fortran Dialect Options.
+* symbol names, transforming: Code Gen Options.
+* symbol names, underscores: Code Gen Options.
+* symbolic names: Scope and Classes of Names.
+* SymLnk intrinsic <1>: SymLnk Intrinsic (function).
+* SymLnk intrinsic: SymLnk Intrinsic (subroutine).
+* synchronous write errors <1>: Output Assumed To Flush.
+* synchronous write errors: Always Flush Output.
+* syntax checking: Warning Options.
+* System intrinsic <1>: System Intrinsic (function).
+* System intrinsic: System Intrinsic (subroutine).
+* System_Clock intrinsic: System_Clock Intrinsic.
+* tab characters: Tabs.
+* table of intrinsics: Table of Intrinsic Functions.
+* Tan intrinsic: Tan Intrinsic.
+* TanD intrinsic: TanD Intrinsic.
+* TanH intrinsic: TanH Intrinsic.
+* test programs: Nothing Happens.
+* texinfo: Updating Documentation.
+* textbooks: Language.
+* threads: Support for Threads.
+* Time intrinsic <1>: Time Intrinsic (VXT).
+* Time intrinsic: Time Intrinsic (UNIX).
+* Time8 intrinsic: Time8 Intrinsic.
+* Tiny intrinsic: Tiny Intrinsic.
+* Toolpack: Increasing Precision/Range.
+* trailing commas: Ugly Null Arguments.
+* trailing comments: Statements Comments Lines.
+* trailing null byte: Character and Hollerith Constants.
+* Transfer intrinsic: Transfer Intrinsic.
+* transformation of symbol names: Names.
+* transforming symbol names: Code Gen Options.
+* translation of user programs: What is GNU Fortran?.
+* Transpose intrinsic: Transpose Intrinsic.
+* Trim intrinsic: Trim Intrinsic.
+* trips, number of: Loops.
+* truncation: Long Lines.
+* TtyNam intrinsic <1>: TtyNam Intrinsic (function).
+* TtyNam intrinsic: TtyNam Intrinsic (subroutine).
+* TYPE statement: TYPE and ACCEPT I/O Statements.
+* types, COMPLEX(KIND=1): Compiler Types.
+* types, COMPLEX(KIND=2): Compiler Types.
+* types, constants <1>: Compiler Constants.
+* types, constants <2>: Constants.
+* types, constants: Fortran Dialect Options.
+* types, DOUBLE COMPLEX: Compiler Types.
+* types, DOUBLE PRECISION: Compiler Types.
+* types, file: Overall Options.
+* types, Fortran/C: C Access to Type Information.
+* types, INTEGER(KIND=1): Compiler Types.
+* types, INTEGER(KIND=2): Compiler Types.
+* types, INTEGER(KIND=3): Compiler Types.
+* types, INTEGER(KIND=6): Compiler Types.
+* types, LOGICAL(KIND=1): Compiler Types.
+* types, LOGICAL(KIND=2): Compiler Types.
+* types, LOGICAL(KIND=3): Compiler Types.
+* types, LOGICAL(KIND=6): Compiler Types.
+* types, of data: Compiler Types.
+* types, REAL(KIND=1): Compiler Types.
+* types, REAL(KIND=2): Compiler Types.
+* UBound intrinsic: UBound Intrinsic.
+* ugly features <1>: Distensions.
+* ugly features: Shorthand Options.
+* UMask intrinsic <1>: UMask Intrinsic (function).
+* UMask intrinsic: UMask Intrinsic (subroutine).
+* undefined behavior: Bug Criteria.
+* undefined function value: Bug Criteria.
+* undefined reference (_main): Cannot Link Fortran Programs.
+* undefined reference (_strtoul): Missing strtoul.
+* underscores <1>: Mangling of Names.
+* underscores <2>: Underscores in Symbol Names.
+* underscores: Code Gen Options.
+* uninitialized variables <1>: Variables Assumed To Be Zero.
+* uninitialized variables <2>: Code Gen Options.
+* uninitialized variables: Warning Options.
+* UNION statement: STRUCTURE UNION RECORD MAP.
+* unit numbers <1>: Large File Unit Numbers.
+* unit numbers: Larger File Unit Numbers.
+* UNIX f77: Shorthand Options.
+* UNIX intrinsics: Fortran Dialect Options.
+* Unlink intrinsic <1>: Unlink Intrinsic (function).
+* Unlink intrinsic: Unlink Intrinsic (subroutine).
+* Unpack intrinsic: Unpack Intrinsic.
+* unpacking distributions: Unpacking.
+* unrecognized file format: What is GNU Fortran?.
+* unresolved reference (various): Cannot Link Fortran Programs.
+* unrolling loops: Optimize Options.
+* unsupported warnings: Warning Options.
+* unused arguments <1>: Unused Arguments.
+* unused arguments: Warning Options.
+* unused dummies: Warning Options.
+* unused parameters: Warning Options.
+* unused variables: Warning Options.
+* updating info directory: Updating Documentation.
+* uppercase letters: Case Sensitivity.
+* user-visible changes: Changes.
+* variables assumed to be zero: Variables Assumed To Be Zero.
+* variables retaining values across calls: Variables Assumed To Be Saved.
+* variables, initialization of: Code Gen Options.
+* variables, mistyped: Not My Type.
+* variables, uninitialized <1>: Code Gen Options.
+* variables, uninitialized: Warning Options.
+* variables, unused: Warning Options.
+* Verify intrinsic: Verify Intrinsic.
+* version information, printing <1>: Overall Options.
+* version information, printing: What is GNU Fortran?.
+* version numbering: Merging Distributions.
+* versions of gcc: Merging Distributions.
+* versions, recent <1>: Changes.
+* versions, recent: News.
+* VXT extensions: VXT Fortran.
+* VXT features: Fortran Dialect Options.
+* VXT intrinsics: Fortran Dialect Options.
+* warning messages: Warning Options.
+* warnings: What is GNU Fortran?.
+* warnings vs errors: Warnings and Errors.
+* warnings, all: Warning Options.
+* warnings, extra: Warning Options.
+* warnings, global names <1>: Code Gen Options.
+* warnings, global names: Warning Options.
+* warnings, implicit declaration: Warning Options.
+* warnings, unsupported: Warning Options.
+* why separate distributions: Merging Distributions.
+* wisdom: Collected Fortran Wisdom.
+* writes, flushing <1>: Output Assumed To Flush.
+* writes, flushing: Always Flush Output.
+* writing code: Collected Fortran Wisdom.
+* XOr intrinsic: XOr Intrinsic.
+* ZAbs intrinsic: ZAbs Intrinsic.
+* ZCos intrinsic: ZCos Intrinsic.
+* zero byte, trailing: Character and Hollerith Constants.
+* zero-initialized variables: Variables Assumed To Be Zero.
+* zero-length CHARACTER: Character Type.
+* ZExp intrinsic: ZExp Intrinsic.
+* ZExt intrinsic: ZExt Intrinsic.
+* ZLog intrinsic: ZLog Intrinsic.
+* ZSin intrinsic: ZSin Intrinsic.
+* ZSqRt intrinsic: ZSqRt Intrinsic.
+* zzz.c: Object File Differences.
+* zzz.o: Object File Differences.
+
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Code Gen Options, Next: Environment Variables, Prev: Directory Options, Up: Invoking G77
+
+Options for Code Generation Conventions
+=======================================
+
+ These machine-independent options control the interface conventions
+used in code generation.
+
+ Most of them have both positive and negative forms; the negative form
+of `-ffoo' would be `-fno-foo'. In the table below, only one of the
+forms is listed--the one which is not the default. You can figure out
+the other form by either removing `no-' or adding it.
+
+`-fno-automatic'
+ Treat each program unit as if the `SAVE' statement was specified
+ for every local variable and array referenced in it. Does not
+ affect common blocks. (Some Fortran compilers provide this option
+ under the name `-static'.)
+
+`-finit-local-zero'
+ Specify that variables and arrays that are local to a program unit
+ (not in a common block and not passed as an argument) are to be
+ initialized to binary zeros.
+
+ Since there is a run-time penalty for initialization of variables
+ that are not given the `SAVE' attribute, it might be a good idea
+ to also use `-fno-automatic' with `-finit-local-zero'.
+
+`-fno-f2c'
+ Do not generate code designed to be compatible with code generated
+ by `f2c'; use the GNU calling conventions instead.
+
+ The `f2c' calling conventions require functions that return type
+ `REAL(KIND=1)' to actually return the C type `double', and
+ functions that return type `COMPLEX' to return the values via an
+ extra argument in the calling sequence that points to where to
+ store the return value. Under the GNU calling conventions, such
+ functions simply return their results as they would in GNU
+ C--`REAL(KIND=1)' functions return the C type `float', and
+ `COMPLEX' functions return the GNU C type `complex' (or its
+ `struct' equivalent).
+
+ This does not affect the generation of code that interfaces with
+ the `libf2c' library.
+
+ However, because the `libf2c' library uses `f2c' calling
+ conventions, `g77' rejects attempts to pass intrinsics implemented
+ by routines in this library as actual arguments when `-fno-f2c' is
+ used, to avoid bugs when they are actually called by code
+ expecting the GNU calling conventions to work.
+
+ For example, `INTRINSIC ABS;CALL FOO(ABS)' is rejected when
+ `-fno-f2c' is in force. (Future versions of the `g77' run-time
+ library might offer routines that provide GNU-callable versions of
+ the routines that implement the `f2c'-callable intrinsics that may
+ be passed as actual arguments, so that valid programs need not be
+ rejected when `-fno-f2c' is used.)
+
+ *Caution:* If `-fno-f2c' is used when compiling any source file
+ used in a program, it must be used when compiling *all* Fortran
+ source files used in that program.
+
+`-ff2c-library'
+ Specify that use of `libf2c' is required. This is the default for
+ the current version of `g77'.
+
+ Currently it is not valid to specify `-fno-f2c-library'. This
+ option is provided so users can specify it in shell scripts that
+ build programs and libraries that require the `libf2c' library,
+ even when being compiled by future versions of `g77' that might
+ otherwise default to generating code for an incompatible library.
+
+`-fno-underscoring'
+ Do not transform names of entities specified in the Fortran source
+ file by appending underscores to them.
+
+ With `-funderscoring' in effect, `g77' appends two underscores to
+ names with underscores and one underscore to external names with
+ no underscores. (`g77' also appends two underscores to internal
+ names with underscores to avoid naming collisions with external
+ names. The `-fno-second-underscore' option disables appending of
+ the second underscore in all cases.)
+
+ This is done to ensure compatibility with code produced by many
+ UNIX Fortran compilers, including `f2c', which perform the same
+ transformations.
+
+ Use of `-fno-underscoring' is not recommended unless you are
+ experimenting with issues such as integration of (GNU) Fortran into
+ existing system environments (vis-a-vis existing libraries, tools,
+ and so on).
+
+ For example, with `-funderscoring', and assuming other defaults
+ like `-fcase-lower' and that `j()' and `max_count()' are external
+ functions while `my_var' and `lvar' are local variables, a
+ statement like
+
+ I = J() + MAX_COUNT (MY_VAR, LVAR)
+
+ is implemented as something akin to:
+
+ i = j_() + max_count__(&my_var__, &lvar);
+
+ With `-fno-underscoring', the same statement is implemented as:
+
+ i = j() + max_count(&my_var, &lvar);
+
+ Use of `-fno-underscoring' allows direct specification of
+ user-defined names while debugging and when interfacing
+ `g77'-compiled code with other languages.
+
+ Note that just because the names match does *not* mean that the
+ interface implemented by `g77' for an external name matches the
+ interface implemented by some other language for that same name.
+ That is, getting code produced by `g77' to link to code produced
+ by some other compiler using this or any other method can be only a
+ small part of the overall solution--getting the code generated by
+ both compilers to agree on issues other than naming can require
+ significant effort, and, unlike naming disagreements, linkers
+ normally cannot detect disagreements in these other areas.
+
+ Also, note that with `-fno-underscoring', the lack of appended
+ underscores introduces the very real possibility that a
+ user-defined external name will conflict with a name in a system
+ library, which could make finding unresolved-reference bugs quite
+ difficult in some cases--they might occur at program run time, and
+ show up only as buggy behavior at run time.
+
+ In future versions of `g77', we hope to improve naming and linking
+ issues so that debugging always involves using the names as they
+ appear in the source, even if the names as seen by the linker are
+ mangled to prevent accidental linking between procedures with
+ incompatible interfaces.
+
+`-fno-second-underscore'
+ Do not append a second underscore to names of entities specified
+ in the Fortran source file.
+
+ This option has no effect if `-fno-underscoring' is in effect.
+
+ Otherwise, with this option, an external name such as `MAX_COUNT'
+ is implemented as a reference to the link-time external symbol
+ `max_count_', instead of `max_count__'.
+
+`-fno-ident'
+ Ignore the `#ident' directive.
+
+`-fzeros'
+ Treat initial values of zero as if they were any other value.
+
+ As of version 0.5.18, `g77' normally treats `DATA' and other
+ statements that are used to specify initial values of zero for
+ variables and arrays as if no values were actually specified, in
+ the sense that no diagnostics regarding multiple initializations
+ are produced.
+
+ This is done to speed up compiling of programs that initialize
+ large arrays to zeros.
+
+ Use `-fzeros' to revert to the simpler, slower behavior that can
+ catch multiple initializations by keeping track of all
+ initializations, zero or otherwise.
+
+ *Caution:* Future versions of `g77' might disregard this option
+ (and its negative form, the default) or interpret it somewhat
+ differently. The interpretation changes will affect only
+ non-standard programs; standard-conforming programs should not be
+ affected.
+
+`-fdebug-kludge'
+ Emit information on `COMMON' and `EQUIVALENCE' members that might
+ help users of debuggers work around lack of proper debugging
+ information on such members.
+
+ As of version 0.5.19, `g77' offers this option to emit information
+ on members of aggregate areas to help users while debugging. This
+ information consists of establishing the type and contents of each
+ such member so that, when a debugger is asked to print the
+ contents, the printed information provides rudimentary debugging
+ information. This information identifies the name of the
+ aggregate area (either the `COMMON' block name, or the
+ `g77'-assigned name for the `EQUIVALENCE' name) and the offset, in
+ bytes, of the member from the beginning of the area.
+
+ Using `gdb', this information is not coherently displayed in the
+ Fortran language mode, so temporarily switching to the C language
+ mode to display the information is suggested. Use `set language
+ c' and `set language fortran' to accomplish this.
+
+ For example:
+
+ COMMON /X/A,B
+ EQUIVALENCE (C,D)
+ CHARACTER XX*50
+ EQUIVALENCE (I,XX(20:20))
+ END
+
+ GDB is free software and you are welcome to distribute copies of it
+ under certain conditions; type "show copying" to see the conditions.
+ There is absolutely no warranty for GDB; type "show warranty" for details.
+ GDB 4.16 (lm-gnits-dwim), Copyright 1996 Free Software Foundation, Inc...
+ (gdb) b MAIN__
+ Breakpoint 1 at 0t1200000201120112: file cd.f, line 5.
+ (gdb) r
+ Starting program: /home/user/a.out
+
+ Breakpoint 1, MAIN__ () at cd.f:5
+ Current language: auto; currently fortran
+ (gdb) set language c
+ Warning: the current language does not match this frame.
+ (gdb) p a
+ $2 = "At (COMMON) `x_' plus 0 bytes"
+ (gdb) p b
+ $3 = "At (COMMON) `x_' plus 4 bytes"
+ (gdb) p c
+ $4 = "At (EQUIVALENCE) `__g77_equiv_c' plus 0 bytes"
+ (gdb) p d
+ $5 = "At (EQUIVALENCE) `__g77_equiv_c' plus 0 bytes"
+ (gdb) p i
+ $6 = "At (EQUIVALENCE) `__g77_equiv_xx' plus 20 bytes"
+ (gdb) p xx
+ $7 = "At (EQUIVALENCE) `__g77_equiv_xx' plus 1 bytes"
+ (gdb) set language fortran
+ (gdb)
+
+ Use `-fdebug-kludge' to generate this information, which might
+ make some programs noticeably larger.
+
+ *Caution:* Future versions of `g77' might disregard this option
+ (and its negative form). Current plans call for this to happen
+ when published versions of `g77' and `gdb' exist that provide
+ proper access to debugging information on `COMMON' and
+ `EQUIVALENCE' members.
+
+`-fno-emulate-complex'
+ Implement `COMPLEX' arithmetic using the facilities in the `gcc'
+ back end that provide direct support of `complex' arithmetic,
+ instead of emulating the arithmetic.
+
+ `gcc' has some known problems in its back-end support for
+ `complex' arithmetic, due primarily to the support not being
+ completed as of version 2.7.2.2. Other front ends for the `gcc'
+ back end avoid this problem by emulating `complex' arithmetic at a
+ higher level, so the back end sees arithmetic on the real and
+ imaginary components. To make `g77' more portable to systems
+ where `complex' support in the `gcc' back end is particularly
+ troublesome, `g77' now defaults to performing the same kinds of
+ emulations done by these other front ends.
+
+ Use `-fno-emulate-complex' to try the `complex' support in the
+ `gcc' back end, in case it works and produces faster programs. So
+ far, all the known bugs seem to involve compile-time crashes,
+ rather than the generation of incorrect code.
+
+ Use of this option should not affect how Fortran code compiled by
+ `g77' works in terms of its interfaces to other code, e.g. that
+ compiled by `f2c'.
+
+ *Caution:* Future versions of `g77' are likely to change the
+ default for this option to `-fno-emulate-complex', and perhaps
+ someday ignore both forms of this option.
+
+ Also, it is possible that use of the `-fno-emulate-complex' option
+ could result in incorrect code being silently produced by `g77'.
+ But, this is generally true of compilers anyway, so, as usual, test
+ the programs you compile before assuming they are working.
+
+`-falias-check'
+
+`-fargument-alias'
+
+`-fargument-noalias'
+
+`-fno-argument-noalias-global'
+ These options specify to what degree aliasing (overlap) is
+ permitted between arguments (passed as pointers) and `COMMON'
+ (external, or public) storage.
+
+ The default for Fortran code, as mandated by the FORTRAN 77 and
+ Fortran 90 standards, is `-fargument-noalias-global'. The default
+ for code written in the C language family is `-fargument-alias'.
+
+ Note that, on some systems, compiling with `-fforce-addr' in
+ effect can produce more optimal code when the default aliasing
+ options are in effect (and when optimization is enabled).
+
+ *Note Aliasing Assumed To Work::, for detailed information on the
+ implications of compiling Fortran code that depends on the ability
+ to alias dummy arguments.
+
+`-fno-globals'
+ Disable diagnostics about inter-procedural analysis problems, such
+ as disagreements about the type of a function or a procedure's
+ argument, that might cause a compiler crash when attempting to
+ inline a reference to a procedure within a program unit. (The
+ diagnostics themselves are still produced, but as warnings, unless
+ `-Wno-globals' is specified, in which case no relevant diagnostics
+ are produced.)
+
+ Further, this option disables such inlining, to avoid compiler
+ crashes resulting from incorrect code that would otherwise be
+ diagnosed.
+
+ As such, this option might be quite useful when compiling
+ existing, "working" code that happens to have a few bugs that do
+ not generally show themselves, but `g77' exposes via a diagnostic.
+
+ Use of this option therefore has the effect of instructing `g77'
+ to behave more like it did up through version 0.5.19.1, when it
+ paid little or no attention to disagreements between program units
+ about a procedure's type and argument information, and when it
+ performed no inlining of procedures (except statement functions).
+
+ Without this option, `g77' defaults to performing the potentially
+ inlining procedures as it started doing in version 0.5.20, but as
+ of version 0.5.21, it also diagnoses disagreements that might
+ cause such inlining to crash the compiler.
+
+ *Note Options for Code Generation Conventions: (gcc)Code Gen
+Options, for information on more options offered by the GBE shared by
+`g77', `gcc', and other GNU compilers.
+
+ Some of these do *not* work when compiling programs written in
+Fortran:
+
+`-fpcc-struct-return'
+
+`-freg-struct-return'
+ You should not use these except strictly the same way as you used
+ them to build the version of `libf2c' with which you will be
+ linking all code compiled by `g77' with the same option.
+
+`-fshort-double'
+ This probably either has no effect on Fortran programs, or makes
+ them act loopy.
+
+`-fno-common'
+ Do not use this when compiling Fortran programs, or there will be
+ Trouble.
+
+`-fpack-struct'
+ This probably will break any calls to the `libf2c' library, at the
+ very least, even if it is built with the same option.
+
+\1f
+File: g77.info, Node: Environment Variables, Prev: Code Gen Options, Up: Invoking G77
+
+Environment Variables Affecting GNU Fortran
+===========================================
+
+ GNU Fortran currently does not make use of any environment variables
+to control its operation above and beyond those that affect the
+operation of `gcc'.
+
+ *Note Environment Variables Affecting GNU CC: (gcc)Environment
+Variables, for information on environment variables.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: News, Next: Changes, Prev: Invoking G77, Up: Top
+
+News About GNU Fortran
+**********************
+
+ Changes made to recent versions of GNU Fortran are listed below,
+with the most recent version first.
+
+ The changes are generally listed with code-generation bugs first,
+followed by compiler crashes involving valid code, new features, fixes
+to existing features, new diagnostics, internal improvements, and
+miscellany. This order is not strict--for example, some items involve
+a combination of these elements.
+
+In 0.5.21:
+==========
+
+ * Fix a code-generation bug introduced by 0.5.20 caused by loop
+ unrolling (by specifying `-funroll-loops' or similar). This bug
+ afflicted all code compiled by version 2.7.2.2.f.2 of `gcc' (C,
+ C++, Fortran, and so on).
+
+ * Fix a code-generation bug manifested when combining local
+ `EQUIVALENCE' with a `DATA' statement that follows the first
+ executable statement (or is treated as an executable-context
+ statement as a result of using the `-fpedantic' option).
+
+ * Fix a compiler crash that occured when an integer division by a
+ constant zero is detected. Instead, when the `-W' option is
+ specified, the `gcc' back end issues a warning about such a case.
+ This bug afflicted all code compiled by version 2.7.2.2.f.2 of
+ `gcc' (C, C++, Fortran, and so on).
+
+ * Fix a compiler crash that occurred in some cases of procedure
+ inlining. (Such cases became more frequent in 0.5.20.)
+
+ * Fix a compiler crash resulting from using `DATA' or similar to
+ initialize a `COMPLEX' variable or array to zero.
+
+ * Fix compiler crashes involving use of `AND', `OR', or `XOR'
+ intrinsics.
+
+ * Fix compiler bug triggered when using a `COMMON' or `EQUIVALENCE'
+ variable as the target of an `ASSIGN' or assigned-`GOTO' statement.
+
+ * Fix compiler crashes due to using the name of a some non-standard
+ intrinsics (such as `FTELL' or `FPUTC') as such and as the name of
+ a procedure or common block. Such dual use of a name in a program
+ is allowed by the standard.
+
+ * Place automatic arrays on the stack, even if `SAVE' or the
+ `-fno-automatic' option is in effect. This avoids a compiler
+ crash in some cases.
+
+ * The `-malign-double' option now reliably aligns `DOUBLE PRECISION'
+ optimally on Pentium and Pentium Pro architectures (586 and 686 in
+ `gcc').
+
+ * New option `-Wno-globals' disables warnings about "suspicious" use
+ of a name both as a global name and as the implicit name of an
+ intrinsic, and warnings about disagreements over the number or
+ natures of arguments passed to global procedures, or the natures
+ of the procedures themselves.
+
+ The default is to issue such warnings, which are new as of this
+ version of `g77'.
+
+ * New option `-fno-globals' disables diagnostics about potentially
+ fatal disagreements analysis problems, such as disagreements over
+ the number or natures of arguments passed to global procedures, or
+ the natures of those procedures themselves.
+
+ The default is to issue such diagnostics and flag the compilation
+ as unsuccessful. With this option, the diagnostics are issued as
+ warnings, or, if `-Wno-globals' is specified, are not issued at
+ all.
+
+ This option also disables inlining of global procedures, to avoid
+ compiler crashes resulting from coding errors that these
+ diagnostics normally would identify.
+
+ * Diagnose cases where a reference to a procedure disagrees with the
+ type of that procedure, or where disagreements about the number or
+ nature of arguments exist. This avoids a compiler crash.
+
+ * Fix parsing bug whereby `g77' rejected a second initialization
+ specification immediately following the first's closing `/' without
+ an intervening comma in a `DATA' statement, and the second
+ specification was an implied-DO list.
+
+ * Improve performance of the `gcc' back end so certain complicated
+ expressions involving `COMPLEX' arithmetic (especially
+ multiplication) don't appear to take forever to compile.
+
+ * Fix a couple of profiling-related bugs in `gcc' back end.
+
+ * Integrate GNU Ada's (GNAT's) changes to the back end, which
+ consist almost entirely of bug fixes. These fixes are circa
+ version 3.10p of GNAT.
+
+ * Include some other `gcc' fixes that seem useful in `g77''s version
+ of `gcc'. (See `gcc/ChangeLog' for details--compare it to that
+ file in the vanilla `gcc-2.7.2.3.tar.gz' distribution.)
+
+ * Fix `libU77' routines that accept file and other names to strip
+ trailing blanks from them, for consistency with other
+ implementations. Blanks may be forcibly appended to such names by
+ appending a single null character (`CHAR(0)') to the significant
+ trailing blanks.
+
+ * Fix `CHMOD' intrinsic to work with file names that have embedded
+ blanks, commas, and so on.
+
+ * Fix `SIGNAL' intrinsic so it accepts an optional third `Status'
+ argument.
+
+ * Fix `IDATE()' intrinsic subroutine (VXT form) so it accepts
+ arguments in the correct order. Documentation fixed accordingly,
+ and for `GMTIME()' and `LTIME()' as well.
+
+ * Make many changes to `libU77' intrinsics to support existing code
+ more directly.
+
+ Such changes include allowing both subroutine and function forms
+ of many routines, changing `MCLOCK()' and `TIME()' to return
+ `INTEGER(KIND=1)' values, introducing `MCLOCK8()' and `TIME8()' to
+ return `INTEGER(KIND=2)' values, and placing functions that are
+ intended to perform side effects in a new intrinsic group,
+ `badu77'.
+
+ * Improve `libU77' so it is more portable.
+
+ * Add options `-fbadu77-intrinsics-delete',
+ `-fbadu77-intrinsics-hide', and so on.
+
+ * Fix crashes involving diagnosed or invalid code.
+
+ * `g77' and `gcc' now do a somewhat better job detecting and
+ diagnosing arrays that are too large to handle before these cause
+ diagnostics during the assembler or linker phase, a compiler
+ crash, or generation of incorrect code.
+
+ * Make some fixes to alias analysis code.
+
+ * Add support for `restrict' keyword in `gcc' front end.
+
+ * Support `gcc' version 2.7.2.3 (modified by `g77' into version
+ 2.7.2.3.f.1), and remove support for prior versions of `gcc'.
+
+ * Incorporate GNAT's patches to the `gcc' back end into `g77''s, so
+ GNAT users do not need to apply GNAT's patches to build both GNAT
+ and `g77' from the same source tree.
+
+ * Modify `make' rules and related code so that generation of Info
+ documentation doesn't require compilation using `gcc'. Now, any
+ ANSI C compiler should be adequate to produce the `g77'
+ documentation (in particular, the tables of intrinsics) from
+ scratch.
+
+ * Add `INT2' and `INT8' intrinsics.
+
+ * Add `CPU_TIME' intrinsic.
+
+ * Add `ALARM' intrinsic.
+
+ * `CTIME' intrinsic now accepts any `INTEGER' argument, not just
+ `INTEGER(KIND=2)'.
+
+ * Warn when explicit type declaration disagrees with the type of an
+ intrinsic invocation.
+
+ * Support `*f771' entry in `gcc' `specs' file.
+
+ * Fix typo in `make' rule `g77-cross', used only for cross-compiling.
+
+ * Fix `libf2c' build procedure to re-archive library if previous
+ attempt to archive was interrupted.
+
+ * Change `gcc' to unroll loops only during the last invocation (of
+ as many as two invocations) of loop optimization.
+
+ * Improve handling of `-fno-f2c' so that code that attempts to pass
+ an intrinsic as an actual argument, such as `CALL FOO(ABS)', is
+ rejected due to the fact that the run-time-library routine is,
+ effectively, compiled with `-ff2c' in effect.
+
+ * Fix `g77' driver to recognize `-fsyntax-only' as an option that
+ inhibits linking, just like `-c' or `-S', and to recognize and
+ properly handle the `-nostdlib', `-M', `-MM', `-nodefaultlibs',
+ and `-Xlinker' options.
+
+ * Upgrade to `libf2c' as of 1997-08-16.
+
+ * Modify `libf2c' to consistently and clearly diagnose recursive I/O
+ (at run time).
+
+ * `g77' driver now prints version information (such as produced by
+ `g77 -v') to `stderr' instead of `stdout'.
+
+ * The `.r' suffix now designates a Ratfor source file, to be
+ preprocessed via the `ratfor' command, available separately.
+
+ * Fix some aspects of how `gcc' determines what kind of system is
+ being configured and what kinds are supported. For example, GNU
+ Linux/Alpha ELF systems now are directly supported.
+
+ * Improve diagnostics.
+
+ * Improve documentation and indexing.
+
+ * Include all pertinent files for `libf2c' that come from
+ `netlib.bell-labs.com'; give any such files that aren't quite
+ accurate in `g77''s version of `libf2c' the suffix `.netlib'.
+
+ * Reserve `INTEGER(KIND=0)' for future use.
+
+In 0.5.20:
+==========
+
+ * The `-fno-typeless-boz' option is now the default.
+
+ This option specifies that non-decimal-radix constants using the
+ prefixed-radix form (such as `Z'1234'') are to be interpreted as
+ `INTEGER' constants. Specify `-ftypeless-boz' to cause such
+ constants to be interpreted as typeless.
+
+ (Version 0.5.19 introduced `-fno-typeless-boz' and its inverse.)
+
+ * Options `-ff90-intrinsics-enable' and `-fvxt-intrinsics-enable'
+ now are the defaults.
+
+ Some programs might use names that clash with intrinsic names
+ defined (and now enabled) by these options or by the new `libU77'
+ intrinsics. Users of such programs might need to compile them
+ differently (using, for example, `-ff90-intrinsics-disable') or,
+ better yet, insert appropriate `EXTERNAL' statements specifying
+ that these names are not intended to be names of intrinsics.
+
+ * The `ALWAYS_FLUSH' macro is no longer defined when building
+ `libf2c', which should result in improved I/O performance,
+ especially over NFS.
+
+ *Note:* If you have code that depends on the behavior of `libf2c'
+ when built with `ALWAYS_FLUSH' defined, you will have to modify
+ `libf2c' accordingly before building it from this and future
+ versions of `g77'.
+
+ * Dave Love's implementation of `libU77' has been added to the
+ version of `libf2c' distributed with and built as part of `g77'.
+ `g77' now knows about the routines in this library as intrinsics.
+
+ * New option `-fvxt' specifies that the source file is written in
+ VXT Fortran, instead of GNU Fortran.
+
+ * The `-fvxt-not-f90' option has been deleted, along with its
+ inverse, `-ff90-not-vxt'.
+
+ If you used one of these deleted options, you should re-read the
+ pertinent documentation to determine which options, if any, are
+ appropriate for compiling your code with this version of `g77'.
+
+ * The `-fugly' option now issues a warning, as it likely will be
+ removed in a future version.
+
+ (Enabling all the `-fugly-*' options is unlikely to be feasible,
+ or sensible, in the future, so users should learn to specify only
+ those `-fugly-*' options they really need for a particular source
+ file.)
+
+ * The `-fugly-assumed' option, introduced in version 0.5.19, has
+ been changed to better accommodate old and new code.
+
+ * Make a number of fixes to the `g77' front end and the `gcc' back
+ end to better support Alpha (AXP) machines. This includes
+ providing at least one bug-fix to the `gcc' back end for Alphas.
+
+ * Related to supporting Alpha (AXP) machines, the `LOC()' intrinsic
+ and `%LOC()' construct now return values of integer type that is
+ the same width (holds the same number of bits) as the pointer type
+ on the machine.
+
+ On most machines, this won't make a difference, whereas on Alphas,
+ the type these constructs return is `INTEGER*8' instead of the
+ more common `INTEGER*4'.
+
+ * Emulate `COMPLEX' arithmetic in the `g77' front end, to avoid bugs
+ in `complex' support in the `gcc' back end. New option
+ `-fno-emulate-complex' causes `g77' to revert the 0.5.19 behavior.
+
+ * Fix bug whereby `REAL A(1)', for example, caused a compiler crash
+ if `-fugly-assumed' was in effect and A was a local (automatic)
+ array. That case is no longer affected by the new handling of
+ `-fugly-assumed'.
+
+ * Fix `g77' command driver so that `g77 -o foo.f' no longer deletes
+ `foo.f' before issuing other diagnostics, and so the `-x' option
+ is properly handled.
+
+ * Enable inlining of subroutines and functions by the `gcc' back end.
+ This works as it does for `gcc' itself--program units may be
+ inlined for invocations that follow them in the same program unit,
+ as long as the appropriate compile-time options are specified.
+
+ * Dummy arguments are no longer assumed to potentially alias
+ (overlap) other dummy arguments or `COMMON' areas when any of
+ these are defined (assigned to) by Fortran code.
+
+ This can result in faster and/or smaller programs when compiling
+ with optimization enabled, though on some systems this effect is
+ observed only when `-fforce-addr' also is specified.
+
+ New options `-falias-check', `-fargument-alias',
+ `-fargument-noalias', and `-fno-argument-noalias-global' control
+ the way `g77' handles potential aliasing.
+
+ * The `CONJG()' and `DCONJG()' intrinsics now are compiled in-line.
+
+ * The bug-fix for 0.5.19.1 has been re-done. The `g77' compiler has
+ been changed back to assume `libf2c' has no aliasing problems in
+ its implementations of the `COMPLEX' (and `DOUBLE COMPLEX')
+ intrinsics. The `libf2c' has been changed to have no such
+ problems.
+
+ As a result, 0.5.20 is expected to offer improved performance over
+ 0.5.19.1, perhaps as good as 0.5.19 in most or all cases, due to
+ this change alone.
+
+ *Note:* This change requires version 0.5.20 of `libf2c', at least,
+ when linking code produced by any versions of `g77' other than
+ 0.5.19.1. Use `g77 -v' to determine the version numbers of the
+ `libF77', `libI77', and `libU77' components of the `libf2c'
+ library. (If these version numbers are not printed--in
+ particular, if the linker complains about unresolved references to
+ names like `g77__fvers__'--that strongly suggests your
+ installation has an obsolete version of `libf2c'.)
+
+ * New option `-fugly-assign' specifies that the same memory
+ locations are to be used to hold the values assigned by both
+ statements `I = 3' and `ASSIGN 10 TO I', for example. (Normally,
+ `g77' uses a separate memory location to hold assigned statement
+ labels.)
+
+ * `FORMAT' and `ENTRY' statements now are allowed to precede
+ `IMPLICIT NONE' statements.
+
+ * Produce diagnostic for unsupported `SELECT CASE' on `CHARACTER'
+ type, instead of crashing, at compile time.
+
+ * Fix crashes involving diagnosed or invalid code.
+
+ * Change approach to building `libf2c' archive (`libf2c.a') so that
+ members are added to it only when truly necessary, so the user
+ that installs an already-built `g77' doesn't need to have write
+ access to the build tree (whereas the user doing the build might
+ not have access to install new software on the system).
+
+ * Support `gcc' version 2.7.2.2 (modified by `g77' into version
+ 2.7.2.2.f.2), and remove support for prior versions of `gcc'.
+
+ * Upgrade to `libf2c' as of 1997-02-08, and fix up some of the build
+ procedures.
+
+ * Improve general build procedures for `g77', fixing minor bugs
+ (such as deletion of any file named `f771' in the parent directory
+ of `gcc/').
+
+ * Enable full support of `INTEGER*8' available in `libf2c' and
+ `f2c.h' so that `f2c' users may make full use of its features via
+ the `g77' version of `f2c.h' and the `INTEGER*8' support routines
+ in the `g77' version of `libf2c'.
+
+ * Improve `g77' driver and `libf2c' so that `g77 -v' yields version
+ information on the library.
+
+ * The `SNGL' and `FLOAT' intrinsics now are specific intrinsics,
+ instead of synonyms for the generic intrinsic `REAL'.
+
+ * New intrinsics have been added. These are `REALPART', `IMAGPART',
+ `COMPLEX', `LONG', and `SHORT'.
+
+ * A new group of intrinsics, `gnu', has been added to contain the
+ new `REALPART', `IMAGPART', and `COMPLEX' intrinsics. An old
+ group, `dcp', has been removed.
+
+ * Complain about industry-wide ambiguous references `REAL(EXPR)' and
+ `AIMAG(EXPR)', where EXPR is `DOUBLE COMPLEX' (or any complex type
+ other than `COMPLEX'), unless `-ff90' option specifies Fortran 90
+ interpretation or new `-fugly-complex' option, in conjunction with
+ `-fnot-f90', specifies `f2c' interpretation.
+
+ * Make improvements to diagnostics.
+
+ * Speed up compiler a bit.
+
+ * Improvements to documentation and indexing, including a new
+ chapter containing information on one, later more, diagnostics
+ that users are directed to pull up automatically via a message in
+ the diagnostic itself.
+
+ (Hence the menu item `M' for the node `Diagnostics' in the
+ top-level menu of the Info documentation.)
+
+In 0.5.19.1:
+============
+
+ * Code-generation bugs afflicting operations on complex data have
+ been fixed.
+
+ These bugs occurred when assigning the result of an operation to a
+ complex variable (or array element) that also served as an input
+ to that operation.
+
+ The operations affected by this bug were: `CONJG()', `DCONJG()',
+ `CCOS()', `CDCOS()', `CLOG()', `CDLOG()', `CSIN()', `CDSIN()',
+ `CSQRT()', `CDSQRT()', complex division, and raising a `DOUBLE
+ COMPLEX' operand to an `INTEGER' power. (The related generic and
+ `Z'-prefixed intrinsics, such as `ZSIN()', also were affected.)
+
+ For example, `C = CSQRT(C)', `Z = Z/C', and `Z = Z**I' (where `C'
+ is `COMPLEX' and `Z' is `DOUBLE COMPLEX') have been fixed.
+
+In 0.5.19:
+==========
+
+ * Fix `FORMAT' statement parsing so negative values for specifiers
+ such as `P' (e.g. `FORMAT(-1PF8.1)') are correctly processed as
+ negative.
+
+ * Fix `SIGNAL' intrinsic so it once again accepts a procedure as its
+ second argument.
+
+ * A temporary kludge option provides bare-bones information on
+ `COMMON' and `EQUIVALENCE' members at debug time.
+
+ * New `-fonetrip' option specifies FORTRAN-66-style one-trip `DO'
+ loops.
+
+ * New `-fno-silent' option causes names of program units to be
+ printed as they are compiled, in a fashion similar to UNIX `f77'
+ and `f2c'.
+
+ * New `-fugly-assumed' option specifies that arrays dimensioned via
+ `DIMENSION X(1)', for example, are to be treated as assumed-size.
+
+ * New `-fno-typeless-boz' option specifies that non-decimal-radix
+ constants using the prefixed-radix form (such as `Z'1234'') are to
+ be interpreted as `INTEGER' constants.
+
+ * New `-ff66' option is a "shorthand" option that specifies
+ behaviors considered appropriate for FORTRAN 66 programs.
+
+ * New `-ff77' option is a "shorthand" option that specifies
+ behaviors considered appropriate for UNIX `f77' programs.
+
+ * New `-fugly-comma' and `-fugly-logint' options provided to perform
+ some of what `-fugly' used to do. `-fugly' and `-fno-ugly' are
+ now "shorthand" options, in that they do nothing more than enable
+ (or disable) other `-fugly-*' options.
+
+ * Fix parsing of assignment statements involving targets that are
+ substrings of elements of `CHARACTER' arrays having names such as
+ `READ', `WRITE', `GOTO', and `REALFUNCTIONFOO'.
+
+ * Fix crashes involving diagnosed code.
+
+ * Fix handling of local `EQUIVALENCE' areas so certain cases of
+ valid Fortran programs are not misdiagnosed as improperly
+ extending the area backwards.
+
+ * Support `gcc' version 2.7.2.1.
+
+ * Upgrade to `libf2c' as of 1996-09-26, and fix up some of the build
+ procedures.
+
+ * Change code generation for list-directed I/O so it allows for new
+ versions of `libf2c' that might return non-zero status codes for
+ some operations previously assumed to always return zero.
+
+ This change not only affects how `IOSTAT=' variables are set by
+ list-directed I/O, it also affects whether `END=' and `ERR='
+ labels are reached by these operations.
+
+ * Add intrinsic support for new `FTELL' and `FSEEK' procedures in
+ `libf2c'.
+
+ * Modify `fseek_()' in `libf2c' to be more portable (though, in
+ practice, there might be no systems where this matters) and to
+ catch invalid `whence' arguments.
+
+ * Some useless warnings from the `-Wunused' option have been
+ eliminated.
+
+ * Fix a problem building the `f771' executable on AIX systems by
+ linking with the `-bbigtoc' option.
+
+ * Abort configuration if `gcc' has not been patched using the patch
+ file provided in the `gcc/f/gbe/' subdirectory.
+
+ * Add options `--help' and `--version' to the `g77' command, to
+ conform to GNU coding guidelines. Also add printing of `g77'
+ version number when the `--verbose' (`-v') option is used.
+
+ * Change internally generated name for local `EQUIVALENCE' areas to
+ one based on the alphabetically sorted first name in the list of
+ names for entities placed at the beginning of the areas.
+
+ * Improvements to documentation and indexing.
+
+In 0.5.18:
+==========
+
+ * Add some rudimentary support for `INTEGER*1', `INTEGER*2',
+ `INTEGER*8', and their `LOGICAL' equivalents. (This support works
+ on most, maybe all, `gcc' targets.)
+
+ Thanks to Scott Snyder (<snyder@d0sgif.fnal.gov>) for providing
+ the patch for this!
+
+ Among the missing elements from the support for these features are
+ full intrinsic support and constants.
+
+ * Add some rudimentary support for the `BYTE' and `WORD'
+ type-declaration statements. `BYTE' corresponds to `INTEGER*1',
+ while `WORD' corresponds to `INTEGER*2'.
+
+ Thanks to Scott Snyder (<snyder@d0sgif.fnal.gov>) for providing
+ the patch for this!
+
+ * The compiler code handling intrinsics has been largely rewritten
+ to accommodate the new types. No new intrinsics or arguments for
+ existing intrinsics have been added, so there is, at this point,
+ no intrinsic to convert to `INTEGER*8', for example.
+
+ * Support automatic arrays in procedures.
+
+ * Reduce space/time requirements for handling large *sparsely*
+ initialized aggregate arrays. This improvement applies to only a
+ subset of the general problem to be addressed in 0.6.
+
+ * Treat initial values of zero as if they weren't specified (in DATA
+ and type-declaration statements). The initial values will be set
+ to zero anyway, but the amount of compile time processing them
+ will be reduced, in some cases significantly (though, again, this
+ is only a subset of the general problem to be addressed in 0.6).
+
+ A new option, `-fzeros', is introduced to enable the traditional
+ treatment of zeros as any other value.
+
+ * With `-ff90' in force, `g77' incorrectly interpreted `REAL(Z)' as
+ returning a `REAL' result, instead of as a `DOUBLE PRECISION'
+ result. (Here, `Z' is `DOUBLE COMPLEX'.)
+
+ With `-fno-f90' in force, the interpretation remains unchanged,
+ since this appears to be how at least some F77 code using the
+ `DOUBLE COMPLEX' extension expected it to work.
+
+ Essentially, `REAL(Z)' in F90 is the same as `DBLE(Z)', while in
+ extended F77, it appears to be the same as `REAL(REAL(Z))'.
+
+ * An expression involving exponentiation, where both operands were
+ type `INTEGER' and the right-hand operand was negative, was
+ erroneously evaluated.
+
+ * Fix bugs involving `DATA' implied-`DO' constructs (these involved
+ an errant diagnostic and a crash, both on good code, one involving
+ subsequent statement-function definition).
+
+ * Close `INCLUDE' files after processing them, so compiling source
+ files with lots of `INCLUDE' statements does not result in being
+ unable to open `INCLUDE' files after all the available file
+ descriptors are used up.
+
+ * Speed up compiling, especially of larger programs, and perhaps
+ slightly reduce memory utilization while compiling (this is *not*
+ the improvement planned for 0.6 involving large aggregate
+ areas)--these improvements result from simply turning off some
+ low-level code to do self-checking that hasn't been triggered in a
+ long time.
+
+ * Introduce three new options that implement optimizations in the
+ `gcc' back end (GBE). These options are `-fmove-all-movables',
+ `-freduce-all-givs', and `-frerun-loop-opt', which are enabled, by
+ default, for Fortran compilations. These optimizations are
+ intended to help toon Fortran programs.
+
+ * Patch the GBE to do a better job optimizing certain kinds of
+ references to array elements.
+
+ * Due to patches to the GBE, the version number of `gcc' also is
+ patched to make it easier to manage installations, especially
+ useful if it turns out a `g77' change to the GBE has a bug.
+
+ The `g77'-modified version number is the `gcc' version number with
+ the string `.f.N' appended, where `f' identifies the version as
+ enhanced for Fortran, and N is `1' for the first Fortran patch for
+ that version of `gcc', `2' for the second, and so on.
+
+ So, this introduces version 2.7.2.f.1 of `gcc'.
+
+ * Make several improvements and fixes to diagnostics, including the
+ removal of two that were inappropriate or inadequate.
+
+ * Warning about two successive arithmetic operators, produced by
+ `-Wsurprising', now produced *only* when both operators are,
+ indeed, arithmetic (not relational/boolean).
+
+ * `-Wsurprising' now warns about the remaining cases of using
+ non-integral variables for implied-`DO' loops, instead of these
+ being rejected unless `-fpedantic' or `-fugly' specified.
+
+ * Allow `SAVE' of a local variable or array, even after it has been
+ given an initial value via `DATA', for example.
+
+ * Introduce an Info version of `g77' documentation, which supercedes
+ `gcc/f/CREDITS', `gcc/f/DOC', and `gcc/f/PROJECTS'. These files
+ will be removed in a future release. The files `gcc/f/BUGS',
+ `gcc/f/INSTALL', and `gcc/f/NEWS' now are automatically built from
+ the texinfo source when distributions are made.
+
+ This effort was inspired by a first pass at translating
+ `g77-0.5.16/f/DOC' that was contributed to Craig by David Ronis
+ (<ronis@onsager.chem.mcgill.ca>).
+
+ * New `-fno-second-underscore' option to specify that, when
+ `-funderscoring' is in effect, a second underscore is not to be
+ appended to Fortran names already containing an underscore.
+
+ * Change the way iterative `DO' loops work to follow the F90
+ standard. In particular, calculation of the iteration count is
+ still done by converting the start, end, and increment parameters
+ to the type of the `DO' variable, but the result of the
+ calculation is always converted to the default `INTEGER' type.
+
+ (This should have no effect on existing code compiled by `g77',
+ but code written to assume that use of a *wider* type for the `DO'
+ variable will result in an iteration count being fully calculated
+ using that wider type (wider than default `INTEGER') must be
+ rewritten.)
+
+ * Support `gcc' version 2.7.2.
+
+ * Upgrade to `libf2c' as of 1996-03-23, and fix up some of the build
+ procedures.
+
+ Note that the email addresses related to `f2c' have changed--the
+ distribution site now is named `netlib.bell-labs.com', and the
+ maintainer's new address is <dmg@bell-labs.com>.
+
+In 0.5.17:
+==========
+
+ * *Fix serious bug* in `g77 -v' command that can cause removal of a
+ system's `/dev/null' special file if run by user `root'.
+
+ *All users* of version 0.5.16 should ensure that they have not
+ removed `/dev/null' or replaced it with an ordinary file (e.g. by
+ comparing the output of `ls -l /dev/null' with `ls -l /dev/zero'.
+ If the output isn't basically the same, contact your system
+ administrator about restoring `/dev/null' to its proper status).
+
+ This bug is particularly insidious because removing `/dev/null' as
+ a special file can go undetected for quite a while, aside from
+ various applications and programs exhibiting sudden, strange
+ behaviors.
+
+ I sincerely apologize for not realizing the implications of the
+ fact that when `g77 -v' runs the `ld' command with `-o /dev/null'
+ that `ld' tries to *remove* the executable it is supposed to build
+ (especially if it reports unresolved references, which it should
+ in this case)!
+
+ * Fix crash on `CHARACTER*(*) FOO' in a main or block data program
+ unit.
+
+ * Fix crash that can occur when diagnostics given outside of any
+ program unit (such as when input file contains `@foo').
+
+ * Fix crashes, infinite loops (hangs), and such involving diagnosed
+ code.
+
+ * Fix `ASSIGN''ed variables so they can be `SAVE''d or dummy
+ arguments, and issue clearer error message in cases where target
+ of `ASSIGN' or `ASSIGN'ed `GOTO'/`FORMAT' is too small (which
+ should never happen).
+
+ * Make `libf2c' build procedures work on more systems again by
+ eliminating unnecessary invocations of `ld -r -x' and `mv'.
+
+ * Fix omission of `-funix-intrinsics-...' options in list of
+ permitted options to compiler.
+
+ * Fix failure to always diagnose missing type declaration for
+ `IMPLICIT NONE'.
+
+ * Fix compile-time performance problem (which could sometimes crash
+ the compiler, cause a hang, or whatever, due to a bug in the back
+ end) involving exponentiation with a large `INTEGER' constant for
+ the right-hand operator (e.g. `I**32767').
+
+ * Fix build procedures so cross-compiling `g77' (the `fini' utility
+ in particular) is properly built using the host compiler.
+
+ * Add new `-Wsurprising' option to warn about constructs that are
+ interpreted by the Fortran standard (and `g77') in ways that are
+ surprising to many programmers.
+
+ * Add `ERF()' and `ERFC()' as generic intrinsics mapping to existing
+ `ERF'/`DERF' and `ERFC'/`DERFC' specific intrinsics.
+
+ *Note:* You should specify `INTRINSIC ERF,ERFC' in any code where
+ you might use these as generic intrinsics, to improve likelihood
+ of diagnostics (instead of subtle run-time bugs) when using a
+ compiler that doesn't support these as intrinsics (e.g. `f2c').
+
+ * Remove from `-fno-pedantic' the diagnostic about `DO' with
+ non-`INTEGER' index variable; issue that under `-Wsurprising'
+ instead.
+
+ * Clarify some diagnostics that say things like "ignored" when that's
+ misleading.
+
+ * Clarify diagnostic on use of `.EQ.'/`.NE.' on `LOGICAL' operands.
+
+ * Minor improvements to code generation for various operations on
+ `LOGICAL' operands.
+
+ * Minor improvement to code generation for some `DO' loops on some
+ machines.
+
+ * Support `gcc' version 2.7.1.
+
+ * Upgrade to `libf2c' as of 1995-11-15.
+
+In 0.5.16:
+==========
+
+ * Fix a code-generation bug involving complicated `EQUIVALENCE'
+ statements not involving `COMMON'.
+
+ * Fix code-generation bugs involving invoking "gratis" library
+ procedures in `libf2c' from code compiled with `-fno-f2c' by
+ making these procedures known to `g77' as intrinsics (not affected
+ by -fno-f2c). This is known to fix code invoking `ERF()',
+ `ERFC()', `DERF()', and `DERFC()'.
+
+ * Update `libf2c' to include netlib patches through 1995-08-16, and
+ `#define' `WANT_LEAD_0' to 1 to make `g77'-compiled code more
+ consistent with other Fortran implementations by outputting
+ leading zeros in formatted and list-directed output.
+
+ * Fix a code-generation bug involving adjustable dummy arrays with
+ high bounds whose primaries are changed during procedure
+ execution, and which might well improve code-generation
+ performance for such arrays compared to `f2c' plus `gcc' (but
+ apparently only when using `gcc-2.7.0' or later).
+
+ * Fix a code-generation bug involving invocation of `COMPLEX' and
+ `DOUBLE COMPLEX' `FUNCTION's and doing `COMPLEX' and `DOUBLE
+ COMPLEX' divides, when the result of the invocation or divide is
+ assigned directly to a variable that overlaps one or more of the
+ arguments to the invocation or divide.
+
+ * Fix crash by not generating new optimal code for `X**I' if `I' is
+ nonconstant and the expression is used to dimension a dummy array,
+ since the `gcc' back end does not support the necessary mechanics
+ (and the `gcc' front end rejects the equivalent construct, as it
+ turns out).
+
+ * Fix crash on expressions like `COMPLEX**INTEGER'.
+
+ * Fix crash on expressions like `(1D0,2D0)**2', i.e. raising a
+ `DOUBLE COMPLEX' constant to an `INTEGER' constant power.
+
+ * Fix crashes and such involving diagnosed code.
+
+ * Diagnose, instead of crashing on, statement function definitions
+ having duplicate dummy argument names.
+
+ * Fix bug causing rejection of good code involving statement function
+ definitions.
+
+ * Fix bug resulting in debugger not knowing size of local equivalence
+ area when any member of area has initial value (via `DATA', for
+ example).
+
+ * Fix installation bug that prevented installation of `g77' driver.
+ Provide for easy selection of whether to install copy of `g77' as
+ `f77' to replace the broken code.
+
+ * Fix `gcc' driver (affects `g77' thereby) to not gratuitously
+ invoke the `f771' program (e.g. when `-E' is specified).
+
+ * Fix diagnostic to point to correct source line when it immediately
+ follows an `INCLUDE' statement.
+
+ * Support more compiler options in `gcc'/`g77' when compiling
+ Fortran files. These options include `-p', `-pg', `-aux-info',
+ `-P', correct setting of version-number macros for preprocessing,
+ full recognition of `-O0', and automatic insertion of
+ configuration-specific linker specs.
+
+ * Add new intrinsics that interface to existing routines in `libf2c':
+ `ABORT', `DERF', `DERFC', `ERF', `ERFC', `EXIT', `FLUSH',
+ `GETARG', `GETENV', `IARGC', `SIGNAL', and `SYSTEM'. Note that
+ `ABORT', `EXIT', `FLUSH', `SIGNAL', and `SYSTEM' are intrinsic
+ subroutines, not functions (since they have side effects), so to
+ get the return values from `SIGNAL' and `SYSTEM', append a final
+ argument specifying an `INTEGER' variable or array element (e.g.
+ `CALL SYSTEM('rm foo',ISTAT)').
+
+ * Add new intrinsic group named `unix' to contain the new intrinsics,
+ and by default enable this new group.
+
+ * Move `LOC()' intrinsic out of the `vxt' group to the new `unix'
+ group.
+
+ * Improve `g77' so that `g77 -v' by itself (or with certain other
+ options, including `-B', `-b', `-i', `-nostdlib', and `-V')
+ reports lots more useful version info, and so that long-form
+ options `gcc' accepts are understood by `g77' as well (even in
+ truncated, unambiguous forms).
+
+ * Add new `g77' option `--driver=name' to specify driver when
+ default, `gcc', isn't appropriate.
+
+ * Add support for `#' directives (as output by the preprocessor) in
+ the compiler, and enable generation of those directives by the
+ preprocessor (when compiling `.F' files) so diagnostics and
+ debugging info are more useful to users of the preprocessor.
+
+ * Produce better diagnostics, more like `gcc', with info such as `In
+ function `foo':' and `In file included from...:'.
+
+ * Support `gcc''s `-fident' and `-fno-ident' options.
+
+ * When `-Wunused' in effect, don't warn about local variables used as
+ statement-function dummy arguments or `DATA' implied-`DO' iteration
+ variables, even though, strictly speaking, these are not uses of
+ the variables themselves.
+
+ * When `-W -Wunused' in effect, don't warn about unused dummy
+ arguments at all, since there's no way to turn this off for
+ individual cases (`g77' might someday start warning about
+ these)--applies to `gcc' versions 2.7.0 and later, since earlier
+ versions didn't warn about unused dummy arguments.
+
+ * New option `-fno-underscoring' that inhibits transformation of
+ names (by appending one or two underscores) so users may experiment
+ with implications of such an environment.
+
+ * Minor improvement to `gcc/f/info' module to make it easier to build
+ `g77' using the native (non-`gcc') compiler on certain machines
+ (but definitely not all machines nor all non-`gcc' compilers).
+ Please do not report bugs showing problems compilers have with
+ macros defined in `gcc/f/target.h' and used in places like
+ `gcc/f/expr.c'.
+
+ * Add warning to be printed for each invocation of the compiler if
+ the target machine `INTEGER', `REAL', or `LOGICAL' size is not 32
+ bits, since `g77' is known to not work well for such cases (to be
+ fixed in Version 0.6--*note Actual Bugs We Haven't Fixed Yet:
+ Actual Bugs.).
+
+ * Lots of new documentation (though work is still needed to put it
+ into canonical GNU format).
+
+ * Build `libf2c' with `-g0', not `-g2', in effect (by default), to
+ produce smaller library without lots of debugging clutter.
+
+In 0.5.15:
+==========
+
+ * Fix bad code generation involving `X**I' and temporary, internal
+ variables generated by `g77' and the back end (such as for `DO'
+ loops).
+
+ * Fix crash given `CHARACTER A;DATA A/.TRUE./'.
+
+ * Replace crash with diagnostic given `CHARACTER A;DATA A/1.0/'.
+
+ * Fix crash or other erratic behavior when null character constant
+ (`''') is encountered.
+
+ * Fix crash or other erratic behavior involving diagnosed code.
+
+ * Fix code generation for external functions returning type `REAL'
+ when the `-ff2c' option is in force (which it is by default) so
+ that `f2c' compatibility is indeed provided.
+
+ * Disallow `COMMON I(10)' if `I' has previously been specified with
+ an array declarator.
+
+ * New `-ffixed-line-length-N' option, where N is the maximum length
+ of a typical fixed-form line, defaulting to 72 columns, such that
+ characters beyond column N are ignored, or N is `none', meaning no
+ characters are ignored. does not affect lines with `&' in column
+ 1, which are always processed as if `-ffixed-line-length-none' was
+ in effect.
+
+ * No longer generate better code for some kinds of array references,
+ as `gcc' back end is to be fixed to do this even better, and it
+ turned out to slow down some code in some cases after all.
+
+ * In `COMMON' and `EQUIVALENCE' areas with any members given initial
+ values (e.g. via `DATA'), uninitialized members now always
+ initialized to binary zeros (though this is not required by the
+ standard, and might not be done in future versions of `g77').
+ Previously, in some `COMMON'/`EQUIVALENCE' areas (essentially
+ those with members of more than one type), the uninitialized
+ members were initialized to spaces, to cater to `CHARACTER' types,
+ but it seems no existing code expects that, while much existing
+ code expects binary zeros.
+
+In 0.5.14:
+==========
+
+ * Don't emit bad code when low bound of adjustable array is
+ nonconstant and thus might vary as an expression at run time.
+
+ * Emit correct code for calculation of number of trips in `DO' loops
+ for cases where the loop should not execute at all. (This bug
+ affected cases where the difference between the begin and end
+ values was less than the step count, though probably not for
+ floating-point cases.)
+
+ * Fix crash when extra parentheses surround item in `DATA'
+ implied-`DO' list.
+
+ * Fix crash over minor internal inconsistencies in handling
+ diagnostics, just substitute dummy strings where necessary.
+
+ * Fix crash on some systems when compiling call to `MVBITS()'
+ intrinsic.
+
+ * Fix crash on array assignment `TYPEDDD(...)=...', where DDD is a
+ string of one or more digits.
+
+ * Fix crash on `DCMPLX()' with a single `INTEGER' argument.
+
+ * Fix various crashes involving code with diagnosed errors.
+
+ * Support `-I' option for `INCLUDE' statement, plus `gcc''s
+ `header.gcc' facility for handling systems like MS-DOS.
+
+ * Allow `INCLUDE' statement to be continued across multiple lines,
+ even allow it to coexist with other statements on the same line.
+
+ * Incorporate Bellcore fixes to `libf2c' through 1995-03-15--this
+ fixes a bug involving infinite loops reading EOF with empty
+ list-directed I/O list.
+
+ * Remove all the `g77'-specific auto-configuration scripts, code,
+ and so on, except for temporary substitutes for bsearch() and
+ strtoul(), as too many configure/build problems were reported in
+ these areas. People will have to fix their systems' problems
+ themselves, or at least somewhere other than `g77', which expects
+ a working ANSI C environment (and, for now, a GNU C compiler to
+ compile `g77' itself).
+
+ * Complain if initialized common redeclared as larger in subsequent
+ program unit.
+
+ * Warn if blank common initialized, since its size can vary and hence
+ related warnings that might be helpful won't be seen.
+
+ * New `-fbackslash' option, on by default, that causes `\' within
+ `CHARACTER' and Hollerith constants to be interpreted a la GNU C.
+ Note that this behavior is somewhat different from `f2c''s, which
+ supports only a limited subset of backslash (escape) sequences.
+
+ * Make `-fugly-args' the default.
+
+ * New `-fugly-init' option, on by default, that allows
+ typeless/Hollerith to be specified as initial values for variables
+ or named constants (`PARAMETER'), and also allows
+ character<->numeric conversion in those contexts--turn off via
+ `-fno-ugly-init'.
+
+ * New `-finit-local-zero' option to initialize local variables to
+ binary zeros. This does not affect whether they are `SAVE'd, i.e.
+ made automatic or static.
+
+ * New `-Wimplicit' option to warn about implicitly typed variables,
+ arrays, and functions. (Basically causes all program units to
+ default to `IMPLICIT NONE'.)
+
+ * `-Wall' now implies `-Wuninitialized' as with `gcc' (i.e. unless
+ `-O' not specified, since `-Wuninitialized' requires `-O'), and
+ implies `-Wunused' as well.
+
+ * `-Wunused' no longer gives spurious messages for unused `EXTERNAL'
+ names (since they are assumed to refer to block data program
+ units, to make use of libraries more reliable).
+
+ * Support `%LOC()' and `LOC()' of character arguments.
+
+ * Support null (zero-length) character constants and expressions.
+
+ * Support `f2c''s `IMAG()' generic intrinsic.
+
+ * Support `ICHAR()', `IACHAR()', and `LEN()' of character
+ expressions that are valid in assignments but not normally as
+ actual arguments.
+
+ * Support `f2c'-style `&' in column 1 to mean continuation line.
+
+ * Allow `NAMELIST', `EXTERNAL', `INTRINSIC', and `VOLATILE' in
+ `BLOCK DATA', even though these are not allowed by the standard.
+
+ * Allow `RETURN' in main program unit.
+
+ * Changes to Hollerith-constant support to obey Appendix C of the
+ standard:
+
+ - Now padded on the right with zeros, not spaces.
+
+ - Hollerith "format specifications" in the form of arrays of
+ non-character allowed.
+
+ - Warnings issued when non-space truncation occurs when
+ converting to another type.
+
+ - When specified as actual argument, now passed by reference to
+ `INTEGER' (padded on right with spaces if constant too small,
+ otherwise fully intact if constant wider the `INTEGER' type)
+ instead of by value.
+
+ *Warning:* `f2c' differs on the interpretation of `CALL FOO(1HX)',
+ which it treats exactly the same as `CALL FOO('X')', but which the
+ standard and `g77' treat as `CALL FOO(%REF('X '))' (padded with
+ as many spaces as necessary to widen to `INTEGER'), essentially.
+
+ * Changes and fixes to typeless-constant support:
+
+ - Now treated as a typeless double-length `INTEGER' value.
+
+ - Warnings issued when overflow occurs.
+
+ - Padded on the left with zeros when converting to a larger
+ type.
+
+ - Should be properly aligned and ordered on the target machine
+ for whatever type it is turned into.
+
+ - When specified as actual argument, now passed as reference to
+ a default `INTEGER' constant.
+
+ * `%DESCR()' of a non-`CHARACTER' expression now passes a pointer to
+ the expression plus a length for the expression just as if it were
+ a `CHARACTER' expression. For example, `CALL FOO(%DESCR(D))',
+ where `D' is `REAL*8', is the same as `CALL FOO(D,%VAL(8)))'.
+
+ * Name of multi-entrypoint master function changed to incorporate
+ the name of the primary entry point instead of a decimal value, so
+ the name of the master function for `SUBROUTINE X' with alternate
+ entry points is now `__g77_masterfun_x'.
+
+ * Remove redundant message about zero-step-count `DO' loops.
+
+ * Clean up diagnostic messages, shortening many of them.
+
+ * Fix typo in `g77' man page.
+
+ * Clarify implications of constant-handling bugs in `f/BUGS'.
+
+ * Generate better code for `**' operator with a right-hand operand of
+ type `INTEGER'.
+
+ * Generate better code for `SQRT()' and `DSQRT()', also when
+ `-ffast-math' specified, enable better code generation for `SIN()'
+ and `COS()'.
+
+ * Generate better code for some kinds of array references.
+
+ * Speed up lexing somewhat (this makes the compilation phase
+ noticeably faster).
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Changes, Next: Language, Prev: News, Up: Top
+
+User-visible Changes
+********************
+
+ This section describes changes to `g77' that are visible to the
+programmers who actually write and maintain Fortran code they compile
+with `g77'. Information on changes to installation procedures, changes
+to the documentation, and bug fixes is not provided here, unless it is
+likely to affect how users use `g77'. *Note News About GNU Fortran:
+News, for information on such changes to `g77'.
+
+ To find out about existing bugs and ongoing plans for GNU Fortran,
+retrieve `ftp://alpha.gnu.ai.mit.edu/g77.plan' or, if you cannot do
+that, email <fortran@gnu.ai.mit.edu> asking for a recent copy of the
+GNU Fortran `.plan' file.
+
+In 0.5.21:
+==========
+
+ * When the `-W' option is specified, `gcc', `g77', and other GNU
+ compilers that incorporate the `gcc' back end as modified by
+ `g77', issue a warning about integer division by constant zero.
+
+ * New option `-Wno-globals' disables warnings about "suspicious" use
+ of a name both as a global name and as the implicit name of an
+ intrinsic, and warnings about disagreements over the number or
+ natures of arguments passed to global procedures, or the natures
+ of the procedures themselves.
+
+ The default is to issue such warnings, which are new as of this
+ version of `g77'.
+
+ * New option `-fno-globals' disables diagnostics about potentially
+ fatal disagreements analysis problems, such as disagreements over
+ the number or natures of arguments passed to global procedures, or
+ the natures of those procedures themselves.
+
+ The default is to issue such diagnostics and flag the compilation
+ as unsuccessful. With this option, the diagnostics are issued as
+ warnings, or, if `-Wno-globals' is specified, are not issued at
+ all.
+
+ This option also disables inlining of global procedures, to avoid
+ compiler crashes resulting from coding errors that these
+ diagnostics normally would identify.
+
+ * Fix `libU77' routines that accept file names to strip trailing
+ spaces from them, for consistency with other implementations.
+
+ * Fix `SIGNAL' intrinsic so it accepts an optional third `Status'
+ argument.
+
+ * Make many changes to `libU77' intrinsics to support existing code
+ more directly.
+
+ Such changes include allowing both subroutine and function forms
+ of many routines, changing `MCLOCK()' and `TIME()' to return
+ `INTEGER(KIND=1)' values, introducing `MCLOCK8()' and `TIME8()' to
+ return `INTEGER(KIND=2)' values, and placing functions that are
+ intended to perform side effects in a new intrinsic group,
+ `badu77'.
+
+ * Add options `-fbadu77-intrinsics-delete',
+ `-fbadu77-intrinsics-hide', and so on.
+
+ * Add `INT2' and `INT8' intrinsics.
+
+ * Add `CPU_TIME' intrinsic.
+
+ * `CTIME' intrinsic now accepts any `INTEGER' argument, not just
+ `INTEGER(KIND=2)'.
+
+In 0.5.20:
+==========
+
+ * The `-fno-typeless-boz' option is now the default.
+
+ This option specifies that non-decimal-radix constants using the
+ prefixed-radix form (such as `Z'1234'') are to be interpreted as
+ `INTEGER(KIND=1)' constants. Specify `-ftypeless-boz' to cause
+ such constants to be interpreted as typeless.
+
+ (Version 0.5.19 introduced `-fno-typeless-boz' and its inverse.)
+
+ *Note Options Controlling Fortran Dialect: Fortran Dialect Options,
+ for information on the `-ftypeless-boz' option.
+
+ * Options `-ff90-intrinsics-enable' and `-fvxt-intrinsics-enable'
+ now are the defaults.
+
+ Some programs might use names that clash with intrinsic names
+ defined (and now enabled) by these options or by the new `libU77'
+ intrinsics. Users of such programs might need to compile them
+ differently (using, for example, `-ff90-intrinsics-disable') or,
+ better yet, insert appropriate `EXTERNAL' statements specifying
+ that these names are not intended to be names of intrinsics.
+
+ * The `ALWAYS_FLUSH' macro is no longer defined when building
+ `libf2c', which should result in improved I/O performance,
+ especially over NFS.
+
+ *Note:* If you have code that depends on the behavior of `libf2c'
+ when built with `ALWAYS_FLUSH' defined, you will have to modify
+ `libf2c' accordingly before building it from this and future
+ versions of `g77'.
+
+ *Note Output Assumed To Flush::, for more information.
+
+ * Dave Love's implementation of `libU77' has been added to the
+ version of `libf2c' distributed with and built by `g77'. `g77'
+ now knows about the routines in this library as intrinsics.
+
+ * New option `-fvxt' specifies that the source file is written in
+ VXT Fortran, instead of GNU Fortran.
+
+ *Note VXT Fortran::, for more information on the constructs
+ recognized when the `-fvxt' option is specified.
+
+ * The `-fvxt-not-f90' option has been deleted, along with its
+ inverse, `-ff90-not-vxt'.
+
+ If you used one of these deleted options, you should re-read the
+ pertinent documentation to determine which options, if any, are
+ appropriate for compiling your code with this version of `g77'.
+
+ *Note Other Dialects::, for more information.
+
+ * The `-fugly' option now issues a warning, as it likely will be
+ removed in a future version.
+
+ (Enabling all the `-fugly-*' options is unlikely to be feasible,
+ or sensible, in the future, so users should learn to specify only
+ those `-fugly-*' options they really need for a particular source
+ file.)
+
+ * The `-fugly-assumed' option, introduced in version 0.5.19, has
+ been changed to better accommodate old and new code. *Note Ugly
+ Assumed-Size Arrays::, for more information.
+
+ * Related to supporting Alpha (AXP) machines, the `LOC()' intrinsic
+ and `%LOC()' construct now return values of `INTEGER(KIND=0)' type,
+ as defined by the GNU Fortran language.
+
+ This type is wide enough (holds the same number of bits) as the
+ character-pointer type on the machine.
+
+ On most systems, this won't make a noticable difference, whereas
+ on Alphas and other systems with 64-bit pointers, the
+ `INTEGER(KIND=0)' type is equivalent to `INTEGER(KIND=2)' (often
+ referred to as `INTEGER*8') instead of the more common
+ `INTEGER(KIND=1)' (often referred to as `INTEGER*4').
+
+ * Emulate `COMPLEX' arithmetic in the `g77' front end, to avoid bugs
+ in `complex' support in the `gcc' back end. New option
+ `-fno-emulate-complex' causes `g77' to revert the 0.5.19 behavior.
+
+ * Dummy arguments are no longer assumed to potentially alias
+ (overlap) other dummy arguments or `COMMON' areas when any of
+ these are defined (assigned to) by Fortran code.
+
+ This can result in faster and/or smaller programs when compiling
+ with optimization enabled, though on some systems this effect is
+ observed only when `-fforce-addr' also is specified.
+
+ New options `-falias-check', `-fargument-alias',
+ `-fargument-noalias', and `-fno-argument-noalias-global' control
+ the way `g77' handles potential aliasing.
+
+ *Note Aliasing Assumed To Work::, for detailed information on why
+ the new defaults might result in some programs no longer working
+ the way they did when compiled by previous versions of `g77'.
+
+ * New option `-fugly-assign' specifies that the same memory
+ locations are to be used to hold the values assigned by both
+ statements `I = 3' and `ASSIGN 10 TO I', for example. (Normally,
+ `g77' uses a separate memory location to hold assigned statement
+ labels.)
+
+ *Note Ugly Assigned Labels::, for more information.
+
+ * `FORMAT' and `ENTRY' statements now are allowed to precede
+ `IMPLICIT NONE' statements.
+
+ * Enable full support of `INTEGER(KIND=2)' (often referred to as
+ `INTEGER*8') available in `libf2c' and `f2c.h' so that `f2c' users
+ may make full use of its features via the `g77' version of `f2c.h'
+ and the `INTEGER(KIND=2)' support routines in the `g77' version of
+ `libf2c'.
+
+ * Improve `g77' driver and `libf2c' so that `g77 -v' yields version
+ information on the library.
+
+ * The `SNGL' and `FLOAT' intrinsics now are specific intrinsics,
+ instead of synonyms for the generic intrinsic `REAL'.
+
+ * New intrinsics have been added. These are `REALPART', `IMAGPART',
+ `COMPLEX', `LONG', and `SHORT'.
+
+ * A new group of intrinsics, `gnu', has been added to contain the
+ new `REALPART', `IMAGPART', and `COMPLEX' intrinsics. An old
+ group, `dcp', has been removed.
+
+In 0.5.19:
+==========
+
+ * A temporary kludge option provides bare-bones information on
+ `COMMON' and `EQUIVALENCE' members at debug time. *Note Options
+ for Code Generation Conventions: Code Gen Options, for information
+ on the `-fdebug-kludge' option.
+
+ * New `-fonetrip' option specifies FORTRAN-66-style one-trip `DO'
+ loops.
+
+ * New `-fno-silent' option causes names of program units to be
+ printed as they are compiled, in a fashion similar to UNIX `f77'
+ and `f2c'.
+
+ * New `-fugly-assumed' option specifies that arrays dimensioned via
+ `DIMENSION X(1)', for example, are to be treated as assumed-size.
+
+ * New `-fno-typeless-boz' option specifies that non-decimal-radix
+ constants using the prefixed-radix form (such as `Z'1234'') are to
+ be interpreted as `INTEGER(KIND=1)' constants.
+
+ * New `-ff66' option is a "shorthand" option that specifies
+ behaviors considered appropriate for FORTRAN 66 programs.
+
+ * New `-ff77' option is a "shorthand" option that specifies
+ behaviors considered appropriate for UNIX `f77' programs.
+
+ * New `-fugly-comma' and `-fugly-logint' options provided to perform
+ some of what `-fugly' used to do. `-fugly' and `-fno-ugly' are
+ now "shorthand" options, in that they do nothing more than enable
+ (or disable) other `-fugly-*' options.
+
+ * Change code generation for list-directed I/O so it allows for new
+ versions of `libf2c' that might return non-zero status codes for
+ some operations previously assumed to always return zero.
+
+ This change not only affects how `IOSTAT=' variables are set by
+ list-directed I/O, it also affects whether `END=' and `ERR='
+ labels are reached by these operations.
+
+ * Add intrinsic support for new `FTELL' and `FSEEK' procedures in
+ `libf2c'.
+
+ * Add options `--help' and `--version' to the `g77' command, to
+ conform to GNU coding guidelines. Also add printing of `g77'
+ version number when the `--verbose' (`-v') option is used.
+
+In 0.5.18:
+==========
+
+ * The `BYTE' and `WORD' statements now are supported, to a limited
+ extent.
+
+ * `INTEGER*1', `INTEGER*2', `INTEGER*8', and their `LOGICAL'
+ equivalents, now are supported to a limited extent. Among the
+ missing elements are complete intrinsic and constant support.
+
+ * Support automatic arrays in procedures. For example, `REAL A(N)',
+ where `A' is not a dummy argument, specifies that `A' is an
+ automatic array. The size of `A' is calculated from the value of
+ `N' each time the procedure is called, that amount of space is
+ allocated, and that space is freed when the procedure returns to
+ its caller.
+
+ * Add `-fno-zeros' option, enabled by default, to reduce
+ compile-time CPU and memory usage for code that provides initial
+ zero values for variables and arrays.
+
+ * Introduce three new options that apply to all compilations by
+ `g77'-aware GNU compilers--`-fmove-all-movables',
+ `-freduce-all-givs', and `-frerun-loop-opt'--which can improve the
+ run-time performance of some programs.
+
+ * Replace much of the existing documentation with a single Info
+ document.
+
+ * New option `-fno-second-underscore'.
+
+In 0.5.17:
+==========
+
+ * The `ERF()' and `ERFC()' intrinsics now are generic intrinsics,
+ mapping to `ERF'/`DERF' and `ERFC'/`DERFC', respectively. *Note:*
+ Use `INTRINSIC ERF,ERFC' in any code that might reference these as
+ generic intrinsics, to improve the likelihood of diagnostics
+ (instead of subtle run-time bugs) when using compilers that don't
+ support these as intrinsics.
+
+ * New option `-Wsurprising'.
+
+ * DO loops with non-`INTEGER' variables now diagnosed only when
+ `-Wsurprising' specified. Previously, this was diagnosed *unless*
+ `-fpedantic' or `-fugly' was specified.
+
+In 0.5.16:
+==========
+
+ * `libf2c' changed to output a leading zero (0) digit for
+ floating-point values output via list-directed and formatted
+ output (to bring `g77' more into line with many existing Fortran
+ implementations--the ANSI FORTRAN 77 standard leaves this choice
+ to the implementation).
+
+ * `libf2c' no longer built with debugging information intact, making
+ it much smaller.
+
+ * Automatic installation of the `g77' command now works.
+
+ * Diagnostic messages now more informative, a la `gcc', including
+ messages like `In function `foo':' and `In file included from...:'.
+
+ * New group of intrinsics called `unix', including `ABORT', `DERF',
+ `DERFC', `ERF', `ERFC', `EXIT', `FLUSH', `GETARG', `GETENV',
+ `SIGNAL', and `SYSTEM'.
+
+ * `-funix-intrinsics-{delete,hide,disable,enable}' options added.
+
+ * `-fno-underscoring' option added.
+
+ * `--driver' option added to the `g77' command.
+
+ * Support for the `gcc' options `-fident' and `-fno-ident' added.
+
+ * `g77 -v' returns much more version info, making the submission of
+ better bug reports easily.
+
+ * Many improvements to the `g77' command to better fulfill its role
+ as a front-end to the `gcc' driver. For example, `g77' now
+ recognizes `--verbose' as a verbose way of specifying `-v'.
+
+ * Compiling preprocessed (`*.F' and `*.fpp') files now results in
+ better diagnostics and debugging information, as the
+ source-location info now is passed all the way through the
+ compilation process instead of being lost.
+
+\1f
+File: g77.info, Node: Language, Next: Compiler, Prev: Changes, Up: Top
+
+The GNU Fortran Language
+************************
+
+ GNU Fortran supports a variety of extensions to, and dialects of,
+the Fortran language. Its primary base is the ANSI FORTRAN 77
+standard, currently available on the network at
+`http://kumo.swcp.com/fortran/F77_std/f77_std.html' or in
+`ftp://ftp.ast.cam.ac.uk/pub/michael/'. It offers some extensions that
+are popular among users of UNIX `f77' and `f2c' compilers, some that
+are popular among users of other compilers (such as Digital products),
+some that are popular among users of the newer Fortran 90 standard, and
+some that are introduced by GNU Fortran.
+
+ (If you need a text on Fortran, a few freely available electronic
+references have pointers from `http://www.fortran.com/fortran/Books/'.)
+
+ Part of what defines a particular implementation of a Fortran
+system, such as `g77', is the particular characteristics of how it
+supports types, constants, and so on. Much of this is left up to the
+implementation by the various Fortran standards and accepted practice
+in the industry.
+
+ The GNU Fortran *language* is described below. Much of the material
+is organized along the same lines as the ANSI FORTRAN 77 standard
+itself.
+
+ *Note Other Dialects::, for information on features `g77' supports
+that are not part of the GNU Fortran language.
+
+ *Note*: This portion of the documentation definitely needs a lot of
+work!
+
+* Menu:
+
+Relationship to the ANSI FORTRAN 77 standard:
+* Direction of Language Development:: Where GNU Fortran is headed.
+* Standard Support:: Degree of support for the standard.
+
+Extensions to the ANSI FORTRAN 77 standard:
+* Conformance::
+* Notation Used::
+* Terms and Concepts::
+* Characters Lines Sequence::
+* Data Types and Constants::
+* Expressions::
+* Specification Statements::
+* Control Statements::
+* Functions and Subroutines::
+* Scope and Classes of Names::
+
+\1f
+File: g77.info, Node: Direction of Language Development, Next: Standard Support, Up: Language
+
+Direction of Language Development
+=================================
+
+ The purpose of the following description of the GNU Fortran language
+is to promote wide portability of GNU Fortran programs.
+
+ GNU Fortran is an evolving language, due to the fact that `g77'
+itself is in beta test. Some current features of the language might
+later be redefined as dialects of Fortran supported by `g77' when
+better ways to express these features are added to `g77', for example.
+Such features would still be supported by `g77', but would be available
+only when one or more command-line options were used.
+
+ The GNU Fortran *language* is distinct from the GNU Fortran
+*compilation system* (`g77').
+
+ For example, `g77' supports various dialects of Fortran--in a sense,
+these are languages other than GNU Fortran--though its primary purpose
+is to support the GNU Fortran language, which also is described in its
+documentation and by its implementation.
+
+ On the other hand, non-GNU compilers might offer support for the GNU
+Fortran language, and are encouraged to do so.
+
+ Currently, the GNU Fortran language is a fairly fuzzy object. It
+represents something of a cross between what `g77' accepts when
+compiling using the prevailing defaults and what this document
+describes as being part of the language.
+
+ Future versions of `g77' are expected to clarify the definition of
+the language in the documentation. Often, this will mean adding new
+features to the language, in the form of both new documentation and new
+support in `g77'. However, it might occasionally mean removing a
+feature from the language itself to "dialect" status. In such a case,
+the documentation would be adjusted to reflect the change, and `g77'
+itself would likely be changed to require one or more command-line
+options to continue supporting the feature.
+
+ The development of the GNU Fortran language is intended to strike a
+balance between:
+
+ * Serving as a mostly-upwards-compatible language from the de facto
+ UNIX Fortran dialect as supported by `f77'.
+
+ * Offering new, well-designed language features. Attributes of such
+ features include not making existing code any harder to read (for
+ those who might be unaware that the new features are not in use)
+ and not making state-of-the-art compilers take longer to issue
+ diagnostics, among others.
+
+ * Supporting existing, well-written code without gratuitously
+ rejecting non-standard constructs, regardless of the origin of the
+ code (its dialect).
+
+ * Offering default behavior and command-line options to reduce and,
+ where reasonable, eliminate the need for programmers to make any
+ modifications to code that already works in existing production
+ environments.
+
+ * Diagnosing constructs that have different meanings in different
+ systems, languages, and dialects, while offering clear, less
+ ambiguous ways to express each of the different meanings so
+ programmers can change their code appropriately.
+
+ One of the biggest practical challenges for the developers of the
+GNU Fortran language is meeting the sometimes contradictory demands of
+the above items.
+
+ For example, a feature might be widely used in one popular
+environment, but the exact same code that utilizes that feature might
+not work as expected--perhaps it might mean something entirely
+different--in another popular environment.
+
+ Traditionally, Fortran compilers--even portable ones--have solved
+this problem by simply offering the appropriate feature to users of the
+respective systems. This approach treats users of various Fortran
+systems and dialects as remote "islands", or camps, of programmers, and
+assume that these camps rarely come into contact with each other (or,
+especially, with each other's code).
+
+ Project GNU takes a radically different approach to software and
+language design, in that it assumes that users of GNU software do not
+necessarily care what kind of underlying system they are using,
+regardless of whether they are using software (at the user-interface
+level) or writing it (for example, writing Fortran or C code).
+
+ As such, GNU users rarely need consider just what kind of underlying
+hardware (or, in many cases, operating system) they are using at any
+particular time. They can use and write software designed for a
+general-purpose, widely portable, heteregenous environment--the GNU
+environment.
+
+ In line with this philosophy, GNU Fortran must evolve into a product
+that is widely ported and portable not only in the sense that it can be
+successfully built, installed, and run by users, but in the larger
+sense that its users can use it in the same way, and expect largely the
+same behaviors from it, regardless of the kind of system they are using
+at any particular time.
+
+ This approach constrains the solutions `g77' can use to resolve
+conflicts between various camps of Fortran users. If these two camps
+disagree about what a particular construct should mean, `g77' cannot
+simply be changed to treat that particular construct as having one
+meaning without comment (such as a warning), lest the users expecting
+it to have the other meaning are unpleasantly surprised that their code
+misbehaves when executed.
+
+ The use of the ASCII backslash character in character constants is
+an excellent (and still somewhat unresolved) example of this kind of
+controversy. *Note Backslash in Constants::. Other examples are
+likely to arise in the future, as `g77' developers strive to improve
+its ability to accept an ever-wider variety of existing Fortran code
+without requiring significant modifications to said code.
+
+ Development of GNU Fortran is further constrained by the desire to
+avoid requiring programmers to change their code. This is important
+because it allows programmers, administrators, and others to more
+faithfully evaluate and validate `g77' (as an overall product and as
+new versions are distributed) without having to support multiple
+versions of their programs so that they continue to work the same way
+on their existing systems (non-GNU perhaps, but possibly also earlier
+versions of `g77').
+
+\1f
+File: g77.info, Node: Standard Support, Next: Conformance, Prev: Direction of Language Development, Up: Language
+
+ANSI FORTRAN 77 Standard Support
+================================
+
+ GNU Fortran supports ANSI FORTRAN 77 with the following caveats. In
+summary, the only ANSI FORTRAN 77 features `g77' doesn't support are
+those that are probably rarely used in actual code, some of which are
+explicitly disallowed by the Fortran 90 standard.
+
+* Menu:
+
+* No Passing External Assumed-length:: CHAR*(*) CFUNC restriction.
+* No Passing Dummy Assumed-length:: CHAR*(*) CFUNC restriction.
+* No Pathological Implied-DO:: No `((..., I=...), I=...)'.
+* No Useless Implied-DO:: No `(A, I=1, 1)'.
+
+\1f
+File: g77.info, Node: No Passing External Assumed-length, Next: No Passing Dummy Assumed-length, Up: Standard Support
+
+No Passing External Assumed-length
+----------------------------------
+
+ `g77' disallows passing of an external procedure as an actual
+argument if the procedure's type is declared `CHARACTER*(*)'. For
+example:
+
+ CHARACTER*(*) CFUNC
+ EXTERNAL CFUNC
+ CALL FOO(CFUNC)
+ END
+
+It isn't clear whether the standard considers this conforming.
+
+\1f
+File: g77.info, Node: No Passing Dummy Assumed-length, Next: No Pathological Implied-DO, Prev: No Passing External Assumed-length, Up: Standard Support
+
+No Passing Dummy Assumed-length
+-------------------------------
+
+ `g77' disallows passing of a dummy procedure as an actual argument
+if the procedure's type is declared `CHARACTER*(*)'.
+
+ SUBROUTINE BAR(CFUNC)
+ CHARACTER*(*) CFUNC
+ EXTERNAL CFUNC
+ CALL FOO(CFUNC)
+ END
+
+It isn't clear whether the standard considers this conforming.
+
+\1f
+File: g77.info, Node: No Pathological Implied-DO, Next: No Useless Implied-DO, Prev: No Passing Dummy Assumed-length, Up: Standard Support
+
+No Pathological Implied-DO
+--------------------------
+
+ The `DO' variable for an implied-`DO' construct in a `DATA'
+statement may not be used as the `DO' variable for an outer
+implied-`DO' construct. For example, this fragment is disallowed by
+`g77':
+
+ DATA ((A(I, I), I= 1, 10), I= 1, 10) /.../
+
+This also is disallowed by Fortran 90, as it offers no additional
+capabilities and would have a variety of possible meanings.
+
+ Note that it is *very* unlikely that any production Fortran code
+tries to use this unsupported construct.
+
+\1f
+File: g77.info, Node: No Useless Implied-DO, Prev: No Pathological Implied-DO, Up: Standard Support
+
+No Useless Implied-DO
+---------------------
+
+ An array element initializer in an implied-`DO' construct in a
+`DATA' statement must contain at least one reference to the `DO'
+variables of each outer implied-`DO' construct. For example, this
+fragment is disallowed by `g77':
+
+ DATA (A, I= 1, 1) /1./
+
+This also is disallowed by Fortran 90, as FORTRAN 77's more permissive
+requirements offer no additional capabilities. However, `g77' doesn't
+necessarily diagnose all cases where this requirement is not met.
+
+ Note that it is *very* unlikely that any production Fortran code
+tries to use this unsupported construct.
+
+\1f
+File: g77.info, Node: Conformance, Next: Notation Used, Prev: Standard Support, Up: Language
+
+Conformance
+===========
+
+ (The following information augments or overrides the information in
+Section 1.4 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 1 of that document otherwise serves as the basis for
+the relevant aspects of GNU Fortran.)
+
+ The definition of the GNU Fortran language is akin to that of the
+ANSI FORTRAN 77 language in that it does not generally require
+conforming implementations to diagnose cases where programs do not
+conform to the language.
+
+ However, `g77' as a compiler is being developed in a way that is
+intended to enable it to diagnose such cases in an easy-to-understand
+manner.
+
+ A program that conforms to the GNU Fortran language should, when
+compiled, linked, and executed using a properly installed `g77' system,
+perform as described by the GNU Fortran language definition. Reasons
+for different behavior include, among others:
+
+ * Use of resources (memory--heap, stack, and so on; disk space; CPU
+ time; etc.) exceeds those of the system.
+
+ * Range and/or precision of calculations required by the program
+ exceeds that of the system.
+
+ * Excessive reliance on behaviors that are system-dependent
+ (non-portable Fortran code).
+
+ * Bugs in the program.
+
+ * Bug in `g77'.
+
+ * Bugs in the system.
+
+ Despite these "loopholes", the availability of a clear specification
+of the language of programs submitted to `g77', as this document is
+intended to provide, is considered an important aspect of providing a
+robust, clean, predictable Fortran implementation.
+
+ The definition of the GNU Fortran language, while having no special
+legal status, can therefore be viewed as a sort of contract, or
+agreement. This agreement says, in essence, "if you write a program in
+this language, and run it in an environment (such as a `g77' system)
+that supports this language, the program should behave in a largely
+predictable way".
+
+\1f
+File: g77.info, Node: Notation Used, Next: Terms and Concepts, Prev: Conformance, Up: Language
+
+Notation Used in This Chapter
+=============================
+
+ (The following information augments or overrides the information in
+Section 1.5 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 1 of that document otherwise serves as the basis for
+the relevant aspects of GNU Fortran.)
+
+ In this chapter, "must" denotes a requirement, "may" denotes
+permission, and "must not" and "may not" denote prohibition. Terms
+such as "might", "should", and "can" generally add little or nothing in
+the way of weight to the GNU Fortran language itself, but are used to
+explain or illustrate the language.
+
+ For example:
+
+ ``The `FROBNITZ' statement must precede all executable
+ statements in a program unit, and may not specify any dummy
+ arguments. It may specify local or common variables and arrays.
+ Its use should be limited to portions of the program designed to
+ be non-portable and system-specific, because it might cause the
+ containing program unit to behave quite differently on different
+ systems.''
+
+ Insofar as the GNU Fortran language is specified, the requirements
+and permissions denoted by the above sample statement are limited to
+the placement of the statement and the kinds of things it may specify.
+The rest of the statement--the content regarding non-portable portions
+of the program and the differing behavior of program units containing
+the `FROBNITZ' statement--does not pertain the GNU Fortran language
+itself. That content offers advice and warnings about the `FROBNITZ'
+statement.
+
+ *Remember:* The GNU Fortran language definition specifies both what
+constitutes a valid GNU Fortran program and how, given such a program,
+a valid GNU Fortran implementation is to interpret that program.
+
+ It is *not* incumbent upon a valid GNU Fortran implementation to
+behave in any particular way, any consistent way, or any predictable
+way when it is asked to interpret input that is *not* a valid GNU
+Fortran program.
+
+ Such input is said to have "undefined" behavior when interpreted by
+a valid GNU Fortran implementation, though an implementation may choose
+to specify behaviors for some cases of inputs that are not valid GNU
+Fortran programs.
+
+ Other notation used herein is that of the GNU texinfo format, which
+is used to generate printed hardcopy, on-line hypertext (Info), and
+on-line HTML versions, all from a single source document. This
+notation is used as follows:
+
+ * Keywords defined by the GNU Fortran language are shown in
+ uppercase, as in: `COMMON', `INTEGER', and `BLOCK DATA'.
+
+ Note that, in practice, many Fortran programs are written in
+ lowercase--uppercase is used in this manual as a means to readily
+ distinguish keywords and sample Fortran-related text from the
+ prose in this document.
+
+ * Portions of actual sample program, input, or output text look like
+ this: `Actual program text'.
+
+ Generally, uppercase is used for all Fortran-specific and
+ Fortran-related text, though this does not always include literal
+ text within Fortran code.
+
+ For example: `PRINT *, 'My name is Bob''.
+
+ * A metasyntactic variable--that is, a name used in this document to
+ serve as a placeholder for whatever text is used by the user or
+ programmer-appears as shown in the following example:
+
+ "The `INTEGER IVAR' statement specifies that IVAR is a variable or
+ array of type `INTEGER'."
+
+ In the above example, any valid text may be substituted for the
+ metasyntactic variable IVAR to make the statement apply to a
+ specific instance, as long as the same text is substituted for
+ *both* occurrences of IVAR.
+
+ * Ellipses ("...") are used to indicate further text that is either
+ unimportant or expanded upon further, elsewhere.
+
+ * Names of data types are in the style of Fortran 90, in most cases.
+
+ *Note Kind Notation::, for information on the relationship between
+ Fortran 90 nomenclature (such as `INTEGER(KIND=1)') and the more
+ traditional, less portably concise nomenclature (such as
+ `INTEGER*4').
+
+\1f
+File: g77.info, Node: Terms and Concepts, Next: Characters Lines Sequence, Prev: Notation Used, Up: Language
+
+Fortran Terms and Concepts
+==========================
+
+ (The following information augments or overrides the information in
+Chapter 2 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 2 of that document otherwise serves as the basis for
+the relevant aspects of GNU Fortran.)
+
+* Menu:
+
+* Syntactic Items::
+* Statements Comments Lines::
+* Scope of Names and Labels::
+
+\1f
+File: g77.info, Node: Syntactic Items, Next: Statements Comments Lines, Up: Terms and Concepts
+
+Syntactic Items
+---------------
+
+ (Corresponds to Section 2.2 of ANSI X3.9-1978 FORTRAN 77.)
+
+ In GNU Fortran, a symbolic name is at least one character long, and
+has no arbitrary upper limit on length. However, names of entities
+requiring external linkage (such as external functions, external
+subroutines, and `COMMON' areas) might be restricted to some arbitrary
+length by the system. Such a restriction is no more constrained than
+that of one through six characters.
+
+ Underscores (`_') are accepted in symbol names after the first
+character (which must be a letter).
+
+\1f
+File: g77.info, Node: Statements Comments Lines, Next: Scope of Names and Labels, Prev: Syntactic Items, Up: Terms and Concepts
+
+Statements, Comments, and Lines
+-------------------------------
+
+ (Corresponds to Section 2.3 of ANSI X3.9-1978 FORTRAN 77.)
+
+ Use of an exclamation point (`!') to begin a trailing comment (a
+comment that extends to the end of the same source line) is permitted
+under the following conditions:
+
+ * The exclamation point does not appear in column 6. Otherwise, it
+ is treated as an indicator of a continuation line.
+
+ * The exclamation point appears outside a character or hollerith
+ constant. Otherwise, the exclamation point is considered part of
+ the constant.
+
+ * The exclamation point appears to the left of any other possible
+ trailing comment. That is, a trailing comment may contain
+ exclamation points in their commentary text.
+
+ Use of a semicolon (`;') as a statement separator is permitted under
+the following conditions:
+
+ * The semicolon appears outside a character or hollerith constant.
+ Otherwise, the semicolon is considered part of the constant.
+
+ * The semicolon appears to the left of a trailing comment.
+ Otherwise, the semicolon is considered part of that comment.
+
+ * Neither a logical `IF' statement nor a non-construct `WHERE'
+ statement (a Fortran 90 feature) may be followed (in the same,
+ possibly continued, line) by a semicolon used as a statement
+ separator.
+
+ This restriction avoids the confusion that can result when reading
+ a line such as:
+
+ IF (VALIDP) CALL FOO; CALL BAR
+
+ Some readers might think the `CALL BAR' is executed only if
+ `VALIDP' is `.TRUE.', while others might assume its execution is
+ unconditional.
+
+ (At present, `g77' does not diagnose code that violates this
+ restriction.)
+
+\1f
+File: g77.info, Node: Scope of Names and Labels, Prev: Statements Comments Lines, Up: Terms and Concepts
+
+Scope of Symbolic Names and Statement Labels
+--------------------------------------------
+
+ (Corresponds to Section 2.9 of ANSI X3.9-1978 FORTRAN 77.)
+
+ Included in the list of entities that have a scope of a program unit
+are construct names (a Fortran 90 feature). *Note Construct Names::,
+for more information.
+
+\1f
+File: g77.info, Node: Characters Lines Sequence, Next: Data Types and Constants, Prev: Terms and Concepts, Up: Language
+
+Characters, Lines, and Execution Sequence
+=========================================
+
+ (The following information augments or overrides the information in
+Chapter 3 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 3 of that document otherwise serves as the basis for
+the relevant aspects of GNU Fortran.)
+
+* Menu:
+
+* Character Set::
+* Lines::
+* Continuation Line::
+* Statements::
+* Statement Labels::
+* Order::
+* INCLUDE::
+
+\1f
+File: g77.info, Node: Character Set, Next: Lines, Up: Characters Lines Sequence
+
+GNU Fortran Character Set
+-------------------------
+
+ (Corresponds to Section 3.1 of ANSI X3.9-1978 FORTRAN 77.)
+
+ Letters include uppercase letters (the twenty-six characters of the
+English alphabet) and lowercase letters (their lowercase equivalent).
+Generally, lowercase letters may be used in place of uppercase letters,
+though in character and hollerith constants, they are distinct.
+
+ Special characters include:
+
+ * Semicolon (`;')
+
+ * Exclamation point (`!')
+
+ * Double quote (`"')
+
+ * Backslash (`\')
+
+ * Question mark (`?')
+
+ * Hash mark (`#')
+
+ * Ampersand (`&')
+
+ * Percent sign (`%')
+
+ * Underscore (`_')
+
+ * Open angle (`<')
+
+ * Close angle (`>')
+
+ * The FORTRAN 77 special characters (<SPC>, `=', `+', `-', `*', `/',
+ `(', `)', `,', `.', `$', `'', and `:')
+
+ Note that this document refers to <SPC> as "space", while X3.9-1978
+FORTRAN 77 refers to it as "blank".
+
+\1f
+File: g77.info, Node: Lines, Next: Continuation Line, Prev: Character Set, Up: Characters Lines Sequence
+
+Lines
+-----
+
+ (Corresponds to Section 3.2 of ANSI X3.9-1978 FORTRAN 77.)
+
+ The way a Fortran compiler views source files depends entirely on the
+implementation choices made for the compiler, since those choices are
+explicitly left to the implementation by the published Fortran
+standards.
+
+ The GNU Fortran language mandates a view applicable to UNIX-like
+text files--files that are made up of an arbitrary number of lines,
+each with an arbitrary number of characters (sometimes called
+stream-based files).
+
+ This view does not apply to types of files that are specified as
+having a particular number of characters on every single line (sometimes
+referred to as record-based files).
+
+ Because a "line in a program unit is a sequence of 72 characters",
+to quote X3.9-1978, the GNU Fortran language specifies that a
+stream-based text file is translated to GNU Fortran lines as follows:
+
+ * A newline in the file is the character that represents the end of
+ a line of text to the underlying system. For example, on
+ ASCII-based systems, a newline is the <NL> character, which has
+ ASCII value 12 (decimal).
+
+ * Each newline in the file serves to end the line of text that
+ precedes it (and that does not contain a newline).
+
+ * The end-of-file marker (`EOF') also serves to end the line of text
+ that precedes it (and that does not contain a newline).
+
+ * Any line of text that is shorter than 72 characters is padded to
+ that length with spaces (called "blanks" in the standard).
+
+ * Any line of text that is longer than 72 characters is truncated to
+ that length, but the truncated remainder must consist entirely of
+ spaces.
+
+ * Characters other than newline and the GNU Fortran character set
+ are invalid.
+
+ For the purposes of the remainder of this description of the GNU
+Fortran language, the translation described above has already taken
+place, unless otherwise specified.
+
+ The result of the above translation is that the source file appears,
+in terms of the remainder of this description of the GNU Fortran
+language, as if it had an arbitrary number of 72-character lines, each
+character being among the GNU Fortran character set.
+
+ For example, if the source file itself has two newlines in a row,
+the second newline becomes, after the above translation, a single line
+containing 72 spaces.
+
+\1f
+File: g77.info, Node: Continuation Line, Next: Statements, Prev: Lines, Up: Characters Lines Sequence
+
+Continuation Line
+-----------------
+
+ (Corresponds to Section 3.2.3 of ANSI X3.9-1978 FORTRAN 77.)
+
+ A continuation line is any line that both
+
+ * Contains a continuation character, and
+
+ * Contains only spaces in columns 1 through 5
+
+ A continuation character is any character of the GNU Fortran
+character set other than space (<SPC>) or zero (`0') in column 6, or a
+digit (`0' through `9') in column 7 through 72 of a line that has only
+spaces to the left of that digit.
+
+ The continuation character is ignored as far as the content of the
+statement is concerned.
+
+ The GNU Fortran language places no limit on the number of
+continuation lines in a statement. In practice, the limit depends on a
+variety of factors, such as available memory, statement content, and so
+on, but no GNU Fortran system may impose an arbitrary limit.
+
+\1f
+File: g77.info, Node: Statements, Next: Statement Labels, Prev: Continuation Line, Up: Characters Lines Sequence
+
+Statements
+----------
+
+ (Corresponds to Section 3.3 of ANSI X3.9-1978 FORTRAN 77.)
+
+ Statements may be written using an arbitrary number of continuation
+lines.
+
+ Statements may be separated using the semicolon (`;'), except that
+the logical `IF' and non-construct `WHERE' statements may not be
+separated from subsequent statements using only a semicolon as
+statement separator.
+
+ The `END PROGRAM', `END SUBROUTINE', `END FUNCTION', and `END BLOCK
+DATA' statements are alternatives to the `END' statement. These
+alternatives may be written as normal statements--they are not subject
+to the restrictions of the `END' statement.
+
+ However, no statement other than `END' may have an initial line that
+appears to be an `END' statement--even `END PROGRAM', for example, must
+not be written as:
+
+ END
+ &PROGRAM
+
+\1f
+File: g77.info, Node: Statement Labels, Next: Order, Prev: Statements, Up: Characters Lines Sequence
+
+Statement Labels
+----------------
+
+ (Corresponds to Section 3.4 of ANSI X3.9-1978 FORTRAN 77.)
+
+ A statement separated from its predecessor via a semicolon may be
+labeled as follows:
+
+ * The semicolon is followed by the label for the statement, which in
+ turn follows the label.
+
+ * The label must be no more than five digits in length.
+
+ * The first digit of the label for the statement is not the first
+ non-space character on a line. Otherwise, that character is
+ treated as a continuation character.
+
+ A statement may have only one label defined for it.
+
+\1f
+File: g77.info, Node: Order, Next: INCLUDE, Prev: Statement Labels, Up: Characters Lines Sequence
+
+Order of Statements and Lines
+-----------------------------
+
+ (Corresponds to Section 3.5 of ANSI X3.9-1978 FORTRAN 77.)
+
+ Generally, `DATA' statements may precede executable statements.
+However, specification statements pertaining to any entities
+initialized by a `DATA' statement must precede that `DATA' statement.
+For example, after `DATA I/1/', `INTEGER I' is not permitted, but
+`INTEGER J' is permitted.
+
+ The last line of a program unit may be an `END' statement, or may be:
+
+ * An `END PROGRAM' statement, if the program unit is a main program.
+
+ * An `END SUBROUTINE' statement, if the program unit is a subroutine.
+
+ * An `END FUNCTION' statement, if the program unit is a function.
+
+ * An `END BLOCK DATA' statement, if the program unit is a block data.
+
+\1f
+File: g77.info, Node: INCLUDE, Prev: Order, Up: Characters Lines Sequence
+
+Including Source Text
+---------------------
+
+ Additional source text may be included in the processing of the
+source file via the `INCLUDE' directive:
+
+ INCLUDE FILENAME
+
+The source text to be included is identified by FILENAME, which is a
+literal GNU Fortran character constant. The meaning and interpretation
+of FILENAME depends on the implementation, but typically is a filename.
+
+ (`g77' treats it as a filename that it searches for in the current
+directory and/or directories specified via the `-I' command-line
+option.)
+
+ The effect of the `INCLUDE' directive is as if the included text
+directly replaced the directive in the source file prior to
+interpretation of the program. Included text may itself use `INCLUDE'.
+The depth of nested `INCLUDE' references depends on the implementation,
+but typically is a positive integer.
+
+ This virtual replacement treats the statements and `INCLUDE'
+directives in the included text as syntactically distinct from those in
+the including text.
+
+ Therefore, the first non-comment line of the included text must not
+be a continuation line. The included text must therefore have, after
+the non-comment lines, either an initial line (statement), an `INCLUDE'
+directive, or nothing (the end of the included text).
+
+ Similarly, the including text may end the `INCLUDE' directive with a
+semicolon or the end of the line, but it cannot follow an `INCLUDE'
+directive at the end of its line with a continuation line. Thus, the
+last statement in an included text may not be continued.
+
+ Any statements between two `INCLUDE' directives on the same line are
+treated as if they appeared in between the respective included texts.
+For example:
+
+ INCLUDE 'A'; PRINT *, 'B'; INCLUDE 'C'; END PROGRAM
+
+If the text included by `INCLUDE 'A'' constitutes a `PRINT *, 'A''
+statement and the text included by `INCLUDE 'C'' constitutes a `PRINT
+*, 'C'' statement, then the output of the above sample program would be
+
+ A
+ B
+ C
+
+(with suitable allowances for how an implementation defines its
+handling of output).
+
+ Included text must not include itself directly or indirectly,
+regardless of whether the FILENAME used to reference the text is the
+same.
+
+ Note that `INCLUDE' is *not* a statement. As such, it is neither a
+non-executable or executable statement. However, if the text it
+includes constitutes one or more executable statements, then the
+placement of `INCLUDE' is subject to effectively the same restrictions
+as those on executable statements.
+
+ An `INCLUDE' directive may be continued across multiple lines as if
+it were a statement. This permits long names to be used for FILENAME.
+
+\1f
+File: g77.info, Node: Data Types and Constants, Next: Expressions, Prev: Characters Lines Sequence, Up: Language
+
+Data Types and Constants
+========================
+
+ (The following information augments or overrides the information in
+Chapter 4 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 4 of that document otherwise serves as the basis for
+the relevant aspects of GNU Fortran.)
+
+ To more concisely express the appropriate types for entities, this
+document uses the more concise Fortran 90 nomenclature such as
+`INTEGER(KIND=1)' instead of the more traditional, but less portably
+concise, byte-size-based nomenclature such as `INTEGER*4', wherever
+reasonable.
+
+ When referring to generic types--in contexts where the specific
+precision and range of a type are not important--this document uses the
+generic type names `INTEGER', `LOGICAL', `REAL', `COMPLEX', and
+`CHARACTER'.
+
+ In some cases, the context requires specification of a particular
+type. This document uses the `KIND=' notation to accomplish this
+throughout, sometimes supplying the more traditional notation for
+clarification, though the traditional notation might not work the same
+way on all GNU Fortran implementations.
+
+ Use of `KIND=' makes this document more concise because `g77' is
+able to define values for `KIND=' that have the same meanings on all
+systems, due to the way the Fortran 90 standard specifies these values
+are to be used.
+
+ (In particular, that standard permits an implementation to
+arbitrarily assign nonnegative values. There are four distinct sets of
+assignments: one to the `CHARACTER' type; one to the `INTEGER' type;
+one to the `LOGICAL' type; and the fourth to both the `REAL' and
+`COMPLEX' types. Implementations are free to assign these values in
+any order, leave gaps in the ordering of assignments, and assign more
+than one value to a representation.)
+
+ This makes `KIND=' values superior to the values used in
+non-standard statements such as `INTEGER*4', because the meanings of
+the values in those statements vary from machine to machine, compiler
+to compiler, even operating system to operating system.
+
+ However, use of `KIND=' is *not* generally recommended when writing
+portable code (unless, for example, the code is going to be compiled
+only via `g77', which is a widely ported compiler). GNU Fortran does
+not yet have adequate language constructs to permit use of `KIND=' in a
+fashion that would make the code portable to Fortran 90
+implementations; and, this construct is known to *not* be accepted by
+many popular FORTRAN 77 implementations, so it cannot be used in code
+that is to be ported to those.
+
+ The distinction here is that this document is able to use specific
+values for `KIND=' to concisely document the types of various
+operations and operands.
+
+ A Fortran program should use the FORTRAN 77 designations for the
+appropriate GNU Fortran types--such as `INTEGER' for `INTEGER(KIND=1)',
+`REAL' for `REAL(KIND=1)', and `DOUBLE COMPLEX' for
+`COMPLEX(KIND=2)'--and, where no such designations exist, make use of
+appropriate techniques (preprocessor macros, parameters, and so on) to
+specify the types in a fashion that may be easily adjusted to suit each
+particular implementation to which the program is ported. (These types
+generally won't need to be adjusted for ports of `g77'.)
+
+ Further details regarding GNU Fortran data types and constants are
+provided below.
+
+* Menu:
+
+* Types::
+* Constants::
+* Integer Type::
+* Character Type::
+
+\1f
+File: g77.info, Node: Types, Next: Constants, Up: Data Types and Constants
+
+Data Types
+----------
+
+ (Corresponds to Section 4.1 of ANSI X3.9-1978 FORTRAN 77.)
+
+ GNU Fortran supports these types:
+
+ 1. Integer (generic type `INTEGER')
+
+ 2. Real (generic type `REAL')
+
+ 3. Double precision
+
+ 4. Complex (generic type `COMPLEX')
+
+ 5. Logical (generic type `LOGICAL')
+
+ 6. Character (generic type `CHARACTER')
+
+ 7. Double Complex
+
+ (The types numbered 1 through 6 above are standard FORTRAN 77 types.)
+
+ The generic types shown above are referred to in this document using
+only their generic type names. Such references usually indicate that
+any specific type (kind) of that generic type is valid.
+
+ For example, a context described in this document as accepting the
+`COMPLEX' type also is likely to accept the `DOUBLE COMPLEX' type.
+
+ The GNU Fortran language supports three ways to specify a specific
+kind of a generic type.
+
+* Menu:
+
+* Double Notation:: As in `DOUBLE COMPLEX'.
+* Star Notation:: As in `INTEGER*4'.
+* Kind Notation:: As in `INTEGER(KIND=1)'.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Double Notation, Next: Star Notation, Up: Types
+
+Double Notation
+...............
+
+ The GNU Fortran language supports two uses of the keyword `DOUBLE'
+to specify a specific kind of type:
+
+ * `DOUBLE PRECISION', equivalent to `REAL(KIND=2)'
+
+ * `DOUBLE COMPLEX', equivalent to `COMPLEX(KIND=2)'
+
+ Use one of the above forms where a type name is valid.
+
+ While use of this notation is popular, it doesn't scale well in a
+language or dialect rich in intrinsic types, as is the case for the GNU
+Fortran language (especially planned future versions of it).
+
+ After all, one rarely sees type names such as `DOUBLE INTEGER',
+`QUADRUPLE REAL', or `QUARTER INTEGER'. Instead, `INTEGER*8',
+`REAL*16', and `INTEGER*1' often are substituted for these,
+respectively, even though they do not always have the same meanings on
+all systems. (And, the fact that `DOUBLE REAL' does not exist as such
+is an inconsistency.)
+
+ Therefore, this document uses "double notation" only on occasion for
+the benefit of those readers who are accustomed to it.
+
+\1f
+File: g77.info, Node: Star Notation, Next: Kind Notation, Prev: Double Notation, Up: Types
+
+Star Notation
+.............
+
+ The following notation specifies the storage size for a type:
+
+ GENERIC-TYPE*N
+
+GENERIC-TYPE must be a generic type--one of `INTEGER', `REAL',
+`COMPLEX', `LOGICAL', or `CHARACTER'. N must be one or more digits
+comprising a decimal integer number greater than zero.
+
+ Use the above form where a type name is valid.
+
+ The `*N' notation specifies that the amount of storage occupied by
+variables and array elements of that type is N times the storage
+occupied by a `CHARACTER*1' variable.
+
+ This notation might indicate a different degree of precision and/or
+range for such variables and array elements, and the functions that
+return values of types using this notation. It does not limit the
+precision or range of values of that type in any particular way--use
+explicit code to do that.
+
+ Further, the GNU Fortran language requires no particular values for
+N to be supported by an implementation via the `*N' notation. `g77'
+supports `INTEGER*1' (as `INTEGER(KIND=3)') on all systems, for example,
+but not all implementations are required to do so, and `g77' is known
+to not support `REAL*1' on most (or all) systems.
+
+ As a result, except for GENERIC-TYPE of `CHARACTER', uses of this
+notation should be limited to isolated portions of a program that are
+intended to handle system-specific tasks and are expected to be
+non-portable.
+
+ (Standard FORTRAN 77 supports the `*N' notation for only
+`CHARACTER', where it signifies not only the amount of storage
+occupied, but the number of characters in entities of that type.
+However, almost all Fortran compilers have supported this notation for
+generic types, though with a variety of meanings for N.)
+
+ Specifications of types using the `*N' notation always are
+interpreted as specifications of the appropriate types described in
+this document using the `KIND=N' notation, described below.
+
+ While use of this notation is popular, it doesn't serve well in the
+context of a widely portable dialect of Fortran, such as the GNU
+Fortran language.
+
+ For example, even on one particular machine, two or more popular
+Fortran compilers might well disagree on the size of a type declared
+`INTEGER*2' or `REAL*16'. Certainly there is known to be disagreement
+over such things among Fortran compilers on *different* systems.
+
+ Further, this notation offers no elegant way to specify sizes that
+are not even multiples of the "byte size" typically designated by
+`INTEGER*1'. Use of "absurd" values (such as `INTEGER*1000') would
+certainly be possible, but would perhaps be stretching the original
+intent of this notation beyond the breaking point in terms of
+widespread readability of documentation and code making use of it.
+
+ Therefore, this document uses "star notation" only on occasion for
+the benefit of those readers who are accustomed to it.
+
+\1f
+File: g77.info, Node: Kind Notation, Prev: Star Notation, Up: Types
+
+Kind Notation
+.............
+
+ The following notation specifies the kind-type selector of a type:
+
+ GENERIC-TYPE(KIND=N)
+
+Use the above form where a type name is valid.
+
+ GENERIC-TYPE must be a generic type--one of `INTEGER', `REAL',
+`COMPLEX', `LOGICAL', or `CHARACTER'. N must be an integer
+initialization expression that is a positive, nonzero value.
+
+ Programmers are discouraged from writing these values directly into
+their code. Future versions of the GNU Fortran language will offer
+facilities that will make the writing of code portable to `g77' *and*
+Fortran 90 implementations simpler.
+
+ However, writing code that ports to existing FORTRAN 77
+implementations depends on avoiding the `KIND=' construct.
+
+ The `KIND=' construct is thus useful in the context of GNU Fortran
+for two reasons:
+
+ * It provides a means to specify a type in a fashion that is
+ portable across all GNU Fortran implementations (though not other
+ FORTRAN 77 and Fortran 90 implementations).
+
+ * It provides a sort of Rosetta stone for this document to use to
+ concisely describe the types of various operations and operands.
+
+ The values of N in the GNU Fortran language are assigned using a
+scheme that:
+
+ * Attempts to maximize the ability of readers of this document to
+ quickly familiarize themselves with assignments for popular types
+
+ * Provides a unique value for each specific desired meaning
+
+ * Provides a means to automatically assign new values so they have a
+ "natural" relationship to existing values, if appropriate, or, if
+ no such relationship exists, will not interfere with future values
+ assigned on the basis of such relationships
+
+ * Avoids using values that are similar to values used in the
+ existing, popular `*N' notation, to prevent readers from expecting
+ that these implied correspondences work on all GNU Fortran
+ implementations
+
+ The assignment system accomplishes this by assigning to each
+"fundamental meaning" of a specific type a unique prime number.
+Combinations of fundamental meanings--for example, a type that is two
+times the size of some other type--are assigned values of N that are
+the products of the values for those fundamental meanings.
+
+ A prime value of N is never given more than one fundamental meaning,
+to avoid situations where some code or system cannot reasonably provide
+those meanings in the form of a single type.
+
+ The values of N assigned so far are:
+
+`KIND=0'
+ This value is reserved for future use.
+
+ The planned future use is for this value to designate, explicitly,
+ context-sensitive kind-type selection. For example, the
+ expression `1D0 * 0.1_0' would be equivalent to `1D0 * 0.1D0'.
+
+`KIND=1'
+ This corresponds to the default types for `REAL', `INTEGER',
+ `LOGICAL', `COMPLEX', and `CHARACTER', as appropriate.
+
+ These are the "default" types described in the Fortran 90 standard,
+ though that standard does not assign any particular `KIND=' value
+ to these types.
+
+ (Typically, these are `REAL*4', `INTEGER*4', `LOGICAL*4', and
+ `COMPLEX*8'.)
+
+`KIND=2'
+ This corresponds to types that occupy twice as much storage as the
+ default types. `REAL(KIND=2)' is `DOUBLE PRECISION' (typically
+ `REAL*8'), `COMPLEX(KIND=2)' is `DOUBLE COMPLEX' (typically
+ `COMPLEX*16'),
+
+ These are the "double precision" types described in the Fortran 90
+ standard, though that standard does not assign any particular
+ `KIND=' value to these types.
+
+ N of 4 thus corresponds to types that occupy four times as much
+ storage as the default types, N of 8 to types that occupy eight
+ times as much storage, and so on.
+
+ The `INTEGER(KIND=2)' and `LOGICAL(KIND=2)' types are not
+ necessarily supported by every GNU Fortran implementation.
+
+`KIND=3'
+ This corresponds to types that occupy as much storage as the
+ default `CHARACTER' type, which is the same effective type as
+ `CHARACTER(KIND=1)' (making that type effectively the same as
+ `CHARACTER(KIND=3)').
+
+ (Typically, these are `INTEGER*1' and `LOGICAL*1'.)
+
+ N of 6 thus corresponds to types that occupy twice as much storage
+ as the N=3 types, N of 12 to types that occupy four times as much
+ storage, and so on.
+
+ These are not necessarily supported by every GNU Fortran
+ implementation.
+
+`KIND=5'
+ This corresponds to types that occupy half the storage as the
+ default (N=1) types.
+
+ (Typically, these are `INTEGER*2' and `LOGICAL*2'.)
+
+ N of 25 thus corresponds to types that occupy one-quarter as much
+ storage as the default types.
+
+ These are not necessarily supported by every GNU Fortran
+ implementation.
+
+`KIND=7'
+ This is valid only as `INTEGER(KIND=7)' and denotes the `INTEGER'
+ type that has the smallest storage size that holds a pointer on
+ the system.
+
+ A pointer representable by this type is capable of uniquely
+ addressing a `CHARACTER*1' variable, array, array element, or
+ substring.
+
+ (Typically this is equivalent to `INTEGER*4' or, on 64-bit
+ systems, `INTEGER*8'. In a compatible C implementation, it
+ typically would be the same size and semantics of the C type `void
+ *'.)
+
+ Note that these are *proposed* correspondences and might change in
+future versions of `g77'--avoid writing code depending on them while
+`g77', and therefore the GNU Fortran language it defines, is in beta
+testing.
+
+ Values not specified in the above list are reserved to future
+versions of the GNU Fortran language.
+
+ Implementation-dependent meanings will be assigned new, unique prime
+numbers so as to not interfere with other implementation-dependent
+meanings, and offer the possibility of increasing the portability of
+code depending on such types by offering support for them in other GNU
+Fortran implementations.
+
+ Other meanings that might be given unique values are:
+
+ * Types that make use of only half their storage size for
+ representing precision and range.
+
+ For example, some compilers offer options that cause `INTEGER'
+ types to occupy the amount of storage that would be needed for
+ `INTEGER(KIND=2)' types, but the range remains that of
+ `INTEGER(KIND=1)'.
+
+ * The IEEE single floating-point type.
+
+ * Types with a specific bit pattern (endianness), such as the
+ little-endian form of `INTEGER(KIND=1)'. These could permit,
+ conceptually, use of portable code and implementations on data
+ files written by existing systems.
+
+ Future *prime* numbers should be given meanings in as incremental a
+fashion as possible, to allow for flexibility and expressiveness in
+combining types.
+
+ For example, instead of defining a prime number for little-endian
+IEEE doubles, one prime number might be assigned the meaning
+"little-endian", another the meaning "IEEE double", and the value of N
+for a little-endian IEEE double would thus naturally be the product of
+those two respective assigned values. (It could even be reasonable to
+have IEEE values result from the products of prime values denoting
+exponent and fraction sizes and meanings, hidden bit usage,
+availability and representations of special values such as subnormals,
+infinities, and Not-A-Numbers (NaNs), and so on.)
+
+ This assignment mechanism, while not inherently required for future
+versions of the GNU Fortran language, is worth using because it could
+ease management of the "space" of supported types much easier in the
+long run.
+
+ The above approach suggests a mechanism for specifying inheritance
+of intrinsic (built-in) types for an entire, widely portable product
+line. It is certainly reasonable that, unlike programmers of other
+languages offering inheritance mechanisms that employ verbose names for
+classes and subclasses, along with graphical browsers to elucidate the
+relationships, Fortran programmers would employ a mechanism that works
+by multiplying prime numbers together and finding the prime factors of
+such products.
+
+ Most of the advantages for the above scheme have been explained
+above. One disadvantage is that it could lead to the defining, by the
+GNU Fortran language, of some fairly large prime numbers. This could
+lead to the GNU Fortran language being declared "munitions" by the
+United States Department of Defense.
+
+\1f
+File: g77.info, Node: Constants, Next: Integer Type, Prev: Types, Up: Data Types and Constants
+
+Constants
+---------
+
+ (Corresponds to Section 4.2 of ANSI X3.9-1978 FORTRAN 77.)
+
+ A "typeless constant" has one of the following forms:
+
+ 'BINARY-DIGITS'B
+ 'OCTAL-DIGITS'O
+ 'HEXADECIMAL-DIGITS'Z
+ 'HEXADECIMAL-DIGITS'X
+
+BINARY-DIGITS, OCTAL-DIGITS, and HEXADECIMAL-DIGITS are nonempty
+strings of characters in the set `01', `01234567', and
+`0123456789ABCDEFabcdef', respectively. (The value for `A' (and `a')
+is 10, for `B' and `b' is 11, and so on.)
+
+ Typeless constants have values that depend on the context in which
+they are used.
+
+ All other constants, called "typed constants", are
+interpreted--converted to internal form--according to their inherent
+type. Thus, context is *never* a determining factor for the type, and
+hence the interpretation, of a typed constant. (All constants in the
+ANSI FORTRAN 77 language are typed constants.)
+
+ For example, `1' is always type `INTEGER(KIND=1)' in GNU Fortran
+(called default INTEGER in Fortran 90), `9.435784839284958' is always
+type `REAL(KIND=1)' (even if the additional precision specified is
+lost, and even when used in a `REAL(KIND=2)' context), `1E0' is always
+type `REAL(KIND=2)', and `1D0' is always type `REAL(KIND=2)'.
+
+\1f
+File: g77.info, Node: Integer Type, Next: Character Type, Prev: Constants, Up: Data Types and Constants
+
+Integer Type
+------------
+
+ (Corresponds to Section 4.3 of ANSI X3.9-1978 FORTRAN 77.)
+
+ An integer constant also may have one of the following forms:
+
+ B'BINARY-DIGITS'
+ O'OCTAL-DIGITS'
+ Z'HEXADECIMAL-DIGITS'
+ X'HEXADECIMAL-DIGITS'
+
+BINARY-DIGITS, OCTAL-DIGITS, and HEXADECIMAL-DIGITS are nonempty
+strings of characters in the set `01', `01234567', and
+`0123456789ABCDEFabcdef', respectively. (The value for `A' (and `a')
+is 10, for `B' and `b' is 11, and so on.)
+
+\1f
+File: g77.info, Node: Character Type, Prev: Integer Type, Up: Data Types and Constants
+
+Character Type
+--------------
+
+ (Corresponds to Section 4.8 of ANSI X3.9-1978 FORTRAN 77.)
+
+ A character constant may be delimited by a pair of double quotes
+(`"') instead of apostrophes. In this case, an apostrophe within the
+constant represents a single apostrophe, while a double quote is
+represented in the source text of the constant by two consecutive double
+quotes with no intervening spaces.
+
+ A character constant may be empty (have a length of zero).
+
+ A character constant may include a substring specification, The
+value of such a constant is the value of the substring--for example,
+the value of `'hello'(3:5)' is the same as the value of `'llo''.
+
+\1f
+File: g77.info, Node: Expressions, Next: Specification Statements, Prev: Data Types and Constants, Up: Language
+
+Expressions
+===========
+
+ (The following information augments or overrides the information in
+Chapter 6 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 6 of that document otherwise serves as the basis for
+the relevant aspects of GNU Fortran.)
+
+* Menu:
+
+* %LOC()::
+
+\1f
+File: g77.info, Node: %LOC(), Up: Expressions
+
+The `%LOC()' Construct
+----------------------
+
+ %LOC(ARG)
+
+ The `%LOC()' construct is an expression that yields the value of the
+location of its argument, ARG, in memory. The size of the type of the
+expression depends on the system--typically, it is equivalent to either
+`INTEGER(KIND=1)' or `INTEGER(KIND=2)', though it is actually type
+`INTEGER(KIND=7)'.
+
+ The argument to `%LOC()' must be suitable as the left-hand side of
+an assignment statement. That is, it may not be a general expression
+involving operators such as addition, subtraction, and so on, nor may
+it be a constant.
+
+ Use of `%LOC()' is recommended only for code that is accessing
+facilities outside of GNU Fortran, such as operating system or
+windowing facilities. It is best to constrain such uses to isolated
+portions of a program--portions that deal specifically and exclusively
+with low-level, system-dependent facilities. Such portions might well
+provide a portable interface for use by the program as a whole, but are
+themselves not portable, and should be thoroughly tested each time they
+are rebuilt using a new compiler or version of a compiler.
+
+ Do not depend on `%LOC()' returning a pointer that can be safely
+used to *define* (change) the argument. While this might work in some
+circumstances, it is hard to predict whether it will continue to work
+when a program (that works using this unsafe behavior) is recompiled
+using different command-line options or a different version of `g77'.
+
+ Generally, `%LOC()' is safe when used as an argument to a procedure
+that makes use of the value of the corresponding dummy argument only
+during its activation, and only when such use is restricted to
+referencing (reading) the value of the argument to `%LOC()'.
+
+ *Implementation Note:* Currently, `g77' passes arguments (those not
+passed using a construct such as `%VAL()') by reference or descriptor,
+depending on the type of the actual argument. Thus, given `INTEGER I',
+`CALL FOO(I)' would seem to mean the same thing as `CALL FOO(%LOC(I))',
+and in fact might compile to identical code.
+
+ However, `CALL FOO(%LOC(I))' emphatically means "pass the address of
+`I' in memory". While `CALL FOO(I)' might use that same approach in a
+particular version of `g77', another version or compiler might choose a
+different implementation, such as copy-in/copy-out, to effect the
+desired behavior--and which will therefore not necessarily compile to
+the same code as would `CALL FOO(%LOC(I))' using the same version or
+compiler.
+
+ *Note Debugging and Interfacing::, for detailed information on how
+this particular version of `g77' implements various constructs.
+
+\1f
+File: g77.info, Node: Specification Statements, Next: Control Statements, Prev: Expressions, Up: Language
+
+Specification Statements
+========================
+
+ (The following information augments or overrides the information in
+Chapter 8 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 8 of that document otherwise serves as the basis for
+the relevant aspects of GNU Fortran.)
+
+* Menu:
+
+* NAMELIST::
+* DOUBLE COMPLEX::
+
+\1f
+File: g77.info, Node: NAMELIST, Next: DOUBLE COMPLEX, Up: Specification Statements
+
+`NAMELIST' Statement
+--------------------
+
+ The `NAMELIST' statement, and related I/O constructs, are supported
+by the GNU Fortran language in essentially the same way as they are by
+`f2c'.
+
+\1f
+File: g77.info, Node: DOUBLE COMPLEX, Prev: NAMELIST, Up: Specification Statements
+
+`DOUBLE COMPLEX' Statement
+--------------------------
+
+ `DOUBLE COMPLEX' is a type-statement (and type) that specifies the
+type `COMPLEX(KIND=2)' in GNU Fortran.
+
+\1f
+File: g77.info, Node: Control Statements, Next: Functions and Subroutines, Prev: Specification Statements, Up: Language
+
+Control Statements
+==================
+
+ (The following information augments or overrides the information in
+Chapter 11 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 11 of that document otherwise serves as the basis
+for the relevant aspects of GNU Fortran.)
+
+* Menu:
+
+* DO WHILE::
+* END DO::
+* Construct Names::
+* CYCLE and EXIT::
+
+\1f
+File: g77.info, Node: DO WHILE, Next: END DO, Up: Control Statements
+
+DO WHILE
+--------
+
+ The `DO WHILE' statement, a feature of both the MIL-STD 1753 and
+Fortran 90 standards, is provided by the GNU Fortran language.
+
+\1f
+File: g77.info, Node: END DO, Next: Construct Names, Prev: DO WHILE, Up: Control Statements
+
+END DO
+------
+
+ The `END DO' statement is provided by the GNU Fortran language.
+
+ This statement is used in one of two ways:
+
+ * The Fortran 90 meaning, in which it specifies the termination
+ point of a single `DO' loop started with a `DO' statement that
+ specifies no termination label.
+
+ * The MIL-STD 1753 meaning, in which it specifies the termination
+ point of one or more `DO' loops, all of which start with a `DO'
+ statement that specify the label defined for the `END DO'
+ statement.
+
+ This kind of `END DO' statement is merely a synonym for
+ `CONTINUE', except it is permitted only when the statement is
+ labeled and a target of one or more labeled `DO' loops.
+
+ It is expected that this use of `END DO' will be removed from the
+ GNU Fortran language in the future, though it is likely that it
+ will long be supported by `g77' as a dialect form.
+
+\1f
+File: g77.info, Node: Construct Names, Next: CYCLE and EXIT, Prev: END DO, Up: Control Statements
+
+Construct Names
+---------------
+
+ The GNU Fortran language supports construct names as defined by the
+Fortran 90 standard. These names are local to the program unit and are
+defined as follows:
+
+ CONSTRUCT-NAME: BLOCK-STATEMENT
+
+Here, CONSTRUCT-NAME is the construct name itself; its definition is
+connoted by the single colon (`:'); and BLOCK-STATEMENT is an `IF',
+`DO', or `SELECT CASE' statement that begins a block.
+
+ A block that is given a construct name must also specify the same
+construct name in its termination statement:
+
+ END BLOCK CONSTRUCT-NAME
+
+Here, BLOCK must be `IF', `DO', or `SELECT', as appropriate.
+
+\1f
+File: g77.info, Node: CYCLE and EXIT, Prev: Construct Names, Up: Control Statements
+
+The `CYCLE' and `EXIT' Statements
+---------------------------------
+
+ The `CYCLE' and `EXIT' statements specify that the remaining
+statements in the current iteration of a particular active (enclosing)
+`DO' loop are to be skipped.
+
+ `CYCLE' specifies that these statements are skipped, but the `END
+DO' statement that marks the end of the `DO' loop be executed--that is,
+the next iteration, if any, is to be started. If the statement marking
+the end of the `DO' loop is not `END DO'--in other words, if the loop
+is not a block `DO'--the `CYCLE' statement does not execute that
+statement, but does start the next iteration (if any).
+
+ `EXIT' specifies that the loop specified by the `DO' construct is
+terminated.
+
+ The `DO' loop affected by `CYCLE' and `EXIT' is the innermost
+enclosing `DO' loop when the following forms are used:
+
+ CYCLE
+ EXIT
+
+ Otherwise, the following forms specify the construct name of the
+pertinent `DO' loop:
+
+ CYCLE CONSTRUCT-NAME
+ EXIT CONSTRUCT-NAME
+
+ `CYCLE' and `EXIT' can be viewed as glorified `GO TO' statements.
+However, they cannot be easily thought of as `GO TO' statements in
+obscure cases involving FORTRAN 77 loops. For example:
+
+ DO 10 I = 1, 5
+ DO 10 J = 1, 5
+ IF (J .EQ. 5) EXIT
+ DO 10 K = 1, 5
+ IF (K .EQ. 3) CYCLE
+ 10 PRINT *, 'I=', I, ' J=', J, ' K=', K
+ 20 CONTINUE
+
+In particular, neither the `EXIT' nor `CYCLE' statements above are
+equivalent to a `GO TO' statement to either label `10' or `20'.
+
+ To understand the effect of `CYCLE' and `EXIT' in the above
+fragment, it is helpful to first translate it to its equivalent using
+only block `DO' loops:
+
+ DO I = 1, 5
+ DO J = 1, 5
+ IF (J .EQ. 5) EXIT
+ DO K = 1, 5
+ IF (K .EQ. 3) CYCLE
+ 10 PRINT *, 'I=', I, ' J=', J, ' K=', K
+ END DO
+ END DO
+ END DO
+ 20 CONTINUE
+
+ Adding new labels allows translation of `CYCLE' and `EXIT' to `GO
+TO' so they may be more easily understood by programmers accustomed to
+FORTRAN coding:
+
+ DO I = 1, 5
+ DO J = 1, 5
+ IF (J .EQ. 5) GOTO 18
+ DO K = 1, 5
+ IF (K .EQ. 3) GO TO 12
+ 10 PRINT *, 'I=', I, ' J=', J, ' K=', K
+ 12 END DO
+ END DO
+ 18 END DO
+ 20 CONTINUE
+
+Thus, the `CYCLE' statement in the innermost loop skips over the
+`PRINT' statement as it begins the next iteration of the loop, while
+the `EXIT' statement in the middle loop ends that loop but *not* the
+outermost loop.
+
+\1f
+File: g77.info, Node: Functions and Subroutines, Next: Scope and Classes of Names, Prev: Control Statements, Up: Language
+
+Functions and Subroutines
+=========================
+
+ (The following information augments or overrides the information in
+Chapter 15 of ANSI X3.9-1978 FORTRAN 77 in specifying the GNU Fortran
+language. Chapter 15 of that document otherwise serves as the basis
+for the relevant aspects of GNU Fortran.)
+
+* Menu:
+
+* %VAL()::
+* %REF()::
+* %DESCR()::
+* Generics and Specifics::
+* REAL() and AIMAG() of Complex::
+* CMPLX() of DOUBLE PRECISION::
+* MIL-STD 1753::
+* f77/f2c Intrinsics::
+* Table of Intrinsic Functions::
+
+\1f
+File: g77.info, Node: %VAL(), Next: %REF(), Up: Functions and Subroutines
+
+The `%VAL()' Construct
+----------------------
+
+ %VAL(ARG)
+
+ The `%VAL()' construct specifies that an argument, ARG, is to be
+passed by value, instead of by reference or descriptor.
+
+ `%VAL()' is restricted to actual arguments in invocations of
+external procedures.
+
+ Use of `%VAL()' is recommended only for code that is accessing
+facilities outside of GNU Fortran, such as operating system or
+windowing facilities. It is best to constrain such uses to isolated
+portions of a program--portions the deal specifically and exclusively
+with low-level, system-dependent facilities. Such portions might well
+provide a portable interface for use by the program as a whole, but are
+themselves not portable, and should be thoroughly tested each time they
+are rebuilt using a new compiler or version of a compiler.
+
+ *Implementation Note:* Currently, `g77' passes all arguments either
+by reference or by descriptor.
+
+ Thus, use of `%VAL()' tends to be restricted to cases where the
+called procedure is written in a language other than Fortran that
+supports call-by-value semantics. (C is an example of such a language.)
+
+ *Note Procedures (SUBROUTINE and FUNCTION): Procedures, for detailed
+information on how this particular version of `g77' passes arguments to
+procedures.
+
+\1f
+File: g77.info, Node: %REF(), Next: %DESCR(), Prev: %VAL(), Up: Functions and Subroutines
+
+The `%REF()' Construct
+----------------------
+
+ %REF(ARG)
+
+ The `%REF()' construct specifies that an argument, ARG, is to be
+passed by reference, instead of by value or descriptor.
+
+ `%REF()' is restricted to actual arguments in invocations of
+external procedures.
+
+ Use of `%REF()' is recommended only for code that is accessing
+facilities outside of GNU Fortran, such as operating system or
+windowing facilities. It is best to constrain such uses to isolated
+portions of a program--portions the deal specifically and exclusively
+with low-level, system-dependent facilities. Such portions might well
+provide a portable interface for use by the program as a whole, but are
+themselves not portable, and should be thoroughly tested each time they
+are rebuilt using a new compiler or version of a compiler.
+
+ Do not depend on `%REF()' supplying a pointer to the procedure being
+invoked. While that is a likely implementation choice, other
+implementation choices are available that preserve Fortran
+pass-by-reference semantics without passing a pointer to the argument,
+ARG. (For example, a copy-in/copy-out implementation.)
+
+ *Implementation Note:* Currently, `g77' passes all arguments (other
+than variables and arrays of type `CHARACTER') by reference. Future
+versions of, or dialects supported by, `g77' might not pass `CHARACTER'
+functions by reference.
+
+ Thus, use of `%REF()' tends to be restricted to cases where ARG is
+type `CHARACTER' but the called procedure accesses it via a means other
+than the method used for Fortran `CHARACTER' arguments.
+
+ *Note Procedures (SUBROUTINE and FUNCTION): Procedures, for detailed
+information on how this particular version of `g77' passes arguments to
+procedures.
+
+\1f
+File: g77.info, Node: %DESCR(), Next: Generics and Specifics, Prev: %REF(), Up: Functions and Subroutines
+
+The `%DESCR()' Construct
+------------------------
+
+ %DESCR(ARG)
+
+ The `%DESCR()' construct specifies that an argument, ARG, is to be
+passed by descriptor, instead of by value or reference.
+
+ `%DESCR()' is restricted to actual arguments in invocations of
+external procedures.
+
+ Use of `%DESCR()' is recommended only for code that is accessing
+facilities outside of GNU Fortran, such as operating system or
+windowing facilities. It is best to constrain such uses to isolated
+portions of a program--portions the deal specifically and exclusively
+with low-level, system-dependent facilities. Such portions might well
+provide a portable interface for use by the program as a whole, but are
+themselves not portable, and should be thoroughly tested each time they
+are rebuilt using a new compiler or version of a compiler.
+
+ Do not depend on `%DESCR()' supplying a pointer and/or a length
+passed by value to the procedure being invoked. While that is a likely
+implementation choice, other implementation choices are available that
+preserve the pass-by-reference semantics without passing a pointer to
+the argument, ARG. (For example, a copy-in/copy-out implementation.)
+And, future versions of `g77' might change the way descriptors are
+implemented, such as passing a single argument pointing to a record
+containing the pointer/length information instead of passing that same
+information via two arguments as it currently does.
+
+ *Implementation Note:* Currently, `g77' passes all variables and
+arrays of type `CHARACTER' by descriptor. Future versions of, or
+dialects supported by, `g77' might pass `CHARACTER' functions by
+descriptor as well.
+
+ Thus, use of `%DESCR()' tends to be restricted to cases where ARG is
+not type `CHARACTER' but the called procedure accesses it via a means
+similar to the method used for Fortran `CHARACTER' arguments.
+
+ *Note Procedures (SUBROUTINE and FUNCTION): Procedures, for detailed
+information on how this particular version of `g77' passes arguments to
+procedures.
+
+\1f
+File: g77.info, Node: Generics and Specifics, Next: REAL() and AIMAG() of Complex, Prev: %DESCR(), Up: Functions and Subroutines
+
+Generics and Specifics
+----------------------
+
+ The ANSI FORTRAN 77 language defines generic and specific intrinsics.
+In short, the distinctions are:
+
+ * *Specific* intrinsics have specific types for their arguments and
+ a specific return type.
+
+ * *Generic* intrinsics are treated, on a case-by-case basis in the
+ program's source code, as one of several possible specific
+ intrinsics.
+
+ Typically, a generic intrinsic has a return type that is
+ determined by the type of one or more of its arguments.
+
+ The GNU Fortran language generalizes these concepts somewhat,
+especially by providing intrinsic subroutines and generic intrinsics
+that are treated as either a specific intrinsic subroutine or a
+specific intrinsic function (e.g. `SECOND').
+
+ However, GNU Fortran avoids generalizing this concept to the point
+where existing code would be accepted as meaning something possibly
+different than what was intended.
+
+ For example, `ABS' is a generic intrinsic, so all working code
+written using `ABS' of an `INTEGER' argument expects an `INTEGER'
+return value. Similarly, all such code expects that `ABS' of an
+`INTEGER*2' argument returns an `INTEGER*2' return value.
+
+ Yet, `IABS' is a *specific* intrinsic that accepts only an
+`INTEGER(KIND=1)' argument. Code that passes something other than an
+`INTEGER(KIND=1)' argument to `IABS' is not valid GNU Fortran code,
+because it is not clear what the author intended.
+
+ For example, if `J' is `INTEGER(KIND=6)', `IABS(J)' is not defined
+by the GNU Fortran language, because the programmer might have used
+that construct to mean any of the following, subtly different, things:
+
+ * Convert `J' to `INTEGER(KIND=1)' first (as if `IABS(INT(J))' had
+ been written).
+
+ * Convert the result of the intrinsic to `INTEGER(KIND=1)' (as if
+ `INT(ABS(J))' had been written).
+
+ * No conversion (as if `ABS(J)' had been written).
+
+ The distinctions matter especially when types and values wider than
+`INTEGER(KIND=1)' (such as `INTEGER(KIND=2)'), or when operations
+performing more "arithmetic" than absolute-value, are involved.
+
+ The following sample program is not a valid GNU Fortran program, but
+might be accepted by other compilers. If so, the output is likely to
+be revealing in terms of how a given compiler treats intrinsics (that
+normally are specific) when they are given arguments that do not
+conform to their stated requirements:
+
+ PROGRAM JCB002
+ C Version 1:
+ C Modified 1997-05-21 (Burley) to accommodate compilers that implement
+ C INT(I1-I2) as INT(I1)-INT(I2) given INTEGER*2 I1,I2.
+ C
+ C Version 0:
+ C Written by James Craig Burley 1997-02-20.
+ C Contact via Internet email: burley@gnu.ai.mit.edu
+ C
+ C Purpose:
+ C Determine how compilers handle non-standard IDIM
+ C on INTEGER*2 operands, which presumably can be
+ C extrapolated into understanding how the compiler
+ C generally treats specific intrinsics that are passed
+ C arguments not of the correct types.
+ C
+ C If your compiler implements INTEGER*2 and INTEGER
+ C as the same type, change all INTEGER*2 below to
+ C INTEGER*1.
+ C
+ INTEGER*2 I0, I4
+ INTEGER I1, I2, I3
+ INTEGER*2 ISMALL, ILARGE
+ INTEGER*2 ITOOLG, ITWO
+ INTEGER*2 ITMP
+ LOGICAL L2, L3, L4
+ C
+ C Find smallest INTEGER*2 number.
+ C
+ ISMALL=0
+ 10 I0 = ISMALL-1
+ IF ((I0 .GE. ISMALL) .OR. (I0+1 .NE. ISMALL)) GOTO 20
+ ISMALL = I0
+ GOTO 10
+ 20 CONTINUE
+ C
+ C Find largest INTEGER*2 number.
+ C
+ ILARGE=0
+ 30 I0 = ILARGE+1
+ IF ((I0 .LE. ILARGE) .OR. (I0-1 .NE. ILARGE)) GOTO 40
+ ILARGE = I0
+ GOTO 30
+ 40 CONTINUE
+ C
+ C Multiplying by two adds stress to the situation.
+ C
+ ITWO = 2
+ C
+ C Need a number that, added to -2, is too wide to fit in I*2.
+ C
+ ITOOLG = ISMALL
+ C
+ C Use IDIM the straightforward way.
+ C
+ I1 = IDIM (ILARGE, ISMALL) * ITWO + ITOOLG
+ C
+ C Calculate result for first interpretation.
+ C
+ I2 = (INT (ILARGE) - INT (ISMALL)) * ITWO + ITOOLG
+ C
+ C Calculate result for second interpretation.
+ C
+ ITMP = ILARGE - ISMALL
+ I3 = (INT (ITMP)) * ITWO + ITOOLG
+ C
+ C Calculate result for third interpretation.
+ C
+ I4 = (ILARGE - ISMALL) * ITWO + ITOOLG
+ C
+ C Print results.
+ C
+ PRINT *, 'ILARGE=', ILARGE
+ PRINT *, 'ITWO=', ITWO
+ PRINT *, 'ITOOLG=', ITOOLG
+ PRINT *, 'ISMALL=', ISMALL
+ PRINT *, 'I1=', I1
+ PRINT *, 'I2=', I2
+ PRINT *, 'I3=', I3
+ PRINT *, 'I4=', I4
+ PRINT *
+ L2 = (I1 .EQ. I2)
+ L3 = (I1 .EQ. I3)
+ L4 = (I1 .EQ. I4)
+ IF (L2 .AND. .NOT.L3 .AND. .NOT.L4) THEN
+ PRINT *, 'Interp 1: IDIM(I*2,I*2) => IDIM(INT(I*2),INT(I*2))'
+ STOP
+ END IF
+ IF (L3 .AND. .NOT.L2 .AND. .NOT.L4) THEN
+ PRINT *, 'Interp 2: IDIM(I*2,I*2) => INT(DIM(I*2,I*2))'
+ STOP
+ END IF
+ IF (L4 .AND. .NOT.L2 .AND. .NOT.L3) THEN
+ PRINT *, 'Interp 3: IDIM(I*2,I*2) => DIM(I*2,I*2)'
+ STOP
+ END IF
+ PRINT *, 'Results need careful analysis.'
+ END
+
+ No future version of the GNU Fortran language will likely permit
+specific intrinsic invocations with wrong-typed arguments (such as
+`IDIM' in the above example), since it has been determined that
+disagreements exist among many production compilers on the
+interpretation of such invocations. These disagreements strongly
+suggest that Fortran programmers, and certainly existing Fortran
+programs, disagree about the meaning of such invocations.
+
+ The first version of `JCB002' didn't accommodate some compilers'
+treatment of `INT(I1-I2)' where `I1' and `I2' are `INTEGER*2'. In such
+a case, these compilers apparently convert both operands to `INTEGER*4'
+and then do an `INTEGER*4' subtraction, instead of doing an `INTEGER*2'
+subtraction on the original values in `I1' and `I2'.
+
+ However, the results of the careful analyses done on the outputs of
+programs compiled by these various compilers show that they all
+implement either `Interp 1' or `Interp 2' above.
+
+ Specifically, it is believed that the new version of `JCB002' above
+will confirm that:
+
+ * Digital Semiconductor ("DEC") Alpha OSF/1, HP-UX 10.0.1, AIX 3.2.5
+ `f77' compilers all implement `Interp 1'.
+
+ * IRIX 5.3 `f77' compiler implements `Interp 2'.
+
+ * Solaris 2.5, SunOS 4.1.3, DECstation ULTRIX 4.3, and IRIX 6.1
+ `f77' compilers all implement `Interp 3'.
+
+ If you get different results than the above for the stated
+compilers, or have results for other compilers that might be worth
+adding to the above list, please let us know the details (compiler
+product, version, machine, results, and so on).
+
+\1f
+File: g77.info, Node: REAL() and AIMAG() of Complex, Next: CMPLX() of DOUBLE PRECISION, Prev: Generics and Specifics, Up: Functions and Subroutines
+
+`REAL()' and `AIMAG()' of Complex
+---------------------------------
+
+ The GNU Fortran language disallows `REAL(EXPR)' and `AIMAG(EXPR)',
+where EXPR is any `COMPLEX' type other than `COMPLEX(KIND=1)', except
+when they are used in the following way:
+
+ REAL(REAL(EXPR))
+ REAL(AIMAG(EXPR))
+
+The above forms explicitly specify that the desired effect is to
+convert the real or imaginary part of EXPR, which might be some `REAL'
+type other than `REAL(KIND=1)', to type `REAL(KIND=1)', and have that
+serve as the value of the expression.
+
+ The GNU Fortran language offers clearly named intrinsics to extract
+the real and imaginary parts of a complex entity without any conversion:
+
+ REALPART(EXPR)
+ IMAGPART(EXPR)
+
+ To express the above using typical extended FORTRAN 77, use the
+following constructs (when EXPR is `COMPLEX(KIND=2)'):
+
+ DBLE(EXPR)
+ DIMAG(EXPR)
+
+ The FORTRAN 77 language offers no way to explicitly specify the real
+and imaginary parts of a complex expression of arbitrary type,
+apparently as a result of requiring support for only one `COMPLEX' type
+(`COMPLEX(KIND=1)'). The concepts of converting an expression to type
+`REAL(KIND=1)' and of extracting the real part of a complex expression
+were thus "smooshed" by FORTRAN 77 into a single intrinsic, since they
+happened to have the exact same effect in that language (due to having
+only one `COMPLEX' type).
+
+ *Note:* When `-ff90' is in effect, `g77' treats `REAL(EXPR)', where
+EXPR is of type `COMPLEX', as `REALPART(EXPR)', whereas with
+`-fugly-complex -fno-f90' in effect, it is treated as
+`REAL(REALPART(EXPR))'.
+
+ *Note Ugly Complex Part Extraction::, for more information.
+
+\1f
+File: g77.info, Node: CMPLX() of DOUBLE PRECISION, Next: MIL-STD 1753, Prev: REAL() and AIMAG() of Complex, Up: Functions and Subroutines
+
+`CMPLX()' of `DOUBLE PRECISION'
+-------------------------------
+
+ In accordance with Fortran 90 and at least some (perhaps all) other
+compilers, the GNU Fortran language defines `CMPLX()' as always
+returning a result that is type `COMPLEX(KIND=1)'.
+
+ This means `CMPLX(D1,D2)', where `D1' and `D2' are `REAL(KIND=2)'
+(`DOUBLE PRECISION'), is treated as:
+
+ CMPLX(SNGL(D1), SNGL(D2))
+
+ (It was necessary for Fortran 90 to specify this behavior for
+`DOUBLE PRECISION' arguments, since that is the behavior mandated by
+FORTRAN 77.)
+
+ The GNU Fortran language also provides the `DCMPLX()' intrinsic,
+which is provided by some FORTRAN 77 compilers to construct a `DOUBLE
+COMPLEX' entity from of `DOUBLE PRECISION' operands. However, this
+solution does not scale well when more `COMPLEX' types (having various
+precisions and ranges) are offered by Fortran implementations.
+
+ Fortran 90 extends the `CMPLX()' intrinsic by adding an extra
+argument used to specify the desired kind of complex result. However,
+this solution is somewhat awkward to use, and `g77' currently does not
+support it.
+
+ The GNU Fortran language provides a simple way to build a complex
+value out of two numbers, with the precise type of the value determined
+by the types of the two numbers (via the usual type-promotion
+mechanism):
+
+ COMPLEX(REAL, IMAG)
+
+ When REAL and IMAG are the same `REAL' types, `COMPLEX()' performs
+no conversion other than to put them together to form a complex result
+of the same (complex version of real) type.
+
+ *Note Complex Intrinsic::, for more information.
+
+\1f
+File: g77.info, Node: MIL-STD 1753, Next: f77/f2c Intrinsics, Prev: CMPLX() of DOUBLE PRECISION, Up: Functions and Subroutines
+
+MIL-STD 1753 Support
+--------------------
+
+ The GNU Fortran language includes the MIL-STD 1753 intrinsics
+`BTEST', `IAND', `IBCLR', `IBITS', `IBSET', `IEOR', `IOR', `ISHFT',
+`ISHFTC', `MVBITS', and `NOT'.
+
+\1f
+File: g77.info, Node: f77/f2c Intrinsics, Next: Table of Intrinsic Functions, Prev: MIL-STD 1753, Up: Functions and Subroutines
+
+`f77'/`f2c' Intrinsics
+----------------------
+
+ The bit-manipulation intrinsics supported by traditional `f77' and
+by `f2c' are available in the GNU Fortran language. These include
+`AND', `LSHIFT', `OR', `RSHIFT', and `XOR'.
+
+ Also supported are the intrinsics `CDABS', `CDCOS', `CDEXP',
+`CDLOG', `CDSIN', `CDSQRT', `DCMPLX', `DCONJG', `DFLOAT', `DIMAG',
+`DREAL', and `IMAG', `ZABS', `ZCOS', `ZEXP', `ZLOG', `ZSIN', and
+`ZSQRT'.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: Table of Intrinsic Functions, Prev: f77/f2c Intrinsics, Up: Functions and Subroutines
+
+Table of Intrinsic Functions
+----------------------------
+
+ (Corresponds to Section 15.10 of ANSI X3.9-1978 FORTRAN 77.)
+
+ The GNU Fortran language adds various functions, subroutines, types,
+and arguments to the set of intrinsic functions in ANSI FORTRAN 77.
+The complete set of intrinsics supported by the GNU Fortran language is
+described below.
+
+ Note that a name is not treated as that of an intrinsic if it is
+specified in an `EXTERNAL' statement in the same program unit; if a
+command-line option is used to disable the groups to which the
+intrinsic belongs; or if the intrinsic is not named in an `INTRINSIC'
+statement and a command-line option is used to hide the groups to which
+the intrinsic belongs.
+
+ So, it is recommended that any reference in a program unit to an
+intrinsic procedure that is not a standard FORTRAN 77 intrinsic be
+accompanied by an appropriate `INTRINSIC' statement in that program
+unit. This sort of defensive programming makes it more likely that an
+implementation will issue a diagnostic rather than generate incorrect
+code for such a reference.
+
+ The terminology used below is based on that of the Fortran 90
+standard, so that the text may be more concise and accurate:
+
+ * `OPTIONAL' means the argument may be omitted.
+
+ * `A-1, A-2, ..., A-n' means more than one argument (generally named
+ `A') may be specified.
+
+ * `scalar' means the argument must not be an array (must be a
+ variable or array element, or perhaps a constant if expressions
+ are permitted).
+
+ * `DIMENSION(4)' means the argument must be an array having 4
+ elements.
+
+ * `INTENT(IN)' means the argument must be an expression (such as a
+ constant or a variable that is defined upon invocation of the
+ intrinsic).
+
+ * `INTENT(OUT)' means the argument must be definable by the
+ invocation of the intrinsic (that is, must not be a constant nor
+ an expression involving operators other than array reference and
+ substring reference).
+
+ * `INTENT(INOUT)' means the argument must be defined prior to, and
+ definable by, invocation of the intrinsic (a combination of the
+ requirements of `INTENT(IN)' and `INTENT(OUT)'.
+
+ * *Note Kind Notation:: for explanation of `KIND'.
+
+ (Note that the empty lines appearing in the menu below are not
+intentional--they result from a bug in the GNU `makeinfo' program...a
+program that, if it did not exist, would leave this document in far
+worse shape!)
+
+* Menu:
+
+
+* Abort Intrinsic:: Abort the program.
+
+* Abs Intrinsic:: Absolute value.
+
+* Access Intrinsic:: Check file accessibility.
+
+* AChar Intrinsic:: ASCII character from code.
+
+* ACos Intrinsic:: Arc cosine.
+
+* AdjustL Intrinsic:: (Reserved for future use.)
+* AdjustR Intrinsic:: (Reserved for future use.)
+
+* AImag Intrinsic:: Convert/extract imaginary part of complex.
+
+* AInt Intrinsic:: Truncate to whole number.
+
+* Alarm Intrinsic:: Execute a routine after a given delay.
+
+* All Intrinsic:: (Reserved for future use.)
+* Allocated Intrinsic:: (Reserved for future use.)
+
+* ALog Intrinsic:: Natural logarithm (archaic).
+* ALog10 Intrinsic:: Natural logarithm (archaic).
+* AMax0 Intrinsic:: Maximum value (archaic).
+* AMax1 Intrinsic:: Maximum value (archaic).
+* AMin0 Intrinsic:: Minimum value (archaic).
+* AMin1 Intrinsic:: Minimum value (archaic).
+* AMod Intrinsic:: Remainder (archaic).
+
+* And Intrinsic:: Boolean AND.
+
+* ANInt Intrinsic:: Round to nearest whole number.
+
+* Any Intrinsic:: (Reserved for future use.)
+
+* ASin Intrinsic:: Arc sine.
+
+* Associated Intrinsic:: (Reserved for future use.)
+
+* ATan Intrinsic:: Arc tangent.
+* ATan2 Intrinsic:: Arc tangent.
+
+* BesJ0 Intrinsic:: Bessel function.
+* BesJ1 Intrinsic:: Bessel function.
+* BesJN Intrinsic:: Bessel function.
+* BesY0 Intrinsic:: Bessel function.
+* BesY1 Intrinsic:: Bessel function.
+* BesYN Intrinsic:: Bessel function.
+
+* Bit_Size Intrinsic:: Number of bits in argument's type.
+
+* BTest Intrinsic:: Test bit.
+
+* CAbs Intrinsic:: Absolute value (archaic).
+* CCos Intrinsic:: Cosine (archaic).
+
+* Ceiling Intrinsic:: (Reserved for future use.)
+
+* CExp Intrinsic:: Exponential (archaic).
+* Char Intrinsic:: Character from code.
+
+* ChDir Intrinsic (subroutine):: Change directory.
+
+* ChMod Intrinsic (subroutine):: Change file modes.
+
+* CLog Intrinsic:: Natural logarithm (archaic).
+* Cmplx Intrinsic:: Construct `COMPLEX(KIND=1)' value.
+
+* Complex Intrinsic:: Build complex value from real and
+ imaginary parts.
+
+* Conjg Intrinsic:: Complex conjugate.
+* Cos Intrinsic:: Cosine.
+
+* CosH Intrinsic:: Hyperbolic cosine.
+
+* Count Intrinsic:: (Reserved for future use.)
+* Cpu_Time Intrinsic:: Get current CPU time.
+* CShift Intrinsic:: (Reserved for future use.)
+
+* CSin Intrinsic:: Sine (archaic).
+* CSqRt Intrinsic:: Square root (archaic).
+
+* CTime Intrinsic (subroutine):: Convert time to Day Mon dd hh:mm:ss yyyy.
+* CTime Intrinsic (function):: Convert time to Day Mon dd hh:mm:ss yyyy.
+
+* DAbs Intrinsic:: Absolute value (archaic).
+* DACos Intrinsic:: Arc cosine (archaic).
+
+* DASin Intrinsic:: Arc sine (archaic).
+
+* DATan Intrinsic:: Arc tangent (archaic).
+* DATan2 Intrinsic:: Arc tangent (archaic).
+
+* Date_and_Time Intrinsic:: (Reserved for future use.)
+
+* DbesJ0 Intrinsic:: Bessel function (archaic).
+* DbesJ1 Intrinsic:: Bessel function (archaic).
+* DbesJN Intrinsic:: Bessel function (archaic).
+* DbesY0 Intrinsic:: Bessel function (archaic).
+* DbesY1 Intrinsic:: Bessel function (archaic).
+* DbesYN Intrinsic:: Bessel function (archaic).
+
+* Dble Intrinsic:: Convert to double precision.
+
+* DCos Intrinsic:: Cosine (archaic).
+
+* DCosH Intrinsic:: Hyperbolic cosine (archaic).
+* DDiM Intrinsic:: Difference magnitude (archaic).
+
+* DErF Intrinsic:: Error function (archaic).
+* DErFC Intrinsic:: Complementary error function (archaic).
+
+* DExp Intrinsic:: Exponential (archaic).
+
+* Digits Intrinsic:: (Reserved for future use.)
+
+* DiM Intrinsic:: Difference magnitude (non-negative subtract).
+
+* DInt Intrinsic:: Truncate to whole number (archaic).
+* DLog Intrinsic:: Natural logarithm (archaic).
+* DLog10 Intrinsic:: Natural logarithm (archaic).
+* DMax1 Intrinsic:: Maximum value (archaic).
+* DMin1 Intrinsic:: Minimum value (archaic).
+* DMod Intrinsic:: Remainder (archaic).
+* DNInt Intrinsic:: Round to nearest whole number (archaic).
+
+* Dot_Product Intrinsic:: (Reserved for future use.)
+
+* DProd Intrinsic:: Double-precision product.
+
+* DSign Intrinsic:: Apply sign to magnitude (archaic).
+* DSin Intrinsic:: Sine (archaic).
+
+* DSinH Intrinsic:: Hyperbolic sine (archaic).
+* DSqRt Intrinsic:: Square root (archaic).
+* DTan Intrinsic:: Tangent (archaic).
+
+* DTanH Intrinsic:: Hyperbolic tangent (archaic).
+
+* Dtime Intrinsic (subroutine):: Get elapsed time since last time.
+
+* EOShift Intrinsic:: (Reserved for future use.)
+* Epsilon Intrinsic:: (Reserved for future use.)
+
+* ErF Intrinsic:: Error function.
+* ErFC Intrinsic:: Complementary error function.
+* ETime Intrinsic (subroutine):: Get elapsed time for process.
+* ETime Intrinsic (function):: Get elapsed time for process.
+* Exit Intrinsic:: Terminate the program.
+
+* Exp Intrinsic:: Exponential.
+
+* Exponent Intrinsic:: (Reserved for future use.)
+
+* Fdate Intrinsic (subroutine):: Get current time as Day Mon dd hh:mm:ss yyyy.
+* Fdate Intrinsic (function):: Get current time as Day Mon dd hh:mm:ss yyyy.
+* FGet Intrinsic (subroutine):: Read a character from unit 5 stream-wise.
+
+* FGetC Intrinsic (subroutine):: Read a character stream-wise.
+
+* Float Intrinsic:: Conversion (archaic).
+
+* Floor Intrinsic:: (Reserved for future use.)
+
+* Flush Intrinsic:: Flush buffered output.
+* FNum Intrinsic:: Get file descriptor from Fortran unit number.
+* FPut Intrinsic (subroutine):: Write a character to unit 6 stream-wise.
+
+* FPutC Intrinsic (subroutine):: Write a character stream-wise.
+
+* Fraction Intrinsic:: (Reserved for future use.)
+
+* FSeek Intrinsic:: Position file (low-level).
+* FStat Intrinsic (subroutine):: Get file information.
+* FStat Intrinsic (function):: Get file information.
+* FTell Intrinsic (subroutine):: Get file position (low-level).
+* FTell Intrinsic (function):: Get file position (low-level).
+* GError Intrinsic:: Get error message for last error.
+* GetArg Intrinsic:: Obtain command-line argument.
+* GetCWD Intrinsic (subroutine):: Get current working directory.
+* GetCWD Intrinsic (function):: Get current working directory.
+* GetEnv Intrinsic:: Get environment variable.
+* GetGId Intrinsic:: Get process group id.
+* GetLog Intrinsic:: Get login name.
+* GetPId Intrinsic:: Get process id.
+* GetUId Intrinsic:: Get process user id.
+* GMTime Intrinsic:: Convert time to GMT time info.
+* HostNm Intrinsic (subroutine):: Get host name.
+* HostNm Intrinsic (function):: Get host name.
+
+* Huge Intrinsic:: (Reserved for future use.)
+
+* IAbs Intrinsic:: Absolute value (archaic).
+
+* IAChar Intrinsic:: ASCII code for character.
+
+* IAnd Intrinsic:: Boolean AND.
+
+* IArgC Intrinsic:: Obtain count of command-line arguments.
+
+* IBClr Intrinsic:: Clear a bit.
+* IBits Intrinsic:: Extract a bit subfield of a variable.
+* IBSet Intrinsic:: Set a bit.
+
+* IChar Intrinsic:: Code for character.
+
+* IDate Intrinsic (UNIX):: Get local time info.
+
+* IDiM Intrinsic:: Difference magnitude (archaic).
+* IDInt Intrinsic:: Convert to `INTEGER' value truncated
+ to whole number (archaic).
+* IDNInt Intrinsic:: Convert to `INTEGER' value rounded
+ to nearest whole number (archaic).
+
+* IEOr Intrinsic:: Boolean XOR.
+
+* IErrNo Intrinsic:: Get error number for last error.
+
+* IFix Intrinsic:: Conversion (archaic).
+
+* Imag Intrinsic:: Extract imaginary part of complex.
+
+* ImagPart Intrinsic:: Extract imaginary part of complex.
+
+* Index Intrinsic:: Locate a CHARACTER substring.
+
+* Int Intrinsic:: Convert to `INTEGER' value truncated
+ to whole number.
+
+* Int2 Intrinsic:: Convert to `INTEGER(KIND=6)' value
+ truncated to whole number.
+* Int8 Intrinsic:: Convert to `INTEGER(KIND=2)' value
+ truncated to whole number.
+
+* IOr Intrinsic:: Boolean OR.
+
+* IRand Intrinsic:: Random number.
+* IsaTty Intrinsic:: Is unit connected to a terminal?
+
+* IShft Intrinsic:: Logical bit shift.
+* IShftC Intrinsic:: Circular bit shift.
+
+* ISign Intrinsic:: Apply sign to magnitude (archaic).
+
+* ITime Intrinsic:: Get local time of day.
+
+* Kill Intrinsic (subroutine):: Signal a process.
+
+* Kind Intrinsic:: (Reserved for future use.)
+* LBound Intrinsic:: (Reserved for future use.)
+
+* Len Intrinsic:: Length of character entity.
+
+* Len_Trim Intrinsic:: Get last non-blank character in string.
+
+* LGe Intrinsic:: Lexically greater than or equal.
+* LGt Intrinsic:: Lexically greater than.
+
+* Link Intrinsic (subroutine):: Make hard link in file system.
+
+* LLe Intrinsic:: Lexically less than or equal.
+* LLt Intrinsic:: Lexically less than.
+
+* LnBlnk Intrinsic:: Get last non-blank character in string.
+* Loc Intrinsic:: Address of entity in core.
+
+* Log Intrinsic:: Natural logarithm.
+* Log10 Intrinsic:: Natural logarithm.
+
+* Logical Intrinsic:: (Reserved for future use.)
+
+* Long Intrinsic:: Conversion to `INTEGER(KIND=1)' (archaic).
+
+* LShift Intrinsic:: Left-shift bits.
+
+* LStat Intrinsic (subroutine):: Get file information.
+* LStat Intrinsic (function):: Get file information.
+* LTime Intrinsic:: Convert time to local time info.
+
+* MatMul Intrinsic:: (Reserved for future use.)
+
+* Max Intrinsic:: Maximum value.
+* Max0 Intrinsic:: Maximum value (archaic).
+* Max1 Intrinsic:: Maximum value (archaic).
+
+* MaxExponent Intrinsic:: (Reserved for future use.)
+* MaxLoc Intrinsic:: (Reserved for future use.)
+* MaxVal Intrinsic:: (Reserved for future use.)
+
+* MClock Intrinsic:: Get number of clock ticks for process.
+* MClock8 Intrinsic:: Get number of clock ticks for process.
+
+* Merge Intrinsic:: (Reserved for future use.)
+
+* Min Intrinsic:: Minimum value.
+* Min0 Intrinsic:: Minimum value (archaic).
+* Min1 Intrinsic:: Minimum value (archaic).
+
+* MinExponent Intrinsic:: (Reserved for future use.)
+* MinLoc Intrinsic:: (Reserved for future use.)
+* MinVal Intrinsic:: (Reserved for future use.)
+
+* Mod Intrinsic:: Remainder.
+
+* Modulo Intrinsic:: (Reserved for future use.)
+
+* MvBits Intrinsic:: Moving a bit field.
+
+* Nearest Intrinsic:: (Reserved for future use.)
+
+* NInt Intrinsic:: Convert to `INTEGER' value rounded
+ to nearest whole number.
+
+* Not Intrinsic:: Boolean NOT.
+
+* Or Intrinsic:: Boolean OR.
+
+* Pack Intrinsic:: (Reserved for future use.)
+
+* PError Intrinsic:: Print error message for last error.
+
+* Precision Intrinsic:: (Reserved for future use.)
+* Present Intrinsic:: (Reserved for future use.)
+* Product Intrinsic:: (Reserved for future use.)
+
+* Radix Intrinsic:: (Reserved for future use.)
+
+* Rand Intrinsic:: Random number.
+
+* Random_Number Intrinsic:: (Reserved for future use.)
+* Random_Seed Intrinsic:: (Reserved for future use.)
+* Range Intrinsic:: (Reserved for future use.)
+
+* Real Intrinsic:: Convert value to type `REAL(KIND=1)'.
+
+* RealPart Intrinsic:: Extract real part of complex.
+
+* Rename Intrinsic (subroutine):: Rename file.
+
+* Repeat Intrinsic:: (Reserved for future use.)
+* Reshape Intrinsic:: (Reserved for future use.)
+* RRSpacing Intrinsic:: (Reserved for future use.)
+
+* RShift Intrinsic:: Right-shift bits.
+
+* Scale Intrinsic:: (Reserved for future use.)
+* Scan Intrinsic:: (Reserved for future use.)
+
+* Second Intrinsic (function):: Get CPU time for process in seconds.
+* Second Intrinsic (subroutine):: Get CPU time for process
+ in seconds.
+
+* Selected_Int_Kind Intrinsic:: (Reserved for future use.)
+* Selected_Real_Kind Intrinsic:: (Reserved for future use.)
+* Set_Exponent Intrinsic:: (Reserved for future use.)
+* Shape Intrinsic:: (Reserved for future use.)
+
+* Short Intrinsic:: Convert to `INTEGER(KIND=6)' value
+ truncated to whole number.
+
+* Sign Intrinsic:: Apply sign to magnitude.
+
+* Signal Intrinsic (subroutine):: Muck with signal handling.
+
+* Sin Intrinsic:: Sine.
+
+* SinH Intrinsic:: Hyperbolic sine.
+
+* Sleep Intrinsic:: Sleep for a specified time.
+
+* Sngl Intrinsic:: Convert (archaic).
+
+* Spacing Intrinsic:: (Reserved for future use.)
+* Spread Intrinsic:: (Reserved for future use.)
+
+* SqRt Intrinsic:: Square root.
+
+* SRand Intrinsic:: Random seed.
+* Stat Intrinsic (subroutine):: Get file information.
+* Stat Intrinsic (function):: Get file information.
+
+* Sum Intrinsic:: (Reserved for future use.)
+
+* SymLnk Intrinsic (subroutine):: Make symbolic link in file system.
+
+* System Intrinsic (subroutine):: Invoke shell (system) command.
+
+* System_Clock Intrinsic:: Get current system clock value.
+
+* Tan Intrinsic:: Tangent.
+
+* TanH Intrinsic:: Hyperbolic tangent.
+
+* Time Intrinsic (UNIX):: Get current time as time value.
+
+* Time8 Intrinsic:: Get current time as time value.
+
+* Tiny Intrinsic:: (Reserved for future use.)
+* Transfer Intrinsic:: (Reserved for future use.)
+* Transpose Intrinsic:: (Reserved for future use.)
+* Trim Intrinsic:: (Reserved for future use.)
+
+* TtyNam Intrinsic (subroutine):: Get name of terminal device for unit.
+* TtyNam Intrinsic (function):: Get name of terminal device for unit.
+
+* UBound Intrinsic:: (Reserved for future use.)
+
+* UMask Intrinsic (subroutine):: Set file creation permissions mask.
+
+* Unlink Intrinsic (subroutine):: Unlink file.
+
+* Unpack Intrinsic:: (Reserved for future use.)
+* Verify Intrinsic:: (Reserved for future use.)
+
+* XOr Intrinsic:: Boolean XOR.
+* ZAbs Intrinsic:: Absolute value (archaic).
+* ZCos Intrinsic:: Cosine (archaic).
+* ZExp Intrinsic:: Exponential (archaic).
+
+* ZLog Intrinsic:: Natural logarithm (archaic).
+* ZSin Intrinsic:: Sine (archaic).
+* ZSqRt Intrinsic:: Square root (archaic).
+
+\1f
+File: g77.info, Node: Abort Intrinsic, Next: Abs Intrinsic, Up: Table of Intrinsic Functions
+
+Abort Intrinsic
+...............
+
+ CALL Abort()
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Prints a message and potentially causes a core dump via `abort(3)'.
+
+\1f
+File: g77.info, Node: Abs Intrinsic, Next: Access Intrinsic, Prev: Abort Intrinsic, Up: Table of Intrinsic Functions
+
+Abs Intrinsic
+.............
+
+ Abs(A)
+
+Abs: `INTEGER' or `REAL' function. The exact type depends on that of
+argument A--if A is `COMPLEX', this function's type is `REAL' with the
+same `KIND=' value as the type of A. Otherwise, this function's type
+is the same as that of A.
+
+A: `INTEGER', `REAL', or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the absolute value of A.
+
+ If A is type `COMPLEX', the absolute value is computed as:
+
+ SQRT(REALPART(A)**2, IMAGPART(A)**2)
+
+Otherwise, it is computed by negating the A if it is negative, or
+returning A.
+
+ *Note Sign Intrinsic::, for how to explicitly compute the positive
+or negative form of the absolute value of an expression.
+
+\1f
+File: g77.info, Node: Access Intrinsic, Next: AChar Intrinsic, Prev: Abs Intrinsic, Up: Table of Intrinsic Functions
+
+Access Intrinsic
+................
+
+ Access(NAME, MODE)
+
+Access: `INTEGER(KIND=1)' function.
+
+NAME: `CHARACTER'; scalar; INTENT(IN).
+
+MODE: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Checks file NAME for accessibility in the mode specified by MODE and
+returns 0 if the file is accessible in that mode, otherwise an error
+code if the file is inaccessible or MODE is invalid. See `access(2)'.
+A null character (`CHAR(0)') marks the end of the name in
+NAME--otherwise, trailing blanks in NAME are ignored. MODE may be a
+concatenation of any of the following characters:
+
+`r'
+ Read permission
+
+`w'
+ Write permission
+
+`x'
+ Execute permission
+
+`SPC'
+ Existence
+
+\1f
+File: g77.info, Node: AChar Intrinsic, Next: ACos Intrinsic, Prev: Access Intrinsic, Up: Table of Intrinsic Functions
+
+AChar Intrinsic
+...............
+
+ AChar(I)
+
+AChar: `CHARACTER*1' function.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `f90'.
+
+Description:
+
+ Returns the ASCII character corresponding to the code specified by I.
+
+ *Note IAChar Intrinsic::, for the inverse of this function.
+
+ *Note Char Intrinsic::, for the function corresponding to the
+system's native character set.
+
+\1f
+File: g77.info, Node: ACos Intrinsic, Next: AdjustL Intrinsic, Prev: AChar Intrinsic, Up: Table of Intrinsic Functions
+
+ACos Intrinsic
+..............
+
+ ACos(X)
+
+ACos: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the arc-cosine (inverse cosine) of X in radians.
+
+ *Note Cos Intrinsic::, for the inverse of this function.
+
+\1f
+File: g77.info, Node: AdjustL Intrinsic, Next: AdjustR Intrinsic, Prev: ACos Intrinsic, Up: Table of Intrinsic Functions
+
+AdjustL Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL AdjustL' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: AdjustR Intrinsic, Next: AImag Intrinsic, Prev: AdjustL Intrinsic, Up: Table of Intrinsic Functions
+
+AdjustR Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL AdjustR' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: AImag Intrinsic, Next: AInt Intrinsic, Prev: AdjustR Intrinsic, Up: Table of Intrinsic Functions
+
+AImag Intrinsic
+...............
+
+ AImag(Z)
+
+AImag: `REAL' function. This intrinsic is valid when argument Z is
+`COMPLEX(KIND=1)'. When Z is any other `COMPLEX' type, this intrinsic
+is valid only when used as the argument to `REAL()', as explained below.
+
+Z: `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the (possibly converted) imaginary part of Z.
+
+ Use of `AIMAG()' with an argument of a type other than
+`COMPLEX(KIND=1)' is restricted to the following case:
+
+ REAL(AIMAG(Z))
+
+This expression converts the imaginary part of Z to `REAL(KIND=1)'.
+
+ *Note REAL() and AIMAG() of Complex::, for more information.
+
+\1f
+File: g77.info, Node: AInt Intrinsic, Next: Alarm Intrinsic, Prev: AImag Intrinsic, Up: Table of Intrinsic Functions
+
+AInt Intrinsic
+..............
+
+ AInt(A)
+
+AInt: `REAL' function, the `KIND=' value of the type being that of
+argument A.
+
+A: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns A with the fractional portion of its magnitude truncated and
+its sign preserved. (Also called "truncation towards zero".)
+
+ *Note ANInt Intrinsic::, for how to round to nearest whole number.
+
+ *Note Int Intrinsic::, for how to truncate and then convert number
+to `INTEGER'.
+
+\1f
+File: g77.info, Node: Alarm Intrinsic, Next: All Intrinsic, Prev: AInt Intrinsic, Up: Table of Intrinsic Functions
+
+Alarm Intrinsic
+...............
+
+ CALL Alarm(SECONDS, HANDLER, STATUS)
+
+SECONDS: `INTEGER'; scalar; INTENT(IN).
+
+HANDLER: Signal handler (`INTEGER FUNCTION' or `SUBROUTINE') or
+dummy/global `INTEGER(KIND=1)' scalar.
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Causes external subroutine HANDLER to be executed after a delay of
+SECONDS seconds by using `alarm(1)' to set up a signal and `signal(2)'
+to catch it. If STATUS is supplied, it will be returned with the the
+number of seconds remaining until any previously scheduled alarm was
+due to be delivered, or zero if there was no previously scheduled alarm.
+*Note Signal Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: All Intrinsic, Next: Allocated Intrinsic, Prev: Alarm Intrinsic, Up: Table of Intrinsic Functions
+
+All Intrinsic
+.............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL All' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Allocated Intrinsic, Next: ALog Intrinsic, Prev: All Intrinsic, Up: Table of Intrinsic Functions
+
+Allocated Intrinsic
+...................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Allocated' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: ALog Intrinsic, Next: ALog10 Intrinsic, Prev: Allocated Intrinsic, Up: Table of Intrinsic Functions
+
+ALog Intrinsic
+..............
+
+ ALog(X)
+
+ALog: `REAL(KIND=1)' function.
+
+X: `REAL(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `LOG()' that is specific to one type for X. *Note
+Log Intrinsic::.
+
+\1f
+File: g77.info, Node: ALog10 Intrinsic, Next: AMax0 Intrinsic, Prev: ALog Intrinsic, Up: Table of Intrinsic Functions
+
+ALog10 Intrinsic
+................
+
+ ALog10(X)
+
+ALog10: `REAL(KIND=1)' function.
+
+X: `REAL(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `LOG10()' that is specific to one type for X. *Note
+Log10 Intrinsic::.
+
+\1f
+File: g77.info, Node: AMax0 Intrinsic, Next: AMax1 Intrinsic, Prev: ALog10 Intrinsic, Up: Table of Intrinsic Functions
+
+AMax0 Intrinsic
+...............
+
+ AMax0(A-1, A-2, ..., A-n)
+
+AMax0: `REAL(KIND=1)' function.
+
+A: `INTEGER(KIND=1)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MAX()' that is specific to one type for A and a
+different return type. *Note Max Intrinsic::.
+
+\1f
+File: g77.info, Node: AMax1 Intrinsic, Next: AMin0 Intrinsic, Prev: AMax0 Intrinsic, Up: Table of Intrinsic Functions
+
+AMax1 Intrinsic
+...............
+
+ AMax1(A-1, A-2, ..., A-n)
+
+AMax1: `REAL(KIND=1)' function.
+
+A: `REAL(KIND=1)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MAX()' that is specific to one type for A. *Note
+Max Intrinsic::.
+
+\1f
+File: g77.info, Node: AMin0 Intrinsic, Next: AMin1 Intrinsic, Prev: AMax1 Intrinsic, Up: Table of Intrinsic Functions
+
+AMin0 Intrinsic
+...............
+
+ AMin0(A-1, A-2, ..., A-n)
+
+AMin0: `REAL(KIND=1)' function.
+
+A: `INTEGER(KIND=1)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MIN()' that is specific to one type for A and a
+different return type. *Note Min Intrinsic::.
+
+\1f
+File: g77.info, Node: AMin1 Intrinsic, Next: AMod Intrinsic, Prev: AMin0 Intrinsic, Up: Table of Intrinsic Functions
+
+AMin1 Intrinsic
+...............
+
+ AMin1(A-1, A-2, ..., A-n)
+
+AMin1: `REAL(KIND=1)' function.
+
+A: `REAL(KIND=1)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MIN()' that is specific to one type for A. *Note
+Min Intrinsic::.
+
+\1f
+File: g77.info, Node: AMod Intrinsic, Next: And Intrinsic, Prev: AMin1 Intrinsic, Up: Table of Intrinsic Functions
+
+AMod Intrinsic
+..............
+
+ AMod(A, P)
+
+AMod: `REAL(KIND=1)' function.
+
+A: `REAL(KIND=1)'; scalar; INTENT(IN).
+
+P: `REAL(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MOD()' that is specific to one type for A. *Note
+Mod Intrinsic::.
+
+\1f
+File: g77.info, Node: And Intrinsic, Next: ANInt Intrinsic, Prev: AMod Intrinsic, Up: Table of Intrinsic Functions
+
+And Intrinsic
+.............
+
+ And(I, J)
+
+And: `INTEGER' or `LOGICAL' function, the exact type being the result
+of cross-promoting the types of all the arguments.
+
+I: `INTEGER' or `LOGICAL'; scalar; INTENT(IN).
+
+J: `INTEGER' or `LOGICAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Returns value resulting from boolean AND of pair of bits in each of
+I and J.
+
+\1f
+File: g77.info, Node: ANInt Intrinsic, Next: Any Intrinsic, Prev: And Intrinsic, Up: Table of Intrinsic Functions
+
+ANInt Intrinsic
+...............
+
+ ANInt(A)
+
+ANInt: `REAL' function, the `KIND=' value of the type being that of
+argument A.
+
+A: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns A with the fractional portion of its magnitude eliminated by
+rounding to the nearest whole number and with its sign preserved.
+
+ A fractional portion exactly equal to `.5' is rounded to the whole
+number that is larger in magnitude. (Also called "Fortran round".)
+
+ *Note AInt Intrinsic::, for how to truncate to whole number.
+
+ *Note NInt Intrinsic::, for how to round and then convert number to
+`INTEGER'.
+
+\1f
+File: g77.info, Node: Any Intrinsic, Next: ASin Intrinsic, Prev: ANInt Intrinsic, Up: Table of Intrinsic Functions
+
+Any Intrinsic
+.............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Any' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: ASin Intrinsic, Next: Associated Intrinsic, Prev: Any Intrinsic, Up: Table of Intrinsic Functions
+
+ASin Intrinsic
+..............
+
+ ASin(X)
+
+ASin: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the arc-sine (inverse sine) of X in radians.
+
+ *Note Sin Intrinsic::, for the inverse of this function.
+
+\1f
+File: g77.info, Node: Associated Intrinsic, Next: ATan Intrinsic, Prev: ASin Intrinsic, Up: Table of Intrinsic Functions
+
+Associated Intrinsic
+....................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Associated' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: ATan Intrinsic, Next: ATan2 Intrinsic, Prev: Associated Intrinsic, Up: Table of Intrinsic Functions
+
+ATan Intrinsic
+..............
+
+ ATan(X)
+
+ATan: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the arc-tangent (inverse tangent) of X in radians.
+
+ *Note Tan Intrinsic::, for the inverse of this function.
+
+\1f
+File: g77.info, Node: ATan2 Intrinsic, Next: BesJ0 Intrinsic, Prev: ATan Intrinsic, Up: Table of Intrinsic Functions
+
+ATan2 Intrinsic
+...............
+
+ ATan2(Y, X)
+
+ATan2: `REAL' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+Y: `REAL'; scalar; INTENT(IN).
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the arc-tangent (inverse tangent) of the complex number (Y,
+X) in radians.
+
+ *Note Tan Intrinsic::, for the inverse of this function.
+
+\1f
+File: g77.info, Node: BesJ0 Intrinsic, Next: BesJ1 Intrinsic, Prev: ATan2 Intrinsic, Up: Table of Intrinsic Functions
+
+BesJ0 Intrinsic
+...............
+
+ BesJ0(X)
+
+BesJ0: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Calculates the Bessel function of the first kind of order 0 of X.
+See `bessel(3m)', on whose implementation the function depends.
+
+\1f
+File: g77.info, Node: BesJ1 Intrinsic, Next: BesJN Intrinsic, Prev: BesJ0 Intrinsic, Up: Table of Intrinsic Functions
+
+BesJ1 Intrinsic
+...............
+
+ BesJ1(X)
+
+BesJ1: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Calculates the Bessel function of the first kind of order 1 of X.
+See `bessel(3m)', on whose implementation the function depends.
+
+\1f
+File: g77.info, Node: BesJN Intrinsic, Next: BesY0 Intrinsic, Prev: BesJ1 Intrinsic, Up: Table of Intrinsic Functions
+
+BesJN Intrinsic
+...............
+
+ BesJN(N, X)
+
+BesJN: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+N: `INTEGER'; scalar; INTENT(IN).
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Calculates the Bessel function of the first kind of order N of X.
+See `bessel(3m)', on whose implementation the function depends.
+
+\1f
+File: g77.info, Node: BesY0 Intrinsic, Next: BesY1 Intrinsic, Prev: BesJN Intrinsic, Up: Table of Intrinsic Functions
+
+BesY0 Intrinsic
+...............
+
+ BesY0(X)
+
+BesY0: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Calculates the Bessel function of the second kind of order 0 of X.
+See `bessel(3m)', on whose implementation the function depends.
+
+\1f
+File: g77.info, Node: BesY1 Intrinsic, Next: BesYN Intrinsic, Prev: BesY0 Intrinsic, Up: Table of Intrinsic Functions
+
+BesY1 Intrinsic
+...............
+
+ BesY1(X)
+
+BesY1: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Calculates the Bessel function of the second kind of order 1 of X.
+See `bessel(3m)', on whose implementation the function depends.
+
+\1f
+File: g77.info, Node: BesYN Intrinsic, Next: Bit_Size Intrinsic, Prev: BesY1 Intrinsic, Up: Table of Intrinsic Functions
+
+BesYN Intrinsic
+...............
+
+ BesYN(N, X)
+
+BesYN: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+N: `INTEGER'; scalar; INTENT(IN).
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Calculates the Bessel function of the second kind of order N of X.
+See `bessel(3m)', on whose implementation the function depends.
+
+\1f
+File: g77.info, Node: Bit_Size Intrinsic, Next: BTest Intrinsic, Prev: BesYN Intrinsic, Up: Table of Intrinsic Functions
+
+Bit_Size Intrinsic
+..................
+
+ Bit_Size(I)
+
+Bit_Size: `INTEGER' function, the `KIND=' value of the type being that
+of argument I.
+
+I: `INTEGER'; scalar.
+
+Intrinsic groups: `f90'.
+
+Description:
+
+ Returns the number of bits (integer precision plus sign bit)
+represented by the type for I.
+
+ *Note BTest Intrinsic::, for how to test the value of a bit in a
+variable or array.
+
+ *Note IBSet Intrinsic::, for how to set a bit in a variable to 1.
+
+ *Note IBClr Intrinsic::, for how to set a bit in a variable to 0.
+
+\1f
+File: g77.info, Node: BTest Intrinsic, Next: CAbs Intrinsic, Prev: Bit_Size Intrinsic, Up: Table of Intrinsic Functions
+
+BTest Intrinsic
+...............
+
+ BTest(I, POS)
+
+BTest: `LOGICAL(KIND=1)' function.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+POS: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ Returns `.TRUE.' if bit POS in I is 1, `.FALSE.' otherwise.
+
+ (Bit 0 is the low-order (rightmost) bit, adding the value 2**0, or 1,
+to the number if set to 1; bit 1 is the next-higher-order bit, adding
+2**1, or 2; bit 2 adds 2**2, or 4; and so on.)
+
+ *Note Bit_Size Intrinsic::, for how to obtain the number of bits in
+a type. The leftmost bit of I is `BIT_SIZE(I-1)'.
+
+\1f
+File: g77.info, Node: CAbs Intrinsic, Next: CCos Intrinsic, Prev: BTest Intrinsic, Up: Table of Intrinsic Functions
+
+CAbs Intrinsic
+..............
+
+ CAbs(A)
+
+CAbs: `REAL(KIND=1)' function.
+
+A: `COMPLEX(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `ABS()' that is specific to one type for A. *Note
+Abs Intrinsic::.
+
+\1f
+File: g77.info, Node: CCos Intrinsic, Next: Ceiling Intrinsic, Prev: CAbs Intrinsic, Up: Table of Intrinsic Functions
+
+CCos Intrinsic
+..............
+
+ CCos(X)
+
+CCos: `COMPLEX(KIND=1)' function.
+
+X: `COMPLEX(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `COS()' that is specific to one type for X. *Note
+Cos Intrinsic::.
+
+\1f
+File: g77.info, Node: Ceiling Intrinsic, Next: CExp Intrinsic, Prev: CCos Intrinsic, Up: Table of Intrinsic Functions
+
+Ceiling Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Ceiling' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: CExp Intrinsic, Next: Char Intrinsic, Prev: Ceiling Intrinsic, Up: Table of Intrinsic Functions
+
+CExp Intrinsic
+..............
+
+ CExp(X)
+
+CExp: `COMPLEX(KIND=1)' function.
+
+X: `COMPLEX(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `EXP()' that is specific to one type for X. *Note
+Exp Intrinsic::.
+
+\1f
+File: g77.info, Node: Char Intrinsic, Next: ChDir Intrinsic (subroutine), Prev: CExp Intrinsic, Up: Table of Intrinsic Functions
+
+Char Intrinsic
+..............
+
+ Char(I)
+
+Char: `CHARACTER*1' function.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the character corresponding to the code specified by I,
+using the system's native character set.
+
+ Because the system's native character set is used, the
+correspondence between character and their codes is not necessarily the
+same between GNU Fortran implementations.
+
+ Note that no intrinsic exists to convert a numerical value to a
+printable character string. For example, there is no intrinsic that,
+given an `INTEGER' or `REAL' argument with the value `154', returns the
+`CHARACTER' result `'154''.
+
+ Instead, you can use internal-file I/O to do this kind of conversion.
+For example:
+
+ INTEGER VALUE
+ CHARACTER*10 STRING
+ VALUE = 154
+ WRITE (STRING, '(I10)'), VALUE
+ PRINT *, STRING
+ END
+
+ The above program, when run, prints:
+
+ 154
+
+ *Note IChar Intrinsic::, for the inverse of the `CHAR' function.
+
+ *Note AChar Intrinsic::, for the function corresponding to the ASCII
+character set.
+
+\1f
+File: g77.info, Node: ChDir Intrinsic (subroutine), Next: ChMod Intrinsic (subroutine), Prev: Char Intrinsic, Up: Table of Intrinsic Functions
+
+ChDir Intrinsic (subroutine)
+............................
+
+ CALL ChDir(DIR, STATUS)
+
+DIR: `CHARACTER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Sets the current working directory to be DIR. If the STATUS
+argument is supplied, it contains 0 on success or a non-zero error code
+otherwise upon return. See `chdir(3)'.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note ChDir
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: ChMod Intrinsic (subroutine), Next: CLog Intrinsic, Prev: ChDir Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+ChMod Intrinsic (subroutine)
+............................
+
+ CALL ChMod(NAME, MODE, STATUS)
+
+NAME: `CHARACTER'; scalar; INTENT(IN).
+
+MODE: `CHARACTER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Changes the access mode of file NAME according to the specification
+MODE, which is given in the format of `chmod(1)'. A null character
+(`CHAR(0)') marks the end of the name in NAME--otherwise, trailing
+blanks in NAME are ignored. Currently, NAME must not contain the
+single quote character.
+
+ If the STATUS argument is supplied, it contains 0 on success or a
+non-zero error code upon return.
+
+ Note that this currently works by actually invoking `/bin/chmod' (or
+the `chmod' found when the library was configured) and so may fail in
+some circumstances and will, anyway, be slow.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note ChMod
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: CLog Intrinsic, Next: Cmplx Intrinsic, Prev: ChMod Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+CLog Intrinsic
+..............
+
+ CLog(X)
+
+CLog: `COMPLEX(KIND=1)' function.
+
+X: `COMPLEX(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `LOG()' that is specific to one type for X. *Note
+Log Intrinsic::.
+
+\1f
+File: g77.info, Node: Cmplx Intrinsic, Next: Complex Intrinsic, Prev: CLog Intrinsic, Up: Table of Intrinsic Functions
+
+Cmplx Intrinsic
+...............
+
+ Cmplx(X, Y)
+
+Cmplx: `COMPLEX(KIND=1)' function.
+
+X: `INTEGER', `REAL', or `COMPLEX'; scalar; INTENT(IN).
+
+Y: `INTEGER' or `REAL'; OPTIONAL (must be omitted if X is `COMPLEX');
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ If X is not type `COMPLEX', constructs a value of type
+`COMPLEX(KIND=1)' from the real and imaginary values specified by X and
+Y, respectively. If Y is omitted, `0.' is assumed.
+
+ If X is type `COMPLEX', converts it to type `COMPLEX(KIND=1)'.
+
+ *Note Complex Intrinsic::, for information on easily constructing a
+`COMPLEX' value of arbitrary precision from `REAL' arguments.
+
+\1f
+File: g77.info, Node: Complex Intrinsic, Next: Conjg Intrinsic, Prev: Cmplx Intrinsic, Up: Table of Intrinsic Functions
+
+Complex Intrinsic
+.................
+
+ Complex(REAL, IMAG)
+
+Complex: `COMPLEX' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+REAL: `INTEGER' or `REAL'; scalar; INTENT(IN).
+
+IMAG: `INTEGER' or `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `gnu'.
+
+Description:
+
+ Returns a `COMPLEX' value that has `Real' and `Imag' as its real and
+imaginary parts, respectively.
+
+ If REAL and IMAG are the same type, and that type is not `INTEGER',
+no data conversion is performed, and the type of the resulting value
+has the same kind value as the types of REAL and IMAG.
+
+ If REAL and IMAG are not the same type, the usual type-promotion
+rules are applied to both, converting either or both to the appropriate
+`REAL' type. The type of the resulting value has the same kind value
+as the type to which both REAL and IMAG were converted, in this case.
+
+ If REAL and IMAG are both `INTEGER', they are both converted to
+`REAL(KIND=1)', and the result of the `COMPLEX()' invocation is type
+`COMPLEX(KIND=1)'.
+
+ *Note:* The way to do this in standard Fortran 90 is too hairy to
+describe here, but it is important to note that `CMPLX(D1,D2)' returns
+a `COMPLEX(KIND=1)' result even if `D1' and `D2' are type
+`REAL(KIND=2)'. Hence the availability of `COMPLEX()' in GNU Fortran.
+
+\1f
+File: g77.info, Node: Conjg Intrinsic, Next: Cos Intrinsic, Prev: Complex Intrinsic, Up: Table of Intrinsic Functions
+
+Conjg Intrinsic
+...............
+
+ Conjg(Z)
+
+Conjg: `COMPLEX' function, the `KIND=' value of the type being that of
+argument Z.
+
+Z: `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the complex conjugate:
+
+ COMPLEX(REALPART(Z), -IMAGPART(Z))
+
+\1f
+File: g77.info, Node: Cos Intrinsic, Next: CosH Intrinsic, Prev: Conjg Intrinsic, Up: Table of Intrinsic Functions
+
+Cos Intrinsic
+.............
+
+ Cos(X)
+
+Cos: `REAL' or `COMPLEX' function, the exact type being that of
+argument X.
+
+X: `REAL' or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the cosine of X, an angle measured in radians.
+
+ *Note ACos Intrinsic::, for the inverse of this function.
+
+\1f
+File: g77.info, Node: CosH Intrinsic, Next: Count Intrinsic, Prev: Cos Intrinsic, Up: Table of Intrinsic Functions
+
+CosH Intrinsic
+..............
+
+ CosH(X)
+
+CosH: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the hyperbolic cosine of X.
+
+\1f
+File: g77.info, Node: Count Intrinsic, Next: Cpu_Time Intrinsic, Prev: CosH Intrinsic, Up: Table of Intrinsic Functions
+
+Count Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Count' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Cpu_Time Intrinsic, Next: CShift Intrinsic, Prev: Count Intrinsic, Up: Table of Intrinsic Functions
+
+Cpu_Time Intrinsic
+..................
+
+ CALL Cpu_Time(SECONDS)
+
+SECONDS: `REAL(KIND=1)'; scalar; INTENT(OUT).
+
+Intrinsic groups: `f90'.
+
+Description:
+
+ Returns in SECONDS the current value of the system time. This
+implementation of the Fortran 95 intrinsic is just an alias for
+`second' *Note Second Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: CShift Intrinsic, Next: CSin Intrinsic, Prev: Cpu_Time Intrinsic, Up: Table of Intrinsic Functions
+
+CShift Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL CShift' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: CSin Intrinsic, Next: CSqRt Intrinsic, Prev: CShift Intrinsic, Up: Table of Intrinsic Functions
+
+CSin Intrinsic
+..............
+
+ CSin(X)
+
+CSin: `COMPLEX(KIND=1)' function.
+
+X: `COMPLEX(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `SIN()' that is specific to one type for X. *Note
+Sin Intrinsic::.
+
+\1f
+File: g77.info, Node: CSqRt Intrinsic, Next: CTime Intrinsic (subroutine), Prev: CSin Intrinsic, Up: Table of Intrinsic Functions
+
+CSqRt Intrinsic
+...............
+
+ CSqRt(X)
+
+CSqRt: `COMPLEX(KIND=1)' function.
+
+X: `COMPLEX(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `SQRT()' that is specific to one type for X. *Note
+SqRt Intrinsic::.
+
+\1f
+File: g77.info, Node: CTime Intrinsic (subroutine), Next: CTime Intrinsic (function), Prev: CSqRt Intrinsic, Up: Table of Intrinsic Functions
+
+CTime Intrinsic (subroutine)
+............................
+
+ CALL CTime(RESULT, STIME)
+
+RESULT: `CHARACTER'; scalar; INTENT(OUT).
+
+STIME: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Converts STIME, a system time value, such as returned by `TIME8()',
+to a string of the form `Sat Aug 19 18:13:14 1995', and returns that
+string in RESULT.
+
+ *Note Time8 Intrinsic::.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine.
+
+ For information on other intrinsics with the same name: *Note CTime
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: CTime Intrinsic (function), Next: DAbs Intrinsic, Prev: CTime Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+CTime Intrinsic (function)
+..........................
+
+ CTime(STIME)
+
+CTime: `CHARACTER*(*)' function.
+
+STIME: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Converts STIME, a system time value, such as returned by `TIME8()',
+to a string of the form `Sat Aug 19 18:13:14 1995', and returns that
+string as the function value.
+
+ *Note Time8 Intrinsic::.
+
+ For information on other intrinsics with the same name: *Note CTime
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: DAbs Intrinsic, Next: DACos Intrinsic, Prev: CTime Intrinsic (function), Up: Table of Intrinsic Functions
+
+DAbs Intrinsic
+..............
+
+ DAbs(A)
+
+DAbs: `REAL(KIND=2)' function.
+
+A: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `ABS()' that is specific to one type for A. *Note
+Abs Intrinsic::.
+
+\1f
+File: g77.info, Node: DACos Intrinsic, Next: DASin Intrinsic, Prev: DAbs Intrinsic, Up: Table of Intrinsic Functions
+
+DACos Intrinsic
+...............
+
+ DACos(X)
+
+DACos: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `ACOS()' that is specific to one type for X. *Note
+ACos Intrinsic::.
+
+\1f
+File: g77.info, Node: DASin Intrinsic, Next: DATan Intrinsic, Prev: DACos Intrinsic, Up: Table of Intrinsic Functions
+
+DASin Intrinsic
+...............
+
+ DASin(X)
+
+DASin: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `ASIN()' that is specific to one type for X. *Note
+ASin Intrinsic::.
+
+\1f
+File: g77.info, Node: DATan Intrinsic, Next: DATan2 Intrinsic, Prev: DASin Intrinsic, Up: Table of Intrinsic Functions
+
+DATan Intrinsic
+...............
+
+ DATan(X)
+
+DATan: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `ATAN()' that is specific to one type for X. *Note
+ATan Intrinsic::.
+
+\1f
+File: g77.info, Node: DATan2 Intrinsic, Next: Date_and_Time Intrinsic, Prev: DATan Intrinsic, Up: Table of Intrinsic Functions
+
+DATan2 Intrinsic
+................
+
+ DATan2(Y, X)
+
+DATan2: `REAL(KIND=2)' function.
+
+Y: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `ATAN2()' that is specific to one type for Y and X.
+*Note ATan2 Intrinsic::.
+
+\1f
+File: g77.info, Node: Date_and_Time Intrinsic, Next: DbesJ0 Intrinsic, Prev: DATan2 Intrinsic, Up: Table of Intrinsic Functions
+
+Date_and_Time Intrinsic
+.......................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Date_and_Time' to use this
+name for an external procedure.
+
+\1f
+File: g77.info, Node: DbesJ0 Intrinsic, Next: DbesJ1 Intrinsic, Prev: Date_and_Time Intrinsic, Up: Table of Intrinsic Functions
+
+DbesJ0 Intrinsic
+................
+
+ DbesJ0(X)
+
+DbesJ0: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `BESJ0()' that is specific to one type for X. *Note
+BesJ0 Intrinsic::.
+
+\1f
+File: g77.info, Node: DbesJ1 Intrinsic, Next: DbesJN Intrinsic, Prev: DbesJ0 Intrinsic, Up: Table of Intrinsic Functions
+
+DbesJ1 Intrinsic
+................
+
+ DbesJ1(X)
+
+DbesJ1: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `BESJ1()' that is specific to one type for X. *Note
+BesJ1 Intrinsic::.
+
+\1f
+File: g77.info, Node: DbesJN Intrinsic, Next: DbesY0 Intrinsic, Prev: DbesJ1 Intrinsic, Up: Table of Intrinsic Functions
+
+DbesJN Intrinsic
+................
+
+ DbesJN(N, X)
+
+DbesJN: `REAL(KIND=2)' function.
+
+N: `INTEGER'; scalar; INTENT(IN).
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `BESJN()' that is specific to one type for X. *Note
+BesJN Intrinsic::.
+
+\1f
+File: g77.info, Node: DbesY0 Intrinsic, Next: DbesY1 Intrinsic, Prev: DbesJN Intrinsic, Up: Table of Intrinsic Functions
+
+DbesY0 Intrinsic
+................
+
+ DbesY0(X)
+
+DbesY0: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `BESY0()' that is specific to one type for X. *Note
+BesY0 Intrinsic::.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: DbesY1 Intrinsic, Next: DbesYN Intrinsic, Prev: DbesY0 Intrinsic, Up: Table of Intrinsic Functions
+
+DbesY1 Intrinsic
+................
+
+ DbesY1(X)
+
+DbesY1: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `BESY1()' that is specific to one type for X. *Note
+BesY1 Intrinsic::.
+
+\1f
+File: g77.info, Node: DbesYN Intrinsic, Next: Dble Intrinsic, Prev: DbesY1 Intrinsic, Up: Table of Intrinsic Functions
+
+DbesYN Intrinsic
+................
+
+ DbesYN(N, X)
+
+DbesYN: `REAL(KIND=2)' function.
+
+N: `INTEGER'; scalar; INTENT(IN).
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `BESYN()' that is specific to one type for X. *Note
+BesYN Intrinsic::.
+
+\1f
+File: g77.info, Node: Dble Intrinsic, Next: DCos Intrinsic, Prev: DbesYN Intrinsic, Up: Table of Intrinsic Functions
+
+Dble Intrinsic
+..............
+
+ Dble(A)
+
+Dble: `REAL(KIND=2)' function.
+
+A: `INTEGER', `REAL', or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns A converted to double precision (`REAL(KIND=2)'). If A is
+`COMPLEX', the real part of A is used for the conversion and the
+imaginary part disregarded.
+
+ *Note Sngl Intrinsic::, for the function that converts to single
+precision.
+
+ *Note Int Intrinsic::, for the function that converts to `INTEGER'.
+
+ *Note Complex Intrinsic::, for the function that converts to
+`COMPLEX'.
+
+\1f
+File: g77.info, Node: DCos Intrinsic, Next: DCosH Intrinsic, Prev: Dble Intrinsic, Up: Table of Intrinsic Functions
+
+DCos Intrinsic
+..............
+
+ DCos(X)
+
+DCos: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `COS()' that is specific to one type for X. *Note
+Cos Intrinsic::.
+
+\1f
+File: g77.info, Node: DCosH Intrinsic, Next: DDiM Intrinsic, Prev: DCos Intrinsic, Up: Table of Intrinsic Functions
+
+DCosH Intrinsic
+...............
+
+ DCosH(X)
+
+DCosH: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `COSH()' that is specific to one type for X. *Note
+CosH Intrinsic::.
+
+\1f
+File: g77.info, Node: DDiM Intrinsic, Next: DErF Intrinsic, Prev: DCosH Intrinsic, Up: Table of Intrinsic Functions
+
+DDiM Intrinsic
+..............
+
+ DDiM(X, Y)
+
+DDiM: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Y: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `DIM()' that is specific to one type for X and Y.
+*Note DiM Intrinsic::.
+
+\1f
+File: g77.info, Node: DErF Intrinsic, Next: DErFC Intrinsic, Prev: DDiM Intrinsic, Up: Table of Intrinsic Functions
+
+DErF Intrinsic
+..............
+
+ DErF(X)
+
+DErF: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `ERF()' that is specific to one type for X. *Note
+ErF Intrinsic::.
+
+\1f
+File: g77.info, Node: DErFC Intrinsic, Next: DExp Intrinsic, Prev: DErF Intrinsic, Up: Table of Intrinsic Functions
+
+DErFC Intrinsic
+...............
+
+ DErFC(X)
+
+DErFC: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `ERFC()' that is specific to one type for X. *Note
+ErFC Intrinsic::.
+
+\1f
+File: g77.info, Node: DExp Intrinsic, Next: Digits Intrinsic, Prev: DErFC Intrinsic, Up: Table of Intrinsic Functions
+
+DExp Intrinsic
+..............
+
+ DExp(X)
+
+DExp: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `EXP()' that is specific to one type for X. *Note
+Exp Intrinsic::.
+
+\1f
+File: g77.info, Node: Digits Intrinsic, Next: DiM Intrinsic, Prev: DExp Intrinsic, Up: Table of Intrinsic Functions
+
+Digits Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Digits' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: DiM Intrinsic, Next: DInt Intrinsic, Prev: Digits Intrinsic, Up: Table of Intrinsic Functions
+
+DiM Intrinsic
+.............
+
+ DiM(X, Y)
+
+DiM: `INTEGER' or `REAL' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+X: `INTEGER' or `REAL'; scalar; INTENT(IN).
+
+Y: `INTEGER' or `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns `X-Y' if X is greater than Y; otherwise returns zero.
+
+\1f
+File: g77.info, Node: DInt Intrinsic, Next: DLog Intrinsic, Prev: DiM Intrinsic, Up: Table of Intrinsic Functions
+
+DInt Intrinsic
+..............
+
+ DInt(A)
+
+DInt: `REAL(KIND=2)' function.
+
+A: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `AINT()' that is specific to one type for A. *Note
+AInt Intrinsic::.
+
+\1f
+File: g77.info, Node: DLog Intrinsic, Next: DLog10 Intrinsic, Prev: DInt Intrinsic, Up: Table of Intrinsic Functions
+
+DLog Intrinsic
+..............
+
+ DLog(X)
+
+DLog: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `LOG()' that is specific to one type for X. *Note
+Log Intrinsic::.
+
+\1f
+File: g77.info, Node: DLog10 Intrinsic, Next: DMax1 Intrinsic, Prev: DLog Intrinsic, Up: Table of Intrinsic Functions
+
+DLog10 Intrinsic
+................
+
+ DLog10(X)
+
+DLog10: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `LOG10()' that is specific to one type for X. *Note
+Log10 Intrinsic::.
+
+\1f
+File: g77.info, Node: DMax1 Intrinsic, Next: DMin1 Intrinsic, Prev: DLog10 Intrinsic, Up: Table of Intrinsic Functions
+
+DMax1 Intrinsic
+...............
+
+ DMax1(A-1, A-2, ..., A-n)
+
+DMax1: `REAL(KIND=2)' function.
+
+A: `REAL(KIND=2)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MAX()' that is specific to one type for A. *Note
+Max Intrinsic::.
+
+\1f
+File: g77.info, Node: DMin1 Intrinsic, Next: DMod Intrinsic, Prev: DMax1 Intrinsic, Up: Table of Intrinsic Functions
+
+DMin1 Intrinsic
+...............
+
+ DMin1(A-1, A-2, ..., A-n)
+
+DMin1: `REAL(KIND=2)' function.
+
+A: `REAL(KIND=2)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MIN()' that is specific to one type for A. *Note
+Min Intrinsic::.
+
+\1f
+File: g77.info, Node: DMod Intrinsic, Next: DNInt Intrinsic, Prev: DMin1 Intrinsic, Up: Table of Intrinsic Functions
+
+DMod Intrinsic
+..............
+
+ DMod(A, P)
+
+DMod: `REAL(KIND=2)' function.
+
+A: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+P: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MOD()' that is specific to one type for A. *Note
+Mod Intrinsic::.
+
+\1f
+File: g77.info, Node: DNInt Intrinsic, Next: Dot_Product Intrinsic, Prev: DMod Intrinsic, Up: Table of Intrinsic Functions
+
+DNInt Intrinsic
+...............
+
+ DNInt(A)
+
+DNInt: `REAL(KIND=2)' function.
+
+A: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `ANINT()' that is specific to one type for A. *Note
+ANInt Intrinsic::.
+
+\1f
+File: g77.info, Node: Dot_Product Intrinsic, Next: DProd Intrinsic, Prev: DNInt Intrinsic, Up: Table of Intrinsic Functions
+
+Dot_Product Intrinsic
+.....................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Dot_Product' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: DProd Intrinsic, Next: DSign Intrinsic, Prev: Dot_Product Intrinsic, Up: Table of Intrinsic Functions
+
+DProd Intrinsic
+...............
+
+ DProd(X, Y)
+
+DProd: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=1)'; scalar; INTENT(IN).
+
+Y: `REAL(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns `DBLE(X)*DBLE(Y)'.
+
+\1f
+File: g77.info, Node: DSign Intrinsic, Next: DSin Intrinsic, Prev: DProd Intrinsic, Up: Table of Intrinsic Functions
+
+DSign Intrinsic
+...............
+
+ DSign(A, B)
+
+DSign: `REAL(KIND=2)' function.
+
+A: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+B: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `SIGN()' that is specific to one type for A and B.
+*Note Sign Intrinsic::.
+
+\1f
+File: g77.info, Node: DSin Intrinsic, Next: DSinH Intrinsic, Prev: DSign Intrinsic, Up: Table of Intrinsic Functions
+
+DSin Intrinsic
+..............
+
+ DSin(X)
+
+DSin: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `SIN()' that is specific to one type for X. *Note
+Sin Intrinsic::.
+
+\1f
+File: g77.info, Node: DSinH Intrinsic, Next: DSqRt Intrinsic, Prev: DSin Intrinsic, Up: Table of Intrinsic Functions
+
+DSinH Intrinsic
+...............
+
+ DSinH(X)
+
+DSinH: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `SINH()' that is specific to one type for X. *Note
+SinH Intrinsic::.
+
+\1f
+File: g77.info, Node: DSqRt Intrinsic, Next: DTan Intrinsic, Prev: DSinH Intrinsic, Up: Table of Intrinsic Functions
+
+DSqRt Intrinsic
+...............
+
+ DSqRt(X)
+
+DSqRt: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `SQRT()' that is specific to one type for X. *Note
+SqRt Intrinsic::.
+
+\1f
+File: g77.info, Node: DTan Intrinsic, Next: DTanH Intrinsic, Prev: DSqRt Intrinsic, Up: Table of Intrinsic Functions
+
+DTan Intrinsic
+..............
+
+ DTan(X)
+
+DTan: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `TAN()' that is specific to one type for X. *Note
+Tan Intrinsic::.
+
+\1f
+File: g77.info, Node: DTanH Intrinsic, Next: Dtime Intrinsic (subroutine), Prev: DTan Intrinsic, Up: Table of Intrinsic Functions
+
+DTanH Intrinsic
+...............
+
+ DTanH(X)
+
+DTanH: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `TANH()' that is specific to one type for X. *Note
+TanH Intrinsic::.
+
+\1f
+File: g77.info, Node: Dtime Intrinsic (subroutine), Next: EOShift Intrinsic, Prev: DTanH Intrinsic, Up: Table of Intrinsic Functions
+
+Dtime Intrinsic (subroutine)
+............................
+
+ CALL Dtime(RESULT, TARRAY)
+
+RESULT: `REAL(KIND=1)'; scalar; INTENT(OUT).
+
+TARRAY: `REAL(KIND=1)'; DIMENSION(2); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Initially, return the number of seconds of runtime since the start
+of the process's execution in RESULT, and the user and system
+components of this in `TARRAY(1)' and `TARRAY(2)' respectively. The
+value of RESULT is equal to `TARRAY(1) + TARRAY(2)'.
+
+ Subsequent invocations of `DTIME()' set values based on accumulations
+since the previous invocation.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine.
+
+ For information on other intrinsics with the same name: *Note Dtime
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: EOShift Intrinsic, Next: Epsilon Intrinsic, Prev: Dtime Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+EOShift Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL EOShift' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: Epsilon Intrinsic, Next: ErF Intrinsic, Prev: EOShift Intrinsic, Up: Table of Intrinsic Functions
+
+Epsilon Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Epsilon' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: ErF Intrinsic, Next: ErFC Intrinsic, Prev: Epsilon Intrinsic, Up: Table of Intrinsic Functions
+
+ErF Intrinsic
+.............
+
+ ErF(X)
+
+ErF: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the error function of X. See `erf(3m)', which provides the
+implementation.
+
+\1f
+File: g77.info, Node: ErFC Intrinsic, Next: ETime Intrinsic (subroutine), Prev: ErF Intrinsic, Up: Table of Intrinsic Functions
+
+ErFC Intrinsic
+..............
+
+ ErFC(X)
+
+ErFC: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the complementary error function of X: `ERFC(R) = 1 -
+ERF(R)' (except that the result may be more accurate than explicitly
+evaluating that formulae would give). See `erfc(3m)', which provides
+the implementation.
+
+\1f
+File: g77.info, Node: ETime Intrinsic (subroutine), Next: ETime Intrinsic (function), Prev: ErFC Intrinsic, Up: Table of Intrinsic Functions
+
+ETime Intrinsic (subroutine)
+............................
+
+ CALL ETime(RESULT, TARRAY)
+
+RESULT: `REAL(KIND=1)'; scalar; INTENT(OUT).
+
+TARRAY: `REAL(KIND=1)'; DIMENSION(2); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Return the number of seconds of runtime since the start of the
+process's execution in RESULT, and the user and system components of
+this in `TARRAY(1)' and `TARRAY(2)' respectively. The value of RESULT
+is equal to `TARRAY(1) + TARRAY(2)'.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine.
+
+ For information on other intrinsics with the same name: *Note ETime
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: ETime Intrinsic (function), Next: Exit Intrinsic, Prev: ETime Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+ETime Intrinsic (function)
+..........................
+
+ ETime(TARRAY)
+
+ETime: `REAL(KIND=1)' function.
+
+TARRAY: `REAL(KIND=1)'; DIMENSION(2); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Return the number of seconds of runtime since the start of the
+process's execution as the function value, and the user and system
+components of this in `TARRAY(1)' and `TARRAY(2)' respectively. The
+functions' value is equal to `TARRAY(1) + TARRAY(2)'.
+
+ For information on other intrinsics with the same name: *Note ETime
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: Exit Intrinsic, Next: Exp Intrinsic, Prev: ETime Intrinsic (function), Up: Table of Intrinsic Functions
+
+Exit Intrinsic
+..............
+
+ CALL Exit(STATUS)
+
+STATUS: `INTEGER'; OPTIONAL; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Exit the program with status STATUS after closing open Fortran I/O
+units and otherwise behaving as `exit(2)'. If STATUS is omitted the
+canonical `success' value will be returned to the system.
+
+\1f
+File: g77.info, Node: Exp Intrinsic, Next: Exponent Intrinsic, Prev: Exit Intrinsic, Up: Table of Intrinsic Functions
+
+Exp Intrinsic
+.............
+
+ Exp(X)
+
+Exp: `REAL' or `COMPLEX' function, the exact type being that of
+argument X.
+
+X: `REAL' or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns `E**X', where E is approximately 2.7182818.
+
+ *Note Log Intrinsic::, for the inverse of this function.
+
+\1f
+File: g77.info, Node: Exponent Intrinsic, Next: Fdate Intrinsic (subroutine), Prev: Exp Intrinsic, Up: Table of Intrinsic Functions
+
+Exponent Intrinsic
+..................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Exponent' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: Fdate Intrinsic (subroutine), Next: Fdate Intrinsic (function), Prev: Exponent Intrinsic, Up: Table of Intrinsic Functions
+
+Fdate Intrinsic (subroutine)
+............................
+
+ CALL Fdate(DATE)
+
+DATE: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the current date (using the same format as `CTIME()') in
+DATE.
+
+ Equivalent to:
+
+ CALL CTIME(DATE, TIME8())
+
+ *Note CTime Intrinsic (subroutine)::.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine.
+
+ For information on other intrinsics with the same name: *Note Fdate
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Fdate Intrinsic (function), Next: FGet Intrinsic (subroutine), Prev: Fdate Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Fdate Intrinsic (function)
+..........................
+
+ Fdate()
+
+Fdate: `CHARACTER*(*)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the current date (using the same format as `CTIME()').
+
+ Equivalent to:
+
+ CTIME(TIME8())
+
+ *Note CTime Intrinsic (function)::.
+
+ For information on other intrinsics with the same name: *Note Fdate
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: FGet Intrinsic (subroutine), Next: FGetC Intrinsic (subroutine), Prev: Fdate Intrinsic (function), Up: Table of Intrinsic Functions
+
+FGet Intrinsic (subroutine)
+...........................
+
+ CALL FGet(C, STATUS)
+
+C: `CHARACTER'; scalar; INTENT(OUT).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Reads a single character into C in stream mode from unit 5
+(by-passing normal formatted output) using `getc(3)'. Returns in
+STATUS 0 on success, -1 on end-of-file, and the error code from
+`ferror(3)' otherwise.
+
+ Stream I/O should not be mixed with normal record-oriented
+(formatted or unformatted) I/O on the same unit; the results are
+unpredictable.
+
+ For information on other intrinsics with the same name: *Note FGet
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: FGetC Intrinsic (subroutine), Next: Float Intrinsic, Prev: FGet Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+FGetC Intrinsic (subroutine)
+............................
+
+ CALL FGetC(UNIT, C, STATUS)
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+C: `CHARACTER'; scalar; INTENT(OUT).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Reads a single character into C in stream mode from unit UNIT
+(by-passing normal formatted output) using `getc(3)'. Returns in
+STATUS 0 on success, -1 on end-of-file, and the error code from
+`ferror(3)' otherwise.
+
+ Stream I/O should not be mixed with normal record-oriented
+(formatted or unformatted) I/O on the same unit; the results are
+unpredictable.
+
+ For information on other intrinsics with the same name: *Note FGetC
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Float Intrinsic, Next: Floor Intrinsic, Prev: FGetC Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Float Intrinsic
+...............
+
+ Float(A)
+
+Float: `REAL(KIND=1)' function.
+
+A: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `REAL()' that is specific to one type for A. *Note
+Real Intrinsic::.
+
+\1f
+File: g77.info, Node: Floor Intrinsic, Next: Flush Intrinsic, Prev: Float Intrinsic, Up: Table of Intrinsic Functions
+
+Floor Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Floor' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Flush Intrinsic, Next: FNum Intrinsic, Prev: Floor Intrinsic, Up: Table of Intrinsic Functions
+
+Flush Intrinsic
+...............
+
+ CALL Flush(UNIT)
+
+UNIT: `INTEGER'; OPTIONAL; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Flushes Fortran unit(s) currently open for output. Without the
+optional argument, all such units are flushed, otherwise just the unit
+specified by UNIT.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as a
+library procedure that might or might not support the (optional) UNIT
+argument.
+
+\1f
+File: g77.info, Node: FNum Intrinsic, Next: FPut Intrinsic (subroutine), Prev: Flush Intrinsic, Up: Table of Intrinsic Functions
+
+FNum Intrinsic
+..............
+
+ FNum(UNIT)
+
+FNum: `INTEGER(KIND=1)' function.
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the Unix file descriptor number corresponding to the open
+Fortran I/O unit UNIT. This could be passed to an interface to C I/O
+routines.
+
+\1f
+File: g77.info, Node: FPut Intrinsic (subroutine), Next: FPutC Intrinsic (subroutine), Prev: FNum Intrinsic, Up: Table of Intrinsic Functions
+
+FPut Intrinsic (subroutine)
+...........................
+
+ CALL FPut(C, STATUS)
+
+C: `CHARACTER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Writes the single character C in stream mode to unit 6 (by-passing
+normal formatted output) using `putc(3)'. Returns in STATUS 0 on
+success, the error code from `ferror(3)' otherwise.
+
+ Stream I/O should not be mixed with normal record-oriented
+(formatted or unformatted) I/O on the same unit; the results are
+unpredictable.
+
+ For information on other intrinsics with the same name: *Note FPut
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: FPutC Intrinsic (subroutine), Next: Fraction Intrinsic, Prev: FPut Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+FPutC Intrinsic (subroutine)
+............................
+
+ CALL FPutC(UNIT, C, STATUS)
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+C: `CHARACTER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Writes the single character UNIT in stream mode to unit 6
+(by-passing normal formatted output) using `putc(3)'. Returns in C 0
+on success, the error code from `ferror(3)' otherwise.
+
+ Stream I/O should not be mixed with normal record-oriented
+(formatted or unformatted) I/O on the same unit; the results are
+unpredictable.
+
+ For information on other intrinsics with the same name: *Note FPutC
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Fraction Intrinsic, Next: FSeek Intrinsic, Prev: FPutC Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Fraction Intrinsic
+..................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Fraction' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: FSeek Intrinsic, Next: FStat Intrinsic (subroutine), Prev: Fraction Intrinsic, Up: Table of Intrinsic Functions
+
+FSeek Intrinsic
+...............
+
+ CALL FSeek(UNIT, OFFSET, WHENCE, ERRLAB)
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+OFFSET: `INTEGER'; scalar; INTENT(IN).
+
+WHENCE: `INTEGER'; scalar; INTENT(IN).
+
+ERRLAB: `*LABEL', where LABEL is the label of an executable statement;
+OPTIONAL.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Attempts to move Fortran unit UNIT to the specified OFFSET: absolute
+offset if OFFSET=0; relative to the current offset if OFFSET=1;
+relative to the end of the file if OFFSET=2. It branches to label
+WHENCE if UNIT is not open or if the call otherwise fails.
+
+\1f
+File: g77.info, Node: FStat Intrinsic (subroutine), Next: FStat Intrinsic (function), Prev: FSeek Intrinsic, Up: Table of Intrinsic Functions
+
+FStat Intrinsic (subroutine)
+............................
+
+ CALL FStat(UNIT, SARRAY, STATUS)
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+SARRAY: `INTEGER(KIND=1)'; DIMENSION(13); INTENT(OUT).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Obtains data about the file open on Fortran I/O unit UNIT and places
+them in the array SARRAY. The values in this array are extracted from
+the `stat' structure as returned by `fstat(2)' q.v., as follows:
+
+ 1. File mode
+
+ 2. Inode number
+
+ 3. ID of device containing directory entry for file
+
+ 4. Device id (if relevant)
+
+ 5. Number of links
+
+ 6. Owner's uid
+
+ 7. Owner's gid
+
+ 8. File size (bytes)
+
+ 9. Last access time
+
+ 10. Last modification time
+
+ 11. Last file status change time
+
+ 12. Preferred I/O block size
+
+ 13. Number of blocks allocated
+
+ Not all these elements are relevant on all systems. If an element
+is not relevant, it is returned as 0.
+
+ If the STATUS argument is supplied, it contains 0 on success or a
+non-zero error code upon return.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note FStat
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: FStat Intrinsic (function), Next: FTell Intrinsic (subroutine), Prev: FStat Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+FStat Intrinsic (function)
+..........................
+
+ FStat(UNIT, SARRAY)
+
+FStat: `INTEGER(KIND=1)' function.
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+SARRAY: `INTEGER(KIND=1)'; DIMENSION(13); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Obtains data about the file open on Fortran I/O unit UNIT and places
+them in the array SARRAY. The values in this array are extracted from
+the `stat' structure as returned by `fstat(2)' q.v., as follows:
+
+ 1. File mode
+
+ 2. Inode number
+
+ 3. ID of device containing directory entry for file
+
+ 4. Device id (if relevant)
+
+ 5. Number of links
+
+ 6. Owner's uid
+
+ 7. Owner's gid
+
+ 8. File size (bytes)
+
+ 9. Last access time
+
+ 10. Last modification time
+
+ 11. Last file status change time
+
+ 12. Preferred I/O block size
+
+ 13. Number of blocks allocated
+
+ Not all these elements are relevant on all systems. If an element
+is not relevant, it is returned as 0.
+
+ Returns 0 on success or a non-zero error code.
+
+ For information on other intrinsics with the same name: *Note FStat
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: FTell Intrinsic (subroutine), Next: FTell Intrinsic (function), Prev: FStat Intrinsic (function), Up: Table of Intrinsic Functions
+
+FTell Intrinsic (subroutine)
+............................
+
+ CALL FTell(UNIT, OFFSET)
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+OFFSET: `INTEGER(KIND=1)'; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Sets OFFSET to the current offset of Fortran unit UNIT (or to -1 if
+UNIT is not open).
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine.
+
+ For information on other intrinsics with the same name: *Note FTell
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: FTell Intrinsic (function), Next: GError Intrinsic, Prev: FTell Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+FTell Intrinsic (function)
+..........................
+
+ FTell(UNIT)
+
+FTell: `INTEGER(KIND=1)' function.
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the current offset of Fortran unit UNIT (or -1 if UNIT is
+not open).
+
+ For information on other intrinsics with the same name: *Note FTell
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: GError Intrinsic, Next: GetArg Intrinsic, Prev: FTell Intrinsic (function), Up: Table of Intrinsic Functions
+
+GError Intrinsic
+................
+
+ CALL GError(MESSAGE)
+
+MESSAGE: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the system error message corresponding to the last system
+error (C `errno').
+
+\1f
+File: g77.info, Node: GetArg Intrinsic, Next: GetCWD Intrinsic (subroutine), Prev: GError Intrinsic, Up: Table of Intrinsic Functions
+
+GetArg Intrinsic
+................
+
+ CALL GetArg(POS, VALUE)
+
+POS: `INTEGER'; scalar; INTENT(IN).
+
+VALUE: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Sets VALUE to the POS-th command-line argument (or to all blanks if
+there are fewer than VALUE command-line arguments); `CALL GETARG(0,
+VALUE)' sets VALUE to the name of the program (on systems that support
+this feature).
+
+ *Note IArgC Intrinsic::, for information on how to get the number of
+arguments.
+
+\1f
+File: g77.info, Node: GetCWD Intrinsic (subroutine), Next: GetCWD Intrinsic (function), Prev: GetArg Intrinsic, Up: Table of Intrinsic Functions
+
+GetCWD Intrinsic (subroutine)
+.............................
+
+ CALL GetCWD(NAME, STATUS)
+
+NAME: `CHARACTER'; scalar; INTENT(OUT).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Places the current working directory in NAME. If the STATUS
+argument is supplied, it contains 0 success or a non-zero error code
+upon return (`ENOSYS' if the system does not provide `getcwd(3)' or
+`getwd(3)').
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note GetCWD
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: GetCWD Intrinsic (function), Next: GetEnv Intrinsic, Prev: GetCWD Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+GetCWD Intrinsic (function)
+...........................
+
+ GetCWD(NAME)
+
+GetCWD: `INTEGER(KIND=1)' function.
+
+NAME: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Places the current working directory in NAME. Returns 0 on success,
+otherwise a non-zero error code (`ENOSYS' if the system does not
+provide `getcwd(3)' or `getwd(3)').
+
+ For information on other intrinsics with the same name: *Note GetCWD
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: GetEnv Intrinsic, Next: GetGId Intrinsic, Prev: GetCWD Intrinsic (function), Up: Table of Intrinsic Functions
+
+GetEnv Intrinsic
+................
+
+ CALL GetEnv(NAME, VALUE)
+
+NAME: `CHARACTER'; scalar; INTENT(IN).
+
+VALUE: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Sets VALUE to the value of environment variable given by the value
+of NAME (`$name' in shell terms) or to blanks if `$name' has not been
+set. A null character (`CHAR(0)') marks the end of the name in
+NAME--otherwise, trailing blanks in NAME are ignored.
+
+\1f
+File: g77.info, Node: GetGId Intrinsic, Next: GetLog Intrinsic, Prev: GetEnv Intrinsic, Up: Table of Intrinsic Functions
+
+GetGId Intrinsic
+................
+
+ GetGId()
+
+GetGId: `INTEGER(KIND=1)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the group id for the current process.
+
+\1f
+File: g77.info, Node: GetLog Intrinsic, Next: GetPId Intrinsic, Prev: GetGId Intrinsic, Up: Table of Intrinsic Functions
+
+GetLog Intrinsic
+................
+
+ CALL GetLog(LOGIN)
+
+LOGIN: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the login name for the process in LOGIN.
+
+\1f
+File: g77.info, Node: GetPId Intrinsic, Next: GetUId Intrinsic, Prev: GetLog Intrinsic, Up: Table of Intrinsic Functions
+
+GetPId Intrinsic
+................
+
+ GetPId()
+
+GetPId: `INTEGER(KIND=1)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the process id for the current process.
+
+\1f
+File: g77.info, Node: GetUId Intrinsic, Next: GMTime Intrinsic, Prev: GetPId Intrinsic, Up: Table of Intrinsic Functions
+
+GetUId Intrinsic
+................
+
+ GetUId()
+
+GetUId: `INTEGER(KIND=1)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the user id for the current process.
+
+\1f
+File: g77.info, Node: GMTime Intrinsic, Next: HostNm Intrinsic (subroutine), Prev: GetUId Intrinsic, Up: Table of Intrinsic Functions
+
+GMTime Intrinsic
+................
+
+ CALL GMTime(STIME, TARRAY)
+
+STIME: `INTEGER(KIND=1)'; scalar; INTENT(IN).
+
+TARRAY: `INTEGER(KIND=1)'; DIMENSION(9); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Given a system time value STIME, fills TARRAY with values extracted
+from it appropriate to the GMT time zone using `gmtime(3)'.
+
+ The array elements are as follows:
+
+ 1. Seconds after the minute, range 0-59 or 0-61 to allow for leap
+ seconds
+
+ 2. Minutes after the hour, range 0-59
+
+ 3. Hours past midnight, range 0-23
+
+ 4. Day of month, range 0-31
+
+ 5. Number of months since January, range 0-12
+
+ 6. Years since 1900
+
+ 7. Number of days since Sunday, range 0-6
+
+ 8. Days since January 1
+
+ 9. Daylight savings indicator: positive if daylight savings is in
+ effect, zero if not, and negative if the information isn't
+ available.
+
+\1f
+File: g77.info, Node: HostNm Intrinsic (subroutine), Next: HostNm Intrinsic (function), Prev: GMTime Intrinsic, Up: Table of Intrinsic Functions
+
+HostNm Intrinsic (subroutine)
+.............................
+
+ CALL HostNm(NAME, STATUS)
+
+NAME: `CHARACTER'; scalar; INTENT(OUT).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Fills NAME with the system's host name returned by `gethostname(2)'.
+If the STATUS argument is supplied, it contains 0 on success or a
+non-zero error code upon return (`ENOSYS' if the system does not
+provide `gethostname(2)').
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note HostNm
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: HostNm Intrinsic (function), Next: Huge Intrinsic, Prev: HostNm Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+HostNm Intrinsic (function)
+...........................
+
+ HostNm(NAME)
+
+HostNm: `INTEGER(KIND=1)' function.
+
+NAME: `CHARACTER'; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Fills NAME with the system's host name returned by `gethostname(2)',
+returning 0 on success or a non-zero error code (`ENOSYS' if the system
+does not provide `gethostname(2)').
+
+ For information on other intrinsics with the same name: *Note HostNm
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: Huge Intrinsic, Next: IAbs Intrinsic, Prev: HostNm Intrinsic (function), Up: Table of Intrinsic Functions
+
+Huge Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Huge' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: IAbs Intrinsic, Next: IAChar Intrinsic, Prev: Huge Intrinsic, Up: Table of Intrinsic Functions
+
+IAbs Intrinsic
+..............
+
+ IAbs(A)
+
+IAbs: `INTEGER(KIND=1)' function.
+
+A: `INTEGER(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `ABS()' that is specific to one type for A. *Note
+Abs Intrinsic::.
+
+\1f
+File: g77.info, Node: IAChar Intrinsic, Next: IAnd Intrinsic, Prev: IAbs Intrinsic, Up: Table of Intrinsic Functions
+
+IAChar Intrinsic
+................
+
+ IAChar(C)
+
+IAChar: `INTEGER(KIND=1)' function.
+
+C: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c', `f90'.
+
+Description:
+
+ Returns the code for the ASCII character in the first character
+position of C.
+
+ *Note AChar Intrinsic::, for the inverse of this function.
+
+ *Note IChar Intrinsic::, for the function corresponding to the
+system's native character set.
+
+\1f
+File: g77.info, Node: IAnd Intrinsic, Next: IArgC Intrinsic, Prev: IAChar Intrinsic, Up: Table of Intrinsic Functions
+
+IAnd Intrinsic
+..............
+
+ IAnd(I, J)
+
+IAnd: `INTEGER' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+J: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ Returns value resulting from boolean AND of pair of bits in each of
+I and J.
+
+\1f
+File: g77.info, Node: IArgC Intrinsic, Next: IBClr Intrinsic, Prev: IAnd Intrinsic, Up: Table of Intrinsic Functions
+
+IArgC Intrinsic
+...............
+
+ IArgC()
+
+IArgC: `INTEGER(KIND=1)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the number of command-line arguments.
+
+ This count does not include the specification of the program name
+itself.
+
+\1f
+File: g77.info, Node: IBClr Intrinsic, Next: IBits Intrinsic, Prev: IArgC Intrinsic, Up: Table of Intrinsic Functions
+
+IBClr Intrinsic
+...............
+
+ IBClr(I, POS)
+
+IBClr: `INTEGER' function, the `KIND=' value of the type being that of
+argument I.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+POS: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ Returns the value of I with bit POS cleared (set to zero). *Note
+BTest Intrinsic:: for information on bit positions.
+
+\1f
+File: g77.info, Node: IBits Intrinsic, Next: IBSet Intrinsic, Prev: IBClr Intrinsic, Up: Table of Intrinsic Functions
+
+IBits Intrinsic
+...............
+
+ IBits(I, POS, LEN)
+
+IBits: `INTEGER' function, the `KIND=' value of the type being that of
+argument I.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+POS: `INTEGER'; scalar; INTENT(IN).
+
+LEN: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ Extracts a subfield of length LEN from I, starting from bit position
+POS and extending left for LEN bits. The result is right-justified and
+the remaining bits are zeroed. The value of `POS+LEN' must be less
+than or equal to the value `BIT_SIZE(I)'. *Note Bit_Size Intrinsic::.
+
+\1f
+File: g77.info, Node: IBSet Intrinsic, Next: IChar Intrinsic, Prev: IBits Intrinsic, Up: Table of Intrinsic Functions
+
+IBSet Intrinsic
+...............
+
+ IBSet(I, POS)
+
+IBSet: `INTEGER' function, the `KIND=' value of the type being that of
+argument I.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+POS: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ Returns the value of I with bit POS set (to one). *Note BTest
+Intrinsic:: for information on bit positions.
+
+\1f
+File: g77.info, Node: IChar Intrinsic, Next: IDate Intrinsic (UNIX), Prev: IBSet Intrinsic, Up: Table of Intrinsic Functions
+
+IChar Intrinsic
+...............
+
+ IChar(C)
+
+IChar: `INTEGER(KIND=1)' function.
+
+C: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the code for the character in the first character position
+of C.
+
+ Because the system's native character set is used, the
+correspondence between character and their codes is not necessarily the
+same between GNU Fortran implementations.
+
+ Note that no intrinsic exists to convert a printable character
+string to a numerical value. For example, there is no intrinsic that,
+given the `CHARACTER' value `'154'', returns an `INTEGER' or `REAL'
+value with the value `154'.
+
+ Instead, you can use internal-file I/O to do this kind of conversion.
+For example:
+
+ INTEGER VALUE
+ CHARACTER*10 STRING
+ STRING = '154'
+ READ (STRING, '(I10)'), VALUE
+ PRINT *, VALUE
+ END
+
+ The above program, when run, prints:
+
+ 154
+
+ *Note Char Intrinsic::, for the inverse of the `ICHAR' function.
+
+ *Note IAChar Intrinsic::, for the function corresponding to the
+ASCII character set.
+
+\1f
+File: g77.info, Node: IDate Intrinsic (UNIX), Next: IDiM Intrinsic, Prev: IChar Intrinsic, Up: Table of Intrinsic Functions
+
+IDate Intrinsic (UNIX)
+......................
+
+ CALL IDate(TARRAY)
+
+TARRAY: `INTEGER(KIND=1)'; DIMENSION(3); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Fills TARRAY with the numerical values at the current local time of
+day, month (in the range 1-12), and year in elements 1, 2, and 3,
+respectively. The year has four significant digits.
+
+ For information on other intrinsics with the same name: *Note IDate
+Intrinsic (VXT)::.
+
+\1f
+File: g77.info, Node: IDiM Intrinsic, Next: IDInt Intrinsic, Prev: IDate Intrinsic (UNIX), Up: Table of Intrinsic Functions
+
+IDiM Intrinsic
+..............
+
+ IDiM(X, Y)
+
+IDiM: `INTEGER(KIND=1)' function.
+
+X: `INTEGER(KIND=1)'; scalar; INTENT(IN).
+
+Y: `INTEGER(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `DIM()' that is specific to one type for X and Y.
+*Note DiM Intrinsic::.
+
+\1f
+File: g77.info, Node: IDInt Intrinsic, Next: IDNInt Intrinsic, Prev: IDiM Intrinsic, Up: Table of Intrinsic Functions
+
+IDInt Intrinsic
+...............
+
+ IDInt(A)
+
+IDInt: `INTEGER(KIND=1)' function.
+
+A: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `INT()' that is specific to one type for A. *Note
+Int Intrinsic::.
+
+\1f
+File: g77.info, Node: IDNInt Intrinsic, Next: IEOr Intrinsic, Prev: IDInt Intrinsic, Up: Table of Intrinsic Functions
+
+IDNInt Intrinsic
+................
+
+ IDNInt(A)
+
+IDNInt: `INTEGER(KIND=1)' function.
+
+A: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `NINT()' that is specific to one type for A. *Note
+NInt Intrinsic::.
+
+\1f
+File: g77.info, Node: IEOr Intrinsic, Next: IErrNo Intrinsic, Prev: IDNInt Intrinsic, Up: Table of Intrinsic Functions
+
+IEOr Intrinsic
+..............
+
+ IEOr(I, J)
+
+IEOr: `INTEGER' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+J: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ Returns value resulting from boolean exclusive-OR of pair of bits in
+each of I and J.
+
+\1f
+File: g77.info, Node: IErrNo Intrinsic, Next: IFix Intrinsic, Prev: IEOr Intrinsic, Up: Table of Intrinsic Functions
+
+IErrNo Intrinsic
+................
+
+ IErrNo()
+
+IErrNo: `INTEGER(KIND=1)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the last system error number (corresponding to the C
+`errno').
+
+\1f
+File: g77.info, Node: IFix Intrinsic, Next: Imag Intrinsic, Prev: IErrNo Intrinsic, Up: Table of Intrinsic Functions
+
+IFix Intrinsic
+..............
+
+ IFix(A)
+
+IFix: `INTEGER(KIND=1)' function.
+
+A: `REAL(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `INT()' that is specific to one type for A. *Note
+Int Intrinsic::.
+
+\1f
+File: g77.info, Node: Imag Intrinsic, Next: ImagPart Intrinsic, Prev: IFix Intrinsic, Up: Table of Intrinsic Functions
+
+Imag Intrinsic
+..............
+
+ Imag(Z)
+
+Imag: `REAL' function, the `KIND=' value of the type being that of
+argument Z.
+
+Z: `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ The imaginary part of Z is returned, without conversion.
+
+ *Note:* The way to do this in standard Fortran 90 is `AIMAG(Z)'.
+However, when, for example, Z is `DOUBLE COMPLEX', `AIMAG(Z)' means
+something different for some compilers that are not true Fortran 90
+compilers but offer some extensions standardized by Fortran 90 (such as
+the `DOUBLE COMPLEX' type, also known as `COMPLEX(KIND=2)').
+
+ The advantage of `IMAG()' is that, while not necessarily more or
+less portable than `AIMAG()', it is more likely to cause a compiler
+that doesn't support it to produce a diagnostic than generate incorrect
+code.
+
+ *Note REAL() and AIMAG() of Complex::, for more information.
+
+\1f
+File: g77.info, Node: ImagPart Intrinsic, Next: Index Intrinsic, Prev: Imag Intrinsic, Up: Table of Intrinsic Functions
+
+ImagPart Intrinsic
+..................
+
+ ImagPart(Z)
+
+ImagPart: `REAL' function, the `KIND=' value of the type being that of
+argument Z.
+
+Z: `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: `gnu'.
+
+Description:
+
+ The imaginary part of Z is returned, without conversion.
+
+ *Note:* The way to do this in standard Fortran 90 is `AIMAG(Z)'.
+However, when, for example, Z is `DOUBLE COMPLEX', `AIMAG(Z)' means
+something different for some compilers that are not true Fortran 90
+compilers but offer some extensions standardized by Fortran 90 (such as
+the `DOUBLE COMPLEX' type, also known as `COMPLEX(KIND=2)').
+
+ The advantage of `IMAGPART()' is that, while not necessarily more or
+less portable than `AIMAG()', it is more likely to cause a compiler
+that doesn't support it to produce a diagnostic than generate incorrect
+code.
+
+ *Note REAL() and AIMAG() of Complex::, for more information.
+
+\1f
+File: g77.info, Node: Index Intrinsic, Next: Int Intrinsic, Prev: ImagPart Intrinsic, Up: Table of Intrinsic Functions
+
+Index Intrinsic
+...............
+
+ Index(STRING, SUBSTRING)
+
+Index: `INTEGER(KIND=1)' function.
+
+STRING: `CHARACTER'; scalar; INTENT(IN).
+
+SUBSTRING: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the position of the start of the first occurrence of string
+SUBSTRING as a substring in STRING, counting from one. If SUBSTRING
+doesn't occur in STRING, zero is returned.
+
+\1f
+File: g77.info, Node: Int Intrinsic, Next: Int2 Intrinsic, Prev: Index Intrinsic, Up: Table of Intrinsic Functions
+
+Int Intrinsic
+.............
+
+ Int(A)
+
+Int: `INTEGER(KIND=1)' function.
+
+A: `INTEGER', `REAL', or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns A with the fractional portion of its magnitude truncated and
+its sign preserved, converted to type `INTEGER(KIND=1)'.
+
+ If A is type `COMPLEX', its real part is truncated and converted,
+and its imaginary part is disregarded.
+
+ *Note NInt Intrinsic::, for how to convert, rounded to nearest whole
+number.
+
+ *Note AInt Intrinsic::, for how to truncate to whole number without
+converting.
+
+\1f
+File: g77.info, Node: Int2 Intrinsic, Next: Int8 Intrinsic, Prev: Int Intrinsic, Up: Table of Intrinsic Functions
+
+Int2 Intrinsic
+..............
+
+ Int2(A)
+
+Int2: `INTEGER(KIND=6)' function.
+
+A: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `gnu'.
+
+Description:
+
+ Returns A with the fractional portion of its magnitude truncated and
+its sign preserved, converted to type `INTEGER(KIND=6)'.
+
+ If A is type `COMPLEX', its real part is truncated and converted,
+and its imaginary part is disgregarded.
+
+ *Note Int Intrinsic::.
+
+ The precise meaning of this intrinsic might change in a future
+version of the GNU Fortran language, as more is learned about how it is
+used.
+
+\1f
+File: g77.info, Node: Int8 Intrinsic, Next: IOr Intrinsic, Prev: Int2 Intrinsic, Up: Table of Intrinsic Functions
+
+Int8 Intrinsic
+..............
+
+ Int8(A)
+
+Int8: `INTEGER(KIND=2)' function.
+
+A: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `gnu'.
+
+Description:
+
+ Returns A with the fractional portion of its magnitude truncated and
+its sign preserved, converted to type `INTEGER(KIND=2)'.
+
+ If A is type `COMPLEX', its real part is truncated and converted,
+and its imaginary part is disgregarded.
+
+ *Note Int Intrinsic::.
+
+ The precise meaning of this intrinsic might change in a future
+version of the GNU Fortran language, as more is learned about how it is
+used.
+
+\1f
+File: g77.info, Node: IOr Intrinsic, Next: IRand Intrinsic, Prev: Int8 Intrinsic, Up: Table of Intrinsic Functions
+
+IOr Intrinsic
+.............
+
+ IOr(I, J)
+
+IOr: `INTEGER' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+J: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ Returns value resulting from boolean OR of pair of bits in each of I
+and J.
+
+\1f
+File: g77.info, Node: IRand Intrinsic, Next: IsaTty Intrinsic, Prev: IOr Intrinsic, Up: Table of Intrinsic Functions
+
+IRand Intrinsic
+...............
+
+ IRand(FLAG)
+
+IRand: `INTEGER(KIND=1)' function.
+
+FLAG: `INTEGER'; OPTIONAL; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns a uniform quasi-random number up to a system-dependent limit.
+If FLAG is 0, the next number in sequence is returned; if FLAG is 1,
+the generator is restarted by calling the UNIX function `srand(0)'; if
+FLAG has any other value, it is used as a new seed with `srand()'.
+
+ *Note SRand Intrinsic::.
+
+ *Note:* As typically implemented (by the routine of the same name in
+the C library), this random number generator is a very poor one, though
+the BSD and GNU libraries provide a much better implementation than the
+`traditional' one. On a different system you almost certainly want to
+use something better.
+
+\1f
+File: g77.info, Node: IsaTty Intrinsic, Next: IShft Intrinsic, Prev: IRand Intrinsic, Up: Table of Intrinsic Functions
+
+IsaTty Intrinsic
+................
+
+ IsaTty(UNIT)
+
+IsaTty: `LOGICAL(KIND=1)' function.
+
+UNIT: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns `.TRUE.' if and only if the Fortran I/O unit specified by
+UNIT is connected to a terminal device. See `isatty(3)'.
+
+\1f
+File: g77.info, Node: IShft Intrinsic, Next: IShftC Intrinsic, Prev: IsaTty Intrinsic, Up: Table of Intrinsic Functions
+
+IShft Intrinsic
+...............
+
+ IShft(I, SHIFT)
+
+IShft: `INTEGER' function, the `KIND=' value of the type being that of
+argument I.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+SHIFT: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ All bits representing I are shifted SHIFT places. `SHIFT.GT.0'
+indicates a left shift, `SHIFT.EQ.0' indicates no shift and
+`SHIFT.LT.0' indicates a right shift. If the absolute value of the
+shift count is greater than `BIT_SIZE(I)', the result is undefined.
+Bits shifted out from the left end or the right end, as the case may be,
+are lost. Zeros are shifted in from the opposite end.
+
+ *Note IShftC Intrinsic:: for the circular-shift equivalent.
+
--- /dev/null
+This is Info file g77.info, produced by Makeinfo version 1.68 from the
+input file g77.texi.
+
+ This file explains how to use the GNU Fortran system.
+
+ Published by the Free Software Foundation 59 Temple Place - Suite 330
+Boston, MA 02111-1307 USA
+
+ Copyright (C) 1995-1997 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License," "Funding for
+Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License," "Funding for Free Software," and "Protect Your Freedom--Fight
+`Look And Feel'", and this permission notice, may be included in
+translations approved by the Free Software Foundation instead of in the
+original English.
+
+ Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
+Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
+contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+
+INFO-DIR-SECTION Fortran Programming
+START-INFO-DIR-ENTRY
+* g77: (g77). The GNU Fortran compilation system.
+END-INFO-DIR-ENTRY
+
+\1f
+File: g77.info, Node: IShftC Intrinsic, Next: ISign Intrinsic, Prev: IShft Intrinsic, Up: Table of Intrinsic Functions
+
+IShftC Intrinsic
+................
+
+ IShftC(I, SHIFT, SIZE)
+
+IShftC: `INTEGER' function, the `KIND=' value of the type being that of
+argument I.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+SHIFT: `INTEGER'; scalar; INTENT(IN).
+
+SIZE: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ The rightmost SIZE bits of the argument I are shifted circularly
+SHIFT places, i.e. the bits shifted out of one end are shifted into the
+opposite end. No bits are lost. The unshifted bits of the result are
+the same as the unshifted bits of I. The absolute value of the
+argument SHIFT must be less than or equal to SIZE. The value of SIZE
+must be greater than or equal to one and less than or equal to
+`BIT_SIZE(I)'.
+
+ *Note IShft Intrinsic:: for the logical shift equivalent.
+
+\1f
+File: g77.info, Node: ISign Intrinsic, Next: ITime Intrinsic, Prev: IShftC Intrinsic, Up: Table of Intrinsic Functions
+
+ISign Intrinsic
+...............
+
+ ISign(A, B)
+
+ISign: `INTEGER(KIND=1)' function.
+
+A: `INTEGER(KIND=1)'; scalar; INTENT(IN).
+
+B: `INTEGER(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `SIGN()' that is specific to one type for A and B.
+*Note Sign Intrinsic::.
+
+\1f
+File: g77.info, Node: ITime Intrinsic, Next: Kill Intrinsic (subroutine), Prev: ISign Intrinsic, Up: Table of Intrinsic Functions
+
+ITime Intrinsic
+...............
+
+ CALL ITime(TARRAY)
+
+TARRAY: `INTEGER(KIND=1)'; DIMENSION(3); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the current local time hour, minutes, and seconds in elements
+1, 2, and 3 of TARRAY, respectively.
+
+\1f
+File: g77.info, Node: Kill Intrinsic (subroutine), Next: Kind Intrinsic, Prev: ITime Intrinsic, Up: Table of Intrinsic Functions
+
+Kill Intrinsic (subroutine)
+...........................
+
+ CALL Kill(PID, SIGNAL, STATUS)
+
+PID: `INTEGER'; scalar; INTENT(IN).
+
+SIGNAL: `INTEGER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Sends the signal specified by SIGNAL to the process PID. If the
+STATUS argument is supplied, it contains 0 on success or a non-zero
+error code upon return. See `kill(2)'.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note Kill
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Kind Intrinsic, Next: LBound Intrinsic, Prev: Kill Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Kind Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Kind' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: LBound Intrinsic, Next: Len Intrinsic, Prev: Kind Intrinsic, Up: Table of Intrinsic Functions
+
+LBound Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL LBound' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Len Intrinsic, Next: Len_Trim Intrinsic, Prev: LBound Intrinsic, Up: Table of Intrinsic Functions
+
+Len Intrinsic
+.............
+
+ Len(STRING)
+
+Len: `INTEGER(KIND=1)' function.
+
+STRING: `CHARACTER'; scalar.
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the length of STRING.
+
+ If STRING is an array, the length of an element of STRING is
+returned.
+
+ Note that STRING need not be defined when this intrinsic is invoked,
+since only the length, not the content, of STRING is needed.
+
+ *Note Bit_Size Intrinsic::, for the function that determines the
+size of its argument in bits.
+
+\1f
+File: g77.info, Node: Len_Trim Intrinsic, Next: LGe Intrinsic, Prev: Len Intrinsic, Up: Table of Intrinsic Functions
+
+Len_Trim Intrinsic
+..................
+
+ Len_Trim(STRING)
+
+Len_Trim: `INTEGER(KIND=1)' function.
+
+STRING: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `f90'.
+
+Description:
+
+ Returns the index of the last non-blank character in STRING.
+`LNBLNK' and `LEN_TRIM' are equivalent.
+
+\1f
+File: g77.info, Node: LGe Intrinsic, Next: LGt Intrinsic, Prev: Len_Trim Intrinsic, Up: Table of Intrinsic Functions
+
+LGe Intrinsic
+.............
+
+ LGe(STRING_A, STRING_B)
+
+LGe: `LOGICAL(KIND=1)' function.
+
+STRING_A: `CHARACTER'; scalar; INTENT(IN).
+
+STRING_B: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns `.TRUE.' if `STRING_A.GE.STRING_B', `.FALSE.' otherwise.
+STRING_A and STRING_B are interpreted as containing ASCII character
+codes. If either value contains a character not in the ASCII character
+set, the result is processor dependent.
+
+ If the STRING_A and STRING_B are not the same length, the shorter is
+compared as if spaces were appended to it to form a value that has the
+same length as the longer.
+
+ The lexical comparison intrinsics `LGe', `LGt', `LLe', and `LLt'
+differ from the corresponding intrinsic operators `.GE.', `.GT.',
+`.LE.', `.LT.'. Because the ASCII collating sequence is assumed, the
+following expressions always return `.TRUE.':
+
+ LGE ('0', ' ')
+ LGE ('A', '0')
+ LGE ('a', 'A')
+
+ The following related expressions do *not* always return `.TRUE.',
+as they are not necessarily evaluated assuming the arguments use ASCII
+encoding:
+
+ '0' .GE. ' '
+ 'A' .GE. '0'
+ 'a' .GE. 'A'
+
+ The same difference exists between `LGt' and `.GT.'; between `LLe'
+and `.LE.'; and between `LLt' and `.LT.'.
+
+\1f
+File: g77.info, Node: LGt Intrinsic, Next: Link Intrinsic (subroutine), Prev: LGe Intrinsic, Up: Table of Intrinsic Functions
+
+LGt Intrinsic
+.............
+
+ LGt(STRING_A, STRING_B)
+
+LGt: `LOGICAL(KIND=1)' function.
+
+STRING_A: `CHARACTER'; scalar; INTENT(IN).
+
+STRING_B: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns `.TRUE.' if `STRING_A.GT.STRING_B', `.FALSE.' otherwise.
+STRING_A and STRING_B are interpreted as containing ASCII character
+codes. If either value contains a character not in the ASCII character
+set, the result is processor dependent.
+
+ If the STRING_A and STRING_B are not the same length, the shorter is
+compared as if spaces were appended to it to form a value that has the
+same length as the longer.
+
+ *Note LGe Intrinsic::, for information on the distinction between
+the `LGT' intrinsic and the `.GT.' operator.
+
+\1f
+File: g77.info, Node: Link Intrinsic (subroutine), Next: LLe Intrinsic, Prev: LGt Intrinsic, Up: Table of Intrinsic Functions
+
+Link Intrinsic (subroutine)
+...........................
+
+ CALL Link(PATH1, PATH2, STATUS)
+
+PATH1: `CHARACTER'; scalar; INTENT(IN).
+
+PATH2: `CHARACTER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Makes a (hard) link from file PATH1 to PATH2. A null character
+(`CHAR(0)') marks the end of the names in PATH1 and PATH2--otherwise,
+trailing blanks in PATH1 and PATH2 are ignored. If the STATUS argument
+is supplied, it contains 0 on success or a non-zero error code upon
+return. See `link(2)'.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note Link
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: LLe Intrinsic, Next: LLt Intrinsic, Prev: Link Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+LLe Intrinsic
+.............
+
+ LLe(STRING_A, STRING_B)
+
+LLe: `LOGICAL(KIND=1)' function.
+
+STRING_A: `CHARACTER'; scalar; INTENT(IN).
+
+STRING_B: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns `.TRUE.' if `STRING_A.LE.STRING_B', `.FALSE.' otherwise.
+STRING_A and STRING_B are interpreted as containing ASCII character
+codes. If either value contains a character not in the ASCII character
+set, the result is processor dependent.
+
+ If the STRING_A and STRING_B are not the same length, the shorter is
+compared as if spaces were appended to it to form a value that has the
+same length as the longer.
+
+ *Note LGe Intrinsic::, for information on the distinction between
+the `LLE' intrinsic and the `.LE.' operator.
+
+\1f
+File: g77.info, Node: LLt Intrinsic, Next: LnBlnk Intrinsic, Prev: LLe Intrinsic, Up: Table of Intrinsic Functions
+
+LLt Intrinsic
+.............
+
+ LLt(STRING_A, STRING_B)
+
+LLt: `LOGICAL(KIND=1)' function.
+
+STRING_A: `CHARACTER'; scalar; INTENT(IN).
+
+STRING_B: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns `.TRUE.' if `STRING_A.LT.STRING_B', `.FALSE.' otherwise.
+STRING_A and STRING_B are interpreted as containing ASCII character
+codes. If either value contains a character not in the ASCII character
+set, the result is processor dependent.
+
+ If the STRING_A and STRING_B are not the same length, the shorter is
+compared as if spaces were appended to it to form a value that has the
+same length as the longer.
+
+ *Note LGe Intrinsic::, for information on the distinction between
+the `LLT' intrinsic and the `.LT.' operator.
+
+\1f
+File: g77.info, Node: LnBlnk Intrinsic, Next: Loc Intrinsic, Prev: LLt Intrinsic, Up: Table of Intrinsic Functions
+
+LnBlnk Intrinsic
+................
+
+ LnBlnk(STRING)
+
+LnBlnk: `INTEGER(KIND=1)' function.
+
+STRING: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the index of the last non-blank character in STRING.
+`LNBLNK' and `LEN_TRIM' are equivalent.
+
+\1f
+File: g77.info, Node: Loc Intrinsic, Next: Log Intrinsic, Prev: LnBlnk Intrinsic, Up: Table of Intrinsic Functions
+
+Loc Intrinsic
+.............
+
+ Loc(ENTITY)
+
+Loc: `INTEGER(KIND=0)' function.
+
+ENTITY: Any type; cannot be a constant or expression.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ The `LOC()' intrinsic works the same way as the `%LOC()' construct.
+*Note The `%LOC()' Construct: %LOC(), for more information.
+
+\1f
+File: g77.info, Node: Log Intrinsic, Next: Log10 Intrinsic, Prev: Loc Intrinsic, Up: Table of Intrinsic Functions
+
+Log Intrinsic
+.............
+
+ Log(X)
+
+Log: `REAL' or `COMPLEX' function, the exact type being that of
+argument X.
+
+X: `REAL' or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the natural logarithm of X, which must be greater than zero
+or, if type `COMPLEX', must not be zero.
+
+ *Note Exp Intrinsic::, for the inverse of this function.
+
+ *Note Log10 Intrinsic::, for the base-10 logarithm function.
+
+\1f
+File: g77.info, Node: Log10 Intrinsic, Next: Logical Intrinsic, Prev: Log Intrinsic, Up: Table of Intrinsic Functions
+
+Log10 Intrinsic
+...............
+
+ Log10(X)
+
+Log10: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the natural logarithm of X, which must be greater than zero
+or, if type `COMPLEX', must not be zero.
+
+ The inverse of this function is `10. ** LOG10(X)'.
+
+ *Note Log Intrinsic::, for the natural logarithm function.
+
+\1f
+File: g77.info, Node: Logical Intrinsic, Next: Long Intrinsic, Prev: Log10 Intrinsic, Up: Table of Intrinsic Functions
+
+Logical Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Logical' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: Long Intrinsic, Next: LShift Intrinsic, Prev: Logical Intrinsic, Up: Table of Intrinsic Functions
+
+Long Intrinsic
+..............
+
+ Long(A)
+
+Long: `INTEGER(KIND=1)' function.
+
+A: `INTEGER(KIND=6)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `INT()' that is specific to one type for A. *Note
+Int Intrinsic::.
+
+ The precise meaning of this intrinsic might change in a future
+version of the GNU Fortran language, as more is learned about how it is
+used.
+
+\1f
+File: g77.info, Node: LShift Intrinsic, Next: LStat Intrinsic (subroutine), Prev: Long Intrinsic, Up: Table of Intrinsic Functions
+
+LShift Intrinsic
+................
+
+ LShift(I, SHIFT)
+
+LShift: `INTEGER' function, the `KIND=' value of the type being that of
+argument I.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+SHIFT: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Returns I shifted to the left SHIFT bits.
+
+ Although similar to the expression `I*(2**SHIFT)', there are
+important differences. For example, the sign of the result is not
+necessarily the same as the sign of I.
+
+ Currently this intrinsic is defined assuming the underlying
+representation of I is as a two's-complement integer. It is unclear at
+this point whether that definition will apply when a different
+representation is involved.
+
+ *Note LShift Intrinsic::, for the inverse of this function.
+
+ *Note IShft Intrinsic::, for information on a more widely available
+left-shifting intrinsic that is also more precisely defined.
+
+\1f
+File: g77.info, Node: LStat Intrinsic (subroutine), Next: LStat Intrinsic (function), Prev: LShift Intrinsic, Up: Table of Intrinsic Functions
+
+LStat Intrinsic (subroutine)
+............................
+
+ CALL LStat(FILE, SARRAY, STATUS)
+
+FILE: `CHARACTER'; scalar; INTENT(IN).
+
+SARRAY: `INTEGER(KIND=1)'; DIMENSION(13); INTENT(OUT).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Obtains data about the given file FILE and places them in the array
+SARRAY. A null character (`CHAR(0)') marks the end of the name in
+FILE--otherwise, trailing blanks in FILE are ignored. If FILE is a
+symbolic link it returns data on the link itself, so the routine is
+available only on systems that support symbolic links. The values in
+this array are extracted from the `stat' structure as returned by
+`fstat(2)' q.v., as follows:
+
+ 1. File mode
+
+ 2. Inode number
+
+ 3. ID of device containing directory entry for file
+
+ 4. Device id (if relevant)
+
+ 5. Number of links
+
+ 6. Owner's uid
+
+ 7. Owner's gid
+
+ 8. File size (bytes)
+
+ 9. Last access time
+
+ 10. Last modification time
+
+ 11. Last file status change time
+
+ 12. Preferred I/O block size
+
+ 13. Number of blocks allocated
+
+ Not all these elements are relevant on all systems. If an element
+is not relevant, it is returned as 0.
+
+ If the STATUS argument is supplied, it contains 0 on success or a
+non-zero error code upon return (`ENOSYS' if the system does not
+provide `lstat(2)').
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note LStat
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: LStat Intrinsic (function), Next: LTime Intrinsic, Prev: LStat Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+LStat Intrinsic (function)
+..........................
+
+ LStat(FILE, SARRAY)
+
+LStat: `INTEGER(KIND=1)' function.
+
+FILE: `CHARACTER'; scalar; INTENT(IN).
+
+SARRAY: `INTEGER(KIND=1)'; DIMENSION(13); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Obtains data about the given file FILE and places them in the array
+SARRAY. A null character (`CHAR(0)') marks the end of the name in
+FILE--otherwise, trailing blanks in FILE are ignored. If FILE is a
+symbolic link it returns data on the link itself, so the routine is
+available only on systems that support symbolic links. The values in
+this array are extracted from the `stat' structure as returned by
+`fstat(2)' q.v., as follows:
+
+ 1. File mode
+
+ 2. Inode number
+
+ 3. ID of device containing directory entry for file
+
+ 4. Device id (if relevant)
+
+ 5. Number of links
+
+ 6. Owner's uid
+
+ 7. Owner's gid
+
+ 8. File size (bytes)
+
+ 9. Last access time
+
+ 10. Last modification time
+
+ 11. Last file status change time
+
+ 12. Preferred I/O block size
+
+ 13. Number of blocks allocated
+
+ Not all these elements are relevant on all systems. If an element
+is not relevant, it is returned as 0.
+
+ Returns 0 on success or a non-zero error code (`ENOSYS' if the
+system does not provide `lstat(2)').
+
+ For information on other intrinsics with the same name: *Note LStat
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: LTime Intrinsic, Next: MatMul Intrinsic, Prev: LStat Intrinsic (function), Up: Table of Intrinsic Functions
+
+LTime Intrinsic
+...............
+
+ CALL LTime(STIME, TARRAY)
+
+STIME: `INTEGER(KIND=1)'; scalar; INTENT(IN).
+
+TARRAY: `INTEGER(KIND=1)'; DIMENSION(9); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Given a system time value STIME, fills TARRAY with values extracted
+from it appropriate to the GMT time zone using `localtime(3)'.
+
+ The array elements are as follows:
+
+ 1. Seconds after the minute, range 0-59 or 0-61 to allow for leap
+ seconds
+
+ 2. Minutes after the hour, range 0-59
+
+ 3. Hours past midnight, range 0-23
+
+ 4. Day of month, range 0-31
+
+ 5. Number of months since January, range 0-12
+
+ 6. Years since 1900
+
+ 7. Number of days since Sunday, range 0-6
+
+ 8. Days since January 1
+
+ 9. Daylight savings indicator: positive if daylight savings is in
+ effect, zero if not, and negative if the information isn't
+ available.
+
+\1f
+File: g77.info, Node: MatMul Intrinsic, Next: Max Intrinsic, Prev: LTime Intrinsic, Up: Table of Intrinsic Functions
+
+MatMul Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL MatMul' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Max Intrinsic, Next: Max0 Intrinsic, Prev: MatMul Intrinsic, Up: Table of Intrinsic Functions
+
+Max Intrinsic
+.............
+
+ Max(A-1, A-2, ..., A-n)
+
+Max: `INTEGER' or `REAL' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+A: `INTEGER' or `REAL'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the argument with the largest value.
+
+ *Note Min Intrinsic::, for the opposite function.
+
+\1f
+File: g77.info, Node: Max0 Intrinsic, Next: Max1 Intrinsic, Prev: Max Intrinsic, Up: Table of Intrinsic Functions
+
+Max0 Intrinsic
+..............
+
+ Max0(A-1, A-2, ..., A-n)
+
+Max0: `INTEGER(KIND=1)' function.
+
+A: `INTEGER(KIND=1)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MAX()' that is specific to one type for A. *Note
+Max Intrinsic::.
+
+\1f
+File: g77.info, Node: Max1 Intrinsic, Next: MaxExponent Intrinsic, Prev: Max0 Intrinsic, Up: Table of Intrinsic Functions
+
+Max1 Intrinsic
+..............
+
+ Max1(A-1, A-2, ..., A-n)
+
+Max1: `INTEGER(KIND=1)' function.
+
+A: `REAL(KIND=1)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MAX()' that is specific to one type for A and a
+different return type. *Note Max Intrinsic::.
+
+\1f
+File: g77.info, Node: MaxExponent Intrinsic, Next: MaxLoc Intrinsic, Prev: Max1 Intrinsic, Up: Table of Intrinsic Functions
+
+MaxExponent Intrinsic
+.....................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL MaxExponent' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: MaxLoc Intrinsic, Next: MaxVal Intrinsic, Prev: MaxExponent Intrinsic, Up: Table of Intrinsic Functions
+
+MaxLoc Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL MaxLoc' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: MaxVal Intrinsic, Next: MClock Intrinsic, Prev: MaxLoc Intrinsic, Up: Table of Intrinsic Functions
+
+MaxVal Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL MaxVal' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: MClock Intrinsic, Next: MClock8 Intrinsic, Prev: MaxVal Intrinsic, Up: Table of Intrinsic Functions
+
+MClock Intrinsic
+................
+
+ MClock()
+
+MClock: `INTEGER(KIND=1)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the number of clock ticks since the start of the process.
+Supported on systems with `clock(3)' (q.v.).
+
+ This intrinsic is not fully portable, such as to systems with 32-bit
+`INTEGER' types but supporting times wider than 32 bits. *Note MClock8
+Intrinsic::, for information on a similar intrinsic that might be
+portable to more GNU Fortran implementations, though to fewer Fortran
+compilers.
+
+ If the system does not support `clock(3)', -1 is returned.
+
+\1f
+File: g77.info, Node: MClock8 Intrinsic, Next: Merge Intrinsic, Prev: MClock Intrinsic, Up: Table of Intrinsic Functions
+
+MClock8 Intrinsic
+.................
+
+ MClock8()
+
+MClock8: `INTEGER(KIND=2)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the number of clock ticks since the start of the process.
+Supported on systems with `clock(3)' (q.v.).
+
+ No Fortran implementations other than GNU Fortran are known to
+support this intrinsic at the time of this writing. *Note MClock
+Intrinsic::, for information on a similar intrinsic that might be
+portable to more Fortran compilers, though to fewer GNU Fortran
+implementations.
+
+ If the system does not support `clock(3)', -1 is returned.
+
+\1f
+File: g77.info, Node: Merge Intrinsic, Next: Min Intrinsic, Prev: MClock8 Intrinsic, Up: Table of Intrinsic Functions
+
+Merge Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Merge' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Min Intrinsic, Next: Min0 Intrinsic, Prev: Merge Intrinsic, Up: Table of Intrinsic Functions
+
+Min Intrinsic
+.............
+
+ Min(A-1, A-2, ..., A-n)
+
+Min: `INTEGER' or `REAL' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+A: `INTEGER' or `REAL'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the argument with the smallest value.
+
+ *Note Max Intrinsic::, for the opposite function.
+
+\1f
+File: g77.info, Node: Min0 Intrinsic, Next: Min1 Intrinsic, Prev: Min Intrinsic, Up: Table of Intrinsic Functions
+
+Min0 Intrinsic
+..............
+
+ Min0(A-1, A-2, ..., A-n)
+
+Min0: `INTEGER(KIND=1)' function.
+
+A: `INTEGER(KIND=1)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MIN()' that is specific to one type for A. *Note
+Min Intrinsic::.
+
+\1f
+File: g77.info, Node: Min1 Intrinsic, Next: MinExponent Intrinsic, Prev: Min0 Intrinsic, Up: Table of Intrinsic Functions
+
+Min1 Intrinsic
+..............
+
+ Min1(A-1, A-2, ..., A-n)
+
+Min1: `INTEGER(KIND=1)' function.
+
+A: `REAL(KIND=1)'; at least two such arguments must be provided;
+scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `MIN()' that is specific to one type for A and a
+different return type. *Note Min Intrinsic::.
+
+\1f
+File: g77.info, Node: MinExponent Intrinsic, Next: MinLoc Intrinsic, Prev: Min1 Intrinsic, Up: Table of Intrinsic Functions
+
+MinExponent Intrinsic
+.....................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL MinExponent' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: MinLoc Intrinsic, Next: MinVal Intrinsic, Prev: MinExponent Intrinsic, Up: Table of Intrinsic Functions
+
+MinLoc Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL MinLoc' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: MinVal Intrinsic, Next: Mod Intrinsic, Prev: MinLoc Intrinsic, Up: Table of Intrinsic Functions
+
+MinVal Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL MinVal' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Mod Intrinsic, Next: Modulo Intrinsic, Prev: MinVal Intrinsic, Up: Table of Intrinsic Functions
+
+Mod Intrinsic
+.............
+
+ Mod(A, P)
+
+Mod: `INTEGER' or `REAL' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+A: `INTEGER' or `REAL'; scalar; INTENT(IN).
+
+P: `INTEGER' or `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns remainder calculated as:
+
+ A - (INT(A / P) * P)
+
+ P must not be zero.
+
+\1f
+File: g77.info, Node: Modulo Intrinsic, Next: MvBits Intrinsic, Prev: Mod Intrinsic, Up: Table of Intrinsic Functions
+
+Modulo Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Modulo' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: MvBits Intrinsic, Next: Nearest Intrinsic, Prev: Modulo Intrinsic, Up: Table of Intrinsic Functions
+
+MvBits Intrinsic
+................
+
+ CALL MvBits(FROM, FROMPOS, LEN, TO, TOPOS)
+
+FROM: `INTEGER'; scalar; INTENT(IN).
+
+FROMPOS: `INTEGER'; scalar; INTENT(IN).
+
+LEN: `INTEGER'; scalar; INTENT(IN).
+
+TO: `INTEGER' with same `KIND=' value as for FROM; scalar;
+INTENT(INOUT).
+
+TOPOS: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ Moves LEN bits from positions FROMPOS through `FROMPOS+LEN-1' of
+FROM to positions TOPOS through `FROMPOS+LEN-1' of TO. The portion of
+argument TO not affected by the movement of bits is unchanged.
+Arguments FROM and TO are permitted to be the same numeric storage
+unit. The values of `FROMPOS+LEN' and `TOPOS+LEN' must be less than or
+equal to `BIT_SIZE(FROM)'.
+
+\1f
+File: g77.info, Node: Nearest Intrinsic, Next: NInt Intrinsic, Prev: MvBits Intrinsic, Up: Table of Intrinsic Functions
+
+Nearest Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Nearest' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: NInt Intrinsic, Next: Not Intrinsic, Prev: Nearest Intrinsic, Up: Table of Intrinsic Functions
+
+NInt Intrinsic
+..............
+
+ NInt(A)
+
+NInt: `INTEGER(KIND=1)' function.
+
+A: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns A with the fractional portion of its magnitude eliminated by
+rounding to the nearest whole number and with its sign preserved,
+converted to type `INTEGER(KIND=1)'.
+
+ If A is type `COMPLEX', its real part is rounded and converted.
+
+ A fractional portion exactly equal to `.5' is rounded to the whole
+number that is larger in magnitude. (Also called "Fortran round".)
+
+ *Note Int Intrinsic::, for how to convert, truncate to whole number.
+
+ *Note ANInt Intrinsic::, for how to round to nearest whole number
+without converting.
+
+\1f
+File: g77.info, Node: Not Intrinsic, Next: Or Intrinsic, Prev: NInt Intrinsic, Up: Table of Intrinsic Functions
+
+Not Intrinsic
+.............
+
+ Not(I)
+
+Not: `INTEGER' function, the `KIND=' value of the type being that of
+argument I.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ Returns value resulting from boolean NOT of each bit in I.
+
+\1f
+File: g77.info, Node: Or Intrinsic, Next: Pack Intrinsic, Prev: Not Intrinsic, Up: Table of Intrinsic Functions
+
+Or Intrinsic
+............
+
+ Or(I, J)
+
+Or: `INTEGER' or `LOGICAL' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+I: `INTEGER' or `LOGICAL'; scalar; INTENT(IN).
+
+J: `INTEGER' or `LOGICAL'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Returns value resulting from boolean OR of pair of bits in each of I
+and J.
+
+\1f
+File: g77.info, Node: Pack Intrinsic, Next: PError Intrinsic, Prev: Or Intrinsic, Up: Table of Intrinsic Functions
+
+Pack Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Pack' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: PError Intrinsic, Next: Precision Intrinsic, Prev: Pack Intrinsic, Up: Table of Intrinsic Functions
+
+PError Intrinsic
+................
+
+ CALL PError(STRING)
+
+STRING: `CHARACTER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Prints (on the C `stderr' stream) a newline-terminated error message
+corresponding to the last system error. This is prefixed by STRING, a
+colon and a space. See `perror(3)'.
+
+\1f
+File: g77.info, Node: Precision Intrinsic, Next: Present Intrinsic, Prev: PError Intrinsic, Up: Table of Intrinsic Functions
+
+Precision Intrinsic
+...................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Precision' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: Present Intrinsic, Next: Product Intrinsic, Prev: Precision Intrinsic, Up: Table of Intrinsic Functions
+
+Present Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Present' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: Product Intrinsic, Next: Radix Intrinsic, Prev: Present Intrinsic, Up: Table of Intrinsic Functions
+
+Product Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Product' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: Radix Intrinsic, Next: Rand Intrinsic, Prev: Product Intrinsic, Up: Table of Intrinsic Functions
+
+Radix Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Radix' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Rand Intrinsic, Next: Random_Number Intrinsic, Prev: Radix Intrinsic, Up: Table of Intrinsic Functions
+
+Rand Intrinsic
+..............
+
+ Rand(FLAG)
+
+Rand: `REAL(KIND=1)' function.
+
+FLAG: `INTEGER'; OPTIONAL; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns a uniform quasi-random number between 0 and 1. If FLAG is
+0, the next number in sequence is returned; if FLAG is 1, the generator
+is restarted by calling `srand(0)'; if FLAG has any other value, it is
+used as a new seed with `srand'.
+
+ *Note SRand Intrinsic::.
+
+ *Note:* As typically implemented (by the routine of the same name in
+the C library), this random number generator is a very poor one, though
+the BSD and GNU libraries provide a much better implementation than the
+`traditional' one. On a different system you almost certainly want to
+use something better.
+
+\1f
+File: g77.info, Node: Random_Number Intrinsic, Next: Random_Seed Intrinsic, Prev: Rand Intrinsic, Up: Table of Intrinsic Functions
+
+Random_Number Intrinsic
+.......................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Random_Number' to use this
+name for an external procedure.
+
+\1f
+File: g77.info, Node: Random_Seed Intrinsic, Next: Range Intrinsic, Prev: Random_Number Intrinsic, Up: Table of Intrinsic Functions
+
+Random_Seed Intrinsic
+.....................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Random_Seed' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: Range Intrinsic, Next: Real Intrinsic, Prev: Random_Seed Intrinsic, Up: Table of Intrinsic Functions
+
+Range Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Range' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Real Intrinsic, Next: RealPart Intrinsic, Prev: Range Intrinsic, Up: Table of Intrinsic Functions
+
+Real Intrinsic
+..............
+
+ Real(A)
+
+Real: `REAL' function. The exact type is `REAL(KIND=1)' when argument
+A is any type other than `COMPLEX', or when it is `COMPLEX(KIND=1)'.
+When A is any `COMPLEX' type other than `COMPLEX(KIND=1)', this
+intrinsic is valid only when used as the argument to `REAL()', as
+explained below.
+
+A: `INTEGER', `REAL', or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Converts A to `REAL(KIND=1)'.
+
+ Use of `REAL()' with a `COMPLEX' argument (other than
+`COMPLEX(KIND=1)') is restricted to the following case:
+
+ REAL(REAL(A))
+
+This expression converts the real part of A to `REAL(KIND=1)'.
+
+ *Note RealPart Intrinsic::, for information on a GNU Fortran
+intrinsic that extracts the real part of an arbitrary `COMPLEX' value.
+
+ *Note REAL() and AIMAG() of Complex::, for more information.
+
+\1f
+File: g77.info, Node: RealPart Intrinsic, Next: Rename Intrinsic (subroutine), Prev: Real Intrinsic, Up: Table of Intrinsic Functions
+
+RealPart Intrinsic
+..................
+
+ RealPart(Z)
+
+RealPart: `REAL' function, the `KIND=' value of the type being that of
+argument Z.
+
+Z: `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: `gnu'.
+
+Description:
+
+ The real part of Z is returned, without conversion.
+
+ *Note:* The way to do this in standard Fortran 90 is `REAL(Z)'.
+However, when, for example, Z is `COMPLEX(KIND=2)', `REAL(Z)' means
+something different for some compilers that are not true Fortran 90
+compilers but offer some extensions standardized by Fortran 90 (such as
+the `DOUBLE COMPLEX' type, also known as `COMPLEX(KIND=2)').
+
+ The advantage of `REALPART()' is that, while not necessarily more or
+less portable than `REAL()', it is more likely to cause a compiler that
+doesn't support it to produce a diagnostic than generate incorrect code.
+
+ *Note REAL() and AIMAG() of Complex::, for more information.
+
+\1f
+File: g77.info, Node: Rename Intrinsic (subroutine), Next: Repeat Intrinsic, Prev: RealPart Intrinsic, Up: Table of Intrinsic Functions
+
+Rename Intrinsic (subroutine)
+.............................
+
+ CALL Rename(PATH1, PATH2, STATUS)
+
+PATH1: `CHARACTER'; scalar; INTENT(IN).
+
+PATH2: `CHARACTER'; scalar; INTENT(IN).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Renames the file PATH1 to PATH2. A null character (`CHAR(0)') marks
+the end of the names in PATH1 and PATH2--otherwise, trailing blanks in
+PATH1 and PATH2 are ignored. See `rename(2)'. If the STATUS argument
+is supplied, it contains 0 on success or a non-zero error code upon
+return.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note Rename
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Repeat Intrinsic, Next: Reshape Intrinsic, Prev: Rename Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Repeat Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Repeat' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Reshape Intrinsic, Next: RRSpacing Intrinsic, Prev: Repeat Intrinsic, Up: Table of Intrinsic Functions
+
+Reshape Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Reshape' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: RRSpacing Intrinsic, Next: RShift Intrinsic, Prev: Reshape Intrinsic, Up: Table of Intrinsic Functions
+
+RRSpacing Intrinsic
+...................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL RRSpacing' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: RShift Intrinsic, Next: Scale Intrinsic, Prev: RRSpacing Intrinsic, Up: Table of Intrinsic Functions
+
+RShift Intrinsic
+................
+
+ RShift(I, SHIFT)
+
+RShift: `INTEGER' function, the `KIND=' value of the type being that of
+argument I.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+SHIFT: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `f2c'.
+
+Description:
+
+ Returns I shifted to the right SHIFT bits.
+
+ Although similar to the expression `I/(2**SHIFT)', there are
+important differences. For example, the sign of the result is
+undefined.
+
+ Currently this intrinsic is defined assuming the underlying
+representation of I is as a two's-complement integer. It is unclear at
+this point whether that definition will apply when a different
+representation is involved.
+
+ *Note RShift Intrinsic::, for the inverse of this function.
+
+ *Note IShft Intrinsic::, for information on a more widely available
+right-shifting intrinsic that is also more precisely defined.
+
+\1f
+File: g77.info, Node: Scale Intrinsic, Next: Scan Intrinsic, Prev: RShift Intrinsic, Up: Table of Intrinsic Functions
+
+Scale Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Scale' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Scan Intrinsic, Next: Second Intrinsic (function), Prev: Scale Intrinsic, Up: Table of Intrinsic Functions
+
+Scan Intrinsic
+..............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Scan' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Second Intrinsic (function), Next: Second Intrinsic (subroutine), Prev: Scan Intrinsic, Up: Table of Intrinsic Functions
+
+Second Intrinsic (function)
+...........................
+
+ Second()
+
+Second: `REAL(KIND=1)' function.
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the process's runtime in seconds--the same value as the UNIX
+function `etime' returns.
+
+ This routine is known from Cray Fortran.
+
+ For information on other intrinsics with the same name: *Note Second
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: Second Intrinsic (subroutine), Next: Selected_Int_Kind Intrinsic, Prev: Second Intrinsic (function), Up: Table of Intrinsic Functions
+
+Second Intrinsic (subroutine)
+.............................
+
+ CALL Second(SECONDS)
+
+SECONDS: `REAL(KIND=1)'; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns the process's runtime in seconds in SECONDS--the same value
+as the UNIX function `etime' returns.
+
+ This routine is known from Cray Fortran. *Note Cpu_Time Intrinsic::
+for a standard equivalent.
+
+ For information on other intrinsics with the same name: *Note Second
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Selected_Int_Kind Intrinsic, Next: Selected_Real_Kind Intrinsic, Prev: Second Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Selected_Int_Kind Intrinsic
+...........................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Selected_Int_Kind' to use this
+name for an external procedure.
+
+\1f
+File: g77.info, Node: Selected_Real_Kind Intrinsic, Next: Set_Exponent Intrinsic, Prev: Selected_Int_Kind Intrinsic, Up: Table of Intrinsic Functions
+
+Selected_Real_Kind Intrinsic
+............................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Selected_Real_Kind' to use
+this name for an external procedure.
+
+\1f
+File: g77.info, Node: Set_Exponent Intrinsic, Next: Shape Intrinsic, Prev: Selected_Real_Kind Intrinsic, Up: Table of Intrinsic Functions
+
+Set_Exponent Intrinsic
+......................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Set_Exponent' to use this name
+for an external procedure.
+
+\1f
+File: g77.info, Node: Shape Intrinsic, Next: Short Intrinsic, Prev: Set_Exponent Intrinsic, Up: Table of Intrinsic Functions
+
+Shape Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Shape' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: Short Intrinsic, Next: Sign Intrinsic, Prev: Shape Intrinsic, Up: Table of Intrinsic Functions
+
+Short Intrinsic
+...............
+
+ Short(A)
+
+Short: `INTEGER(KIND=6)' function.
+
+A: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Returns A with the fractional portion of its magnitude truncated and
+its sign preserved, converted to type `INTEGER(KIND=6)'.
+
+ If A is type `COMPLEX', its real part is truncated and converted,
+and its imaginary part is disgregarded.
+
+ *Note Int Intrinsic::.
+
+ The precise meaning of this intrinsic might change in a future
+version of the GNU Fortran language, as more is learned about how it is
+used.
+
+\1f
+File: g77.info, Node: Sign Intrinsic, Next: Signal Intrinsic (subroutine), Prev: Short Intrinsic, Up: Table of Intrinsic Functions
+
+Sign Intrinsic
+..............
+
+ Sign(A, B)
+
+Sign: `INTEGER' or `REAL' function, the exact type being the result of
+cross-promoting the types of all the arguments.
+
+A: `INTEGER' or `REAL'; scalar; INTENT(IN).
+
+B: `INTEGER' or `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns `ABS(A)*S', where S is +1 if `B.GE.0', -1 otherwise.
+
+ *Note Abs Intrinsic::, for the function that returns the magnitude
+of a value.
+
+\1f
+File: g77.info, Node: Signal Intrinsic (subroutine), Next: Sin Intrinsic, Prev: Sign Intrinsic, Up: Table of Intrinsic Functions
+
+Signal Intrinsic (subroutine)
+.............................
+
+ CALL Signal(NUMBER, HANDLER, STATUS)
+
+NUMBER: `INTEGER'; scalar; INTENT(IN).
+
+HANDLER: Signal handler (`INTEGER FUNCTION' or `SUBROUTINE') or
+dummy/global `INTEGER(KIND=1)' scalar.
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ If HANDLER is a an `EXTERNAL' routine, arranges for it to be invoked
+with a single integer argument (of system-dependent length) when signal
+NUMBER occurs. If NUMBER is an integer, it can be used to turn off
+handling of signal HANDLER or revert to its default action. See
+`signal(2)'.
+
+ Note that HANDLER will be called using C conventions, so its value in
+Fortran terms is obtained by applying `%LOC()' (or LOC()) to it.
+
+ The value returned by `signal(2)' is written to STATUS, if that
+argument is supplied. Otherwise the return value is ignored.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note Signal
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Sin Intrinsic, Next: SinH Intrinsic, Prev: Signal Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Sin Intrinsic
+.............
+
+ Sin(X)
+
+Sin: `REAL' or `COMPLEX' function, the exact type being that of
+argument X.
+
+X: `REAL' or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the sine of X, an angle measured in radians.
+
+ *Note ASin Intrinsic::, for the inverse of this function.
+
+\1f
+File: g77.info, Node: SinH Intrinsic, Next: Sleep Intrinsic, Prev: Sin Intrinsic, Up: Table of Intrinsic Functions
+
+SinH Intrinsic
+..............
+
+ SinH(X)
+
+SinH: `REAL' function, the `KIND=' value of the type being that of
+argument X.
+
+X: `REAL'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the hyperbolic sine of X.
+
+\1f
+File: g77.info, Node: Sleep Intrinsic, Next: Sngl Intrinsic, Prev: SinH Intrinsic, Up: Table of Intrinsic Functions
+
+Sleep Intrinsic
+...............
+
+ CALL Sleep(SECONDS)
+
+SECONDS: `INTEGER(KIND=1)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Causes the process to pause for SECONDS seconds. See `sleep(2)'.
+
+\1f
+File: g77.info, Node: Sngl Intrinsic, Next: Spacing Intrinsic, Prev: Sleep Intrinsic, Up: Table of Intrinsic Functions
+
+Sngl Intrinsic
+..............
+
+ Sngl(A)
+
+Sngl: `REAL(KIND=1)' function.
+
+A: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Archaic form of `REAL()' that is specific to one type for A. *Note
+Real Intrinsic::.
+
+\1f
+File: g77.info, Node: Spacing Intrinsic, Next: Spread Intrinsic, Prev: Sngl Intrinsic, Up: Table of Intrinsic Functions
+
+Spacing Intrinsic
+.................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Spacing' to use this name for
+an external procedure.
+
+\1f
+File: g77.info, Node: Spread Intrinsic, Next: SqRt Intrinsic, Prev: Spacing Intrinsic, Up: Table of Intrinsic Functions
+
+Spread Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Spread' to use this name for an
+external procedure.
+
+\1f
+File: g77.info, Node: SqRt Intrinsic, Next: SRand Intrinsic, Prev: Spread Intrinsic, Up: Table of Intrinsic Functions
+
+SqRt Intrinsic
+..............
+
+ SqRt(X)
+
+SqRt: `REAL' or `COMPLEX' function, the exact type being that of
+argument X.
+
+X: `REAL' or `COMPLEX'; scalar; INTENT(IN).
+
+Intrinsic groups: (standard FORTRAN 77).
+
+Description:
+
+ Returns the square root of X, which must not be negative.
+
+ To calculate and represent the square root of a negative number,
+complex arithmetic must be used. For example, `SQRT(COMPLEX(X))'.
+
+ The inverse of this function is `SQRT(X) * SQRT(X)'.
+
+\1f
+File: g77.info, Node: SRand Intrinsic, Next: Stat Intrinsic (subroutine), Prev: SqRt Intrinsic, Up: Table of Intrinsic Functions
+
+SRand Intrinsic
+...............
+
+ CALL SRand(SEED)
+
+SEED: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Reinitialises the generator with the seed in SEED. *Note IRand
+Intrinsic::. *Note Rand Intrinsic::.
+
+\1f
+File: g77.info, Node: Stat Intrinsic (subroutine), Next: Stat Intrinsic (function), Prev: SRand Intrinsic, Up: Table of Intrinsic Functions
+
+Stat Intrinsic (subroutine)
+...........................
+
+ CALL Stat(FILE, SARRAY, STATUS)
+
+FILE: `CHARACTER'; scalar; INTENT(IN).
+
+SARRAY: `INTEGER(KIND=1)'; DIMENSION(13); INTENT(OUT).
+
+STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Obtains data about the given file FILE and places them in the array
+SARRAY. A null character (`CHAR(0)') marks the end of the name in
+FILE--otherwise, trailing blanks in FILE are ignored. The values in
+this array are extracted from the `stat' structure as returned by
+`fstat(2)' q.v., as follows:
+
+ 1. File mode
+
+ 2. Inode number
+
+ 3. ID of device containing directory entry for file
+
+ 4. Device id (if relevant)
+
+ 5. Number of links
+
+ 6. Owner's uid
+
+ 7. Owner's gid
+
+ 8. File size (bytes)
+
+ 9. Last access time
+
+ 10. Last modification time
+
+ 11. Last file status change time
+
+ 12. Preferred I/O block size
+
+ 13. Number of blocks allocated
+
+ Not all these elements are relevant on all systems. If an element
+is not relevant, it is returned as 0.
+
+ If the STATUS argument is supplied, it contains 0 on success or a
+non-zero error code upon return.
+
+ Some non-GNU implementations of Fortran provide this intrinsic as
+only a function, not as a subroutine, or do not support the (optional)
+STATUS argument.
+
+ For information on other intrinsics with the same name: *Note Stat
+Intrinsic (function)::.
+
+\1f
+File: g77.info, Node: Stat Intrinsic (function), Next: Sum Intrinsic, Prev: Stat Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Stat Intrinsic (function)
+.........................
+
+ Stat(FILE, SARRAY)
+
+Stat: `INTEGER(KIND=1)' function.
+
+FILE: `CHARACTER'; scalar; INTENT(IN).
+
+SARRAY: `INTEGER(KIND=1)'; DIMENSION(13); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Obtains data about the given file FILE and places them in the array
+SARRAY. A null character (`CHAR(0)') marks the end of the name in
+FILE--otherwise, trailing blanks in FILE are ignored. The values in
+this array are extracted from the `stat' structure as returned by
+`fstat(2)' q.v., as follows:
+
+ 1. File mode
+
+ 2. Inode number
+
+ 3. ID of device containing directory entry for file
+
+ 4. Device id (if relevant)
+
+ 5. Number of links
+
+ 6. Owner's uid
+
+ 7. Owner's gid
+
+ 8. File size (bytes)
+
+ 9. Last access time
+
+ 10. Last modification time
+
+ 11. Last file status change time
+
+ 12. Preferred I/O block size
+
+ 13. Number of blocks allocated
+
+ Not all these elements are relevant on all systems. If an element
+is not relevant, it is returned as 0.
+
+ Returns 0 on success or a non-zero error code.
+
+ For information on other intrinsics with the same name: *Note Stat
+Intrinsic (subroutine)::.
+
+\1f
+File: g77.info, Node: Sum Intrinsic, Next: SymLnk Intrinsic (subroutine), Prev: Stat Intrinsic (function), Up: Table of Intrinsic Functions
+
+Sum Intrinsic
+.............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Sum' to use this name for an
+external procedure.
+
--- /dev/null
+IMPORTANT: After applying this patch, you must rebuild the
+Info documentation derived from the Texinfo files in the
+gcc distribution, as this patch does not include patches
+to any derived files (due to differences in the way gcc
+version 2.7.2.2 is obtained by users). Use the following
+command sequence after applying this patch:
+
+ cd gcc-2.7.2.3; make -f Makefile.in gcc.info
+
+If that fails due to `makeinfo' not being installed, obtain
+texinfo-3.11.tar.gz from a GNU distribution site, unpack,
+build, and install it, and try the above command sequence
+again.
+
+NOTE: You probably will have trouble with the `ChangeLog'
+file in this patch. That's because gcc version 2.7.2.2 itself
+had an incomplete patch file (gcc-2.7.2.2-2.7.2.3.diff.gz
+omitted the patch to gcc/ChangeLog), which in turn "infected"
+both forms of the 2.7.2.3 distribution (the .tar.gz and .diff.gz
+file, neither of which has the proper gcc/ChangeLog file).
+
+The following patch's gcc/ChangeLog patchlet assumes a
+"fixed" gcc-2.7.2.3/ChangeLog, and then further "fixes" it
+to sort the pertinent entries in the usual chronological order.
+
+If you start with the gcc-2.7.2.2.tar.gz distribution, apply
+the gcc-2.7.2.2-2.7.2.3.diff.gz patch, "fix up" the gcc/ChangeLog
+file so the new material ends up "above" the single large
+2.7.2.2 release entry (dated "Tue Jan 29 02:47:13 1997"), then
+you *should* be able to apply this patch file cleanly.
+
+In any case, don't worry; the contents of gcc/ChangeLog aren't
+really important to non-developers of gcc.
+
+
+diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
+*** gcc-2.7.2.3/ChangeLog Sun Aug 31 09:41:00 1997
+--- gcc-2.7.2.3.f.1/ChangeLog Tue Sep 9 04:24:28 1997
+***************
+*** 1,6 ****
+--- 1,36 ----
++ Wed Sep 3 12:26:33 1997 Jim Wilson <wilson@cygnus.com>
++
++ * alias.c (true_dependence): Address with AND can alias scalars.
++ (anti_dependence, output_dependence): Likewise.
++
++ Wed Sep 3 10:36:51 1997 Jim Wilson <wilson@cygnus.com>
++
++ * alias.c (true_dependence): Test x for BLKmode, in addition to mem.
++
++ Sat Aug 30 16:42:50 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * reload.c (find_reloads): Fix 1997-07-28 fix so the
++ loop to handle MATCH_DUPs is disabled when insn_code_number
++ is <= 0, because in that case recog_dup_loc is not
++ relevant.
++
++ Tue Aug 26 01:52:17 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ From Stan Cox <coxs@dg-rtp.dg.com>
++ * reg-stack.c (subst_stack_regs): Cope with computed goto
++ (`GOTO I' in FORTRAN; `goto *lab;' in GNU C).
++
+ Thu Aug 22 23:47:38 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * Version 2.7.2.3 released.
+
++ Fri Aug 22 21:31:54 1997 Jim Wilson <wilson@cygnus.com>
++
++ * alias.c (true_dependence): Pass x_addr not x to varies.
++
++ Sun Aug 17 03:31:44 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * Makefile.in: Comment out lines containing just formfeeds.
++
+ Wed Aug 13 08:28:18 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+*************** Wed Aug 13 08:28:18 1997 H.J. Lu (hjl@
+*** 26,33 ****
+ (FINALIZE_TRAMPOLINE, CLEAR_INSN_CACHE): New.
+
+! Mon Mar 17 17:03:55 1997 J.T. Conklin <jtc@cygnus.com>
+
+! * m68k.md (beq0_di, bne0_di, bge0_di, blt0_di): Use cmpw #0
+! instead of tstl when testing address registers on the 68000.
+
+ Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+--- 56,81 ----
+ (FINALIZE_TRAMPOLINE, CLEAR_INSN_CACHE): New.
+
+! Sun Aug 10 22:23:10 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+! * explow.c (probe_stack_range): Add USE for test_addr if -O0.
+!
+! Sun Aug 10 18:14:24 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! Integrate C front end part of patch for better alias
+! handling from John Carr <jfc@mit.edu>:
+! * c-decl.c (grokdeclarator): Check for RID_RESTRICT
+! flag; diagnose certain misuses; set DECL_RESTRICT as
+! appropriate.
+! * c-lex.c (init_lex): Set up RID_RESTRICT pointer.
+! Unset `restrict' as reserved word.
+! * c-lex.h: Replace RID_NOALIAS with RID_RESTRICT.
+! * c-parse.gperf: Add `restrict' and `__restrict'
+! keywords.
+! * tree.h: Add DECL_RESTRICT flag.
+!
+! Sun Aug 10 14:50:30 1997 Jim Wilson <wilson@cygnus.com>
+!
+! * sdbout.c (plain_type_1, case ARRAY_TYPE): Verify that TYPE_DOMAIN
+! has integer TYPE_{MAX,MIN}_VALUE before using them.
+
+ Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+*************** Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@
+*** 38,41 ****
+--- 86,143 ----
+ * install1.texi: New.
+
++ Mon Aug 4 17:49:14 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * combine.c (try_combine): If have PARALLEL of independent SETs
++ and have cc0, ensure insn using CC0 come first.
++
++ Sat Aug 2 08:03:04 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * varasm.c (compare_constant_1, case STRING_CST): Compare TYPE_MODE.
++ (record_constant_1, case STRING_CST): Record TYPE_MODE.
++
++ Sat Aug 2 08:03:04 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * tree.c (contains_this_placeholder_p): Delete.
++ (contains_placeholder_p): Now contains code from above function.
++ (contains_placeholder_p, case 'r'): Don't look at offset info.
++ * expr.c (expand_expr, case PLACEHOLDER_EXPR): Find innermost
++ matching and don't check contains_placeholder_p.
++
++ Mon Jul 28 15:35:38 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * combine.c (num_sign_bit_copies): Speed up the 961126-1.c
++ case of repeated (neg (neg (neg ...))) so c-torture runs
++ in less time.
++
++ * reload.c (find_reloads_toplev, find_reloads_address):
++ These now return whether replacement by a constant, so
++ caller can know to do other replacements. Currently if
++ caller doesn't want that info and such replacement would
++ happen, we crash so as to investigate the problem and
++ learn more about it. All callers updated.
++ (find_reloads): If pseudo replaced by constant, always
++ update duplicates of it.
++
++ Sun Jul 27 12:13:01 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * expr.c (expand_expr, case SAVE_EXPR): Handle top-level SAVE_EXPR by
++ moving into current function; abort if in odd context.
++ * fold-const.c (fold_truthop, fold): Avoid making SAVE_EXPR
++ if at top level.
++
++ * expr.c (get_inner_unaligned_p): Deleted.
++ (expand_assignment): Remove special-case of constant array.
++ (expand_expr, case ARRAY_REF): Likewise, and clean up remaining code.
++
++ * explow.c (probe_stack_range): Do probing with loop if more
++ than a small number.
++
++ Fri Jul 25 08:38:37 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * calls.c: (expand_call): If -fstack-check and temp needed
++ for arg is too large, use alloca.
++ * expr.c (expand_expr, case MODIFY_EXPR): Don't preexpand calls
++ if LHS is an indirect via a constant pointer.
++
+ Mon Jul 21 22:47:13 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+*************** Mon Jul 21 22:47:13 1997 H.J. Lu (hjl@
+*** 43,46 ****
+--- 145,213 ----
+ for Linux.
+
++ Mon Jul 21 00:00:24 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * fold-const.c (size_binop): Make sure overflows
++ are flagged properly, so as to avoid silently generating
++ bad code for, e.g., a too-large array.
++
++ Sun Jul 20 06:10:26 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * tree.c (contains_placeholder_p): Call contains_this_placeholder_p.
++ (contains_this_placeholder_p): Renamed from contains_placeholder_p.
++ Added new arg, PL.
++ Rework to make more consistent, check more codes, and avoid
++ undefined fields.
++ * expr.c (expand_expr, case PLACEHOLDER_EXPR): Pick outermost
++ object in placeholder_list of right type without a PLACEHOLDER_EXPR>
++
++ Sat Jul 19 17:54:28 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * alpha.h (STACK_CHECK_BUILTIN): New macro.
++
++ Thu Jul 17 07:02:10 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * expr.h (STACK_CHECK_*): Provide default values.
++ (probe_stack_range): New declaration.
++ * flags.h (flag_stack_check): Likewise.
++ * explow.c (allocate_dynamic_stack_space): Call probe_stack_range.
++ (emit_stack_probe, probe_stack_range): New functions.
++ * function.c (expand_function_end): If function is non-leaf and stack
++ checking is requested, emit needed probes.
++ * reload1.c (reload): If checking stack, verify frame small enough.
++ * stmt.c (expand_decl): If stack checking, use alloca for large vars.
++ * toplev.c (flag_stack_check): New variable.
++ (f_options): Add "stack-check".
++
++ Sun Jul 13 22:23:14 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * stmt.c (expand_expr_stmt): Must generate code for
++ statements within an expression (gcc's `({ ... )}')
++ even if -fsyntax-only.
++
++ Sun Jul 13 15:14:48 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * m68k.md (tstdi, cmpdi): Disable.
++
++ Tue Jul 1 23:27:43 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * reorg.c (redundant_insn): If INSN or possible match has REG_UNUSED
++ note, don't have match.
++
++ Mon Jun 30 17:23:07 1997 Michael Meissner <meissner@cygnus.com>
++
++ * gcc.c (process_command): If -save-temps and -pipe were specified
++ together, don't do -pipe.
++
++ Thu Jun 26 05:40:46 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * stor-layout.c (get_best_mode): Handle negative bitpos
++ correctly, so caller doesn't get into infinite recursion
++ trying to cope with a spurious VOIDmode.
++
++ Tue Jun 24 19:46:31 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * varasm.c (assemble_variable): If low part of size
++ doesn't fit in an int, variable is too large.
++
+ Tue Jun 24 11:24:56 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+*************** Mon Jun 23 22:48:00 1997 Jim Wilson <w
+*** 69,92 ****
+ to biv_count for reduced givs.
+
+! Tue Apr 16 16:59:49 1996 Richard Henderson <rth@tamu.edu>
+
+! * function.c (expand_function_end): Allow TRAMPOLINE_TEMPLATE
+! to be omitted on systems for which it is not cost effective.
+! * varasm.c (assemble_trampoline_template): No such function
+! if no TRAMPOLINE_TEMPLATE.
+! * m68k.h: Greatly simplify the run-time trampoline code:
+! (TRAMPOLINE_TEMPLATE, TRANSFER_FROM_TRAMPOLINE): Delete define.
+! (TRAMPOLINE_SIZE, INITIALIZE_TRAMPOLINE): Changed.
+! (TRAMPOLINE_ALIGN): No point aligning to cache line.
+! (FINISH_INIT_TRAMPOLINE): New define.
+! * m68k/next.h: Instead of redefining INITIALIZE_TRAMPOLINE,
+! make use of the new FINISH_INIT_TRAMPOLINE.
+! * m68k/{m68k.h,next.h} (FINISH_INIT_TRAMPOLINE):
+! Rename to FINALIZE_TRAMPOLINE.
+
+! Mon Apr 15 08:49:20 1996 Tom May (ftom@netcom.com)
+
+! * cse.c (invalidate_skipped_set): Ignore CLOBBER after calling
+! note_mem_written, not before.
+
+ Tue Jan 29 02:47:13 1997 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+--- 236,433 ----
+ to biv_count for reduced givs.
+
+! Sat Jun 21 12:09:00 1997 Craig Burley <burley@gnu.ai.mit.edu>
+
+! * toplev.c (rest_of_compilation): Also temporarily set
+! flag_unroll_all_loops to 0 during first of two calls
+! to loop_optimize, and clean up code a bit to make it
+! easier to read.
+
+! * expr.c (safe_from_p_1, safe_from_p): Fix these to use
+! TREE_SET_CODE instead of TREE_CODE.
+
+! Thu Jun 19 19:30:47 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * config/alpha/alpha.c: Don't include <stamp.h> on
+! GNU Linux machines.
+!
+! * config/alpha/elf.c: New file for ELF systems.
+!
+! * config/alpha/xm-alpha.h: Don't declare alloca()
+! if it's already a macro (probably defined in stdlib.h).
+!
+! * config/alpha/xm-linux.h (HAVE_STRERROR): #define
+! this, according to what various people suggest.
+!
+! * config.guess, configure: Make some (hopefully safe)
+! changes, based mostly on gcc-2.8.0-in-development,
+! in the hopes that these make some systems configure
+! "out of the box" more easily, especially Alpha systems.
+!
+! Mon Jun 9 04:26:53 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * expr.c (safe_from_p): Don't examine a given SAVE_EXPR
+! node more than once, to avoid combinatorial explosion
+! in complex expressions. Fortran case that triggered
+! this had a complicated *and* complex expression with
+! 293 unique nodes, resulting in 28 minutes of compile
+! time mostly spent in a single top-level safe_from_p()
+! call due to all the redundant SAVE_EXPR traversals.
+! This change reduced the time to around 2 seconds.
+! (safe_from_p_1): New helper function that does almost
+! exactly what the old safe_from_p() did.
+!
+! Fri May 30 11:40:10 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * rs6000.md (movdi): Emit a CLOBBER before the two movsi insns
+! in constant case.
+!
+! Sun May 18 21:18:48 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * fold-const.c (fold): Clarify why TRUNC_DIV_EXPR
+! and FLOOR_DIV_EXPR aren't rewritten to EXACT_DIV_EXPR,
+! clean up related code.
+!
+! Sat May 17 15:15:23 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * cse.c (cse_insn): Don't record a SRC that's a MEM and the same
+! as a REG_EQUIV note if DEST is set more than once.
+!
+! Sat May 3 13:53:00 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * config.sub: Change all `i[345]' to `i[3456]' to
+! support Pentium Pro (this change was already made
+! in configure for gcc-2.7.2.2).
+!
+! From Toon Moene <toon@moene.indiv.nluug.nl>:
+! * toplev.c (rest_of_compilation): Unroll loops
+! only the final time through loop optimization.
+!
+! Thu Apr 24 16:39:53 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * stmt.c (pushcase_range): Check for null range first.
+!
+! Mon Apr 21 16:31:50 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * cse.c (fold_rtx, case PLUS): When seeing if negative of constant
+! is around, make sure not dealing with largest negative.
+!
+! Sun Apr 20 10:46:24 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * fold-const.c (operand_equal_p): Constants are not equal if there
+! has been an overflow.
+!
+! Sun Apr 20 10:45:35 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * final.c (profile_function): Only call ASM_OUTPUT_REG_{PUSH,POP}
+! if defined.
+!
+! Wed Apr 16 22:26:16 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * alias.c, cse.c, loop.c, rtl.c, rtl.h, sched.c:
+! Make changes submitted by <jfc@mit.edu>.
+!
+! Wed Apr 16 16:54:18 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * function.c (find_temp_slot_from_address): Compare slots using
+! rtx_equal_p, not identity comparison.
+! * expr.c (store_expr): Check if TEMP and TARGET are the
+! same using rtx_equal_p.
+!
+! Tue Apr 15 18:03:58 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * rs6000.c (rs6000_output_load_toc_table): New function.
+! (output_prolog): Delete code from here and call new function.
+! * rs6000.md (nonlocal_goto_receiver): New pattern.
+!
+! * expr.c (expand_assignment, store_field): Use copy_rtx when
+! need to copy rtx instead of change_address.
+! (expand_expr, case CONSTRUCTOR, COMPONENT_REF): Likewise.
+!
+! Sun Apr 13 19:32:53 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * fold-const.c (fold): If extra warnings enabled,
+! warn about integer division by zero.
+!
+! Sun Apr 13 08:15:31 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+!
+! * final.c (profile_function): Save the static chain register
+! around the call to the profiler function.
+!
+! Sat Apr 12 14:56:42 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * unroll.c (find_splittable_givs): Permit more cases
+! of mult_val/add_val to agree by using rtx_equal_p
+! to compare them instead of requiring them to be
+! integers with the same value. Also don't bother
+! checking if ADDRESS_COST not defined (they will be
+! equal in that case).
+!
+! Fri Apr 11 03:30:04 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * unroll.c (find_splittable_givs): Must create a new
+! register if the mult_val and add_val fields don't
+! agree.
+!
+! Fri Apr 4 23:00:55 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * fold-const.c (fold): Don't call multiple_of_p if
+! arg1 is constant zero, to avoid crashing; simplify
+! code accordingly.
+!
+! Mon Mar 24 22:33:40 1997 Dave Love <d.love@dl.ac.uk>
+!
+! * config/i386/i386.h (STACK_BOUNDARY): Define as BIGGEST_ALIGNMENT
+! so that -malign-double works for stack-allocated data.
+!
+! Wed Mar 19 12:24:11 1997 Jim Wilson <wilson@cygnus.com>
+!
+! * combine.c (move_deaths): Handle partial REG_DEAD note for
+! multi-reg hard register.
+!
+! Mon Mar 17 17:03:55 1997 J.T. Conklin <jtc@cygnus.com>
+!
+! * m68k.md (beq0_di, bne0_di, bge0_di, blt0_di): Use cmpw #0
+! instead of tstl when testing address registers on the 68000.
+!
+! Sun Mar 16 19:53:13 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * expr.c (expand_expr, case PLACEHOLDER_EXPR): Refine which
+! object is picked.
+!
+! Mon Mar 10 16:01:44 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+!
+! * emit-rtl.c (subreg_lowpart_p): Return 0 if SUBREG_REG is VOIDmode.
+! * combine.c (simplify_rtx, case SUBREG): Fix direction of test when
+! calling operand_subword; use inline code intead of subreg_lowpart_p.
+!
+! Wed Feb 26 13:09:33 1997 Michael Meissner <meissner@cygnus.com>
+!
+! * reload.c (debug_reload): Fix format string to print
+! reload_nocombine[r].
+!
+! Sun Feb 23 15:26:53 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! * fold-const.c (multiple_of_p): Clean up and improve.
+! (fold): Clean up invocation of multiple_of_p.
+!
+! Sun Feb 9 14:03:53 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+!
+! * function.c (assign_stack_temp): Clear MEM flags from reuse.
+!
+! Sat Feb 8 04:53:27 1997 Craig Burley <burley@gnu.ai.mit.edu>
+!
+! From <jfc@jfc.tiac.net> Fri, 07 Feb 1997 22:02:21 -0500:
+! * alias.c (init_alias_analysis): Reduce amount of time
+! needed to simplify the reg_base_value array in the
+! typical case (especially involving function inlining).
+!
+! Fri Feb 7 07:56:12 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+!
+! * function.c (instantiate_virtual_regs_1, case USE, CLOBBER):
+! Fix error in last change.
+!
+! Sat Feb 1 18:51:47 1997 Douglas B. Rupp (rupp@gnat.com)
+!
+! * gcc.c (process_command): Fix improper use of strncpy.
+
+ Tue Jan 29 02:47:13 1997 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+*************** Tue Jan 29 02:47:13 1997 Richard Stallm
+*** 109,112 ****
+--- 450,532 ----
+ [! LIBC_VERSION_1] (LIB_SPEC): New override definition.
+
++ Tue Jan 21 16:09:37 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
++
++ * function.c (mark_all_temps_used): Set KEEP as well.
++
++ Fri Jan 10 17:22:17 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ Minor improvements/fixes to better alias handling:
++ * Makefile.in (alias.o): Fix typo in rule (was RLT_H).
++ * cse.c, sched.c: Fix up some indenting.
++ * toplev.c: Add -fargument-alias flag, so Fortran users
++ can turn C-style aliasing on once g77 defaults to
++ -fargument-noalias-global.
++
++ Integrate patch for better alias handling from
++ John Carr <jfc@mit.edu>:
++ * Makefile.in (OBJS, alias.o): New module and rule.
++ * alias.c: New source module.
++ * calls.c (expand_call): Recognize alias status of calls
++ to malloc().
++ * combine.c (distribute_notes): New REG_NOALIAS note.
++ * rtl.h (REG_NOALIAS): Ditto.
++ Many other changes for new alias.c module.
++ * cse.c: Many changes, and much code moved into alias.c.
++ * flags.h (flag_alias_check, flag_argument_noalias):
++ New flags.
++ * toplev.c: New flags and related options.
++ * local-alloc.c (validate_equiv_mem_from_store):
++ Caller of true_dependence changed.
++ * loop.c (NUM_STORES): Increase to 50 from 20.
++ (prescan_loop): "const" functions don't alter unknown addresses.
++ (invariant_p): Caller of true_dependence changed.
++ (record_giv): Zero new unrolled and shared flags.
++ (emit_iv_add_mult): Record base value for register.
++ * sched.c: Many changes, mostly moving code to alias.c.
++ (sched_note_set): SCHED_SORT macro def form, but not function,
++ inexplicably changed.
++ * unroll.c: Record base values for registers, etc.
++
++ Fri Jan 3 04:01:00 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * loop.c (check_final_value): Handle insns with no luid's
++ appropriately, instead of crashing on INSN_LUID macro
++ invocations.
++
++ Mon Dec 23 00:49:19 1996 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * config/alpha/alpha.md: Fix pattern that matches if_then_else
++ involving DF target, DF comparison, SF source.
++
++ Fri Dec 20 15:42:52 1996 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * fold-const.c (multiple_of_p): New function.
++ (fold): Use new function to turn *_DIV_EXPR into EXACT_DIV_EXPR.
++
++ Tue Nov 26 14:50:54 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
++
++ * expr.c (move_by_pieces): Abort only if length positive at end.
++
++ Tue Oct 22 18:32:20 1996 Jim Wilson <wilson@cygnus.com>
++
++ * unroll.c (unroll_loop): Always reject loops with unbalanced blocks.
++
++ Tue Sep 24 19:37:00 1996 Jim Wilson <wilson@cygnus.com>
++
++ * reload.c (push_secondary_reload): Do strip paradoxical SUBREG
++ even if reload_class is CLASS_CANNOT_CHANGE_SIZE. Change reload_mode
++ to mode in SECONDARY_MEMORY_NEEDED and get_secondary_mem calls.
++
++ Mon Aug 12 07:48:54 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
++
++ * expr.c (expand_builtin, case BUILT_IN_SETJMP): Add test
++ and call for nonlocal_goto_receiver pattern.
++ * stmt.c (expand_end_bindings): Likewise.
++
++ Mon Aug 5 16:53:36 1996 Doug Evans <dje@fallis.cygnus.com>
++
++ * stor-layout.c (layout_record): Correct overflow test for 0 sized
++ fields.
++
+ Sat Jun 29 12:33:39 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+*************** Tue Jun 11 20:18:03 1996 Per Bothner <b
+*** 118,121 ****
+--- 538,551 ----
+ * alpha.h (FIXPROTO_INIT): Define new macro.
+
++ Thu Jun 6 18:24:39 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
++
++ * fold-cont.c (fold): Don't do anything with evaluated SAVE_EXPR.
++
++ Sat May 18 20:17:27 1996 Jim Wilson <wilson@cygnus.com>
++
++ * unroll.c (copy_loop_body): When update split DEST_ADDR giv,
++ check to make sure it was split.
++ (find_splittable_givs): Fix reversed test of verify_addresses result.
++
+ Fri May 10 18:35:00 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+*************** Wed Apr 17 17:53:23 1996 Michael Meissn
+*** 136,139 ****
+--- 566,597 ----
+ bits.
+
++ Tue Apr 16 16:59:49 1996 Richard Henderson <rth@tamu.edu>
++
++ * function.c (expand_function_end): Allow TRAMPOLINE_TEMPLATE
++ to be omitted on systems for which it is not cost effective.
++ * varasm.c (assemble_trampoline_template): No such function
++ if no TRAMPOLINE_TEMPLATE.
++ * m68k.h: Greatly simplify the run-time trampoline code:
++ (TRAMPOLINE_TEMPLATE, TRANSFER_FROM_TRAMPOLINE): Delete define.
++ (TRAMPOLINE_SIZE, INITIALIZE_TRAMPOLINE): Changed.
++ (TRAMPOLINE_ALIGN): No point aligning to cache line.
++ (FINISH_INIT_TRAMPOLINE): New define.
++ * m68k/next.h: Instead of redefining INITIALIZE_TRAMPOLINE,
++ make use of the new FINISH_INIT_TRAMPOLINE.
++ * m68k/{m68k.h,next.h} (FINISH_INIT_TRAMPOLINE):
++ Rename to FINALIZE_TRAMPOLINE.
++
++ Mon Apr 15 08:49:20 1996 Tom May (ftom@netcom.com)
++
++ * cse.c (invalidate_skipped_set): Ignore CLOBBER after calling
++ note_mem_written, not before.
++
++ Sat Apr 13 07:47:09 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
++
++ * alpha.c (alpha_emit_set_const_1): Renamed from
++ alpha_emit_set_const and static.
++ Remove change of Nov 26; again use normal mechanism for SImode.
++ (alpha_emit_set_const): New function.
++
+ Mon Apr 8 13:46:28 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+*************** Mon Feb 19 07:35:07 1996 Torbjorn Granl
+*** 176,179 ****
+--- 634,642 ----
+ * rs6000.md (not:SI with assign and compare): Fix typo.
+
++ Tue Feb 13 17:43:46 1996 Jim Wilson <wilson@cygnus.com>
++
++ * integrate.c (save_constants_in_decl_trees): New function.
++ (save_for_inline_copying, save_for_inline_nocopy): Call it.
++
+ Wed Jan 24 18:00:12 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+*************** Tue Jan 16 06:01:28 1996 Thomas Graiche
+*** 191,198 ****
+--- 654,686 ----
+ * i386/freebsd.h (ASM_WEAKEN_LABEL): Deleted; not supported.
+
++ Mon Jan 15 07:22:59 1996 Michel Delval (mfd@ccv.fr)
++
++ * reload.c (find_equiv_reg): Apply single_set, not PATTERN, to WHERE.
++
+ Sun Jan 7 17:11:11 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * collect2.c (scan_libraries): Correct Import File ID interpretation.
+
++ Sat Jan 6 03:27:49 1996 Hans-Peter Nilsson <Hans-Peter.Nilsson@axis.se>
++
++ * expr.c (emit_move_insn_1): Don't emit lobber when moving
++ by parts and source equals destination.
++
++ Sat Jan 6 03:27:49 1996 Hans-Peter Nilsson <Hans-Peter.Nilsson@axis.se>
++
++ * optabs.c (expand_fix): Don't copy TARGET to TO if same.
++
++ Mon Jan 1 09:05:07 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
++
++ * local-alloc.c (reg_equiv_replacement): New variable.
++ (memref_referenced_p, case REG): Check for reg_equiv_replacement.
++ (update_equiv_regs): reg_equiv_replacement now file-scope.
++
++ Fri Dec 22 17:29:42 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
++
++ * reload.c (find_valid_class): New function.
++ (push_reload): Use it in cases where a SUBREG and its contents
++ both need to be reloaded.
++
+ Thu Dec 28 22:24:53 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+*************** Mon Dec 18 18:40:34 1995 Jim Wilson <w
+*** 209,212 ****
+--- 697,705 ----
+ above.
+
++ Sun Dec 17 06:37:00 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
++
++ * reload.c (push_secondary_reload): Don't strip paradoxical SUBREG
++ if reload_class is CLASS_CANNOT_CHANGE_SIZE.
++
+ Sat Dec 16 07:03:33 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+*************** Sat Dec 9 18:05:03 1995 Jim Wilson <w
+*** 223,226 ****
+--- 716,724 ----
+ * expr.c (expand_expr, case INDIRECT_REF): Correct typo in May 8
+ change.
++
++ Fri Dec 8 19:17:30 1995 Mike Meissner <meissner@beauty.cygnus.com>
++
++ * rs6000/rs6000.c (input_operand): Allow any integer constant, not
++ just integers that fit in 1 instruction.
+
+ Sun Nov 26 14:47:42 1995 Richard Kenner <kenner@mole.gnu.ai.mit.edu>
+diff -rcp2N gcc-2.7.2.3/Makefile.in gcc-2.7.2.3.f.1/Makefile.in
+*** gcc-2.7.2.3/Makefile.in Sun Aug 31 09:39:41 1997
+--- gcc-2.7.2.3.f.1/Makefile.in Sun Aug 31 09:29:51 1997
+*************** all: all.indirect
+*** 397,401 ****
+ ####cross overrides
+ ####build overrides
+! \f
+ # Now figure out from those variables how to compile and link.
+
+--- 397,401 ----
+ ####cross overrides
+ ####build overrides
+! #\f
+ # Now figure out from those variables how to compile and link.
+
+*************** INCLUDES = -I. -I$(srcdir) -I$(srcdir)/c
+*** 454,458 ****
+ # defined in this file into the environment.
+ .NOEXPORT:
+! \f
+ # Support for additional languages (other than c and objc).
+ # ??? objc can be supported this way too (leave for later).
+--- 454,458 ----
+ # defined in this file into the environment.
+ .NOEXPORT:
+! #\f
+ # Support for additional languages (other than c and objc).
+ # ??? objc can be supported this way too (leave for later).
+*************** FLAGS_TO_PASS = \
+*** 491,495 ****
+ "bindir=$(bindir)" \
+ "libsubdir=$(libsubdir)"
+! \f
+ # Lists of files for various purposes.
+
+--- 491,495 ----
+ "bindir=$(bindir)" \
+ "libsubdir=$(libsubdir)"
+! #\f
+ # Lists of files for various purposes.
+
+*************** OBJS = toplev.o version.o tree.o print-t
+*** 519,523 ****
+ integrate.o jump.o cse.o loop.o unroll.o flow.o stupid.o combine.o \
+ regclass.o local-alloc.o global.o reload.o reload1.o caller-save.o \
+! insn-peep.o reorg.o sched.o final.o recog.o reg-stack.o \
+ insn-opinit.o insn-recog.o insn-extract.o insn-output.o insn-emit.o \
+ insn-attrtab.o $(out_object_file) getpwd.o convert.o $(EXTRA_OBJS)
+--- 519,523 ----
+ integrate.o jump.o cse.o loop.o unroll.o flow.o stupid.o combine.o \
+ regclass.o local-alloc.o global.o reload.o reload1.o caller-save.o \
+! insn-peep.o reorg.o alias.o sched.o final.o recog.o reg-stack.o \
+ insn-opinit.o insn-recog.o insn-extract.o insn-output.o insn-emit.o \
+ insn-attrtab.o $(out_object_file) getpwd.o convert.o $(EXTRA_OBJS)
+*************** LIB2FUNCS = _muldi3 _divdi3 _moddi3 _udi
+*** 570,574 ****
+ _fixxfdi _fixunsxfdi _floatdixf _fixunsxfsi \
+ _fixtfdi _fixunstfdi _floatditf \
+! __gcc_bcmp _varargs _eprintf _op_new _op_vnew _new_handler _op_delete \
+ _op_vdel _bb _shtab _clear_cache _trampoline __main _exit _ctors _eh \
+ _pure
+--- 570,575 ----
+ _fixxfdi _fixunsxfdi _floatdixf _fixunsxfsi \
+ _fixtfdi _fixunstfdi _floatditf \
+! __gcc_bcmp _varargs __dummy _eprintf \
+! _op_new _op_vnew _new_handler _op_delete \
+ _op_vdel _bb _shtab _clear_cache _trampoline __main _exit _ctors _eh \
+ _pure
+*************** RTL_H = rtl.h rtl.def machmode.h machmod
+*** 585,589 ****
+ TREE_H = tree.h real.h tree.def machmode.h machmode.def
+ BYTECODE_H = bytecode.h bc-emit.h bc-optab.h
+! \f
+ # Language makefile fragments.
+
+--- 586,590 ----
+ TREE_H = tree.h real.h tree.def machmode.h machmode.def
+ BYTECODE_H = bytecode.h bc-emit.h bc-optab.h
+! #\f
+ # Language makefile fragments.
+
+*************** BYTECODE_H = bytecode.h bc-emit.h bc-opt
+*** 607,611 ****
+
+ # End of language makefile fragments.
+! \f
+ # Avoid a lot of time thinking about remaking Makefile.in and *.def.
+ .SUFFIXES: .in .def
+--- 608,612 ----
+
+ # End of language makefile fragments.
+! #\f
+ # Avoid a lot of time thinking about remaking Makefile.in and *.def.
+ .SUFFIXES: .in .def
+*************** xlimits.h: glimits.h limitx.h limity.h
+*** 730,734 ****
+ fi
+ mv tmp-xlimits.h xlimits.h
+! \f
+ # Build libgcc.a.
+ # This is done in two parts because some functions, in libgcc1.c,
+--- 731,735 ----
+ fi
+ mv tmp-xlimits.h xlimits.h
+! #\f
+ # Build libgcc.a.
+ # This is done in two parts because some functions, in libgcc1.c,
+*************** stamp-crtS: stamp-crt crtstuff.c $(GCC_P
+*** 1042,1046 ****
+ mv crtstuff$(objext) crtendS$(objext)
+ touch stamp-crtS
+! \f
+ # Compiling object files from source files.
+
+--- 1043,1047 ----
+ mv crtstuff$(objext) crtendS$(objext)
+ touch stamp-crtS
+! #\f
+ # Compiling object files from source files.
+
+*************** expr.o : expr.c $(CONFIG_H) $(RTL_H) $(T
+*** 1179,1183 ****
+ insn-flags.h insn-codes.h expr.h insn-config.h recog.h output.h \
+ typeclass.h bytecode.h bc-opcode.h bc-typecd.h bc-typecd.def bc-optab.h \
+! bc-emit.h modemap.def
+ calls.o : calls.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h expr.h insn-codes.h \
+ insn-flags.h
+--- 1180,1184 ----
+ insn-flags.h insn-codes.h expr.h insn-config.h recog.h output.h \
+ typeclass.h bytecode.h bc-opcode.h bc-typecd.h bc-typecd.def bc-optab.h \
+! bc-emit.h modemap.def hard-reg-set.h
+ calls.o : calls.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h expr.h insn-codes.h \
+ insn-flags.h
+*************** reorg.o : reorg.c $(CONFIG_H) $(RTL_H) c
+*** 1238,1241 ****
+--- 1239,1243 ----
+ basic-block.h regs.h insn-config.h insn-attr.h insn-flags.h recog.h \
+ flags.h output.h
++ alias.o : $(CONFIG_H) $(RTL_H) flags.h hard-reg-set.h regs.h
+ sched.o : sched.c $(CONFIG_H) $(RTL_H) basic-block.h regs.h hard-reg-set.h \
+ flags.h insn-config.h insn-attr.h
+*************** alloca.o: alloca.c
+*** 1275,1279 ****
+ -c `echo $(srcdir)/alloca.c | sed 's,^\./,,'`
+ $(ALLOCA_FINISH)
+! \f
+ # Generate header and source files from the machine description,
+ # and compile them.
+--- 1277,1281 ----
+ -c `echo $(srcdir)/alloca.c | sed 's,^\./,,'`
+ $(ALLOCA_FINISH)
+! #\f
+ # Generate header and source files from the machine description,
+ # and compile them.
+*************** stamp-output : $(md_file) genoutput $(sr
+*** 1400,1404 ****
+ $(srcdir)/move-if-change tmp-output.c insn-output.c
+ touch stamp-output
+! \f
+ # Compile the programs that generate insn-* from the machine description.
+ # They are compiled with $(HOST_CC), and associated libraries,
+--- 1402,1406 ----
+ $(srcdir)/move-if-change tmp-output.c insn-output.c
+ touch stamp-output
+! #\f
+ # Compile the programs that generate insn-* from the machine description.
+ # They are compiled with $(HOST_CC), and associated libraries,
+*************** genoutput : genoutput.o $(HOST_RTL) $(HO
+*** 1493,1497 ****
+ genoutput.o : genoutput.c $(RTL_H) $(build_xm_file)
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genoutput.c
+! \f
+ # Compile the libraries to be used by gen*.
+ # If we are not cross-building, gen* use the same .o's that cc1 will use,
+--- 1495,1499 ----
+ genoutput.o : genoutput.c $(RTL_H) $(build_xm_file)
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genoutput.c
+! #\f
+ # Compile the libraries to be used by gen*.
+ # If we are not cross-building, gen* use the same .o's that cc1 will use,
+*************** $(HOST_PREFIX_1)malloc.o: malloc.c
+*** 1532,1536 ****
+ $(HOST_PREFIX_1):
+ touch $(HOST_PREFIX_1)
+! \f
+ # Remake bytecode files.
+ BI_OBJ=bi-parser.o bi-lexer.o bi-reverse.o
+--- 1534,1538 ----
+ $(HOST_PREFIX_1):
+ touch $(HOST_PREFIX_1)
+! #\f
+ # Remake bytecode files.
+ BI_OBJ=bi-parser.o bi-lexer.o bi-reverse.o
+*************** bytecode.maintainer-clean: bytecode.clea
+*** 1601,1605 ****
+ -rm -f bi-parser.c bi-parser.h
+
+! \f
+ # Remake cpp and protoize.
+
+--- 1603,1607 ----
+ -rm -f bi-parser.c bi-parser.h
+
+! #\f
+ # Remake cpp and protoize.
+
+*************** test-protoize-simple: ./protoize ./unpro
+*** 1724,1728 ****
+ diff $(srcdir)/protoize.c tmp-proto.c | cat
+ -rm -f tmp-proto.[cs] tmp-proto$(objext)
+! \f
+ # Build the include directory. The stamp files are stmp-* rather than
+ # stamp-* so that mostlyclean does not force the include directory to
+--- 1726,1730 ----
+ diff $(srcdir)/protoize.c tmp-proto.c | cat
+ -rm -f tmp-proto.[cs] tmp-proto$(objext)
+! #\f
+ # Build the include directory. The stamp files are stmp-* rather than
+ # stamp-* so that mostlyclean does not force the include directory to
+*************** stmp-fixproto: fixhdr.ready fixproto stm
+*** 1862,1866 ****
+ fi
+ touch stmp-fixproto
+! \f
+ # Remake the info files.
+
+--- 1864,1868 ----
+ fi
+ touch stmp-fixproto
+! #\f
+ # Remake the info files.
+
+*************** $(srcdir)/INSTALL: install1.texi install
+*** 1889,1893 ****
+ cd $(srcdir); $(MAKEINFO) -D INSTALLONLY --no-header \
+ --no-split install1.texi -o INSTALL
+! \f
+ # Deletion of files made during compilation.
+ # There are four levels of this:
+--- 1891,1895 ----
+ cd $(srcdir); $(MAKEINFO) -D INSTALLONLY --no-header \
+ --no-split install1.texi -o INSTALL
+! #\f
+ # Deletion of files made during compilation.
+ # There are four levels of this:
+*************** maintainer-clean: distclean bytecode.mai
+*** 2010,2014 ****
+ -rm -f cpp.info* cpp.??s cpp.*aux
+ -rm -f gcc.info* gcc.??s gcc.*aux
+! \f
+ # Entry points `install' and `uninstall'.
+ # Also use `install-collect2' to install collect2 when the config files don't.
+--- 2012,2016 ----
+ -rm -f cpp.info* cpp.??s cpp.*aux
+ -rm -f gcc.info* gcc.??s gcc.*aux
+! #\f
+ # Entry points `install' and `uninstall'.
+ # Also use `install-collect2' to install collect2 when the config files don't.
+*************** uninstall: lang.uninstall
+*** 2256,2260 ****
+ -rm -rf $(mandir)/protoize$(manext)
+ -rm -rf $(mandir)/unprotoize$(manext)
+! \f
+ # These exist for maintenance purposes.
+
+--- 2258,2262 ----
+ -rm -rf $(mandir)/protoize$(manext)
+ -rm -rf $(mandir)/unprotoize$(manext)
+! #\f
+ # These exist for maintenance purposes.
+
+diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c
+*** gcc-2.7.2.3/alias.c Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/alias.c Tue Sep 9 04:23:32 1997
+***************
+*** 0 ****
+--- 1,1004 ----
++ /* Alias analysis for GNU C, by John Carr (jfc@mit.edu).
++ Derived in part from sched.c */
++ #include "config.h"
++ #include "rtl.h"
++ #include "expr.h"
++ #include "regs.h"
++ #include "hard-reg-set.h"
++ #include "flags.h"
++
++ static rtx canon_rtx PROTO((rtx));
++ static int rtx_equal_for_memref_p PROTO((rtx, rtx));
++ static rtx find_symbolic_term PROTO((rtx));
++ static int memrefs_conflict_p PROTO((int, rtx, int, rtx,
++ HOST_WIDE_INT));
++
++ /* Set up all info needed to perform alias analysis on memory references. */
++
++ #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
++
++ /* reg_base_value[N] gives an address to which register N is related.
++ If all sets after the first add or subtract to the current value
++ or otherwise modify it so it does not point to a different top level
++ object, reg_base_value[N] is equal to the address part of the source
++ of the first set. The value will be a SYMBOL_REF, a LABEL_REF, or
++ (address (reg)) to indicate that the address is derived from an
++ argument or fixed register. */
++ rtx *reg_base_value;
++ unsigned int reg_base_value_size; /* size of reg_base_value array */
++ #define REG_BASE_VALUE(X) \
++ (REGNO (X) < reg_base_value_size ? reg_base_value[REGNO (X)] : 0)
++
++ /* Vector indexed by N giving the initial (unchanging) value known
++ for pseudo-register N. */
++ rtx *reg_known_value;
++
++ /* Indicates number of valid entries in reg_known_value. */
++ static int reg_known_value_size;
++
++ /* Vector recording for each reg_known_value whether it is due to a
++ REG_EQUIV note. Future passes (viz., reload) may replace the
++ pseudo with the equivalent expression and so we account for the
++ dependences that would be introduced if that happens. */
++ /* ??? This is a problem only on the Convex. The REG_EQUIV notes created in
++ assign_parms mention the arg pointer, and there are explicit insns in the
++ RTL that modify the arg pointer. Thus we must ensure that such insns don't
++ get scheduled across each other because that would invalidate the REG_EQUIV
++ notes. One could argue that the REG_EQUIV notes are wrong, but solving
++ the problem in the scheduler will likely give better code, so we do it
++ here. */
++ char *reg_known_equiv_p;
++
++ /* Inside SRC, the source of a SET, find a base address. */
++
++ /* When copying arguments into pseudo-registers, record the (ADDRESS)
++ expression for the argument directly so that even if the argument
++ register is changed later (e.g. for a function call) the original
++ value is noted. */
++ static int copying_arguments;
++
++ static rtx
++ find_base_value (src)
++ register rtx src;
++ {
++ switch (GET_CODE (src))
++ {
++ case SYMBOL_REF:
++ case LABEL_REF:
++ return src;
++
++ case REG:
++ if (copying_arguments && REGNO (src) < FIRST_PSEUDO_REGISTER)
++ return reg_base_value[REGNO (src)];
++ return src;
++
++ case MEM:
++ /* Check for an argument passed in memory. Only record in the
++ copying-arguments block; it is too hard to track changes
++ otherwise. */
++ if (copying_arguments
++ && (XEXP (src, 0) == arg_pointer_rtx
++ || (GET_CODE (XEXP (src, 0)) == PLUS
++ && XEXP (XEXP (src, 0), 0) == arg_pointer_rtx)))
++ return gen_rtx (ADDRESS, VOIDmode, src);
++ return 0;
++
++ case CONST:
++ src = XEXP (src, 0);
++ if (GET_CODE (src) != PLUS && GET_CODE (src) != MINUS)
++ break;
++ /* fall through */
++ case PLUS:
++ case MINUS:
++ /* Guess which operand to set the register equivalent to. */
++ /* If the first operand is a symbol or the second operand is
++ an integer, the first operand is the base address. */
++ if (GET_CODE (XEXP (src, 0)) == SYMBOL_REF
++ || GET_CODE (XEXP (src, 0)) == LABEL_REF
++ || GET_CODE (XEXP (src, 1)) == CONST_INT)
++ return XEXP (src, 0);
++ /* If an operand is a register marked as a pointer, it is the base. */
++ if (GET_CODE (XEXP (src, 0)) == REG
++ && REGNO_POINTER_FLAG (REGNO (XEXP (src, 0))))
++ src = XEXP (src, 0);
++ else if (GET_CODE (XEXP (src, 1)) == REG
++ && REGNO_POINTER_FLAG (REGNO (XEXP (src, 1))))
++ src = XEXP (src, 1);
++ else
++ return 0;
++ if (copying_arguments && REGNO (src) < FIRST_PSEUDO_REGISTER)
++ return reg_base_value[REGNO (src)];
++ return src;
++
++ case AND:
++ /* If the second operand is constant set the base
++ address to the first operand. */
++ if (GET_CODE (XEXP (src, 1)) == CONST_INT
++ && GET_CODE (XEXP (src, 0)) == REG)
++ {
++ src = XEXP (src, 0);
++ if (copying_arguments && REGNO (src) < FIRST_PSEUDO_REGISTER)
++ return reg_base_value[REGNO (src)];
++ return src;
++ }
++ return 0;
++
++ case HIGH:
++ return XEXP (src, 0);
++ }
++
++ return 0;
++ }
++
++ /* Called from init_alias_analysis indirectly through note_stores. */
++
++ /* while scanning insns to find base values, reg_seen[N] is nonzero if
++ register N has been set in this function. */
++ static char *reg_seen;
++
++ static
++ void record_set (dest, set)
++ rtx dest, set;
++ {
++ register int regno;
++ rtx src;
++
++ if (GET_CODE (dest) != REG)
++ return;
++
++ regno = REGNO (dest);
++
++ if (set)
++ {
++ /* A CLOBBER wipes out any old value but does not prevent a previously
++ unset register from acquiring a base address (i.e. reg_seen is not
++ set). */
++ if (GET_CODE (set) == CLOBBER)
++ {
++ reg_base_value[regno] = 0;
++ return;
++ }
++ src = SET_SRC (set);
++ }
++ else
++ {
++ static int unique_id;
++ if (reg_seen[regno])
++ {
++ reg_base_value[regno] = 0;
++ return;
++ }
++ reg_seen[regno] = 1;
++ reg_base_value[regno] = gen_rtx (ADDRESS, Pmode,
++ GEN_INT (unique_id++));
++ return;
++ }
++
++ /* This is not the first set. If the new value is not related to the
++ old value, forget the base value. Note that the following code is
++ not detected:
++ extern int x, y; int *p = &x; p += (&y-&x);
++ ANSI C does not allow computing the difference of addresses
++ of distinct top level objects. */
++ if (reg_base_value[regno])
++ switch (GET_CODE (src))
++ {
++ case PLUS:
++ case MINUS:
++ if (XEXP (src, 0) != dest && XEXP (src, 1) != dest)
++ reg_base_value[regno] = 0;
++ break;
++ case AND:
++ if (XEXP (src, 0) != dest || GET_CODE (XEXP (src, 1)) != CONST_INT)
++ reg_base_value[regno] = 0;
++ break;
++ case LO_SUM:
++ if (XEXP (src, 0) != dest)
++ reg_base_value[regno] = 0;
++ break;
++ default:
++ reg_base_value[regno] = 0;
++ break;
++ }
++ /* If this is the first set of a register, record the value. */
++ else if ((regno >= FIRST_PSEUDO_REGISTER || ! fixed_regs[regno])
++ && ! reg_seen[regno] && reg_base_value[regno] == 0)
++ reg_base_value[regno] = find_base_value (src);
++
++ reg_seen[regno] = 1;
++ }
++
++ /* Called from loop optimization when a new pseudo-register is created. */
++ void
++ record_base_value (regno, val)
++ int regno;
++ rtx val;
++ {
++ if (!flag_alias_check || regno >= reg_base_value_size)
++ return;
++ if (GET_CODE (val) == REG)
++ {
++ if (REGNO (val) < reg_base_value_size)
++ reg_base_value[regno] = reg_base_value[REGNO (val)];
++ return;
++ }
++ reg_base_value[regno] = find_base_value (val);
++ }
++
++ static rtx
++ canon_rtx (x)
++ rtx x;
++ {
++ /* Recursively look for equivalences. */
++ if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER
++ && REGNO (x) < reg_known_value_size)
++ return reg_known_value[REGNO (x)] == x
++ ? x : canon_rtx (reg_known_value[REGNO (x)]);
++ else if (GET_CODE (x) == PLUS)
++ {
++ rtx x0 = canon_rtx (XEXP (x, 0));
++ rtx x1 = canon_rtx (XEXP (x, 1));
++
++ if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
++ {
++ /* We can tolerate LO_SUMs being offset here; these
++ rtl are used for nothing other than comparisons. */
++ if (GET_CODE (x0) == CONST_INT)
++ return plus_constant_for_output (x1, INTVAL (x0));
++ else if (GET_CODE (x1) == CONST_INT)
++ return plus_constant_for_output (x0, INTVAL (x1));
++ return gen_rtx (PLUS, GET_MODE (x), x0, x1);
++ }
++ }
++ /* This gives us much better alias analysis when called from
++ the loop optimizer. Note we want to leave the original
++ MEM alone, but need to return the canonicalized MEM with
++ all the flags with their original values. */
++ else if (GET_CODE (x) == MEM)
++ {
++ rtx addr = canon_rtx (XEXP (x, 0));
++ if (addr != XEXP (x, 0))
++ {
++ rtx new = gen_rtx (MEM, GET_MODE (x), addr);
++ MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x);
++ RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
++ MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x);
++ x = new;
++ }
++ }
++ return x;
++ }
++
++ /* Return 1 if X and Y are identical-looking rtx's.
++
++ We use the data in reg_known_value above to see if two registers with
++ different numbers are, in fact, equivalent. */
++
++ static int
++ rtx_equal_for_memref_p (x, y)
++ rtx x, y;
++ {
++ register int i;
++ register int j;
++ register enum rtx_code code;
++ register char *fmt;
++
++ if (x == 0 && y == 0)
++ return 1;
++ if (x == 0 || y == 0)
++ return 0;
++ x = canon_rtx (x);
++ y = canon_rtx (y);
++
++ if (x == y)
++ return 1;
++
++ code = GET_CODE (x);
++ /* Rtx's of different codes cannot be equal. */
++ if (code != GET_CODE (y))
++ return 0;
++
++ /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
++ (REG:SI x) and (REG:HI x) are NOT equivalent. */
++
++ if (GET_MODE (x) != GET_MODE (y))
++ return 0;
++
++ /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
++
++ if (code == REG)
++ return REGNO (x) == REGNO (y);
++ if (code == LABEL_REF)
++ return XEXP (x, 0) == XEXP (y, 0);
++ if (code == SYMBOL_REF)
++ return XSTR (x, 0) == XSTR (y, 0);
++
++ /* For commutative operations, the RTX match if the operand match in any
++ order. Also handle the simple binary and unary cases without a loop. */
++ if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
++ return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
++ && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
++ || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
++ && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
++ else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
++ return (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
++ && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)));
++ else if (GET_RTX_CLASS (code) == '1')
++ return rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0));
++
++ /* Compare the elements. If any pair of corresponding elements
++ fail to match, return 0 for the whole things. */
++
++ fmt = GET_RTX_FORMAT (code);
++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
++ {
++ switch (fmt[i])
++ {
++ case 'w':
++ if (XWINT (x, i) != XWINT (y, i))
++ return 0;
++ break;
++
++ case 'n':
++ case 'i':
++ if (XINT (x, i) != XINT (y, i))
++ return 0;
++ break;
++
++ case 'V':
++ case 'E':
++ /* Two vectors must have the same length. */
++ if (XVECLEN (x, i) != XVECLEN (y, i))
++ return 0;
++
++ /* And the corresponding elements must match. */
++ for (j = 0; j < XVECLEN (x, i); j++)
++ if (rtx_equal_for_memref_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
++ return 0;
++ break;
++
++ case 'e':
++ if (rtx_equal_for_memref_p (XEXP (x, i), XEXP (y, i)) == 0)
++ return 0;
++ break;
++
++ case 'S':
++ case 's':
++ if (strcmp (XSTR (x, i), XSTR (y, i)))
++ return 0;
++ break;
++
++ case 'u':
++ /* These are just backpointers, so they don't matter. */
++ break;
++
++ case '0':
++ break;
++
++ /* It is believed that rtx's at this level will never
++ contain anything but integers and other rtx's,
++ except for within LABEL_REFs and SYMBOL_REFs. */
++ default:
++ abort ();
++ }
++ }
++ return 1;
++ }
++
++ /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
++ X and return it, or return 0 if none found. */
++
++ static rtx
++ find_symbolic_term (x)
++ rtx x;
++ {
++ register int i;
++ register enum rtx_code code;
++ register char *fmt;
++
++ code = GET_CODE (x);
++ if (code == SYMBOL_REF || code == LABEL_REF)
++ return x;
++ if (GET_RTX_CLASS (code) == 'o')
++ return 0;
++
++ fmt = GET_RTX_FORMAT (code);
++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
++ {
++ rtx t;
++
++ if (fmt[i] == 'e')
++ {
++ t = find_symbolic_term (XEXP (x, i));
++ if (t != 0)
++ return t;
++ }
++ else if (fmt[i] == 'E')
++ break;
++ }
++ return 0;
++ }
++
++ static rtx
++ find_base_term (x)
++ register rtx x;
++ {
++ switch (GET_CODE (x))
++ {
++ case REG:
++ return REG_BASE_VALUE (x);
++
++ case HIGH:
++ return find_base_term (XEXP (x, 0));
++
++ case CONST:
++ x = XEXP (x, 0);
++ if (GET_CODE (x) != PLUS && GET_CODE (x) != MINUS)
++ return 0;
++ /* fall through */
++ case LO_SUM:
++ case PLUS:
++ case MINUS:
++ {
++ rtx tmp = find_base_term (XEXP (x, 0));
++ if (tmp)
++ return tmp;
++ return find_base_term (XEXP (x, 1));
++ }
++
++ case AND:
++ if (GET_CODE (XEXP (x, 0)) == REG && GET_CODE (XEXP (x, 1)) == CONST_INT)
++ return REG_BASE_VALUE (XEXP (x, 0));
++ return 0;
++
++ case SYMBOL_REF:
++ case LABEL_REF:
++ return x;
++
++ default:
++ return 0;
++ }
++ }
++
++ /* Return 0 if the addresses X and Y are known to point to different
++ objects, 1 if they might be pointers to the same object. */
++
++ static int
++ base_alias_check (x, y)
++ rtx x, y;
++ {
++ rtx x_base = find_base_term (x);
++ rtx y_base = find_base_term (y);
++
++ /* If either base address is unknown or the base addresses are equal,
++ nothing is known about aliasing. */
++
++ if (x_base == 0 || y_base == 0 || rtx_equal_p (x_base, y_base))
++ return 1;
++
++ /* The base addresses of the read and write are different
++ expressions. If they are both symbols there is no
++ conflict. */
++ if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
++ return 0;
++
++ /* If one address is a stack reference there can be no alias:
++ stack references using different base registers do not alias,
++ a stack reference can not alias a parameter, and a stack reference
++ can not alias a global. */
++ if ((GET_CODE (x_base) == ADDRESS && GET_MODE (x_base) == Pmode)
++ || (GET_CODE (y_base) == ADDRESS && GET_MODE (y_base) == Pmode))
++ return 0;
++
++ if (! flag_argument_noalias)
++ return 1;
++
++ if (flag_argument_noalias > 1)
++ return 0;
++
++ /* Weak noalias assertion (arguments are distinct, but may match globals). */
++ return ! (GET_MODE (x_base) == VOIDmode && GET_MODE (y_base) == VOIDmode);
++ }
++
++ /* Return nonzero if X and Y (memory addresses) could reference the
++ same location in memory. C is an offset accumulator. When
++ C is nonzero, we are testing aliases between X and Y + C.
++ XSIZE is the size in bytes of the X reference,
++ similarly YSIZE is the size in bytes for Y.
++
++ If XSIZE or YSIZE is zero, we do not know the amount of memory being
++ referenced (the reference was BLKmode), so make the most pessimistic
++ assumptions.
++
++ We recognize the following cases of non-conflicting memory:
++
++ (1) addresses involving the frame pointer cannot conflict
++ with addresses involving static variables.
++ (2) static variables with different addresses cannot conflict.
++
++ Nice to notice that varying addresses cannot conflict with fp if no
++ local variables had their addresses taken, but that's too hard now. */
++
++
++ static int
++ memrefs_conflict_p (xsize, x, ysize, y, c)
++ register rtx x, y;
++ int xsize, ysize;
++ HOST_WIDE_INT c;
++ {
++ if (GET_CODE (x) == HIGH)
++ x = XEXP (x, 0);
++ else if (GET_CODE (x) == LO_SUM)
++ x = XEXP (x, 1);
++ else
++ x = canon_rtx (x);
++ if (GET_CODE (y) == HIGH)
++ y = XEXP (y, 0);
++ else if (GET_CODE (y) == LO_SUM)
++ y = XEXP (y, 1);
++ else
++ y = canon_rtx (y);
++
++ if (rtx_equal_for_memref_p (x, y))
++ {
++ if (xsize == 0 || ysize == 0)
++ return 1;
++ if (c >= 0 && xsize > c)
++ return 1;
++ if (c < 0 && ysize+c > 0)
++ return 1;
++ return 0;
++ }
++
++ if (y == frame_pointer_rtx || y == hard_frame_pointer_rtx
++ || y == stack_pointer_rtx)
++ {
++ rtx t = y;
++ int tsize = ysize;
++ y = x; ysize = xsize;
++ x = t; xsize = tsize;
++ }
++
++ if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
++ || x == stack_pointer_rtx)
++ {
++ rtx y1;
++
++ if (CONSTANT_P (y))
++ return 0;
++
++ if (GET_CODE (y) == PLUS
++ && canon_rtx (XEXP (y, 0)) == x
++ && (y1 = canon_rtx (XEXP (y, 1)))
++ && GET_CODE (y1) == CONST_INT)
++ {
++ c += INTVAL (y1);
++ return (xsize == 0 || ysize == 0
++ || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
++ }
++
++ if (GET_CODE (y) == PLUS
++ && (y1 = canon_rtx (XEXP (y, 0)))
++ && CONSTANT_P (y1))
++ return 0;
++
++ return 1;
++ }
++
++ if (GET_CODE (x) == PLUS)
++ {
++ /* The fact that X is canonicalized means that this
++ PLUS rtx is canonicalized. */
++ rtx x0 = XEXP (x, 0);
++ rtx x1 = XEXP (x, 1);
++
++ if (GET_CODE (y) == PLUS)
++ {
++ /* The fact that Y is canonicalized means that this
++ PLUS rtx is canonicalized. */
++ rtx y0 = XEXP (y, 0);
++ rtx y1 = XEXP (y, 1);
++
++ if (rtx_equal_for_memref_p (x1, y1))
++ return memrefs_conflict_p (xsize, x0, ysize, y0, c);
++ if (rtx_equal_for_memref_p (x0, y0))
++ return memrefs_conflict_p (xsize, x1, ysize, y1, c);
++ if (GET_CODE (x1) == CONST_INT)
++ if (GET_CODE (y1) == CONST_INT)
++ return memrefs_conflict_p (xsize, x0, ysize, y0,
++ c - INTVAL (x1) + INTVAL (y1));
++ else
++ return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
++ else if (GET_CODE (y1) == CONST_INT)
++ return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
++
++ /* Handle case where we cannot understand iteration operators,
++ but we notice that the base addresses are distinct objects. */
++ /* ??? Is this still necessary? */
++ x = find_symbolic_term (x);
++ if (x == 0)
++ return 1;
++ y = find_symbolic_term (y);
++ if (y == 0)
++ return 1;
++ return rtx_equal_for_memref_p (x, y);
++ }
++ else if (GET_CODE (x1) == CONST_INT)
++ return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
++ }
++ else if (GET_CODE (y) == PLUS)
++ {
++ /* The fact that Y is canonicalized means that this
++ PLUS rtx is canonicalized. */
++ rtx y0 = XEXP (y, 0);
++ rtx y1 = XEXP (y, 1);
++
++ if (GET_CODE (y1) == CONST_INT)
++ return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
++ else
++ return 1;
++ }
++
++ if (GET_CODE (x) == GET_CODE (y))
++ switch (GET_CODE (x))
++ {
++ case MULT:
++ {
++ /* Handle cases where we expect the second operands to be the
++ same, and check only whether the first operand would conflict
++ or not. */
++ rtx x0, y0;
++ rtx x1 = canon_rtx (XEXP (x, 1));
++ rtx y1 = canon_rtx (XEXP (y, 1));
++ if (! rtx_equal_for_memref_p (x1, y1))
++ return 1;
++ x0 = canon_rtx (XEXP (x, 0));
++ y0 = canon_rtx (XEXP (y, 0));
++ if (rtx_equal_for_memref_p (x0, y0))
++ return (xsize == 0 || ysize == 0
++ || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
++
++ /* Can't properly adjust our sizes. */
++ if (GET_CODE (x1) != CONST_INT)
++ return 1;
++ xsize /= INTVAL (x1);
++ ysize /= INTVAL (x1);
++ c /= INTVAL (x1);
++ return memrefs_conflict_p (xsize, x0, ysize, y0, c);
++ }
++ }
++
++ /* Treat an access through an AND (e.g. a subword access on an Alpha)
++ as an access with indeterminate size. */
++ if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT)
++ return memrefs_conflict_p (0, XEXP (x, 0), ysize, y, c);
++ if (GET_CODE (y) == AND && GET_CODE (XEXP (y, 1)) == CONST_INT)
++ return memrefs_conflict_p (xsize, x, 0, XEXP (y, 0), c);
++
++ if (CONSTANT_P (x))
++ {
++ if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT)
++ {
++ c += (INTVAL (y) - INTVAL (x));
++ return (xsize == 0 || ysize == 0
++ || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
++ }
++
++ if (GET_CODE (x) == CONST)
++ {
++ if (GET_CODE (y) == CONST)
++ return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
++ ysize, canon_rtx (XEXP (y, 0)), c);
++ else
++ return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
++ ysize, y, c);
++ }
++ if (GET_CODE (y) == CONST)
++ return memrefs_conflict_p (xsize, x, ysize,
++ canon_rtx (XEXP (y, 0)), c);
++
++ if (CONSTANT_P (y))
++ return (rtx_equal_for_memref_p (x, y)
++ && (xsize == 0 || ysize == 0
++ || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)));
++
++ return 1;
++ }
++ return 1;
++ }
++
++ /* Functions to compute memory dependencies.
++
++ Since we process the insns in execution order, we can build tables
++ to keep track of what registers are fixed (and not aliased), what registers
++ are varying in known ways, and what registers are varying in unknown
++ ways.
++
++ If both memory references are volatile, then there must always be a
++ dependence between the two references, since their order can not be
++ changed. A volatile and non-volatile reference can be interchanged
++ though.
++
++ A MEM_IN_STRUCT reference at a non-QImode non-AND varying address can never
++ conflict with a non-MEM_IN_STRUCT reference at a fixed address. We must
++ allow QImode aliasing because the ANSI C standard allows character
++ pointers to alias anything. We are assuming that characters are
++ always QImode here. We also must allow AND addresses, because they may
++ generate accesses outside the object being referenced. This is used to
++ generate aligned addresses from unaligned addresses, for instance, the
++ alpha storeqi_unaligned pattern. */
++
++ /* Read dependence: X is read after read in MEM takes place. There can
++ only be a dependence here if both reads are volatile. */
++
++ int
++ read_dependence (mem, x)
++ rtx mem;
++ rtx x;
++ {
++ return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
++ }
++
++ /* True dependence: X is read after store in MEM takes place. */
++
++ int
++ true_dependence (mem, mem_mode, x, varies)
++ rtx mem;
++ enum machine_mode mem_mode;
++ rtx x;
++ int (*varies)();
++ {
++ rtx x_addr, mem_addr;
++
++ if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
++ return 1;
++
++ x_addr = XEXP (x, 0);
++ mem_addr = XEXP (mem, 0);
++
++ if (flag_alias_check && ! base_alias_check (x_addr, mem_addr))
++ return 0;
++
++ /* If X is an unchanging read, then it can't possibly conflict with any
++ non-unchanging store. It may conflict with an unchanging write though,
++ because there may be a single store to this address to initialize it.
++ Just fall through to the code below to resolve the case where we have
++ both an unchanging read and an unchanging write. This won't handle all
++ cases optimally, but the possible performance loss should be
++ negligible. */
++ if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
++ return 0;
++
++ x_addr = canon_rtx (x_addr);
++ mem_addr = canon_rtx (mem_addr);
++ if (mem_mode == VOIDmode)
++ mem_mode = GET_MODE (mem);
++
++ if (! memrefs_conflict_p (mem_mode, mem_addr, SIZE_FOR_MODE (x), x_addr, 0))
++ return 0;
++
++ /* If both references are struct references, or both are not, nothing
++ is known about aliasing.
++
++ If either reference is QImode or BLKmode, ANSI C permits aliasing.
++
++ If both addresses are constant, or both are not, nothing is known
++ about aliasing. */
++ if (MEM_IN_STRUCT_P (x) == MEM_IN_STRUCT_P (mem)
++ || mem_mode == QImode || mem_mode == BLKmode
++ || GET_MODE (x) == QImode || GET_MODE (x) == BLKmode
++ || GET_CODE (x_addr) == AND || GET_CODE (mem_addr) == AND
++ || varies (x_addr) == varies (mem_addr))
++ return 1;
++
++ /* One memory reference is to a constant address, one is not.
++ One is to a structure, the other is not.
++
++ If either memory reference is a variable structure the other is a
++ fixed scalar and there is no aliasing. */
++ if ((MEM_IN_STRUCT_P (mem) && varies (mem_addr))
++ || (MEM_IN_STRUCT_P (x) && varies (x_addr)))
++ return 0;
++
++ return 1;
++ }
++
++ /* Anti dependence: X is written after read in MEM takes place. */
++
++ int
++ anti_dependence (mem, x)
++ rtx mem;
++ rtx x;
++ {
++ if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
++ return 1;
++
++ if (flag_alias_check && ! base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
++ return 0;
++
++ /* If MEM is an unchanging read, then it can't possibly conflict with
++ the store to X, because there is at most one store to MEM, and it must
++ have occurred somewhere before MEM. */
++ x = canon_rtx (x);
++ mem = canon_rtx (mem);
++ if (RTX_UNCHANGING_P (mem))
++ return 0;
++
++ return (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
++ SIZE_FOR_MODE (x), XEXP (x, 0), 0)
++ && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
++ && GET_MODE (mem) != QImode
++ && GET_CODE (XEXP (mem, 0)) != AND
++ && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
++ && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
++ && GET_MODE (x) != QImode
++ && GET_CODE (XEXP (x, 0)) != AND
++ && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
++ }
++
++ /* Output dependence: X is written after store in MEM takes place. */
++
++ int
++ output_dependence (mem, x)
++ register rtx mem;
++ register rtx x;
++ {
++ if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
++ return 1;
++
++ if (flag_alias_check && !base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
++ return 0;
++
++ x = canon_rtx (x);
++ mem = canon_rtx (mem);
++ return (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
++ SIZE_FOR_MODE (x), XEXP (x, 0), 0)
++ && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
++ && GET_MODE (mem) != QImode
++ && GET_CODE (XEXP (mem, 0)) != AND
++ && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
++ && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
++ && GET_MODE (x) != QImode
++ && GET_CODE (XEXP (x, 0)) != AND
++ && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
++ }
++
++ void
++ init_alias_analysis ()
++ {
++ int maxreg = max_reg_num ();
++ int changed;
++ register int i;
++ register rtx insn;
++ rtx note;
++ rtx set;
++
++ reg_known_value_size = maxreg;
++
++ reg_known_value
++ = (rtx *) oballoc ((maxreg - FIRST_PSEUDO_REGISTER) * sizeof (rtx))
++ - FIRST_PSEUDO_REGISTER;
++ reg_known_equiv_p =
++ oballoc (maxreg - FIRST_PSEUDO_REGISTER) - FIRST_PSEUDO_REGISTER;
++ bzero ((char *) (reg_known_value + FIRST_PSEUDO_REGISTER),
++ (maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx));
++ bzero (reg_known_equiv_p + FIRST_PSEUDO_REGISTER,
++ (maxreg - FIRST_PSEUDO_REGISTER) * sizeof (char));
++
++ if (flag_alias_check)
++ {
++ /* Overallocate reg_base_value to allow some growth during loop
++ optimization. Loop unrolling can create a large number of
++ registers. */
++ reg_base_value_size = maxreg * 2;
++ reg_base_value = (rtx *)oballoc (reg_base_value_size * sizeof (rtx));
++ reg_seen = (char *)alloca (reg_base_value_size);
++ bzero (reg_base_value, reg_base_value_size * sizeof (rtx));
++ bzero (reg_seen, reg_base_value_size);
++
++ /* Mark all hard registers which may contain an address.
++ The stack, frame and argument pointers may contain an address.
++ An argument register which can hold a Pmode value may contain
++ an address even if it is not in BASE_REGS.
++
++ The address expression is VOIDmode for an argument and
++ Pmode for other registers. */
++ #ifndef OUTGOING_REGNO
++ #define OUTGOING_REGNO(N) N
++ #endif
++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
++ /* Check whether this register can hold an incoming pointer
++ argument. FUNCTION_ARG_REGNO_P tests outgoing register
++ numbers, so translate if necessary due to register windows. */
++ if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i)) && HARD_REGNO_MODE_OK (i, Pmode))
++ reg_base_value[i] = gen_rtx (ADDRESS, VOIDmode,
++ gen_rtx (REG, Pmode, i));
++
++ reg_base_value[STACK_POINTER_REGNUM]
++ = gen_rtx (ADDRESS, Pmode, stack_pointer_rtx);
++ reg_base_value[ARG_POINTER_REGNUM]
++ = gen_rtx (ADDRESS, Pmode, arg_pointer_rtx);
++ reg_base_value[FRAME_POINTER_REGNUM]
++ = gen_rtx (ADDRESS, Pmode, frame_pointer_rtx);
++ reg_base_value[HARD_FRAME_POINTER_REGNUM]
++ = gen_rtx (ADDRESS, Pmode, hard_frame_pointer_rtx);
++ }
++
++ copying_arguments = 1;
++ /* Fill in the entries with known constant values. */
++ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
++ {
++ if (flag_alias_check && GET_RTX_CLASS (GET_CODE (insn)) == 'i')
++ {
++ /* If this insn has a noalias note, process it, Otherwise,
++ scan for sets. A simple set will have no side effects
++ which could change the base value of any other register. */
++ rtx noalias_note;
++ if (GET_CODE (PATTERN (insn)) == SET
++ && (noalias_note = find_reg_note (insn, REG_NOALIAS, NULL_RTX)))
++ record_set (SET_DEST (PATTERN (insn)), 0);
++ else
++ note_stores (PATTERN (insn), record_set);
++ }
++ else if (GET_CODE (insn) == NOTE
++ && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG)
++ copying_arguments = 0;
++
++ if ((set = single_set (insn)) != 0
++ && GET_CODE (SET_DEST (set)) == REG
++ && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
++ && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
++ && reg_n_sets[REGNO (SET_DEST (set))] == 1)
++ || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
++ && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
++ {
++ int regno = REGNO (SET_DEST (set));
++ reg_known_value[regno] = XEXP (note, 0);
++ reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV;
++ }
++ }
++
++ /* Fill in the remaining entries. */
++ for (i = FIRST_PSEUDO_REGISTER; i < maxreg; i++)
++ if (reg_known_value[i] == 0)
++ reg_known_value[i] = regno_reg_rtx[i];
++
++ if (! flag_alias_check)
++ return;
++
++ /* Simplify the reg_base_value array so that no register refers to
++ another register, except to special registers indirectly through
++ ADDRESS expressions.
++
++ In theory this loop can take as long as O(registers^2), but unless
++ there are very long dependency chains it will run in close to linear
++ time. */
++ do
++ {
++ changed = 0;
++ for (i = FIRST_PSEUDO_REGISTER; i < reg_base_value_size; i++)
++ {
++ rtx base = reg_base_value[i];
++ if (base && GET_CODE (base) == REG)
++ {
++ int base_regno = REGNO (base);
++ if (base_regno == i) /* register set from itself */
++ reg_base_value[i] = 0;
++ else
++ reg_base_value[i] = reg_base_value[base_regno];
++ changed = 1;
++ }
++ }
++ }
++ while (changed);
++
++ reg_seen = 0;
++ }
++
++ void
++ end_alias_analysis ()
++ {
++ reg_known_value = 0;
++ reg_base_value = 0;
++ reg_base_value_size = 0;
++ }
+diff -rcp2N gcc-2.7.2.3/c-decl.c gcc-2.7.2.3.f.1/c-decl.c
+*** gcc-2.7.2.3/c-decl.c Fri Oct 27 09:44:43 1995
+--- gcc-2.7.2.3.f.1/c-decl.c Sun Aug 10 22:46:24 1997
+*************** init_decl_processing ()
+*** 3207,3210 ****
+--- 3207,3223 ----
+ builtin_function ("__builtin_cosl", ldouble_ftype_ldouble,
+ BUILT_IN_COS, "cosl");
++ builtin_function ("__builtin_setjmp",
++ build_function_type (integer_type_node,
++ tree_cons (NULL_TREE,
++ ptr_type_node, endlink)),
++ BUILT_IN_SETJMP, NULL_PTR);
++ builtin_function ("__builtin_longjmp",
++ build_function_type
++ (void_type_node,
++ tree_cons (NULL, ptr_type_node,
++ tree_cons (NULL_TREE,
++ integer_type_node,
++ endlink))),
++ BUILT_IN_LONGJMP, NULL_PTR);
+
+ /* In an ANSI C program, it is okay to supply built-in meanings
+*************** grokdeclarator (declarator, declspecs, d
+*** 4049,4052 ****
+--- 4062,4066 ----
+ int volatilep;
+ int inlinep;
++ int restrictp;
+ int explicit_int = 0;
+ int explicit_char = 0;
+*************** grokdeclarator (declarator, declspecs, d
+*** 4342,4349 ****
+--- 4356,4366 ----
+ volatilep = !! (specbits & 1 << (int) RID_VOLATILE) + TYPE_VOLATILE (type);
+ inlinep = !! (specbits & (1 << (int) RID_INLINE));
++ restrictp = !! (specbits & (1 << (int) RID_RESTRICT));
+ if (constp > 1)
+ pedwarn ("duplicate `const'");
+ if (volatilep > 1)
+ pedwarn ("duplicate `volatile'");
++ if (restrictp)
++ error ("`restrict' used in non-parameter or non-pointer type declaration");
+ if (! flag_gen_aux_info && (TYPE_READONLY (type) || TYPE_VOLATILE (type)))
+ type = TYPE_MAIN_VARIANT (type);
+*************** grokdeclarator (declarator, declspecs, d
+*** 4693,4696 ****
+--- 4710,4715 ----
+ else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_VOLATILE])
+ volatilep++;
++ else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_RESTRICT])
++ restrictp++;
+ else if (!erred)
+ {
+*************** grokdeclarator (declarator, declspecs, d
+*** 4703,4706 ****
+--- 4722,4727 ----
+ if (volatilep > 1)
+ pedwarn ("duplicate `volatile'");
++ if (restrictp > 1)
++ pedwarn ("duplicate `restrict'");
+ }
+
+*************** grokdeclarator (declarator, declspecs, d
+*** 4844,4847 ****
+--- 4865,4875 ----
+ }
+
++ if (restrictp)
++ {
++ if (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE)
++ error ("`restrict' applied to non-pointer");
++ DECL_RESTRICT (decl) = 1;
++ }
++
+ DECL_ARG_TYPE_AS_WRITTEN (decl) = type_as_written;
+ }
+*************** start_struct (code, name)
+*** 5365,5368 ****
+--- 5393,5397 ----
+ pushtag (name, ref);
+ C_TYPE_BEING_DEFINED (ref) = 1;
++ TYPE_PACKED (ref) = flag_pack_struct;
+ return ref;
+ }
+*************** start_enum (name)
+*** 5806,5809 ****
+--- 5835,5841 ----
+ enum_overflow = 0;
+
++ if (flag_short_enums)
++ TYPE_PACKED (enumtype) = 1;
++
+ return enumtype;
+ }
+*************** finish_enum (enumtype, values, attribute
+*** 5862,5867 ****
+ precision = MAX (lowprec, highprec);
+
+! if (flag_short_enums || TYPE_PACKED (enumtype)
+! || precision > TYPE_PRECISION (integer_type_node))
+ /* Use the width of the narrowest normal C type which is wide enough. */
+ TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1));
+--- 5894,5898 ----
+ precision = MAX (lowprec, highprec);
+
+! if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node))
+ /* Use the width of the narrowest normal C type which is wide enough. */
+ TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1));
+diff -rcp2N gcc-2.7.2.3/c-gperf.h gcc-2.7.2.3.f.1/c-gperf.h
+*** gcc-2.7.2.3/c-gperf.h Fri Mar 4 19:15:53 1994
+--- gcc-2.7.2.3.f.1/c-gperf.h Mon Aug 11 06:58:47 1997
+***************
+*** 1,15 ****
+ /* C code produced by gperf version 2.5 (GNU C++ version) */
+! /* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ c-parse.gperf */
+ struct resword { char *name; short token; enum rid rid; };
+
+! #define TOTAL_KEYWORDS 79
+ #define MIN_WORD_LENGTH 2
+ #define MAX_WORD_LENGTH 20
+! #define MIN_HASH_VALUE 10
+! #define MAX_HASH_VALUE 144
+! /* maximum key range = 135, duplicates = 0 */
+
+ #ifdef __GNUC__
+! __inline
+ #endif
+ static unsigned int
+--- 1,16 ----
+ /* C code produced by gperf version 2.5 (GNU C++ version) */
+! /* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ ../g77-new/c-parse.gperf */
+! /* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */
+ struct resword { char *name; short token; enum rid rid; };
+
+! #define TOTAL_KEYWORDS 81
+ #define MIN_WORD_LENGTH 2
+ #define MAX_WORD_LENGTH 20
+! #define MIN_HASH_VALUE 11
+! #define MAX_HASH_VALUE 157
+! /* maximum key range = 147, duplicates = 0 */
+
+ #ifdef __GNUC__
+! inline
+ #endif
+ static unsigned int
+*************** hash (str, len)
+*** 20,36 ****
+ static unsigned char asso_values[] =
+ {
+! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+! 145, 145, 145, 145, 25, 145, 145, 145, 145, 145,
+! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+! 145, 145, 145, 145, 145, 1, 145, 46, 8, 15,
+! 61, 6, 36, 48, 3, 5, 145, 18, 63, 25,
+! 29, 76, 1, 145, 13, 2, 1, 51, 37, 9,
+! 9, 1, 3, 145, 145, 145, 145, 145,
+ };
+ register int hval = len;
+--- 21,37 ----
+ static unsigned char asso_values[] =
+ {
+! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+! 158, 158, 158, 158, 2, 158, 158, 158, 158, 158,
+! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+! 158, 158, 158, 158, 158, 1, 158, 18, 1, 58,
+! 56, 6, 44, 64, 13, 45, 158, 4, 26, 68,
+! 2, 74, 1, 158, 2, 13, 1, 33, 48, 5,
+! 5, 3, 12, 158, 158, 158, 158, 158,
+ };
+ register int hval = len;
+*************** hash (str, len)
+*** 44,47 ****
+--- 45,49 ----
+ case 1:
+ hval += asso_values[str[0]];
++ break;
+ }
+ return hval + asso_values[str[len - 1]];
+*************** hash (str, len)
+*** 50,166 ****
+ static struct resword wordlist[] =
+ {
+! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
+! {"",},
+! {"int", TYPESPEC, RID_INT},
+! {"",}, {"",},
+! {"__typeof__", TYPEOF, NORID},
+! {"__signed__", TYPESPEC, RID_SIGNED},
+! {"__imag__", IMAGPART, NORID},
+! {"switch", SWITCH, NORID},
+! {"__inline__", SCSPEC, RID_INLINE},
+! {"else", ELSE, NORID},
+! {"__iterator__", SCSPEC, RID_ITERATOR},
+! {"__inline", SCSPEC, RID_INLINE},
+! {"__extension__", EXTENSION, NORID},
+! {"struct", STRUCT, NORID},
+! {"__real__", REALPART, NORID},
+! {"__const", TYPE_QUAL, RID_CONST},
+! {"while", WHILE, NORID},
+! {"__const__", TYPE_QUAL, RID_CONST},
+! {"case", CASE, NORID},
+! {"__complex__", TYPESPEC, RID_COMPLEX},
+! {"__iterator", SCSPEC, RID_ITERATOR},
+! {"bycopy", TYPE_QUAL, RID_BYCOPY},
+! {"",}, {"",}, {"",},
+! {"__complex", TYPESPEC, RID_COMPLEX},
+! {"",},
+! {"in", TYPE_QUAL, RID_IN},
+! {"break", BREAK, NORID},
+! {"@defs", DEFS, NORID},
+! {"",}, {"",}, {"",},
+! {"extern", SCSPEC, RID_EXTERN},
+! {"if", IF, NORID},
+! {"typeof", TYPEOF, NORID},
+! {"typedef", SCSPEC, RID_TYPEDEF},
+! {"__typeof", TYPEOF, NORID},
+! {"sizeof", SIZEOF, NORID},
+! {"",},
+! {"return", RETURN, NORID},
+! {"const", TYPE_QUAL, RID_CONST},
+! {"__volatile__", TYPE_QUAL, RID_VOLATILE},
+! {"@private", PRIVATE, NORID},
+! {"@selector", SELECTOR, NORID},
+! {"__volatile", TYPE_QUAL, RID_VOLATILE},
+! {"__asm__", ASM_KEYWORD, NORID},
+! {"",}, {"",},
+! {"continue", CONTINUE, NORID},
+! {"__alignof__", ALIGNOF, NORID},
+! {"__imag", IMAGPART, NORID},
+! {"__attribute__", ATTRIBUTE, NORID},
+! {"",}, {"",},
+! {"__attribute", ATTRIBUTE, NORID},
+! {"for", FOR, NORID},
+! {"",},
+! {"@encode", ENCODE, NORID},
+! {"id", OBJECTNAME, RID_ID},
+! {"static", SCSPEC, RID_STATIC},
+! {"@interface", INTERFACE, NORID},
+! {"",},
+! {"__signed", TYPESPEC, RID_SIGNED},
+! {"",},
+! {"__label__", LABEL, NORID},
+! {"",}, {"",},
+! {"__asm", ASM_KEYWORD, NORID},
+! {"char", TYPESPEC, RID_CHAR},
+! {"",},
+! {"inline", SCSPEC, RID_INLINE},
+! {"out", TYPE_QUAL, RID_OUT},
+! {"register", SCSPEC, RID_REGISTER},
+! {"__real", REALPART, NORID},
+! {"short", TYPESPEC, RID_SHORT},
+! {"",},
+! {"enum", ENUM, NORID},
+! {"inout", TYPE_QUAL, RID_INOUT},
+! {"",},
+! {"oneway", TYPE_QUAL, RID_ONEWAY},
+! {"union", UNION, NORID},
+! {"",},
+! {"__alignof", ALIGNOF, NORID},
+! {"",},
+! {"@implementation", IMPLEMENTATION, NORID},
+! {"",},
+! {"@class", CLASS, NORID},
+! {"",},
+! {"@public", PUBLIC, NORID},
+! {"asm", ASM_KEYWORD, NORID},
+! {"",}, {"",}, {"",}, {"",}, {"",},
+! {"default", DEFAULT, NORID},
+! {"",},
+! {"void", TYPESPEC, RID_VOID},
+! {"",},
+! {"@protected", PROTECTED, NORID},
+! {"@protocol", PROTOCOL, NORID},
+! {"",}, {"",}, {"",},
+! {"volatile", TYPE_QUAL, RID_VOLATILE},
+! {"",}, {"",},
+! {"signed", TYPESPEC, RID_SIGNED},
+! {"float", TYPESPEC, RID_FLOAT},
+! {"@end", END, NORID},
+! {"",}, {"",},
+! {"unsigned", TYPESPEC, RID_UNSIGNED},
+! {"@compatibility_alias", ALIAS, NORID},
+! {"double", TYPESPEC, RID_DOUBLE},
+! {"",}, {"",},
+! {"auto", SCSPEC, RID_AUTO},
+! {"",},
+! {"goto", GOTO, NORID},
+! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
+! {"do", DO, NORID},
+! {"",}, {"",}, {"",}, {"",},
+! {"long", TYPESPEC, RID_LONG},
+ };
+
+ #ifdef __GNUC__
+! __inline
+ #endif
+ struct resword *
+--- 52,167 ----
+ static struct resword wordlist[] =
+ {
+! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
+! {"",}, {"",},
+! {"return", RETURN, NORID},
+! {"__real__", REALPART, NORID},
+! {"__typeof__", TYPEOF, NORID},
+! {"__restrict", TYPE_QUAL, RID_RESTRICT},
+! {"extern", SCSPEC, RID_EXTERN},
+! {"break", BREAK, NORID},
+! {"@encode", ENCODE, NORID},
+! {"@private", PRIVATE, NORID},
+! {"@selector", SELECTOR, NORID},
+! {"@interface", INTERFACE, NORID},
+! {"__extension__", EXTENSION, NORID},
+! {"struct", STRUCT, NORID},
+! {"",},
+! {"restrict", TYPE_QUAL, RID_RESTRICT},
+! {"__signed__", TYPESPEC, RID_SIGNED},
+! {"@defs", DEFS, NORID},
+! {"__asm__", ASM_KEYWORD, NORID},
+! {"",},
+! {"else", ELSE, NORID},
+! {"",},
+! {"__alignof__", ALIGNOF, NORID},
+! {"",},
+! {"__attribute__", ATTRIBUTE, NORID},
+! {"",},
+! {"__real", REALPART, NORID},
+! {"__attribute", ATTRIBUTE, NORID},
+! {"__label__", LABEL, NORID},
+! {"",},
+! {"@protocol", PROTOCOL, NORID},
+! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
+! {"@class", CLASS, NORID},
+! {"",},
+! {"in", TYPE_QUAL, RID_IN},
+! {"int", TYPESPEC, RID_INT},
+! {"for", FOR, NORID},
+! {"typeof", TYPEOF, NORID},
+! {"typedef", SCSPEC, RID_TYPEDEF},
+! {"__typeof", TYPEOF, NORID},
+! {"__imag__", IMAGPART, NORID},
+! {"",},
+! {"__inline__", SCSPEC, RID_INLINE},
+! {"__iterator", SCSPEC, RID_ITERATOR},
+! {"__iterator__", SCSPEC, RID_ITERATOR},
+! {"__inline", SCSPEC, RID_INLINE},
+! {"while", WHILE, NORID},
+! {"__volatile__", TYPE_QUAL, RID_VOLATILE},
+! {"",},
+! {"@end", END, NORID},
+! {"__volatile", TYPE_QUAL, RID_VOLATILE},
+! {"const", TYPE_QUAL, RID_CONST},
+! {"__const", TYPE_QUAL, RID_CONST},
+! {"bycopy", TYPE_QUAL, RID_BYCOPY},
+! {"__const__", TYPE_QUAL, RID_CONST},
+! {"@protected", PROTECTED, NORID},
+! {"__complex__", TYPESPEC, RID_COMPLEX},
+! {"__alignof", ALIGNOF, NORID},
+! {"__complex", TYPESPEC, RID_COMPLEX},
+! {"continue", CONTINUE, NORID},
+! {"sizeof", SIZEOF, NORID},
+! {"register", SCSPEC, RID_REGISTER},
+! {"switch", SWITCH, NORID},
+! {"__signed", TYPESPEC, RID_SIGNED},
+! {"out", TYPE_QUAL, RID_OUT},
+! {"",},
+! {"case", CASE, NORID},
+! {"char", TYPESPEC, RID_CHAR},
+! {"inline", SCSPEC, RID_INLINE},
+! {"",},
+! {"union", UNION, NORID},
+! {"",},
+! {"@implementation", IMPLEMENTATION, NORID},
+! {"volatile", TYPE_QUAL, RID_VOLATILE},
+! {"oneway", TYPE_QUAL, RID_ONEWAY},
+! {"",},
+! {"if", IF, NORID},
+! {"__asm", ASM_KEYWORD, NORID},
+! {"short", TYPESPEC, RID_SHORT},
+! {"",},
+! {"static", SCSPEC, RID_STATIC},
+! {"long", TYPESPEC, RID_LONG},
+! {"auto", SCSPEC, RID_AUTO},
+! {"",}, {"",},
+! {"@public", PUBLIC, NORID},
+! {"double", TYPESPEC, RID_DOUBLE},
+! {"",},
+! {"id", OBJECTNAME, RID_ID},
+! {"",}, {"",}, {"",}, {"",},
+! {"default", DEFAULT, NORID},
+! {"@compatibility_alias", ALIAS, NORID},
+! {"unsigned", TYPESPEC, RID_UNSIGNED},
+! {"enum", ENUM, NORID},
+! {"",}, {"",}, {"",}, {"",},
+! {"__imag", IMAGPART, NORID},
+! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
+! {"float", TYPESPEC, RID_FLOAT},
+! {"inout", TYPE_QUAL, RID_INOUT},
+! {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
+! {"do", DO, NORID},
+! {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
+! {"signed", TYPESPEC, RID_SIGNED},
+! {"",}, {"",}, {"",},
+! {"goto", GOTO, NORID},
+! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
+! {"void", TYPESPEC, RID_VOID},
+! {"",}, {"",}, {"",},
+! {"asm", ASM_KEYWORD, NORID},
+ };
+
+ #ifdef __GNUC__
+! inline
+ #endif
+ struct resword *
+diff -rcp2N gcc-2.7.2.3/c-lex.c gcc-2.7.2.3.f.1/c-lex.c
+*** gcc-2.7.2.3/c-lex.c Thu Jun 15 11:11:39 1995
+--- gcc-2.7.2.3.f.1/c-lex.c Sun Aug 10 22:46:49 1997
+*************** init_lex ()
+*** 173,176 ****
+--- 173,177 ----
+ ridpointers[(int) RID_CONST] = get_identifier ("const");
+ ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile");
++ ridpointers[(int) RID_RESTRICT] = get_identifier ("restrict");
+ ridpointers[(int) RID_AUTO] = get_identifier ("auto");
+ ridpointers[(int) RID_STATIC] = get_identifier ("static");
+*************** init_lex ()
+*** 206,209 ****
+--- 207,211 ----
+ UNSET_RESERVED_WORD ("iterator");
+ UNSET_RESERVED_WORD ("complex");
++ UNSET_RESERVED_WORD ("restrict");
+ }
+ if (flag_no_asm)
+*************** init_lex ()
+*** 214,217 ****
+--- 216,220 ----
+ UNSET_RESERVED_WORD ("iterator");
+ UNSET_RESERVED_WORD ("complex");
++ UNSET_RESERVED_WORD ("restrict");
+ }
+ }
+*************** yylex ()
+*** 1433,1437 ****
+ /* Create a node with determined type and value. */
+ if (imag)
+! yylval.ttype = build_complex (convert (type, integer_zero_node),
+ build_real (type, value));
+ else
+--- 1436,1441 ----
+ /* Create a node with determined type and value. */
+ if (imag)
+! yylval.ttype = build_complex (NULL_TREE,
+! convert (type, integer_zero_node),
+ build_real (type, value));
+ else
+*************** yylex ()
+*** 1624,1629 ****
+ <= TYPE_PRECISION (integer_type_node))
+ yylval.ttype
+! = build_complex (integer_zero_node,
+! convert (integer_type_node, yylval.ttype));
+ else
+ error ("complex integer constant is too wide for `complex int'");
+--- 1628,1634 ----
+ <= TYPE_PRECISION (integer_type_node))
+ yylval.ttype
+! = build_complex (NULL_TREE, integer_zero_node,
+! convert (integer_type_node,
+! yylval.ttype));
+ else
+ error ("complex integer constant is too wide for `complex int'");
+diff -rcp2N gcc-2.7.2.3/c-lex.h gcc-2.7.2.3.f.1/c-lex.h
+*** gcc-2.7.2.3/c-lex.h Thu Jun 15 11:12:22 1995
+--- gcc-2.7.2.3.f.1/c-lex.h Sun Aug 10 22:10:55 1997
+*************** enum rid
+*** 43,47 ****
+ RID_VOLATILE,
+ RID_INLINE,
+! RID_NOALIAS,
+ RID_ITERATOR,
+ RID_COMPLEX,
+--- 43,47 ----
+ RID_VOLATILE,
+ RID_INLINE,
+! RID_RESTRICT,
+ RID_ITERATOR,
+ RID_COMPLEX,
+diff -rcp2N gcc-2.7.2.3/c-parse.gperf gcc-2.7.2.3.f.1/c-parse.gperf
+*** gcc-2.7.2.3/c-parse.gperf Fri Apr 9 23:00:44 1993
+--- gcc-2.7.2.3.f.1/c-parse.gperf Sun Aug 10 22:10:55 1997
+*************** __label__, LABEL, NORID
+*** 36,39 ****
+--- 36,40 ----
+ __real, REALPART, NORID
+ __real__, REALPART, NORID
++ __restrict, TYPE_QUAL, RID_RESTRICT
+ __signed, TYPESPEC, RID_SIGNED
+ __signed__, TYPESPEC, RID_SIGNED
+*************** oneway, TYPE_QUAL, RID_ONEWAY
+*** 69,72 ****
+--- 70,74 ----
+ out, TYPE_QUAL, RID_OUT
+ register, SCSPEC, RID_REGISTER
++ restrict, TYPE_QUAL, RID_RESTRICT
+ return, RETURN, NORID
+ short, TYPESPEC, RID_SHORT
+diff -rcp2N gcc-2.7.2.3/c-typeck.c gcc-2.7.2.3.f.1/c-typeck.c
+*** gcc-2.7.2.3/c-typeck.c Sat Jun 29 16:27:15 1996
+--- gcc-2.7.2.3.f.1/c-typeck.c Sun Aug 10 22:46:29 1997
+*************** pointer_int_sum (resultcode, ptrop, into
+*** 2681,2686 ****
+ so the multiply won't overflow spuriously. */
+
+! if (TYPE_PRECISION (TREE_TYPE (intop)) != POINTER_SIZE)
+! intop = convert (type_for_size (POINTER_SIZE, 0), intop);
+
+ /* Replace the integer argument with a suitable product by the object size.
+--- 2681,2688 ----
+ so the multiply won't overflow spuriously. */
+
+! if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)
+! || TREE_UNSIGNED (TREE_TYPE (intop)) != TREE_UNSIGNED (sizetype))
+! intop = convert (type_for_size (TYPE_PRECISION (sizetype),
+! TREE_UNSIGNED (sizetype)), intop);
+
+ /* Replace the integer argument with a suitable product by the object size.
+diff -rcp2N gcc-2.7.2.3/calls.c gcc-2.7.2.3.f.1/calls.c
+*** gcc-2.7.2.3/calls.c Fri Oct 27 01:53:43 1995
+--- gcc-2.7.2.3.f.1/calls.c Fri Aug 29 07:52:07 1997
+*************** expand_call (exp, target, ignore)
+*** 564,567 ****
+--- 564,569 ----
+ /* Nonzero if it is plausible that this is a call to alloca. */
+ int may_be_alloca;
++ /* Nonzero if this is a call to malloc or a related function. */
++ int is_malloc;
+ /* Nonzero if this is a call to setjmp or a related function. */
+ int returns_twice;
+*************** expand_call (exp, target, ignore)
+*** 741,745 ****
+ if (stack_arg_under_construction || i >= 0)
+ {
+! rtx insn = NEXT_INSN (before_call), seq;
+
+ /* Look for a call in the inline function code.
+--- 743,749 ----
+ if (stack_arg_under_construction || i >= 0)
+ {
+! rtx first_insn
+! = before_call ? NEXT_INSN (before_call) : get_insns ();
+! rtx insn, seq;
+
+ /* Look for a call in the inline function code.
+*************** expand_call (exp, target, ignore)
+*** 749,753 ****
+
+ if (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) == 0)
+! for (; insn; insn = NEXT_INSN (insn))
+ if (GET_CODE (insn) == CALL_INSN)
+ break;
+--- 753,757 ----
+
+ if (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) == 0)
+! for (insn = first_insn; insn; insn = NEXT_INSN (insn))
+ if (GET_CODE (insn) == CALL_INSN)
+ break;
+*************** expand_call (exp, target, ignore)
+*** 781,785 ****
+ seq = get_insns ();
+ end_sequence ();
+! emit_insns_before (seq, NEXT_INSN (before_call));
+ emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
+ }
+--- 785,789 ----
+ seq = get_insns ();
+ end_sequence ();
+! emit_insns_before (seq, first_insn);
+ emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
+ }
+*************** expand_call (exp, target, ignore)
+*** 852,855 ****
+--- 856,860 ----
+ returns_twice = 0;
+ is_longjmp = 0;
++ is_malloc = 0;
+
+ if (name != 0 && IDENTIFIER_LENGTH (DECL_NAME (fndecl)) <= 15)
+*************** expand_call (exp, target, ignore)
+*** 891,894 ****
+--- 896,903 ----
+ && ! strcmp (tname, "longjmp"))
+ is_longjmp = 1;
++ /* Only recognize malloc when alias analysis is enabled. */
++ else if (tname[0] == 'm' && flag_alias_check
++ && ! strcmp(tname, "malloc"))
++ is_malloc = 1;
+ }
+
+*************** expand_call (exp, target, ignore)
+*** 1060,1064 ****
+
+ if (TYPE_SIZE (type) == 0
+! || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+ {
+ /* This is a variable-sized object. Make space on the stack
+--- 1069,1077 ----
+
+ if (TYPE_SIZE (type) == 0
+! || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
+! || (flag_stack_check && ! STACK_CHECK_BUILTIN
+! && (TREE_INT_CST_HIGH (TYPE_SIZE (type)) != 0
+! || (TREE_INT_CST_LOW (TYPE_SIZE (type))
+! > STACK_CHECK_MAX_VAR_SIZE * BITS_PER_UNIT))))
+ {
+ /* This is a variable-sized object. Make space on the stack
+*************** expand_call (exp, target, ignore)
+*** 1087,1090 ****
+--- 1100,1104 ----
+
+ store_expr (args[i].tree_value, copy, 0);
++ is_const = 0;
+
+ args[i].tree_value = build1 (ADDR_EXPR,
+*************** expand_call (exp, target, ignore)
+*** 1363,1367 ****
+ /* Now we are about to start emitting insns that can be deleted
+ if a libcall is deleted. */
+! if (is_const)
+ start_sequence ();
+
+--- 1377,1381 ----
+ /* Now we are about to start emitting insns that can be deleted
+ if a libcall is deleted. */
+! if (is_const || is_malloc)
+ start_sequence ();
+
+*************** expand_call (exp, target, ignore)
+*** 1951,1954 ****
+--- 1965,1982 ----
+ end_sequence ();
+ emit_insns (insns);
++ }
++ else if (is_malloc)
++ {
++ rtx temp = gen_reg_rtx (GET_MODE (valreg));
++ rtx last, insns;
++
++ emit_move_insn (temp, valreg);
++ last = get_last_insn ();
++ REG_NOTES (last) =
++ gen_rtx (EXPR_LIST, REG_NOALIAS, temp, REG_NOTES (last));
++ insns = get_insns ();
++ end_sequence ();
++ emit_insns (insns);
++ valreg = temp;
+ }
+
+diff -rcp2N gcc-2.7.2.3/cccp.c gcc-2.7.2.3.f.1/cccp.c
+*** gcc-2.7.2.3/cccp.c Thu Oct 26 22:07:26 1995
+--- gcc-2.7.2.3.f.1/cccp.c Sun Aug 10 22:45:53 1997
+*************** initialize_builtins (inp, outp)
+*** 9626,9629 ****
+--- 9626,9630 ----
+ so that it is present only when truly compiling with GNU C. */
+ /* install ((U_CHAR *) "__GNUC__", -1, T_CONST, "2", -1); */
++ install ((U_CHAR *) "__HAVE_BUILTIN_SETJMP__", -1, T_CONST, "1", -1);
+
+ if (debug_output)
+diff -rcp2N gcc-2.7.2.3/combine.c gcc-2.7.2.3.f.1/combine.c
+*** gcc-2.7.2.3/combine.c Sun Nov 26 19:32:07 1995
+--- gcc-2.7.2.3.f.1/combine.c Fri Aug 29 07:52:16 1997
+*************** try_combine (i3, i2, i1)
+*** 2011,2016 ****
+ XVECEXP (newpat, 0, 1)))
+ {
+! newi2pat = XVECEXP (newpat, 0, 1);
+! newpat = XVECEXP (newpat, 0, 0);
+
+ i2_code_number
+--- 2011,2029 ----
+ XVECEXP (newpat, 0, 1)))
+ {
+! /* Normally, it doesn't matter which of the two is done first,
+! but it does if one references cc0. In that case, it has to
+! be first. */
+! #ifdef HAVE_cc0
+! if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
+! {
+! newi2pat = XVECEXP (newpat, 0, 0);
+! newpat = XVECEXP (newpat, 0, 1);
+! }
+! else
+! #endif
+! {
+! newi2pat = XVECEXP (newpat, 0, 1);
+! newpat = XVECEXP (newpat, 0, 0);
+! }
+
+ i2_code_number
+*************** simplify_rtx (x, op0_mode, last, in_dest
+*** 3278,3282 ****
+ if (CONSTANT_P (SUBREG_REG (x)) && op0_mode != VOIDmode
+ && GET_MODE_SIZE (mode) == UNITS_PER_WORD
+! && GET_MODE_SIZE (op0_mode) < UNITS_PER_WORD
+ && GET_MODE_CLASS (mode) == MODE_INT)
+ {
+--- 3291,3295 ----
+ if (CONSTANT_P (SUBREG_REG (x)) && op0_mode != VOIDmode
+ && GET_MODE_SIZE (mode) == UNITS_PER_WORD
+! && GET_MODE_SIZE (op0_mode) > UNITS_PER_WORD
+ && GET_MODE_CLASS (mode) == MODE_INT)
+ {
+*************** simplify_rtx (x, op0_mode, last, in_dest
+*** 3290,3295 ****
+ take the low bits. On a little-endian machine, that's
+ always valid. On a big-endian machine, it's valid
+! only if the constant's mode fits in one word. */
+! if (CONSTANT_P (SUBREG_REG (x)) && subreg_lowpart_p (x)
+ && GET_MODE_SIZE (mode) < GET_MODE_SIZE (op0_mode)
+ && (! WORDS_BIG_ENDIAN
+--- 3303,3316 ----
+ take the low bits. On a little-endian machine, that's
+ always valid. On a big-endian machine, it's valid
+! only if the constant's mode fits in one word. Note that we
+! cannot use subreg_lowpart_p since we SUBREG_REG may be VOIDmode. */
+! if (CONSTANT_P (SUBREG_REG (x))
+! && ((GET_MODE_SIZE (op0_mode) <= UNITS_PER_WORD
+! || ! WORDS_BIG_ENDIAN)
+! ? SUBREG_WORD (x) == 0
+! : (SUBREG_WORD (x)
+! == ((GET_MODE_SIZE (op0_mode)
+! - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD))
+! / UNITS_PER_WORD)))
+ && GET_MODE_SIZE (mode) < GET_MODE_SIZE (op0_mode)
+ && (! WORDS_BIG_ENDIAN
+*************** num_sign_bit_copies (x, mode)
+*** 7326,7329 ****
+--- 7347,7356 ----
+
+ case NEG:
++ while (GET_MODE (XEXP (x, 0)) == GET_MODE (x)
++ && GET_CODE (XEXP (x, 0)) == NEG
++ && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
++ && GET_CODE (XEXP (XEXP (x, 0), 0)) == NEG)
++ x = XEXP (XEXP (x, 0), 0); /* Speed up 961126-1.c */
++
+ /* In general, this subtracts one sign bit copy. But if the value
+ is known to be positive, the number of sign bit copies is the
+*************** move_deaths (x, from_cuid, to_insn, pnot
+*** 10421,10425 ****
+ if (note != 0 && regno < FIRST_PSEUDO_REGISTER
+ && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
+! != GET_MODE_SIZE (GET_MODE (x))))
+ {
+ int deadregno = REGNO (XEXP (note, 0));
+--- 10448,10452 ----
+ if (note != 0 && regno < FIRST_PSEUDO_REGISTER
+ && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
+! > GET_MODE_SIZE (GET_MODE (x))))
+ {
+ int deadregno = REGNO (XEXP (note, 0));
+*************** move_deaths (x, from_cuid, to_insn, pnot
+*** 10437,10452 ****
+ REG_NOTES (where_dead));
+ }
+! /* If we didn't find any note, and we have a multi-reg hard
+ register, then to be safe we must check for REG_DEAD notes
+ for each register other than the first. They could have
+ their own REG_DEAD notes lying around. */
+! else if (note == 0 && regno < FIRST_PSEUDO_REGISTER
+ && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1)
+ {
+ int ourend = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
+! int i;
+ rtx oldnotes = 0;
+
+! for (i = regno + 1; i < ourend; i++)
+ move_deaths (gen_rtx (REG, reg_raw_mode[i], i),
+ from_cuid, to_insn, &oldnotes);
+--- 10464,10489 ----
+ REG_NOTES (where_dead));
+ }
+! /* If we didn't find any note, or if we found a REG_DEAD note that
+! covers only part of the given reg, and we have a multi-reg hard
+ register, then to be safe we must check for REG_DEAD notes
+ for each register other than the first. They could have
+ their own REG_DEAD notes lying around. */
+! else if ((note == 0
+! || (note != 0
+! && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
+! < GET_MODE_SIZE (GET_MODE (x)))))
+! && regno < FIRST_PSEUDO_REGISTER
+ && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1)
+ {
+ int ourend = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
+! int i, offset;
+ rtx oldnotes = 0;
+
+! if (note)
+! offset = HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0)));
+! else
+! offset = 1;
+!
+! for (i = regno + offset; i < ourend; i++)
+ move_deaths (gen_rtx (REG, reg_raw_mode[i], i),
+ from_cuid, to_insn, &oldnotes);
+*************** distribute_notes (notes, from_insn, i3,
+*** 10648,10651 ****
+--- 10685,10689 ----
+ case REG_EQUIV:
+ case REG_NONNEG:
++ case REG_NOALIAS:
+ /* These notes say something about results of an insn. We can
+ only support them if they used to be on I3 in which case they
+diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.c gcc-2.7.2.3.f.1/config/alpha/alpha.c
+*** gcc-2.7.2.3/config/alpha/alpha.c Sat Jun 29 16:26:53 1996
+--- gcc-2.7.2.3.f.1/config/alpha/alpha.c Fri Aug 29 07:51:37 1997
+*************** extern int rtx_equal_function_value_matt
+*** 64,67 ****
+--- 64,69 ----
+ /* Declarations of static functions. */
+ static void alpha_set_memflags_1 PROTO((rtx, int, int, int));
++ static rtx alpha_emit_set_const_1 PROTO((rtx, enum machine_mode,
++ HOST_WIDE_INT, int));
+ static void add_long_const PROTO((FILE *, HOST_WIDE_INT, int, int, int));
+ \f
+*************** alpha_emit_set_const (target, mode, c, n
+*** 670,673 ****
+--- 672,695 ----
+ int n;
+ {
++ rtx pat;
++ int i;
++
++ /* Try 1 insn, then 2, then up to N. */
++ for (i = 1; i <= n; i++)
++ if ((pat = alpha_emit_set_const_1 (target, mode, c, i)) != 0)
++ return pat;
++
++ return 0;
++ }
++
++ /* Internal routine for the above to check for N or below insns. */
++
++ static rtx
++ alpha_emit_set_const_1 (target, mode, c, n)
++ rtx target;
++ enum machine_mode mode;
++ HOST_WIDE_INT c;
++ int n;
++ {
+ HOST_WIDE_INT new = c;
+ int i, bits;
+*************** alpha_emit_set_const (target, mode, c, n
+*** 714,723 ****
+ if (c == low || (low == 0 && extra == 0))
+ return copy_to_suggested_reg (GEN_INT (c), target, mode);
+! else if (n >= 2 + (extra != 0)
+! /* We can't do this when SImode if HIGH required adjustment.
+! This is because the code relies on an implicit overflow
+! which is invisible to the RTL. We can thus get incorrect
+! code if the two ldah instructions are combined. */
+! && ! (mode == SImode && extra != 0))
+ {
+ temp = copy_to_suggested_reg (GEN_INT (low), subtarget, mode);
+--- 736,740 ----
+ if (c == low || (low == 0 && extra == 0))
+ return copy_to_suggested_reg (GEN_INT (c), target, mode);
+! else if (n >= 2 + (extra != 0))
+ {
+ temp = copy_to_suggested_reg (GEN_INT (low), subtarget, mode);
+*************** direct_return ()
+*** 1239,1243 ****
+ cross-compiler. Otherwise, use the versions in /usr/include/stamp.h. */
+
+! #if !defined(CROSS_COMPILE) && !defined(_WIN32)
+ #include <stamp.h>
+ #endif
+--- 1256,1260 ----
+ cross-compiler. Otherwise, use the versions in /usr/include/stamp.h. */
+
+! #if !defined(CROSS_COMPILE) && !defined(_WIN32) && !defined(__linux__)
+ #include <stamp.h>
+ #endif
+*************** output_prolog (file, size)
+*** 1370,1373 ****
+--- 1387,1395 ----
+
+ alpha_function_needs_gp = 0;
++ #ifdef __linux__
++ if(profile_flag) {
++ alpha_function_needs_gp = 1;
++ }
++ #endif
+ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+ if ((GET_CODE (insn) == CALL_INSN)
+diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.h gcc-2.7.2.3.f.1/config/alpha/alpha.h
+*** gcc-2.7.2.3/config/alpha/alpha.h Sat Jun 29 16:27:31 1996
+--- gcc-2.7.2.3.f.1/config/alpha/alpha.h Fri Aug 29 07:52:06 1997
+*************** extern int target_flags;
+*** 112,116 ****
+--- 112,118 ----
+ {"", TARGET_DEFAULT | TARGET_CPU_DEFAULT} }
+
++ #ifndef TARGET_DEFAULT
+ #define TARGET_DEFAULT 3
++ #endif
+
+ #ifndef TARGET_CPU_DEFAULT
+*************** extern int target_flags;
+*** 253,256 ****
+--- 255,261 ----
+ #define BIGGEST_ALIGNMENT 64
+
++ /* For atomic access to objects, must have at least 32-bit alignment. */
++ #define MINIMUM_ATOMIC_ALIGNMENT 32
++
+ /* Make strings word-aligned so strcpy from constants will be faster. */
+ #define CONSTANT_ALIGNMENT(EXP, ALIGN) \
+*************** enum reg_class { NO_REGS, GENERAL_REGS,
+*** 664,667 ****
+--- 669,675 ----
+ On Alpha, don't define this because there are no push insns. */
+ /* #define PUSH_ROUNDING(BYTES) */
++
++ /* Define this to be nonzero if stack checking is built into the ABI. */
++ #define STACK_CHECK_BUILTIN 1
+
+ /* Define this if the maximum size of all the outgoing args is to be
+diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.md gcc-2.7.2.3.f.1/config/alpha/alpha.md
+*** gcc-2.7.2.3/config/alpha/alpha.md Fri Oct 27 10:49:59 1995
+--- gcc-2.7.2.3.f.1/config/alpha/alpha.md Fri Jul 11 00:08:48 1997
+***************
+*** 1746,1752 ****
+ (if_then_else:DF
+ (match_operator 3 "signed_comparison_operator"
+! [(match_operand:DF 1 "reg_or_fp0_operand" "fG,fG")
+ (match_operand:DF 2 "fp0_operand" "G,G")])
+! (float_extend:DF (match_operand:SF 4 "reg_or_fp0_operand" "fG,0"))
+ (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))]
+ "TARGET_FP"
+--- 1746,1752 ----
+ (if_then_else:DF
+ (match_operator 3 "signed_comparison_operator"
+! [(match_operand:DF 4 "reg_or_fp0_operand" "fG,fG")
+ (match_operand:DF 2 "fp0_operand" "G,G")])
+! (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG,0"))
+ (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))]
+ "TARGET_FP"
+diff -rcp2N gcc-2.7.2.3/config/alpha/elf.h gcc-2.7.2.3.f.1/config/alpha/elf.h
+*** gcc-2.7.2.3/config/alpha/elf.h Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/config/alpha/elf.h Fri Jul 11 00:08:49 1997
+***************
+*** 0 ****
+--- 1,522 ----
++ /* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF.
++ Copyright (C) 1996 Free Software Foundation, Inc.
++ Contributed by Richard Henderson (rth@tamu.edu).
++
++ This file is part of GNU CC.
++
++ GNU CC is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2, or (at your option)
++ any later version.
++
++ GNU CC is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with GNU CC; see the file COPYING. If not, write to
++ the Free Software Foundation, 59 Temple Place - Suite 330,
++ Boston, MA 02111-1307, USA. */
++
++ /* This is used on Alpha platforms that use the ELF format.
++ Currently only Linux uses this. */
++
++ #include "alpha/linux.h"
++
++ #undef TARGET_VERSION
++ #define TARGET_VERSION fprintf (stderr, " (Alpha Linux/ELF)");
++
++ #undef OBJECT_FORMAT_COFF
++ #undef EXTENDED_COFF
++ #define OBJECT_FORMAT_ELF
++
++ #define SDB_DEBUGGING_INFO
++
++ #undef ASM_FINAL_SPEC
++
++ #undef CPP_PREDEFINES
++ #define CPP_PREDEFINES "\
++ -D__alpha -D__alpha__ -D__linux__ -D__linux -D_LONGLONG -Dlinux -Dunix \
++ -Asystem(linux) -Acpu(alpha) -Amachine(alpha) -D__ELF__"
++
++ #undef LINK_SPEC
++ #define LINK_SPEC "-m elf64alpha -G 8 %{O*:-O3} %{!O*:-O1} \
++ %{shared:-shared} \
++ %{!shared: \
++ %{!static: \
++ %{rdynamic:-export-dynamic} \
++ %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++ %{static:-static}}"
++
++ /* Output at beginning of assembler file. */
++
++ #undef ASM_FILE_START
++ #define ASM_FILE_START(FILE) \
++ { \
++ alpha_write_verstamp (FILE); \
++ output_file_directive (FILE, main_input_filename); \
++ fprintf (FILE, "\t.version\t\"01.01\"\n"); \
++ fprintf (FILE, "\t.set noat\n"); \
++ }
++
++ #define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \
++ alpha_output_lineno (STREAM, LINE)
++ extern void alpha_output_lineno ();
++
++ extern void output_file_directive ();
++
++ /* Attach a special .ident directive to the end of the file to identify
++ the version of GCC which compiled this code. The format of the
++ .ident string is patterned after the ones produced by native svr4
++ C compilers. */
++
++ #define IDENT_ASM_OP ".ident"
++
++ #ifdef IDENTIFY_WITH_IDENT
++ #define ASM_IDENTIFY_GCC(FILE) /* nothing */
++ #define ASM_IDENTIFY_LANGUAGE(FILE) \
++ fprintf(FILE, "\t%s \"GCC (%s) %s\"\n", IDENT_ASM_OP, \
++ lang_identify(), version_string)
++ #else
++ #define ASM_FILE_END(FILE) \
++ do { \
++ fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n", \
++ IDENT_ASM_OP, version_string); \
++ } while (0)
++ #endif
++
++ /* Allow #sccs in preprocessor. */
++
++ #define SCCS_DIRECTIVE
++
++ /* Output #ident as a .ident. */
++
++ #define ASM_OUTPUT_IDENT(FILE, NAME) \
++ fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
++
++ /* This is how to allocate empty space in some section. The .zero
++ pseudo-op is used for this on most svr4 assemblers. */
++
++ #define SKIP_ASM_OP ".zero"
++
++ #undef ASM_OUTPUT_SKIP
++ #define ASM_OUTPUT_SKIP(FILE,SIZE) \
++ fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
++
++ /* Output the label which precedes a jumptable. Note that for all svr4
++ systems where we actually generate jumptables (which is to say every
++ svr4 target except i386, where we use casesi instead) we put the jump-
++ tables into the .rodata section and since other stuff could have been
++ put into the .rodata section prior to any given jumptable, we have to
++ make sure that the location counter for the .rodata section gets pro-
++ perly re-aligned prior to the actual beginning of the jump table. */
++
++ #define ALIGN_ASM_OP ".align"
++
++ #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
++ #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
++ ASM_OUTPUT_ALIGN ((FILE), 2);
++ #endif
++
++ #undef ASM_OUTPUT_CASE_LABEL
++ #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \
++ do { \
++ ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \
++ ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
++ } while (0)
++
++ /* The standard SVR4 assembler seems to require that certain builtin
++ library routines (e.g. .udiv) be explicitly declared as .globl
++ in each assembly file where they are referenced. */
++
++ #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
++ ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
++
++ /* This says how to output assembler code to declare an
++ uninitialized external linkage data object. Under SVR4,
++ the linker seems to want the alignment of data objects
++ to depend on their types. We do exactly that here. */
++
++ #define COMMON_ASM_OP ".comm"
++
++ #undef ASM_OUTPUT_ALIGNED_COMMON
++ #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
++ do { \
++ fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \
++ assemble_name ((FILE), (NAME)); \
++ fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
++ } while (0)
++
++ /* This says how to output assembler code to declare an
++ uninitialized internal linkage data object. Under SVR4,
++ the linker seems to want the alignment of data objects
++ to depend on their types. We do exactly that here. */
++
++ #define LOCAL_ASM_OP ".local"
++
++ #undef ASM_OUTPUT_ALIGNED_LOCAL
++ #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
++ do { \
++ fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \
++ assemble_name ((FILE), (NAME)); \
++ fprintf ((FILE), "\n"); \
++ ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
++ } while (0)
++
++ /* This is the pseudo-op used to generate a 64-bit word of data with a
++ specific value in some section. */
++
++ #define INT_ASM_OP ".quad"
++
++ /* This is the pseudo-op used to generate a contiguous sequence of byte
++ values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
++ AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */
++
++ #undef ASCII_DATA_ASM_OP
++ #define ASCII_DATA_ASM_OP ".ascii"
++
++ /* Support const sections and the ctors and dtors sections for g++.
++ Note that there appears to be two different ways to support const
++ sections at the moment. You can either #define the symbol
++ READONLY_DATA_SECTION (giving it some code which switches to the
++ readonly data section) or else you can #define the symbols
++ EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
++ SELECT_RTX_SECTION. We do both here just to be on the safe side. */
++
++ #define USE_CONST_SECTION 1
++
++ #define CONST_SECTION_ASM_OP ".section\t.rodata"
++
++ /* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
++
++ Note that we want to give these sections the SHF_WRITE attribute
++ because these sections will actually contain data (i.e. tables of
++ addresses of functions in the current root executable or shared library
++ file) and, in the case of a shared library, the relocatable addresses
++ will have to be properly resolved/relocated (and then written into) by
++ the dynamic linker when it actually attaches the given shared library
++ to the executing process. (Note that on SVR4, you may wish to use the
++ `-z text' option to the ELF linker, when building a shared library, as
++ an additional check that you are doing everything right. But if you do
++ use the `-z text' option when building a shared library, you will get
++ errors unless the .ctors and .dtors sections are marked as writable
++ via the SHF_WRITE attribute.) */
++
++ #define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\""
++ #define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\""
++
++ /* On svr4, we *do* have support for the .init and .fini sections, and we
++ can put stuff in there to be executed before and after `main'. We let
++ crtstuff.c and other files know this by defining the following symbols.
++ The definitions say how to change sections to the .init and .fini
++ sections. This is the same for all known svr4 assemblers. */
++
++ #define INIT_SECTION_ASM_OP ".section\t.init"
++ #define FINI_SECTION_ASM_OP ".section\t.fini"
++
++ /* Support non-common, uninitialized data in the .bss section. */
++
++ #define BSS_SECTION_ASM_OP ".section\t.bss"
++
++ /* A default list of other sections which we might be "in" at any given
++ time. For targets that use additional sections (e.g. .tdesc) you
++ should override this definition in the target-specific file which
++ includes this file. */
++
++ #undef EXTRA_SECTIONS
++ #define EXTRA_SECTIONS in_const, in_ctors, in_dtors, in_bss
++
++ /* A default list of extra section function definitions. For targets
++ that use additional sections (e.g. .tdesc) you should override this
++ definition in the target-specific file which includes this file. */
++
++ #undef EXTRA_SECTION_FUNCTIONS
++ #define EXTRA_SECTION_FUNCTIONS \
++ CONST_SECTION_FUNCTION \
++ CTORS_SECTION_FUNCTION \
++ DTORS_SECTION_FUNCTION \
++ BSS_SECTION_FUNCTION
++
++ #undef READONLY_DATA_SECTION
++ #define READONLY_DATA_SECTION() const_section ()
++
++ extern void text_section ();
++
++ #define CONST_SECTION_FUNCTION \
++ void \
++ const_section () \
++ { \
++ if (!USE_CONST_SECTION) \
++ text_section(); \
++ else if (in_section != in_const) \
++ { \
++ fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
++ in_section = in_const; \
++ } \
++ }
++
++ #define CTORS_SECTION_FUNCTION \
++ void \
++ ctors_section () \
++ { \
++ if (in_section != in_ctors) \
++ { \
++ fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \
++ in_section = in_ctors; \
++ } \
++ }
++
++ #define DTORS_SECTION_FUNCTION \
++ void \
++ dtors_section () \
++ { \
++ if (in_section != in_dtors) \
++ { \
++ fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \
++ in_section = in_dtors; \
++ } \
++ }
++
++ #define BSS_SECTION_FUNCTION \
++ void \
++ bss_section () \
++ { \
++ if (in_section != in_bss) \
++ { \
++ fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP); \
++ in_section = in_bss; \
++ } \
++ }
++
++
++ /* Switch into a generic section.
++ This is currently only used to support section attributes.
++
++ We make the section read-only and executable for a function decl,
++ read-only for a const data decl, and writable for a non-const data decl. */
++ #define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME) \
++ fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \
++ (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
++ (DECL) && TREE_READONLY (DECL) ? "a" : "aw")
++
++
++ /* A C statement (sans semicolon) to output an element in the table of
++ global constructors. */
++ #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
++ do { \
++ ctors_section (); \
++ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ fprintf (FILE, "\n"); \
++ } while (0)
++
++ /* A C statement (sans semicolon) to output an element in the table of
++ global destructors. */
++ #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
++ do { \
++ dtors_section (); \
++ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ fprintf (FILE, "\n"); \
++ } while (0)
++
++ /* A C statement or statements to switch to the appropriate
++ section for output of DECL. DECL is either a `VAR_DECL' node
++ or a constant of some sort. RELOC indicates whether forming
++ the initial value of DECL requires link-time relocations. */
++
++ #define SELECT_SECTION(DECL,RELOC) \
++ { \
++ if (TREE_CODE (DECL) == STRING_CST) \
++ { \
++ if (! flag_writable_strings) \
++ const_section (); \
++ else \
++ data_section (); \
++ } \
++ else if (TREE_CODE (DECL) == VAR_DECL) \
++ { \
++ if ((flag_pic && RELOC) \
++ || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
++ || !DECL_INITIAL (DECL) \
++ || (DECL_INITIAL (DECL) != error_mark_node \
++ && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
++ { \
++ if (DECL_COMMON (DECL) \
++ && !DECL_INITIAL (DECL)) \
++ /* || DECL_INITIAL (DECL) == error_mark_node)) */ \
++ bss_section(); \
++ else \
++ data_section (); \
++ } \
++ else \
++ const_section (); \
++ } \
++ else \
++ const_section (); \
++ }
++
++ /* A C statement or statements to switch to the appropriate
++ section for output of RTX in mode MODE. RTX is some kind
++ of constant in RTL. The argument MODE is redundant except
++ in the case of a `const_int' rtx. Currently, these always
++ go into the const section. */
++
++ #undef SELECT_RTX_SECTION
++ #define SELECT_RTX_SECTION(MODE,RTX) const_section()
++
++ /* Define the strings used for the special svr4 .type and .size directives.
++ These strings generally do not vary from one system running svr4 to
++ another, but if a given system (e.g. m88k running svr) needs to use
++ different pseudo-op names for these, they may be overridden in the
++ file which includes this one. */
++
++ #define TYPE_ASM_OP ".type"
++ #define SIZE_ASM_OP ".size"
++
++ /* This is how we tell the assembler that a symbol is weak. */
++
++ #define ASM_WEAKEN_LABEL(FILE,NAME) \
++ do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
++ fputc ('\n', FILE); } while (0)
++
++ /* This is how we tell the assembler that two symbols have the same value. */
++
++ #define ASM_OUTPUT_DEF(FILE,NAME1,NAME2) \
++ do { assemble_name(FILE, NAME1); \
++ fputs(" = ", FILE); \
++ assemble_name(FILE, NAME2); \
++ fputc('\n', FILE); } while (0)
++
++ /* The following macro defines the format used to output the second
++ operand of the .type assembler directive. Different svr4 assemblers
++ expect various different forms for this operand. The one given here
++ is just a default. You may need to override it in your machine-
++ specific tm.h file (depending upon the particulars of your assembler). */
++
++ #define TYPE_OPERAND_FMT "@%s"
++
++ /* Write the extra assembler code needed to declare a function's result.
++ Most svr4 assemblers don't require any special declaration of the
++ result value, but there are exceptions. */
++
++ #ifndef ASM_DECLARE_RESULT
++ #define ASM_DECLARE_RESULT(FILE, RESULT)
++ #endif
++
++ /* These macros generate the special .type and .size directives which
++ are used to set the corresponding fields of the linker symbol table
++ entries in an ELF object file under SVR4. These macros also output
++ the starting labels for the relevant functions/objects. */
++
++ /* Write the extra assembler code needed to declare an object properly. */
++
++ #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
++ do { \
++ fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ putc (',', FILE); \
++ fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
++ putc ('\n', FILE); \
++ size_directive_output = 0; \
++ if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
++ { \
++ size_directive_output = 1; \
++ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
++ } \
++ ASM_OUTPUT_LABEL(FILE, NAME); \
++ } while (0)
++
++ /* Output the size directive for a decl in rest_of_decl_compilation
++ in the case where we did not do so before the initializer.
++ Once we find the error_mark_node, we know that the value of
++ size_directive_output was set
++ by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
++
++ #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
++ do { \
++ char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
++ if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
++ && ! AT_END && TOP_LEVEL \
++ && DECL_INITIAL (DECL) == error_mark_node \
++ && !size_directive_output) \
++ { \
++ size_directive_output = 1; \
++ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
++ assemble_name (FILE, name); \
++ fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
++ } \
++ } while (0)
++
++ /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
++ ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table
++ corresponds to a particular byte value [0..255]. For any
++ given byte value, if the value in the corresponding table
++ position is zero, the given character can be output directly.
++ If the table value is 1, the byte must be output as a \ooo
++ octal escape. If the tables value is anything else, then the
++ byte value should be output as a \ followed by the value
++ in the table. Note that we can use standard UN*X escape
++ sequences for many control characters, but we don't use
++ \a to represent BEL because some svr4 assemblers (e.g. on
++ the i386) don't know about that. Also, we don't use \v
++ since some versions of gas, such as 2.2 did not accept it. */
++
++ #define ESCAPES \
++ "\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
++ \0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
++ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
++ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
++ \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
++ \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
++ \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
++ \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
++
++ /* Some svr4 assemblers have a limit on the number of characters which
++ can appear in the operand of a .string directive. If your assembler
++ has such a limitation, you should define STRING_LIMIT to reflect that
++ limit. Note that at least some svr4 assemblers have a limit on the
++ actual number of bytes in the double-quoted string, and that they
++ count each character in an escape sequence as one byte. Thus, an
++ escape sequence like \377 would count as four bytes.
++
++ If your target assembler doesn't support the .string directive, you
++ should define this to zero.
++ */
++
++ #define STRING_LIMIT ((unsigned) 256)
++
++ #define STRING_ASM_OP ".string"
++
++ /*
++ * We always use gas here, so we don't worry about ECOFF assembler problems.
++ */
++ #undef TARGET_GAS
++ #define TARGET_GAS (1)
++
++ #undef PREFERRED_DEBUGGING_TYPE
++ #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
++
++ /* Provide a STARTFILE_SPEC appropriate for Linux. Here we add
++ the Linux magical crtbegin.o file (see crtstuff.c) which
++ provides part of the support for getting C++ file-scope static
++ object constructed before entering `main'. */
++
++ #undef STARTFILE_SPEC
++ #define STARTFILE_SPEC \
++ "%{!shared: \
++ %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\
++ crti.o%s crtbegin.o%s"
++
++ /* Provide a ENDFILE_SPEC appropriate for Linux. Here we tack on
++ the Linux magical crtend.o file (see crtstuff.c) which
++ provides part of the support for getting C++ file-scope static
++ object constructed before entering `main', followed by a normal
++ Linux "finalizer" file, `crtn.o'. */
++
++ #undef ENDFILE_SPEC
++ #define ENDFILE_SPEC \
++ "crtend.o%s crtn.o%s"
+diff -rcp2N gcc-2.7.2.3/config/alpha/linux.h gcc-2.7.2.3.f.1/config/alpha/linux.h
+*** gcc-2.7.2.3/config/alpha/linux.h Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/config/alpha/linux.h Fri Jul 11 00:08:49 1997
+***************
+*** 0 ****
+--- 1,72 ----
++ /* Definitions of target machine for GNU compiler, for Alpha Linux,
++ using ECOFF.
++ Copyright (C) 1995 Free Software Foundation, Inc.
++ Contributed by Bob Manson.
++ Derived from work contributed by Cygnus Support,
++ (c) 1993 Free Software Foundation.
++
++ This file is part of GNU CC.
++
++ GNU CC is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2, or (at your option)
++ any later version.
++
++ GNU CC is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with GNU CC; see the file COPYING. If not, write to
++ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
++
++ #define TARGET_DEFAULT (3 | MASK_GAS)
++
++ #include "alpha/alpha.h"
++
++ #undef TARGET_VERSION
++ #define TARGET_VERSION fprintf (stderr, " (Linux/Alpha)");
++
++ #undef CPP_PREDEFINES
++ #define CPP_PREDEFINES "\
++ -D__alpha -D__alpha__ -D__linux__ -D__linux -D_LONGLONG -Dlinux -Dunix \
++ -Asystem(linux) -Acpu(alpha) -Amachine(alpha)"
++
++ /* We don't actually need any of these; the MD_ vars are ignored
++ anyway for cross-compilers, and the other specs won't get picked up
++ 'coz the user is supposed to do ld -r (hmm, perhaps that should be
++ the default). In any case, setting them thus will catch some
++ common user errors. */
++
++ #undef MD_EXEC_PREFIX
++ #undef MD_STARTFILE_PREFIX
++
++ #undef LIB_SPEC
++ #define LIB_SPEC "%{pg:-lgmon} %{pg:-lc_p} %{!pg:-lc}"
++
++ #undef LINK_SPEC
++ #define LINK_SPEC \
++ "-G 8 %{O*:-O3} %{!O*:-O1}"
++
++ #undef ASM_SPEC
++ #define ASM_SPEC "-nocpp"
++
++ /* Can't do stabs */
++ #undef SDB_DEBUGGING_INFO
++
++ /* Prefer dbx. */
++ #undef PREFERRED_DEBUGGING_TYPE
++ #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
++
++ #undef FUNCTION_PROFILER
++
++ #define FUNCTION_PROFILER(FILE, LABELNO) \
++ do { \
++ fputs ("\tlda $27,_mcount\n", (FILE)); \
++ fputs ("\tjsr $26,($27),_mcount\n", (FILE)); \
++ fputs ("\tldgp $29,0($26)\n", (FILE)); \
++ } while (0);
++
++ /* Generate calls to memcpy, etc., not bcopy, etc. */
++ #define TARGET_MEM_FUNCTIONS
+diff -rcp2N gcc-2.7.2.3/config/alpha/t-linux gcc-2.7.2.3.f.1/config/alpha/t-linux
+*** gcc-2.7.2.3/config/alpha/t-linux Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/config/alpha/t-linux Fri Jul 11 00:08:49 1997
+***************
+*** 0 ****
+--- 1,3 ----
++ # Our header files are supposed to be correct, nein?
++ FIXINCLUDES =
++ STMP_FIXPROTO =
+diff -rcp2N gcc-2.7.2.3/config/alpha/x-linux gcc-2.7.2.3.f.1/config/alpha/x-linux
+*** gcc-2.7.2.3/config/alpha/x-linux Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/config/alpha/x-linux Fri Jul 11 00:08:49 1997
+***************
+*** 0 ****
+--- 1 ----
++ CLIB=-lbfd -liberty
+diff -rcp2N gcc-2.7.2.3/config/alpha/xm-alpha.h gcc-2.7.2.3.f.1/config/alpha/xm-alpha.h
+*** gcc-2.7.2.3/config/alpha/xm-alpha.h Thu Aug 31 21:52:27 1995
+--- gcc-2.7.2.3.f.1/config/alpha/xm-alpha.h Fri Jul 11 00:08:49 1997
+*************** Boston, MA 02111-1307, USA. */
+*** 46,51 ****
+--- 46,53 ----
+ #include <alloca.h>
+ #else
++ #ifndef alloca
+ extern void *alloca ();
+ #endif
++ #endif
+
+ /* The host compiler has problems with enum bitfields since it makes
+*************** extern void *malloc (), *realloc (), *ca
+*** 68,72 ****
+--- 70,76 ----
+ /* OSF/1 has vprintf. */
+
++ #ifndef linux /* 1996/02/22 mauro@craftwork.com -- unreliable with Linux */
+ #define HAVE_VPRINTF
++ #endif
+
+ /* OSF/1 has putenv. */
+diff -rcp2N gcc-2.7.2.3/config/alpha/xm-linux.h gcc-2.7.2.3.f.1/config/alpha/xm-linux.h
+*** gcc-2.7.2.3/config/alpha/xm-linux.h Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/config/alpha/xm-linux.h Fri Jul 11 00:08:49 1997
+***************
+*** 0 ****
+--- 1,10 ----
++ #ifndef _XM_LINUX_H
++ #define _XM_LINUX_H
++
++ #include "xm-alpha.h"
++
++ #define HAVE_STRERROR
++
++ #define DONT_DECLARE_SYS_SIGLIST
++ #define USE_BFD
++ #endif
+diff -rcp2N gcc-2.7.2.3/config/i386/i386.c gcc-2.7.2.3.f.1/config/i386/i386.c
+*** gcc-2.7.2.3/config/i386/i386.c Sun Oct 22 11:13:21 1995
+--- gcc-2.7.2.3.f.1/config/i386/i386.c Sun Aug 10 22:46:09 1997
+*************** standard_80387_constant_p (x)
+*** 1290,1294 ****
+ set_float_handler (handler);
+ REAL_VALUE_FROM_CONST_DOUBLE (d, x);
+! is0 = REAL_VALUES_EQUAL (d, dconst0);
+ is1 = REAL_VALUES_EQUAL (d, dconst1);
+ set_float_handler (NULL_PTR);
+--- 1290,1294 ----
+ set_float_handler (handler);
+ REAL_VALUE_FROM_CONST_DOUBLE (d, x);
+! is0 = REAL_VALUES_EQUAL (d, dconst0) && !REAL_VALUE_MINUS_ZERO (d);
+ is1 = REAL_VALUES_EQUAL (d, dconst1);
+ set_float_handler (NULL_PTR);
+diff -rcp2N gcc-2.7.2.3/config/i386/i386.h gcc-2.7.2.3.f.1/config/i386/i386.h
+*** gcc-2.7.2.3/config/i386/i386.h Fri Sep 22 22:42:57 1995
+--- gcc-2.7.2.3.f.1/config/i386/i386.h Sun Aug 24 10:33:50 1997
+*************** extern int target_flags;
+*** 245,249 ****
+
+ /* Boundary (in *bits*) on which stack pointer should be aligned. */
+! #define STACK_BOUNDARY 32
+
+ /* Allocation boundary (in *bits*) for the code of a function.
+--- 245,249 ----
+
+ /* Boundary (in *bits*) on which stack pointer should be aligned. */
+! #define STACK_BOUNDARY BIGGEST_ALIGNMENT
+
+ /* Allocation boundary (in *bits*) for the code of a function.
+diff -rcp2N gcc-2.7.2.3/config/m68k/m68k.md gcc-2.7.2.3.f.1/config/m68k/m68k.md
+*** gcc-2.7.2.3/config/m68k/m68k.md Sun Aug 31 09:39:43 1997
+--- gcc-2.7.2.3.f.1/config/m68k/m68k.md Sun Aug 31 09:21:09 1997
+***************
+*** 288,292 ****
+ (match_operand:DI 0 "nonimmediate_operand" "d"))
+ (clobber (match_dup 1))])]
+! ""
+ "operands[1] = gen_reg_rtx (DImode);")
+
+--- 288,292 ----
+ (match_operand:DI 0 "nonimmediate_operand" "d"))
+ (clobber (match_dup 1))])]
+! "0"
+ "operands[1] = gen_reg_rtx (DImode);")
+
+***************
+*** 411,415 ****
+ (match_operand:DI 1 "general_operand" "")))
+ (clobber (match_dup 2))])]
+! ""
+ "operands[2] = gen_reg_rtx (DImode);")
+
+--- 411,415 ----
+ (match_operand:DI 1 "general_operand" "")))
+ (clobber (match_dup 2))])]
+! "0"
+ "operands[2] = gen_reg_rtx (DImode);")
+
+diff -rcp2N gcc-2.7.2.3/config/mips/mips.c gcc-2.7.2.3.f.1/config/mips/mips.c
+*** gcc-2.7.2.3/config/mips/mips.c Sat Jun 29 16:26:44 1996
+--- gcc-2.7.2.3.f.1/config/mips/mips.c Sun Aug 10 22:45:43 1997
+*************** expand_block_move (operands)
+*** 2360,2365 ****
+
+ else if (constp && bytes <= 2*MAX_MOVE_BYTES)
+! emit_insn (gen_movstrsi_internal (gen_rtx (MEM, BLKmode, dest_reg),
+! gen_rtx (MEM, BLKmode, src_reg),
+ bytes_rtx, align_rtx));
+
+--- 2360,2367 ----
+
+ else if (constp && bytes <= 2*MAX_MOVE_BYTES)
+! emit_insn (gen_movstrsi_internal (change_address (operands[0],
+! BLKmode, dest_reg),
+! change_address (orig_src, BLKmode,
+! src_reg),
+ bytes_rtx, align_rtx));
+
+diff -rcp2N gcc-2.7.2.3/config/mips/mips.h gcc-2.7.2.3.f.1/config/mips/mips.h
+*** gcc-2.7.2.3/config/mips/mips.h Thu Nov 9 16:23:09 1995
+--- gcc-2.7.2.3.f.1/config/mips/mips.h Sun Aug 10 22:46:44 1997
+*************** typedef struct mips_args {
+*** 2160,2170 ****
+ } \
+ \
+! /* Flush the instruction cache. */ \
+! /* ??? Are the modes right? Maybe they should depend on -mint64/-mlong64? */\
+ /* ??? Should check the return value for errors. */ \
+! emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "cacheflush"), \
+ 0, VOIDmode, 3, addr, Pmode, \
+ GEN_INT (TRAMPOLINE_SIZE), SImode, \
+! GEN_INT (1), SImode); \
+ }
+ \f
+--- 2160,2170 ----
+ } \
+ \
+! /* Flush both caches. We need to flush the data cache in case \
+! the system has a write-back cache. */ \
+ /* ??? Should check the return value for errors. */ \
+! emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "_flush_cache"), \
+ 0, VOIDmode, 3, addr, Pmode, \
+ GEN_INT (TRAMPOLINE_SIZE), SImode, \
+! GEN_INT (3), TYPE_MODE (integer_type_node)); \
+ }
+ \f
+*************** typedef struct mips_args {
+*** 2388,2392 ****
+ ((GET_CODE (X) != CONST_DOUBLE \
+ || mips_const_double_ok (X, GET_MODE (X))) \
+! && ! (GET_CODE (X) == CONST && ABI_64BIT))
+
+ /* A C compound statement that attempts to replace X with a valid
+--- 2388,2393 ----
+ ((GET_CODE (X) != CONST_DOUBLE \
+ || mips_const_double_ok (X, GET_MODE (X))) \
+! && ! (GET_CODE (X) == CONST \
+! && (ABI_64BIT || GET_CODE (XEXP (X, 0)) == MINUS)))
+
+ /* A C compound statement that attempts to replace X with a valid
+diff -rcp2N gcc-2.7.2.3/config/mips/sni-gas.h gcc-2.7.2.3.f.1/config/mips/sni-gas.h
+*** gcc-2.7.2.3/config/mips/sni-gas.h Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/config/mips/sni-gas.h Sun Aug 10 22:46:33 1997
+***************
+*** 0 ****
+--- 1,43 ----
++ #include "mips/sni-svr4.h"
++
++ /* Enable debugging. */
++ #define DBX_DEBUGGING_INFO
++ #define SDB_DEBUGGING_INFO
++ #define MIPS_DEBUGGING_INFO
++
++ #define DWARF_DEBUGGING_INFO
++ #undef PREFERRED_DEBUGGING_TYPE
++ #define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG
++
++ /* We need to use .esize and .etype instead of .size and .type to
++ avoid conflicting with ELF directives. These are only recognized
++ by gas, anyhow, not the native assembler. */
++ #undef PUT_SDB_SIZE
++ #define PUT_SDB_SIZE(a) \
++ do { \
++ extern FILE *asm_out_text_file; \
++ fprintf (asm_out_text_file, "\t.esize\t%d;", (a)); \
++ } while (0)
++
++ #undef PUT_SDB_TYPE
++ #define PUT_SDB_TYPE(a) \
++ do { \
++ extern FILE *asm_out_text_file; \
++ fprintf (asm_out_text_file, "\t.etype\t0x%x;", (a)); \
++ } while (0)
++
++
++ /* This is how to equate one symbol to another symbol. The syntax used is
++ `SYM1=SYM2'. Note that this is different from the way equates are done
++ with most svr4 assemblers, where the syntax is `.set SYM1,SYM2'. */
++
++ #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \
++ do { fprintf ((FILE), "\t"); \
++ assemble_name (FILE, LABEL1); \
++ fprintf (FILE, " = "); \
++ assemble_name (FILE, LABEL2); \
++ fprintf (FILE, "\n"); \
++ } while (0)
++
++
++
+diff -rcp2N gcc-2.7.2.3/config/mips/sni-svr4.h gcc-2.7.2.3.f.1/config/mips/sni-svr4.h
+*** gcc-2.7.2.3/config/mips/sni-svr4.h Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/config/mips/sni-svr4.h Sun Aug 10 22:46:33 1997
+***************
+*** 0 ****
+--- 1,103 ----
++ /* Definitions of target machine for GNU compiler. SNI SINIX version.
++ Copyright (C) 1996 Free Software Foundation, Inc.
++ Contributed by Marco Walther (Marco.Walther@mch.sni.de).
++
++ This file is part of GNU CC.
++
++ GNU CC is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2, or (at your option)
++ any later version.
++
++ GNU CC is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with GNU CC; see the file COPYING. If not, write to
++ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
++
++ #define MIPS_SVR4
++
++ #define CPP_PREDEFINES "\
++ -Dmips -Dunix -Dhost_mips -DMIPSEB -DR3000 -DSYSTYPE_SVR4 \
++ -D_mips -D_unix -D_host_mips -D_MIPSEB -D_R3000 -D_SYSTYPE_SVR4 \
++ -Asystem(unix) -Asystem(svr4) -Acpu(mips) -Amachine(mips)"
++
++ #define CPP_SPEC "\
++ %{.cc: -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS} \
++ %{.cxx: -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS} \
++ %{.C: -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS} \
++ %{.m: -D__LANGUAGE_OBJECTIVE_C -D_LANGUAGE_OBJECTIVE_C} \
++ %{.S: -D__LANGUAGE_ASSEMBLY -D_LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \
++ %{.s: -D__LANGUAGE_ASSEMBLY -D_LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \
++ %{!.S:%{!.s: -D__LANGUAGE_C -D_LANGUAGE_C %{!ansi:-DLANGUAGE_C}}} \
++ -D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int"
++
++ #define LINK_SPEC "\
++ %{G*} \
++ %{!mgas: \
++ %{dy} %{dn}}"
++
++ #define LIB_SPEC "\
++ %{p:-lprof1} \
++ %{!p:%{pg:-lprof1} \
++ %{!pg:-L/usr/ccs/lib/ -lc /usr/ccs/lib/crtn.o%s}}"
++
++ #define STARTFILE_SPEC "\
++ %{pg:gcrt0.o%s} \
++ %{!pg:%{p:mcrt0.o%s} \
++ %{!p:/usr/ccs/lib/crt1.o /usr/ccs/lib/crti.o /usr/ccs/lib/values-Xt.o%s}}"
++
++ /* Mips System V.4 doesn't have a getpagesize() function needed by the
++ trampoline code, so use the POSIX sysconf function to get it.
++ This is only done when compiling the trampoline code. */
++
++ #ifdef L_trampoline
++ #include <unistd.h>
++
++ #define getpagesize() sysconf(_SC_PAGE_SIZE)
++ #endif /* L_trampoline */
++
++ /* Use atexit for static constructors/destructors, instead of defining
++ our own exit function. */
++ #define HAVE_ATEXIT
++
++ /* Generate calls to memcpy, etc., not bcopy, etc. */
++ #define TARGET_MEM_FUNCTIONS
++
++ #define OBJECT_FORMAT_ELF
++
++ #define TARGET_DEFAULT MASK_ABICALLS
++ #define ABICALLS_ASM_OP ".option pic2"
++
++ #define MACHINE_TYPE "SNI running SINIX 5.42"
++
++ #define MIPS_DEFAULT_GVALUE 0
++
++ #define NM_FLAGS "-p"
++
++ /* wir haben ein Problem, wenn in einem Assembler-File keine .text-section
++ erzeugt wird. Dann landen diese Pseudo-Labels in irgendeiner anderen
++ section, z.B. .reginfo. Das macht den ld sehr ungluecklich. */
++
++ #define ASM_IDENTIFY_GCC(mw_stream) \
++ fprintf(mw_stream, "\t.ident \"gcc2_compiled.\"\n");
++
++ #define ASM_IDENTIFY_LANGUAGE(STREAM)
++
++ #define ASM_LONG ".word\t"
++ #define ASM_GLOBAL ".rdata\n\t\t.globl\t"
++
++ #include "mips/mips.h"
++
++ /* We do not want to run mips-tfile! */
++ #undef ASM_FINAL_SPEC
++
++ #undef OBJECT_FORMAT_COFF
++
++ /* We don't support debugging info for now. */
++ #undef DBX_DEBUGGING_INFO
++ #undef SDB_DEBUGGING_INFO
++ #undef MIPS_DEBUGGING_INFO
+diff -rcp2N gcc-2.7.2.3/config/mips/x-sni-svr4 gcc-2.7.2.3.f.1/config/mips/x-sni-svr4
+*** gcc-2.7.2.3/config/mips/x-sni-svr4 Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/config/mips/x-sni-svr4 Sun Aug 10 22:46:33 1997
+***************
+*** 0 ****
+--- 1,18 ----
++ # Define CC and OLDCC as the same, so that the tests:
++ # if [ x"$(OLDCC)" = x"$(CC)" ] ...
++ #
++ # will succeed (if OLDCC != CC, it is assumed that GCC is
++ # being used in secondary stage builds).
++ # -Olimit is so the user can use -O2. Down with fixed
++ # size tables!
++
++ CC = $(OLDCC)
++ OPT =
++ OLDCC = cc -Olimit 3000 $(OPT)
++
++ X_CFLAGS = -DNO_SYS_SIGLIST
++
++ # Show we need to use the C version of ALLOCA
++ # The SVR3 configurations have it, but the SVR4 configurations don't.
++ # For now, just try using it for all SVR* configurations.
++ ALLOCA = alloca.o
+diff -rcp2N gcc-2.7.2.3/config/msdos/configur.bat gcc-2.7.2.3.f.1/config/msdos/configur.bat
+*** gcc-2.7.2.3/config/msdos/configur.bat Mon Aug 28 09:55:47 1995
+--- gcc-2.7.2.3.f.1/config/msdos/configur.bat Sun Aug 10 23:08:05 1997
+*************** sed -f config/msdos/top.sed Makefile.in
+*** 18,21 ****
+--- 18,27 ----
+ set LANG=\r
+ \r
++ if not exist ada\make-lang.in goto no_ada\r
++ sed -f config/msdos/top.sed ada\make-lang.in >> Makefile\r
++ sed -f config/msdos/top.sed ada\makefile.in > ada\Makefile\r
++ set LANG=%LANG% ada.& \r
++ :no_ada\r
++ \r
+ if not exist cp\make-lang.in goto no_cp\r
+ sed -f config/msdos/top.sed cp\make-lang.in >> Makefile\r
+diff -rcp2N gcc-2.7.2.3/config/pa/pa.c gcc-2.7.2.3.f.1/config/pa/pa.c
+*** gcc-2.7.2.3/config/pa/pa.c Sun Oct 22 11:45:20 1995
+--- gcc-2.7.2.3.f.1/config/pa/pa.c Sun Aug 10 22:45:44 1997
+*************** output_move_double (operands)
+*** 1344,1369 ****
+ do them in the other order.
+
+! RMS says "This happens only for registers;
+! such overlap can't happen in memory unless the user explicitly
+! sets it up, and that is an undefined circumstance."
+!
+! but it happens on the HP-PA when loading parameter registers,
+! so I am going to define that circumstance, and make it work
+! as expected. */
+
+! if (optype0 == REGOP && (optype1 == MEMOP || optype1 == OFFSOP)
+! && reg_overlap_mentioned_p (operands[0], XEXP (operands[1], 0)))
+ {
+- /* XXX THIS PROBABLY DOESN'T WORK. */
+ /* Do the late half first. */
+ if (addreg1)
+ output_asm_insn ("ldo 4(%0),%0", &addreg1);
+ output_asm_insn (singlemove_string (latehalf), latehalf);
+ if (addreg1)
+ output_asm_insn ("ldo -4(%0),%0", &addreg1);
+- /* Then clobber. */
+ return singlemove_string (operands);
+ }
+
+ if (optype0 == REGOP && optype1 == REGOP
+ && REGNO (operands[0]) == REGNO (operands[1]) + 1)
+--- 1344,1377 ----
+ do them in the other order.
+
+! This can happen in two cases:
+
+! mem -> register where the first half of the destination register
+! is the same register used in the memory's address. Reload
+! can create such insns.
+!
+! mem in this case will be either register indirect or register
+! indirect plus a valid offset.
+!
+! register -> register move where REGNO(dst) == REGNO(src + 1)
+! someone (Tim/Tege?) claimed this can happen for parameter loads.
+!
+! Handle mem -> register case first. */
+! if (optype0 == REGOP
+! && (optype1 == MEMOP || optype1 == OFFSOP)
+! && refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
+! operands[1], 0))
+ {
+ /* Do the late half first. */
+ if (addreg1)
+ output_asm_insn ("ldo 4(%0),%0", &addreg1);
+ output_asm_insn (singlemove_string (latehalf), latehalf);
++
++ /* Then clobber. */
+ if (addreg1)
+ output_asm_insn ("ldo -4(%0),%0", &addreg1);
+ return singlemove_string (operands);
+ }
+
++ /* Now handle register -> register case. */
+ if (optype0 == REGOP && optype1 == REGOP
+ && REGNO (operands[0]) == REGNO (operands[1]) + 1)
+diff -rcp2N gcc-2.7.2.3/config/pa/pa.md gcc-2.7.2.3.f.1/config/pa/pa.md
+*** gcc-2.7.2.3/config/pa/pa.md Mon Aug 14 13:00:49 1995
+--- gcc-2.7.2.3.f.1/config/pa/pa.md Sun Aug 10 22:45:45 1997
+***************
+*** 1828,1832 ****
+ (define_insn ""
+ [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
+! "=f,*r,Q,?o,?Q,f,*&r,*&r")
+ (match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
+ "fG,*rG,f,*r,*r,Q,o,Q"))]
+--- 1828,1832 ----
+ (define_insn ""
+ [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
+! "=f,*r,Q,?o,?Q,f,*r,*r")
+ (match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
+ "fG,*rG,f,*r,*r,Q,o,Q"))]
+***************
+*** 1846,1850 ****
+ (define_insn ""
+ [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
+! "=r,?o,?Q,&r,&r")
+ (match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
+ "rG,r,r,o,Q"))]
+--- 1846,1850 ----
+ (define_insn ""
+ [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
+! "=r,?o,?Q,r,r")
+ (match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
+ "rG,r,r,o,Q"))]
+***************
+*** 2019,2023 ****
+ (define_insn ""
+ [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
+! "=r,o,Q,&r,&r,&r,f,f,*T")
+ (match_operand:DI 1 "general_operand"
+ "rM,r,r,o,Q,i,fM,*T,f"))]
+--- 2019,2023 ----
+ (define_insn ""
+ [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
+! "=r,o,Q,r,r,r,f,f,*T")
+ (match_operand:DI 1 "general_operand"
+ "rM,r,r,o,Q,i,fM,*T,f"))]
+***************
+*** 2037,2041 ****
+ (define_insn ""
+ [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
+! "=r,o,Q,&r,&r,&r")
+ (match_operand:DI 1 "general_operand"
+ "rM,r,r,o,Q,i"))]
+--- 2037,2041 ----
+ (define_insn ""
+ [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
+! "=r,o,Q,r,r,r")
+ (match_operand:DI 1 "general_operand"
+ "rM,r,r,o,Q,i"))]
+diff -rcp2N gcc-2.7.2.3/config/rs6000/rs6000.c gcc-2.7.2.3.f.1/config/rs6000/rs6000.c
+*** gcc-2.7.2.3/config/rs6000/rs6000.c Sat Jun 29 16:26:26 1996
+--- gcc-2.7.2.3.f.1/config/rs6000/rs6000.c Fri Aug 29 07:51:51 1997
+*************** input_operand (op, mode)
+*** 724,730 ****
+ return 1;
+
+! /* For HImode and QImode, any constant is valid. */
+! if ((mode == HImode || mode == QImode)
+! && GET_CODE (op) == CONST_INT)
+ return 1;
+
+--- 724,729 ----
+ return 1;
+
+! /* For integer modes, any constant is ok. */
+! if (GET_CODE (op) == CONST_INT)
+ return 1;
+
+*************** svr4_traceback (file, name, decl)
+*** 2611,2614 ****
+--- 2610,2682 ----
+ #endif /* USING_SVR4_H */
+ \f
++ /* Write out an instruction to load the TOC_TABLE address into register 30.
++ This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
++ a constant pool. */
++
++ void
++ rs6000_output_load_toc_table (file)
++ FILE *file;
++ {
++ char buf[256];
++
++ #ifdef USING_SVR4_H
++ if (TARGET_RELOCATABLE)
++ {
++ ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
++ fprintf (file, "\tbl ");
++ assemble_name (file, buf);
++ fprintf (file, "\n");
++
++ ASM_OUTPUT_INTERNAL_LABEL (file, "LCF", rs6000_pic_labelno);
++ fprintf (file, "\tmflr %s\n", reg_names[30]);
++
++ if (TARGET_POWERPC64)
++ fprintf (file, "\tld");
++ else if (TARGET_NEW_MNEMONICS)
++ fprintf (file, "\tlwz");
++ else
++ fprintf (file, "\tl");
++
++ fprintf (file, " %s,(", reg_names[0]);
++ ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
++ assemble_name (file, buf);
++ fprintf (file, "-");
++ ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
++ assemble_name (file, buf);
++ fprintf (file, ")(%s)\n", reg_names[30]);
++ asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
++ reg_names[30], reg_names[0], reg_names[30]);
++ rs6000_pic_labelno++;
++ }
++ else if (!TARGET_64BIT)
++ {
++ ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
++ asm_fprintf (file, "\t{cau|addis} %s,%s,", reg_names[30], reg_names[0]);
++ assemble_name (file, buf);
++ asm_fprintf (file, "@ha\n");
++ if (TARGET_NEW_MNEMONICS)
++ {
++ asm_fprintf (file, "\taddi %s,%s,", reg_names[30], reg_names[30]);
++ assemble_name (file, buf);
++ asm_fprintf (file, "@l\n");
++ }
++ else
++ {
++ asm_fprintf (file, "\tcal %s,", reg_names[30]);
++ assemble_name (file, buf);
++ asm_fprintf (file, "@l(%s)\n", reg_names[30]);
++ }
++ }
++ else
++ abort ();
++
++ #else /* !USING_SVR4_H */
++ ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 0);
++ asm_fprintf (file, "\t{l|lwz} %s,", reg_names[30]);
++ assemble_name (file, buf);
++ asm_fprintf (file, "(%s)\n", reg_names[2]);
++ #endif /* USING_SVR4_H */
++ }
++
+ /* Write function prologue. */
+ void
+*************** output_prolog (file, size)
+*** 2770,2834 ****
+ TOC_TABLE address into register 30. */
+ if (TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
+! {
+! char buf[256];
+!
+! #ifdef USING_SVR4_H
+! if (TARGET_RELOCATABLE)
+! {
+! ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
+! fprintf (file, "\tbl ");
+! assemble_name (file, buf);
+! fprintf (file, "\n");
+!
+! ASM_OUTPUT_INTERNAL_LABEL (file, "LCF", rs6000_pic_labelno);
+! fprintf (file, "\tmflr %s\n", reg_names[30]);
+!
+! if (TARGET_POWERPC64)
+! fprintf (file, "\tld");
+! else if (TARGET_NEW_MNEMONICS)
+! fprintf (file, "\tlwz");
+! else
+! fprintf (file, "\tl");
+!
+! fprintf (file, " %s,(", reg_names[0]);
+! ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
+! assemble_name (file, buf);
+! fprintf (file, "-");
+! ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
+! assemble_name (file, buf);
+! fprintf (file, ")(%s)\n", reg_names[30]);
+! asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
+! reg_names[30], reg_names[0], reg_names[30]);
+! rs6000_pic_labelno++;
+! }
+! else if (!TARGET_64BIT)
+! {
+! ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
+! asm_fprintf (file, "\t{cau|addis} %s,%s,", reg_names[30], reg_names[0]);
+! assemble_name (file, buf);
+! asm_fprintf (file, "@ha\n");
+! if (TARGET_NEW_MNEMONICS)
+! {
+! asm_fprintf (file, "\taddi %s,%s,", reg_names[30], reg_names[30]);
+! assemble_name (file, buf);
+! asm_fprintf (file, "@l\n");
+! }
+! else
+! {
+! asm_fprintf (file, "\tcal %s,", reg_names[30]);
+! assemble_name (file, buf);
+! asm_fprintf (file, "@l(%s)\n", reg_names[30]);
+! }
+! }
+! else
+! abort ();
+!
+! #else /* !USING_SVR4_H */
+! ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 0);
+! asm_fprintf (file, "\t{l|lwz} %s,", reg_names[30]);
+! assemble_name (file, buf);
+! asm_fprintf (file, "(%s)\n", reg_names[2]);
+! #endif /* USING_SVR4_H */
+! }
+ }
+
+--- 2838,2842 ----
+ TOC_TABLE address into register 30. */
+ if (TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
+! rs6000_output_load_toc_table (file);
+ }
+
+diff -rcp2N gcc-2.7.2.3/config/rs6000/rs6000.md gcc-2.7.2.3.f.1/config/rs6000/rs6000.md
+*** gcc-2.7.2.3/config/rs6000/rs6000.md Sat Jun 29 16:27:24 1996
+--- gcc-2.7.2.3.f.1/config/rs6000/rs6000.md Fri Aug 29 07:52:00 1997
+***************
+*** 4420,4423 ****
+--- 4420,4424 ----
+ }
+
++ emit_insn (gen_rtx (CLOBBER, VOIDmode, operands[0]));
+ emit_move_insn (gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN),
+ GEN_INT (low));
+***************
+*** 5409,5412 ****
+--- 5410,5425 ----
+ DONE;
+ }")
++
++ ;; If we have -mmiminal-toc, we need to reload r30 after a nonlocal goto.
++
++ (define_insn "nonlocal_goto_receiver"
++ [(unspec_volatile [(const_int 0)] 1)]
++ "TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0"
++ "*
++ {
++ rs6000_output_load_toc_table (asm_out_file);
++ return \"\";
++ }"
++ [(set_attr "type" "load")])
+ \f
+ ;; A function pointer is a pointer to a data area whose first word contains
+diff -rcp2N gcc-2.7.2.3/config/sparc/sol2.h gcc-2.7.2.3.f.1/config/sparc/sol2.h
+*** gcc-2.7.2.3/config/sparc/sol2.h Sat Aug 19 21:36:45 1995
+--- gcc-2.7.2.3.f.1/config/sparc/sol2.h Sun Aug 10 22:45:53 1997
+*************** do { \
+*** 166,168 ****
+ /* Define for support of TFmode long double and REAL_ARITHMETIC.
+ Sparc ABI says that long double is 4 words. */
+! #define LONG_DOUBLE_TYPE_SIZE 128
+--- 166,168 ----
+ /* Define for support of TFmode long double and REAL_ARITHMETIC.
+ Sparc ABI says that long double is 4 words. */
+! #define LONG_DOUBLE_TYPE_SIZE 64
+diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.c gcc-2.7.2.3.f.1/config/sparc/sparc.c
+*** gcc-2.7.2.3/config/sparc/sparc.c Tue Sep 12 22:32:24 1995
+--- gcc-2.7.2.3.f.1/config/sparc/sparc.c Sun Aug 10 22:46:03 1997
+*************** Boston, MA 02111-1307, USA. */
+*** 40,46 ****
+ /* 1 if the caller has placed an "unimp" insn immediately after the call.
+ This is used in v8 code when calling a function that returns a structure.
+! v9 doesn't have this. */
+
+! #define SKIP_CALLERS_UNIMP_P (!TARGET_V9 && current_function_returns_struct)
+
+ /* Global variables for machine-dependent things. */
+--- 40,51 ----
+ /* 1 if the caller has placed an "unimp" insn immediately after the call.
+ This is used in v8 code when calling a function that returns a structure.
+! v9 doesn't have this. Be careful to have this test be the same as that
+! used on the call. */
+
+! #define SKIP_CALLERS_UNIMP_P \
+! (!TARGET_V9 && current_function_returns_struct \
+! && ! integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl))) \
+! && (TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl))) \
+! == INTEGER_CST))
+
+ /* Global variables for machine-dependent things. */
+diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.h gcc-2.7.2.3.f.1/config/sparc/sparc.h
+*** gcc-2.7.2.3/config/sparc/sparc.h Sat Jun 29 16:25:54 1996
+--- gcc-2.7.2.3.f.1/config/sparc/sparc.h Sun Aug 10 22:46:13 1997
+*************** extern int leaf_function;
+*** 1526,1533 ****
+
+ /* Output assembler code to FILE to increment profiler label # LABELNO
+! for profiling a function entry. */
+
+ #define FUNCTION_PROFILER(FILE, LABELNO) \
+ do { \
+ fputs ("\tsethi %hi(", (FILE)); \
+ ASM_OUTPUT_INTERNAL_LABELREF (FILE, "LP", LABELNO); \
+--- 1526,1540 ----
+
+ /* Output assembler code to FILE to increment profiler label # LABELNO
+! for profiling a function entry.
+!
+! 32 bit sparc uses %g2 as the STATIC_CHAIN_REGNUM which gets clobbered
+! during profiling so we need to save/restore it around the call to mcount.
+! We're guaranteed that a save has just been done, and we use the space
+! allocated for intreg/fpreg value passing. */
+
+ #define FUNCTION_PROFILER(FILE, LABELNO) \
+ do { \
++ if (! TARGET_V9) \
++ fputs ("\tst %g2,[%fp-4]\n", FILE); \
+ fputs ("\tsethi %hi(", (FILE)); \
+ ASM_OUTPUT_INTERNAL_LABELREF (FILE, "LP", LABELNO); \
+*************** extern int leaf_function;
+*** 1539,1542 ****
+--- 1546,1551 ----
+ ASM_OUTPUT_INTERNAL_LABELREF (FILE, "LP", LABELNO); \
+ fputs ("),%o0,%o0\n", (FILE)); \
++ if (! TARGET_V9) \
++ fputs ("\tld [%fp-4],%g2\n", FILE); \
+ } while (0)
+
+diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.md gcc-2.7.2.3.f.1/config/sparc/sparc.md
+*** gcc-2.7.2.3/config/sparc/sparc.md Tue Sep 12 22:57:35 1995
+--- gcc-2.7.2.3.f.1/config/sparc/sparc.md Sun Aug 10 22:46:27 1997
+***************
+*** 4799,4803 ****
+ abort ();
+
+! if (GET_CODE (XEXP (operands[0], 0)) == LABEL_REF)
+ {
+ /* This is really a PIC sequence. We want to represent
+--- 4799,4803 ----
+ abort ();
+
+! if (GET_CODE (XEXP (operands[0], 0)) == LABEL_REF)
+ {
+ /* This is really a PIC sequence. We want to represent
+***************
+*** 4809,4824 ****
+
+ if (! TARGET_V9 && INTVAL (operands[3]) != 0)
+! emit_jump_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3,
+! gen_rtx (SET, VOIDmode, pc_rtx,
+! XEXP (operands[0], 0)),
+! operands[3],
+! gen_rtx (CLOBBER, VOIDmode,
+! gen_rtx (REG, Pmode, 15)))));
+ else
+! emit_jump_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2,
+! gen_rtx (SET, VOIDmode, pc_rtx,
+! XEXP (operands[0], 0)),
+! gen_rtx (CLOBBER, VOIDmode,
+! gen_rtx (REG, Pmode, 15)))));
+ goto finish_call;
+ }
+--- 4809,4828 ----
+
+ if (! TARGET_V9 && INTVAL (operands[3]) != 0)
+! emit_jump_insn
+! (gen_rtx (PARALLEL, VOIDmode,
+! gen_rtvec (3,
+! gen_rtx (SET, VOIDmode, pc_rtx,
+! XEXP (operands[0], 0)),
+! GEN_INT (INTVAL (operands[3]) & 0xfff),
+! gen_rtx (CLOBBER, VOIDmode,
+! gen_rtx (REG, Pmode, 15)))));
+ else
+! emit_jump_insn
+! (gen_rtx (PARALLEL, VOIDmode,
+! gen_rtvec (2,
+! gen_rtx (SET, VOIDmode, pc_rtx,
+! XEXP (operands[0], 0)),
+! gen_rtx (CLOBBER, VOIDmode,
+! gen_rtx (REG, Pmode, 15)))));
+ goto finish_call;
+ }
+***************
+*** 4839,4852 ****
+
+ if (! TARGET_V9 && INTVAL (operands[3]) != 0)
+! emit_call_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3,
+! gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
+! operands[3],
+! gen_rtx (CLOBBER, VOIDmode,
+! gen_rtx (REG, Pmode, 15)))));
+ else
+! emit_call_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2,
+! gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
+! gen_rtx (CLOBBER, VOIDmode,
+! gen_rtx (REG, Pmode, 15)))));
+
+ finish_call:
+--- 4843,4858 ----
+
+ if (! TARGET_V9 && INTVAL (operands[3]) != 0)
+! emit_call_insn
+! (gen_rtx (PARALLEL, VOIDmode,
+! gen_rtvec (3, gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
+! GEN_INT (INTVAL (operands[3]) & 0xfff),
+! gen_rtx (CLOBBER, VOIDmode,
+! gen_rtx (REG, Pmode, 15)))));
+ else
+! emit_call_insn
+! (gen_rtx (PARALLEL, VOIDmode,
+! gen_rtvec (2, gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
+! gen_rtx (CLOBBER, VOIDmode,
+! gen_rtx (REG, Pmode, 15)))));
+
+ finish_call:
+***************
+*** 4911,4915 ****
+ (clobber (reg:SI 15))]
+ ;;- Do not use operand 1 for most machines.
+! "! TARGET_V9 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) > 0"
+ "call %a0,%1\;nop\;unimp %2"
+ [(set_attr "type" "call_no_delay_slot")])
+--- 4917,4921 ----
+ (clobber (reg:SI 15))]
+ ;;- Do not use operand 1 for most machines.
+! "! TARGET_V9 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0"
+ "call %a0,%1\;nop\;unimp %2"
+ [(set_attr "type" "call_no_delay_slot")])
+***************
+*** 4923,4927 ****
+ (clobber (reg:SI 15))]
+ ;;- Do not use operand 1 for most machines.
+! "! TARGET_V9 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) > 0"
+ "call %a0,%1\;nop\;unimp %2"
+ [(set_attr "type" "call_no_delay_slot")])
+--- 4929,4933 ----
+ (clobber (reg:SI 15))]
+ ;;- Do not use operand 1 for most machines.
+! "! TARGET_V9 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0"
+ "call %a0,%1\;nop\;unimp %2"
+ [(set_attr "type" "call_no_delay_slot")])
+***************
+*** 5178,5184 ****
+ emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
+ emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx));
+- emit_insn (gen_rtx (USE, VOIDmode, gen_rtx (REG, Pmode, 8)));
+ /* Return, restoring reg window and jumping to goto handler. */
+ emit_insn (gen_goto_handler_and_restore ());
+ DONE;
+ }")
+--- 5184,5190 ----
+ emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
+ emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx));
+ /* Return, restoring reg window and jumping to goto handler. */
+ emit_insn (gen_goto_handler_and_restore ());
++ emit_barrier ();
+ DONE;
+ }")
+***************
+*** 5192,5200 ****
+
+ (define_insn "goto_handler_and_restore"
+! [(unspec_volatile [(const_int 0)] 2)]
+ ""
+ "jmp %%o0+0\;restore"
+ [(set_attr "type" "misc")
+ (set_attr "length" "2")])
+
+ ;; Special pattern for the FLUSH instruction.
+--- 5198,5237 ----
+
+ (define_insn "goto_handler_and_restore"
+! [(unspec_volatile [(const_int 0)] 2)
+! (use (reg:SI 8))]
+ ""
+ "jmp %%o0+0\;restore"
+ [(set_attr "type" "misc")
+ (set_attr "length" "2")])
++
++ ;; Pattern for use after a setjmp to store FP and the return register
++ ;; into the stack area.
++
++ (define_expand "setjmp"
++ [(const_int 0)]
++ ""
++ "
++ {
++ if (TARGET_V9)
++ emit_insn (gen_setjmp_64 ());
++ else
++ emit_insn (gen_setjmp_32 ());
++
++ DONE;
++ }")
++
++ (define_expand "setjmp_32"
++ [(set (mem:SI (plus:SI (reg:SI 14) (const_int 56))) (match_dup 0))
++ (set (mem:SI (plus:SI (reg:SI 14) (const_int 60))) (reg:SI 31))]
++ ""
++ "
++ { operands[0] = frame_pointer_rtx; }")
++
++ (define_expand "setjmp_64"
++ [(set (mem:DI (plus:DI (reg:DI 14) (const_int 112))) (match_dup 0))
++ (set (mem:DI (plus:DI (reg:DI 14) (const_int 120))) (reg:DI 31))]
++ ""
++ "
++ { operands[0] = frame_pointer_rtx; }")
+
+ ;; Special pattern for the FLUSH instruction.
+diff -rcp2N gcc-2.7.2.3/config/x-linux gcc-2.7.2.3.f.1/config/x-linux
+*** gcc-2.7.2.3/config/x-linux Tue Mar 28 12:43:37 1995
+--- gcc-2.7.2.3.f.1/config/x-linux Fri Jul 11 00:08:49 1997
+*************** BOOT_CFLAGS = -O $(CFLAGS) -Iinclude
+*** 13,14 ****
+--- 13,17 ----
+ # Don't run fixproto
+ STMP_FIXPROTO =
++
++ # Don't install "assert.h" in gcc. We use the one in glibc.
++ INSTALL_ASSERT_H =
+diff -rcp2N gcc-2.7.2.3/config/x-linux-aout gcc-2.7.2.3.f.1/config/x-linux-aout
+*** gcc-2.7.2.3/config/x-linux-aout Thu Jan 1 00:00:00 1970
+--- gcc-2.7.2.3.f.1/config/x-linux-aout Fri Jul 11 00:08:49 1997
+***************
+*** 0 ****
+--- 1,14 ----
++ # It is defined in config/xm-linux.h.
++ # X_CFLAGS = -DPOSIX
++
++ # The following is needed when compiling stages 2 and 3 because gcc's
++ # limits.h must be picked up before /usr/include/limits.h. This is because
++ # each does an #include_next of the other if the other hasn't been included.
++ # /usr/include/limits.h loses if it gets found first because /usr/include is
++ # at the end of the search order. When a new version of gcc is released,
++ # gcc's limits.h hasn't been installed yet and hence isn't found.
++
++ BOOT_CFLAGS = -O $(CFLAGS) -Iinclude
++
++ # Don't run fixproto
++ STMP_FIXPROTO =
+diff -rcp2N gcc-2.7.2.3/config.guess gcc-2.7.2.3.f.1/config.guess
+*** gcc-2.7.2.3/config.guess Sun Aug 31 09:39:43 1997
+--- gcc-2.7.2.3.f.1/config.guess Sun Aug 31 09:21:10 1997
+*************** trap 'rm -f dummy.c dummy.o dummy; exit
+*** 52,63 ****
+
+ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+- alpha:OSF1:V*:*)
+- # After 1.2, OSF1 uses "V1.3" for uname -r.
+- echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'`
+- exit 0 ;;
+ alpha:OSF1:*:*)
+ # 1.2 uses "1.2" for uname -r.
+! echo alpha-dec-osf${UNAME_RELEASE}
+! exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+--- 52,62 ----
+
+ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ alpha:OSF1:*:*)
++ # A Vn.n version is a released version.
++ # A Tn.n version is a released field test version.
++ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+! echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'`
+! exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+*************** case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+*** 154,161 ****
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+! ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+! i[34]86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+--- 153,160 ----
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+! ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+! i?86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+*************** EOF
+*** 220,224 ****
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+! 9000/7?? | 9000/8?[79] ) HP_ARCH=hppa1.1 ;;
+ 9000/8?? ) HP_ARCH=hppa1.0 ;;
+ esac
+--- 219,223 ----
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+! 9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
+ 9000/8?? ) HP_ARCH=hppa1.0 ;;
+ esac
+*************** EOF
+*** 304,308 ****
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+! i[34]86:BSD/386:*:* | *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+--- 303,307 ----
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+! i?86:BSD/386:*:* | *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+*************** EOF
+*** 314,318 ****
+ exit 0 ;;
+ *:GNU:*:*)
+! echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:Linux:*:*)
+--- 313,317 ----
+ exit 0 ;;
+ *:GNU:*:*)
+! echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:Linux:*:*)
+*************** EOF
+*** 320,330 ****
+ # first see if it will tell us.
+ ld_help_string=`ld --help 2>&1`
+! # if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: elf_i[345]86"; then
+ # echo "${UNAME_MACHINE}-unknown-linux" ; exit 0
+! if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i[345]86linux"; then
+ echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0
+! elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i[345]86coff"; then
+ echo "${UNAME_MACHINE}-unknown-linuxcoff" ; exit 0
+ elif test "${UNAME_MACHINE}" = "alpha" ; then
+ echo alpha-unknown-linux ; exit 0
+ else
+--- 319,333 ----
+ # first see if it will tell us.
+ ld_help_string=`ld --help 2>&1`
+! # if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: elf_i?86"; then
+ # echo "${UNAME_MACHINE}-unknown-linux" ; exit 0
+! if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i?86linux"; then
+ echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0
+! elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i?86coff"; then
+ echo "${UNAME_MACHINE}-unknown-linuxcoff" ; exit 0
+ elif test "${UNAME_MACHINE}" = "alpha" ; then
++ as_version_string=`as --version 2>&1`
++ if echo $as_version_string | grep >/dev/null 2>&1 " version 2.6 "; then
++ echo alpha-unknown-linuxoldas ; exit 0
++ fi
+ echo alpha-unknown-linux ; exit 0
+ else
+*************** EOF
+*** 362,369 ****
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
+ # are messed up and put the nodename in both sysname and nodename.
+! i[34]86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+! i[34]86:*:4.*:* | i[34]86:SYSTEM_V:4.*:*)
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+--- 365,372 ----
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
+ # are messed up and put the nodename in both sysname and nodename.
+! i?86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+! i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+*************** EOF
+*** 372,376 ****
+ fi
+ exit 0 ;;
+! i[34]86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+--- 375,379 ----
+ fi
+ exit 0 ;;
+! i?86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+*************** EOF
+*** 379,382 ****
+--- 382,387 ----
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
++ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
++ && UNAME_MACHINE=i586
+ echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL
+ else
+*************** EOF
+*** 401,405 ****
+ echo m68010-convergent-sysv
+ exit 0 ;;
+! M680[234]0:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0)
+--- 406,410 ----
+ echo m68010-convergent-sysv
+ exit 0 ;;
+! M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0)
+*************** EOF
+*** 409,413 ****
+ uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+! m680[234]0:LynxOS:2.[23]*:*)
+ echo m68k-lynx-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+--- 414,418 ----
+ uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+! m68*:LynxOS:2.*:*)
+ echo m68k-lynx-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+*************** EOF
+*** 415,425 ****
+ echo m68k-atari-sysv4
+ exit 0 ;;
+! i[34]86:LynxOS:2.[23]*:*)
+ echo i386-lynx-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+! TSUNAMI:LynxOS:2.[23]*:*)
+ echo sparc-lynx-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+! rs6000:LynxOS:2.[23]*:*)
+ echo rs6000-lynx-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+--- 420,430 ----
+ echo m68k-atari-sysv4
+ exit 0 ;;
+! i?86:LynxOS:2.*:*)
+ echo i386-lynx-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+! TSUNAMI:LynxOS:2.*:*)
+ echo sparc-lynx-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+! rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+ echo rs6000-lynx-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+*************** main ()
+*** 478,482 ****
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+! printf ("%s-next-nextstep%s\n", __ARCHITECTURE__, version==2 ? "2" : "3");
+ exit (0);
+ #endif
+--- 483,487 ----
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+! printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+ #endif
+diff -rcp2N gcc-2.7.2.3/configure gcc-2.7.2.3.f.1/configure
+*** gcc-2.7.2.3/configure Sun Aug 31 09:39:44 1997
+--- gcc-2.7.2.3.f.1/configure Sun Aug 31 09:35:10 1997
+*************** exec_prefix='$(prefix)'
+*** 82,85 ****
+--- 82,86 ----
+ # The default g++ include directory is $(libdir)/g++-include.
+ gxx_include_dir='$(libdir)/g++-include'
++ #gxx_include_dir='$(exec_prefix)/include/g++'
+
+ # Default --program-transform-name to nothing.
+*************** for machine in $canon_build $canon_host
+*** 548,551 ****
+--- 549,578 ----
+ use_collect2=yes
+ ;;
++ alpha-*-linux*oldas*)
++ tm_file=alpha/linux.h
++ tmake_file=alpha/t-linux
++ xmake_file=alpha/x-linux
++ fixincludes=Makefile.in
++ xm_file=alpha/xm-linux.h
++ gas=yes gnu_ld=yes
++ ;;
++ alpha-*-linux*ecoff*)
++ tm_file=alpha/linux.h
++ tmake_file=alpha/t-linux
++ xmake_file=alpha/x-linux
++ fixincludes=Makefile.in
++ xm_file=alpha/xm-linux.h
++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
++ gas=yes gnu_ld=yes
++ ;;
++ alpha-*-linux*)
++ tm_file=alpha/elf.h
++ tmake_file=alpha/t-linux
++ xmake_file=alpha/x-linux
++ fixincludes=Makefile.in
++ xm_file=alpha/xm-linux.h
++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
++ gas=yes gnu_ld=yes
++ ;;
+ alpha-dec-osf[23456789]*)
+ tm_file=alpha/osf2.h
+*************** for machine in $canon_build $canon_host
+*** 982,986 ****
+ cpu_type=i386 # with a.out format using pre BFD linkers
+ xm_file=i386/xm-linux.h
+! xmake_file=x-linux
+ tm_file=i386/linux-oldld.h
+ fixincludes=Makefile.in # The headers are ok already.
+--- 1009,1013 ----
+ cpu_type=i386 # with a.out format using pre BFD linkers
+ xm_file=i386/xm-linux.h
+! xmake_file=x-linux-aout
+ tm_file=i386/linux-oldld.h
+ fixincludes=Makefile.in # The headers are ok already.
+*************** for machine in $canon_build $canon_host
+*** 991,995 ****
+ cpu_type=i386 # with a.out format
+ xm_file=i386/xm-linux.h
+! xmake_file=x-linux
+ tm_file=i386/linux-aout.h
+ fixincludes=Makefile.in # The headers are ok already.
+--- 1018,1022 ----
+ cpu_type=i386 # with a.out format
+ xm_file=i386/xm-linux.h
+! xmake_file=x-linux-aout
+ tm_file=i386/linux-aout.h
+ fixincludes=Makefile.in # The headers are ok already.
+*************** for machine in $canon_build $canon_host
+*** 1663,1666 ****
+--- 1690,1714 ----
+ use_collect2=yes
+ ;;
++ mips-sni-sysv4)
++ if [ x$gas = xyes ]
++ then
++ if [ x$stabs = xyes ]
++ then
++ tm_file=mips/iris5gdb.h
++ else
++ tm_file=mips/sni-gas.h
++ fi
++ else
++ tm_file=mips/sni-svr4.h
++ fi
++ xm_file=mips/xm-sysv.h
++ xmake_file=mips/x-sni-svr4
++ tmake_file=mips/t-mips-gas
++ if [ x$gnu_ld != xyes ]
++ then
++ use_collect2=yes
++ fi
++ broken_install=yes
++ ;;
+ mips-sgi-irix5*) # SGI System V.4., IRIX 5
+ if [ x$gas = xyes ]
+*************** MAYBE_TARGET_DEFAULT = -DTARGET_CPU_DEFA
+*** 2995,2999 ****
+ rm Makefile.sed
+ echo 's|\f||' > Makefile.sed
+! echo "s|^target=.*$|target=${target}|" >> Makefile.sed
+ echo "s|^xmake_file=.*$|xmake_file=${dep_host_xmake_file}|" >> Makefile.sed
+ echo "s|^tmake_file=.*$|tmake_file=${dep_tmake_file}|" >> Makefile.sed
+--- 3043,3047 ----
+ rm Makefile.sed
+ echo 's|\f||' > Makefile.sed
+! echo "s|^target=.*$|target=${canon_target}|" >> Makefile.sed
+ echo "s|^xmake_file=.*$|xmake_file=${dep_host_xmake_file}|" >> Makefile.sed
+ echo "s|^tmake_file=.*$|tmake_file=${dep_tmake_file}|" >> Makefile.sed
+diff -rcp2N gcc-2.7.2.3/cse.c gcc-2.7.2.3.f.1/cse.c
+*** gcc-2.7.2.3/cse.c Sun Aug 31 09:39:46 1997
+--- gcc-2.7.2.3.f.1/cse.c Sun Aug 31 09:21:14 1997
+*************** static struct table_elt *last_jump_equiv
+*** 520,544 ****
+ static int constant_pool_entries_cost;
+
+- /* Bits describing what kind of values in memory must be invalidated
+- for a particular instruction. If all three bits are zero,
+- no memory refs need to be invalidated. Each bit is more powerful
+- than the preceding ones, and if a bit is set then the preceding
+- bits are also set.
+-
+- Here is how the bits are set:
+- Pushing onto the stack invalidates only the stack pointer,
+- writing at a fixed address invalidates only variable addresses,
+- writing in a structure element at variable address
+- invalidates all but scalar variables,
+- and writing in anything else at variable address invalidates everything. */
+-
+- struct write_data
+- {
+- int sp : 1; /* Invalidate stack pointer. */
+- int var : 1; /* Invalidate variable addresses. */
+- int nonscalar : 1; /* Invalidate all but scalar variables. */
+- int all : 1; /* Invalidate all memory refs. */
+- };
+-
+ /* Define maximum length of a branch path. */
+
+--- 520,523 ----
+*************** static void merge_equiv_classes PROTO((s
+*** 626,632 ****
+ struct table_elt *));
+ static void invalidate PROTO((rtx, enum machine_mode));
+ static void remove_invalid_refs PROTO((int));
+ static void rehash_using_reg PROTO((rtx));
+! static void invalidate_memory PROTO((struct write_data *));
+ static void invalidate_for_call PROTO((void));
+ static rtx use_related_value PROTO((rtx, struct table_elt *));
+--- 605,612 ----
+ struct table_elt *));
+ static void invalidate PROTO((rtx, enum machine_mode));
++ static int cse_rtx_varies_p PROTO((rtx));
+ static void remove_invalid_refs PROTO((int));
+ static void rehash_using_reg PROTO((rtx));
+! static void invalidate_memory PROTO((void));
+ static void invalidate_for_call PROTO((void));
+ static rtx use_related_value PROTO((rtx, struct table_elt *));
+*************** static void set_nonvarying_address_compo
+*** 638,644 ****
+ HOST_WIDE_INT *));
+ static int refers_to_p PROTO((rtx, rtx));
+- static int refers_to_mem_p PROTO((rtx, rtx, HOST_WIDE_INT,
+- HOST_WIDE_INT));
+- static int cse_rtx_addr_varies_p PROTO((rtx));
+ static rtx canon_reg PROTO((rtx, rtx));
+ static void find_best_addr PROTO((rtx, rtx *));
+--- 618,621 ----
+*************** static void record_jump_cond PROTO((enum
+*** 656,661 ****
+ rtx, rtx, int));
+ static void cse_insn PROTO((rtx, int));
+! static void note_mem_written PROTO((rtx, struct write_data *));
+! static void invalidate_from_clobbers PROTO((struct write_data *, rtx));
+ static rtx cse_process_notes PROTO((rtx, rtx));
+ static void cse_around_loop PROTO((rtx));
+--- 633,638 ----
+ rtx, rtx, int));
+ static void cse_insn PROTO((rtx, int));
+! static int note_mem_written PROTO((rtx));
+! static void invalidate_from_clobbers PROTO((rtx));
+ static rtx cse_process_notes PROTO((rtx, rtx));
+ static void cse_around_loop PROTO((rtx));
+*************** invalidate (x, full_mode)
+*** 1512,1517 ****
+ register int i;
+ register struct table_elt *p;
+- rtx base;
+- HOST_WIDE_INT start, end;
+
+ /* If X is a register, dependencies on its contents
+--- 1489,1492 ----
+*************** invalidate (x, full_mode)
+*** 1605,1611 ****
+ full_mode = GET_MODE (x);
+
+- set_nonvarying_address_components (XEXP (x, 0), GET_MODE_SIZE (full_mode),
+- &base, &start, &end);
+-
+ for (i = 0; i < NBUCKETS; i++)
+ {
+--- 1580,1583 ----
+*************** invalidate (x, full_mode)
+*** 1614,1618 ****
+ {
+ next = p->next_same_hash;
+! if (refers_to_mem_p (p->exp, base, start, end))
+ remove_from_table (p, i);
+ }
+--- 1586,1594 ----
+ {
+ next = p->next_same_hash;
+! /* Invalidate ASM_OPERANDS which reference memory (this is easier
+! than checking all the aliases). */
+! if (p->in_memory
+! && (GET_CODE (p->exp) != MEM
+! || true_dependence (x, full_mode, p->exp, cse_rtx_varies_p)))
+ remove_from_table (p, i);
+ }
+*************** rehash_using_reg (x)
+*** 1695,1722 ****
+ }
+ \f
+- /* Remove from the hash table all expressions that reference memory,
+- or some of them as specified by *WRITES. */
+-
+- static void
+- invalidate_memory (writes)
+- struct write_data *writes;
+- {
+- register int i;
+- register struct table_elt *p, *next;
+- int all = writes->all;
+- int nonscalar = writes->nonscalar;
+-
+- for (i = 0; i < NBUCKETS; i++)
+- for (p = table[i]; p; p = next)
+- {
+- next = p->next_same_hash;
+- if (p->in_memory
+- && (all
+- || (nonscalar && p->in_struct)
+- || cse_rtx_addr_varies_p (p->exp)))
+- remove_from_table (p, i);
+- }
+- }
+- \f
+ /* Remove from the hash table any expression that is a call-clobbered
+ register. Also update their TICK values. */
+--- 1671,1674 ----
+*************** invalidate_for_call ()
+*** 1756,1759 ****
+--- 1708,1717 ----
+ next = p->next_same_hash;
+
++ if (p->in_memory)
++ {
++ remove_from_table (p, hash);
++ continue;
++ }
++
+ if (GET_CODE (p->exp) != REG
+ || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
+*************** canon_hash (x, mode)
+*** 1946,1950 ****
+ return 0;
+ }
+! if (! RTX_UNCHANGING_P (x))
+ {
+ hash_arg_in_memory = 1;
+--- 1904,1908 ----
+ return 0;
+ }
+! if (! RTX_UNCHANGING_P (x) || FIXED_BASE_PLUS_P (XEXP (x, 0)))
+ {
+ hash_arg_in_memory = 1;
+*************** set_nonvarying_address_components (addr,
+*** 2395,2477 ****
+ }
+
+! /* Return 1 iff any subexpression of X refers to memory
+! at an address of BASE plus some offset
+! such that any of the bytes' offsets fall between START (inclusive)
+! and END (exclusive).
+!
+! The value is undefined if X is a varying address (as determined by
+! cse_rtx_addr_varies_p). This function is not used in such cases.
+!
+! When used in the cse pass, `qty_const' is nonzero, and it is used
+! to treat an address that is a register with a known constant value
+! as if it were that constant value.
+! In the loop pass, `qty_const' is zero, so this is not done. */
+!
+! static int
+! refers_to_mem_p (x, base, start, end)
+! rtx x, base;
+! HOST_WIDE_INT start, end;
+! {
+! register HOST_WIDE_INT i;
+! register enum rtx_code code;
+! register char *fmt;
+!
+! repeat:
+! if (x == 0)
+! return 0;
+!
+! code = GET_CODE (x);
+! if (code == MEM)
+! {
+! register rtx addr = XEXP (x, 0); /* Get the address. */
+! rtx mybase;
+! HOST_WIDE_INT mystart, myend;
+!
+! set_nonvarying_address_components (addr, GET_MODE_SIZE (GET_MODE (x)),
+! &mybase, &mystart, &myend);
+!
+!
+! /* refers_to_mem_p is never called with varying addresses.
+! If the base addresses are not equal, there is no chance
+! of the memory addresses conflicting. */
+! if (! rtx_equal_p (mybase, base))
+! return 0;
+!
+! return myend > start && mystart < end;
+! }
+!
+! /* X does not match, so try its subexpressions. */
+!
+! fmt = GET_RTX_FORMAT (code);
+! for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
+! if (fmt[i] == 'e')
+! {
+! if (i == 0)
+! {
+! x = XEXP (x, 0);
+! goto repeat;
+! }
+! else
+! if (refers_to_mem_p (XEXP (x, i), base, start, end))
+! return 1;
+! }
+! else if (fmt[i] == 'E')
+! {
+! int j;
+! for (j = 0; j < XVECLEN (x, i); j++)
+! if (refers_to_mem_p (XVECEXP (x, i, j), base, start, end))
+! return 1;
+! }
+!
+! return 0;
+! }
+!
+! /* Nonzero if X refers to memory at a varying address;
+ except that a register which has at the moment a known constant value
+ isn't considered variable. */
+
+ static int
+! cse_rtx_addr_varies_p (x)
+! rtx x;
+ {
+ /* We need not check for X and the equivalence class being of the same
+--- 2353,2363 ----
+ }
+
+! /* Nonzero if X, a memory address, refers to a varying address;
+ except that a register which has at the moment a known constant value
+ isn't considered variable. */
+
+ static int
+! cse_rtx_varies_p (x)
+! register rtx x;
+ {
+ /* We need not check for X and the equivalence class being of the same
+*************** cse_rtx_addr_varies_p (x)
+*** 2479,2497 ****
+ doesn't vary in any mode. */
+
+! if (GET_CODE (x) == MEM
+! && GET_CODE (XEXP (x, 0)) == REG
+! && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
+! && GET_MODE (XEXP (x, 0)) == qty_mode[reg_qty[REGNO (XEXP (x, 0))]]
+! && qty_const[reg_qty[REGNO (XEXP (x, 0))]] != 0)
+ return 0;
+
+! if (GET_CODE (x) == MEM
+! && GET_CODE (XEXP (x, 0)) == PLUS
+! && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
+! && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
+! && REGNO_QTY_VALID_P (REGNO (XEXP (XEXP (x, 0), 0)))
+! && (GET_MODE (XEXP (XEXP (x, 0), 0))
+! == qty_mode[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]])
+! && qty_const[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]])
+ return 0;
+
+--- 2365,2381 ----
+ doesn't vary in any mode. */
+
+! if (GET_CODE (x) == REG
+! && REGNO_QTY_VALID_P (REGNO (x))
+! && GET_MODE (x) == qty_mode[reg_qty[REGNO (x)]]
+! && qty_const[reg_qty[REGNO (x)]] != 0)
+ return 0;
+
+! if (GET_CODE (x) == PLUS
+! && GET_CODE (XEXP (x, 1)) == CONST_INT
+! && GET_CODE (XEXP (x, 0)) == REG
+! && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
+! && (GET_MODE (XEXP (x, 0))
+! == qty_mode[reg_qty[REGNO (XEXP (x, 0))]])
+! && qty_const[reg_qty[REGNO (XEXP (x, 0))]])
+ return 0;
+
+*************** cse_rtx_addr_varies_p (x)
+*** 2501,2519 ****
+ load fp minus a constant into a register, then a MEM which is the
+ sum of the two `constant' registers. */
+! if (GET_CODE (x) == MEM
+! && GET_CODE (XEXP (x, 0)) == PLUS
+! && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
+! && GET_CODE (XEXP (XEXP (x, 0), 1)) == REG
+! && REGNO_QTY_VALID_P (REGNO (XEXP (XEXP (x, 0), 0)))
+! && (GET_MODE (XEXP (XEXP (x, 0), 0))
+! == qty_mode[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]])
+! && qty_const[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]]
+! && REGNO_QTY_VALID_P (REGNO (XEXP (XEXP (x, 0), 1)))
+! && (GET_MODE (XEXP (XEXP (x, 0), 1))
+! == qty_mode[reg_qty[REGNO (XEXP (XEXP (x, 0), 1))]])
+! && qty_const[reg_qty[REGNO (XEXP (XEXP (x, 0), 1))]])
+ return 0;
+
+! return rtx_addr_varies_p (x);
+ }
+ \f
+--- 2385,2402 ----
+ load fp minus a constant into a register, then a MEM which is the
+ sum of the two `constant' registers. */
+! if (GET_CODE (x) == PLUS
+! && GET_CODE (XEXP (x, 0)) == REG
+! && GET_CODE (XEXP (x, 1)) == REG
+! && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
+! && (GET_MODE (XEXP (x, 0))
+! == qty_mode[reg_qty[REGNO (XEXP (x, 0))]])
+! && qty_const[reg_qty[REGNO (XEXP (x, 0))]]
+! && REGNO_QTY_VALID_P (REGNO (XEXP (x, 1)))
+! && (GET_MODE (XEXP (x, 1))
+! == qty_mode[reg_qty[REGNO (XEXP (x, 1))]])
+! && qty_const[reg_qty[REGNO (XEXP (x, 1))]])
+ return 0;
+
+! return rtx_varies_p (x);
+ }
+ \f
+*************** fold_rtx (x, insn)
+*** 5542,5550 ****
+ CONST_INT, see if we can find a register equivalent to the
+ positive constant. Make a MINUS if so. Don't do this for
+! a negative constant since we might then alternate between
+ chosing positive and negative constants. Having the positive
+! constant previously-used is the more common case. */
+! if (const_arg1 && GET_CODE (const_arg1) == CONST_INT
+! && INTVAL (const_arg1) < 0 && GET_CODE (folded_arg1) == REG)
+ {
+ rtx new_const = GEN_INT (- INTVAL (const_arg1));
+--- 5425,5439 ----
+ CONST_INT, see if we can find a register equivalent to the
+ positive constant. Make a MINUS if so. Don't do this for
+! a non-negative constant since we might then alternate between
+ chosing positive and negative constants. Having the positive
+! constant previously-used is the more common case. Be sure
+! the resulting constant is non-negative; if const_arg1 were
+! the smallest negative number this would overflow: depending
+! on the mode, this would either just be the same value (and
+! hence not save anything) or be incorrect. */
+! if (const_arg1 != 0 && GET_CODE (const_arg1) == CONST_INT
+! && INTVAL (const_arg1) < 0
+! && - INTVAL (const_arg1) >= 0
+! && GET_CODE (folded_arg1) == REG)
+ {
+ rtx new_const = GEN_INT (- INTVAL (const_arg1));
+*************** cse_insn (insn, in_libcall_block)
+*** 6105,6110 ****
+ rtx this_insn_cc0 = 0;
+ enum machine_mode this_insn_cc0_mode;
+- struct write_data writes_memory;
+- static struct write_data init = {0, 0, 0, 0};
+
+ rtx src_eqv = 0;
+--- 5994,5997 ----
+*************** cse_insn (insn, in_libcall_block)
+*** 6118,6122 ****
+
+ this_insn = insn;
+- writes_memory = init;
+
+ /* Find all the SETs and CLOBBERs in this instruction.
+--- 6005,6008 ----
+*************** cse_insn (insn, in_libcall_block)
+*** 6220,6232 ****
+ else if (GET_CODE (y) == CLOBBER)
+ {
+! /* If we clobber memory, take note of that,
+! and canon the address.
+ This does nothing when a register is clobbered
+ because we have already invalidated the reg. */
+ if (GET_CODE (XEXP (y, 0)) == MEM)
+! {
+! canon_reg (XEXP (y, 0), NULL_RTX);
+! note_mem_written (XEXP (y, 0), &writes_memory);
+! }
+ }
+ else if (GET_CODE (y) == USE
+--- 6106,6114 ----
+ else if (GET_CODE (y) == CLOBBER)
+ {
+! /* If we clobber memory, canon the address.
+ This does nothing when a register is clobbered
+ because we have already invalidated the reg. */
+ if (GET_CODE (XEXP (y, 0)) == MEM)
+! canon_reg (XEXP (y, 0), NULL_RTX);
+ }
+ else if (GET_CODE (y) == USE
+*************** cse_insn (insn, in_libcall_block)
+*** 6247,6254 ****
+ {
+ if (GET_CODE (XEXP (x, 0)) == MEM)
+! {
+! canon_reg (XEXP (x, 0), NULL_RTX);
+! note_mem_written (XEXP (x, 0), &writes_memory);
+! }
+ }
+
+--- 6129,6133 ----
+ {
+ if (GET_CODE (XEXP (x, 0)) == MEM)
+! canon_reg (XEXP (x, 0), NULL_RTX);
+ }
+
+*************** cse_insn (insn, in_libcall_block)
+*** 6430,6433 ****
+--- 6309,6327 ----
+ sets[i].src_in_struct = hash_arg_in_struct;
+
++ /* If SRC is a MEM, there is a REG_EQUIV note for SRC, and DEST is
++ a pseudo that is set more than once, do not record SRC. Using
++ SRC as a replacement for anything else will be incorrect in that
++ situation. Note that this usually occurs only for stack slots,
++ in which case all the RTL would be refering to SRC, so we don't
++ lose any optimization opportunities by not having SRC in the
++ hash table. */
++
++ if (GET_CODE (src) == MEM
++ && find_reg_note (insn, REG_EQUIV, src) != 0
++ && GET_CODE (dest) == REG
++ && REGNO (dest) >= FIRST_PSEUDO_REGISTER
++ && reg_n_sets[REGNO (dest)] != 1)
++ sets[i].src_volatile = 1;
++
+ #if 0
+ /* It is no longer clear why we used to do this, but it doesn't
+*************** cse_insn (insn, in_libcall_block)
+*** 6674,6678 ****
+ }
+ #endif /* LOAD_EXTEND_OP */
+!
+ if (src == src_folded)
+ src_folded = 0;
+--- 6568,6572 ----
+ }
+ #endif /* LOAD_EXTEND_OP */
+!
+ if (src == src_folded)
+ src_folded = 0;
+*************** cse_insn (insn, in_libcall_block)
+*** 6860,6864 ****
+ || (GET_CODE (src_folded) != MEM
+ && ! src_folded_force_flag))
+! && GET_MODE_CLASS (mode) != MODE_CC)
+ {
+ src_folded_force_flag = 1;
+--- 6754,6759 ----
+ || (GET_CODE (src_folded) != MEM
+ && ! src_folded_force_flag))
+! && GET_MODE_CLASS (mode) != MODE_CC
+! && mode != VOIDmode)
+ {
+ src_folded_force_flag = 1;
+*************** cse_insn (insn, in_libcall_block)
+*** 6983,6993 ****
+ if (GET_CODE (dest) == MEM)
+ {
+ dest = fold_rtx (dest, insn);
+-
+- /* Decide whether we invalidate everything in memory,
+- or just things at non-fixed places.
+- Writing a large aggregate must invalidate everything
+- because we don't know how long it is. */
+- note_mem_written (dest, &writes_memory);
+ }
+
+--- 6878,6890 ----
+ if (GET_CODE (dest) == MEM)
+ {
++ #ifdef PUSH_ROUNDING
++ /* Stack pushes invalidate the stack pointer. */
++ rtx addr = XEXP (dest, 0);
++ if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC
++ || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC)
++ && XEXP (addr, 0) == stack_pointer_rtx)
++ invalidate (stack_pointer_rtx, Pmode);
++ #endif
+ dest = fold_rtx (dest, insn);
+ }
+
+*************** cse_insn (insn, in_libcall_block)
+*** 7234,7238 ****
+ sets[i].src_elt = src_eqv_elt;
+
+! invalidate_from_clobbers (&writes_memory, x);
+
+ /* Some registers are invalidated by subroutine calls. Memory is
+--- 7131,7135 ----
+ sets[i].src_elt = src_eqv_elt;
+
+! invalidate_from_clobbers (x);
+
+ /* Some registers are invalidated by subroutine calls. Memory is
+*************** cse_insn (insn, in_libcall_block)
+*** 7241,7248 ****
+ if (GET_CODE (insn) == CALL_INSN)
+ {
+- static struct write_data everything = {0, 1, 1, 1};
+-
+ if (! CONST_CALL_P (insn))
+! invalidate_memory (&everything);
+ invalidate_for_call ();
+ }
+--- 7138,7143 ----
+ if (GET_CODE (insn) == CALL_INSN)
+ {
+ if (! CONST_CALL_P (insn))
+! invalidate_memory ();
+ invalidate_for_call ();
+ }
+*************** cse_insn (insn, in_libcall_block)
+*** 7265,7270 ****
+ we have just done an invalidate_memory that covers even those. */
+ if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
+! || (GET_CODE (dest) == MEM && ! writes_memory.all
+! && ! cse_rtx_addr_varies_p (dest)))
+ invalidate (dest, VOIDmode);
+ else if (GET_CODE (dest) == STRICT_LOW_PART
+--- 7160,7164 ----
+ we have just done an invalidate_memory that covers even those. */
+ if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
+! || GET_CODE (dest) == MEM)
+ invalidate (dest, VOIDmode);
+ else if (GET_CODE (dest) == STRICT_LOW_PART
+*************** cse_insn (insn, in_libcall_block)
+*** 7359,7363 ****
+ sets[i].dest_hash, GET_MODE (dest));
+ elt->in_memory = (GET_CODE (sets[i].inner_dest) == MEM
+! && ! RTX_UNCHANGING_P (sets[i].inner_dest));
+
+ if (elt->in_memory)
+--- 7253,7259 ----
+ sets[i].dest_hash, GET_MODE (dest));
+ elt->in_memory = (GET_CODE (sets[i].inner_dest) == MEM
+! && (! RTX_UNCHANGING_P (sets[i].inner_dest)
+! || FIXED_BASE_PLUS_P (XEXP (sets[i].inner_dest,
+! 0))));
+
+ if (elt->in_memory)
+*************** cse_insn (insn, in_libcall_block)
+*** 7532,7580 ****
+ }
+ \f
+- /* Store 1 in *WRITES_PTR for those categories of memory ref
+- that must be invalidated when the expression WRITTEN is stored in.
+- If WRITTEN is null, say everything must be invalidated. */
+-
+ static void
+! note_mem_written (written, writes_ptr)
+! rtx written;
+! struct write_data *writes_ptr;
+! {
+! static struct write_data everything = {0, 1, 1, 1};
+!
+! if (written == 0)
+! *writes_ptr = everything;
+! else if (GET_CODE (written) == MEM)
+! {
+! /* Pushing or popping the stack invalidates just the stack pointer. */
+! rtx addr = XEXP (written, 0);
+! if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC
+! || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC)
+! && GET_CODE (XEXP (addr, 0)) == REG
+! && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM)
+! {
+! writes_ptr->sp = 1;
+! return;
+! }
+! else if (GET_MODE (written) == BLKmode)
+! *writes_ptr = everything;
+! /* (mem (scratch)) means clobber everything. */
+! else if (GET_CODE (addr) == SCRATCH)
+! *writes_ptr = everything;
+! else if (cse_rtx_addr_varies_p (written))
+! {
+! /* A varying address that is a sum indicates an array element,
+! and that's just as good as a structure element
+! in implying that we need not invalidate scalar variables.
+! However, we must allow QImode aliasing of scalars, because the
+! ANSI C standard allows character pointers to alias anything. */
+! if (! ((MEM_IN_STRUCT_P (written)
+! || GET_CODE (XEXP (written, 0)) == PLUS)
+! && GET_MODE (written) != QImode))
+! writes_ptr->all = 1;
+! writes_ptr->nonscalar = 1;
+! }
+! writes_ptr->var = 1;
+ }
+ }
+
+--- 7428,7471 ----
+ }
+ \f
+ static void
+! invalidate_memory ()
+! {
+! register int i;
+! register struct table_elt *p, *next;
+!
+! for (i = 0; i < NBUCKETS; i++)
+! for (p = table[i]; p; p = next)
+! {
+! next = p->next_same_hash;
+! if (p->in_memory)
+! remove_from_table (p, i);
+! }
+! }
+!
+! static int
+! note_mem_written (mem)
+! register rtx mem;
+! {
+! if (mem == 0 || GET_CODE(mem) != MEM )
+! return 0;
+! else
+! {
+! register rtx addr = XEXP (mem, 0);
+! /* Pushing or popping the stack invalidates just the stack pointer. */
+! if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC
+! || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC)
+! && GET_CODE (XEXP (addr, 0)) == REG
+! && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM)
+! {
+! if (reg_tick[STACK_POINTER_REGNUM] >= 0)
+! reg_tick[STACK_POINTER_REGNUM]++;
+!
+! /* This should be *very* rare. */
+! if (TEST_HARD_REG_BIT (hard_regs_in_table, STACK_POINTER_REGNUM))
+! invalidate (stack_pointer_rtx, VOIDmode);
+! return 1;
+ }
++ return 0;
++ }
+ }
+
+*************** note_mem_written (written, writes_ptr)
+*** 7584,7612 ****
+ alias with something that is SET or CLOBBERed.
+
+- W points to the writes_memory for this insn, a struct write_data
+- saying which kinds of memory references must be invalidated.
+ X is the pattern of the insn. */
+
+ static void
+! invalidate_from_clobbers (w, x)
+! struct write_data *w;
+ rtx x;
+ {
+- /* If W->var is not set, W specifies no action.
+- If W->all is set, this step gets all memory refs
+- so they can be ignored in the rest of this function. */
+- if (w->var)
+- invalidate_memory (w);
+-
+- if (w->sp)
+- {
+- if (reg_tick[STACK_POINTER_REGNUM] >= 0)
+- reg_tick[STACK_POINTER_REGNUM]++;
+-
+- /* This should be *very* rare. */
+- if (TEST_HARD_REG_BIT (hard_regs_in_table, STACK_POINTER_REGNUM))
+- invalidate (stack_pointer_rtx, VOIDmode);
+- }
+-
+ if (GET_CODE (x) == CLOBBER)
+ {
+--- 7475,7484 ----
+ alias with something that is SET or CLOBBERed.
+
+ X is the pattern of the insn. */
+
+ static void
+! invalidate_from_clobbers (x)
+ rtx x;
+ {
+ if (GET_CODE (x) == CLOBBER)
+ {
+*************** invalidate_from_clobbers (w, x)
+*** 7615,7619 ****
+ {
+ if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
+! || (GET_CODE (ref) == MEM && ! w->all))
+ invalidate (ref, VOIDmode);
+ else if (GET_CODE (ref) == STRICT_LOW_PART
+--- 7487,7491 ----
+ {
+ if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
+! || GET_CODE (ref) == MEM)
+ invalidate (ref, VOIDmode);
+ else if (GET_CODE (ref) == STRICT_LOW_PART
+*************** invalidate_from_clobbers (w, x)
+*** 7631,7643 ****
+ {
+ rtx ref = XEXP (y, 0);
+! if (ref)
+! {
+! if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
+! || (GET_CODE (ref) == MEM && !w->all))
+! invalidate (ref, VOIDmode);
+! else if (GET_CODE (ref) == STRICT_LOW_PART
+! || GET_CODE (ref) == ZERO_EXTRACT)
+! invalidate (XEXP (ref, 0), GET_MODE (ref));
+! }
+ }
+ }
+--- 7503,7512 ----
+ {
+ rtx ref = XEXP (y, 0);
+! if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
+! || GET_CODE (ref) == MEM)
+! invalidate (ref, VOIDmode);
+! else if (GET_CODE (ref) == STRICT_LOW_PART
+! || GET_CODE (ref) == ZERO_EXTRACT)
+! invalidate (XEXP (ref, 0), GET_MODE (ref));
+ }
+ }
+*************** cse_around_loop (loop_start)
+*** 7800,7807 ****
+ }
+ \f
+- /* Variable used for communications between the next two routines. */
+-
+- static struct write_data skipped_writes_memory;
+-
+ /* Process one SET of an insn that was skipped. We ignore CLOBBERs
+ since they are done elsewhere. This function is called via note_stores. */
+--- 7669,7672 ----
+*************** invalidate_skipped_set (dest, set)
+*** 7812,7823 ****
+ rtx dest;
+ {
+! if (GET_CODE (dest) == MEM)
+! note_mem_written (dest, &skipped_writes_memory);
+!
+! /* There are times when an address can appear varying and be a PLUS
+! during this scan when it would be a fixed address were we to know
+! the proper equivalences. So promote "nonscalar" to be "all". */
+! if (skipped_writes_memory.nonscalar)
+! skipped_writes_memory.all = 1;
+
+ if (GET_CODE (set) == CLOBBER
+--- 7677,7695 ----
+ rtx dest;
+ {
+! enum rtx_code code = GET_CODE (dest);
+!
+! if (code == MEM
+! && ! note_mem_written (dest) /* If this is not a stack push ... */
+! /* There are times when an address can appear varying and be a PLUS
+! during this scan when it would be a fixed address were we to know
+! the proper equivalences. So invalidate all memory if there is
+! a BLKmode or nonscalar memory reference or a reference to a
+! variable address. */
+! && (MEM_IN_STRUCT_P (dest) || GET_MODE (dest) == BLKmode
+! || cse_rtx_varies_p (XEXP (dest, 0))))
+! {
+! invalidate_memory ();
+! return;
+! }
+
+ if (GET_CODE (set) == CLOBBER
+*************** invalidate_skipped_set (dest, set)
+*** 7828,7837 ****
+ return;
+
+! if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
+! || (! skipped_writes_memory.all && ! cse_rtx_addr_varies_p (dest)))
+! invalidate (dest, VOIDmode);
+! else if (GET_CODE (dest) == STRICT_LOW_PART
+! || GET_CODE (dest) == ZERO_EXTRACT)
+ invalidate (XEXP (dest, 0), GET_MODE (dest));
+ }
+
+--- 7700,7707 ----
+ return;
+
+! if (code == STRICT_LOW_PART || code == ZERO_EXTRACT)
+ invalidate (XEXP (dest, 0), GET_MODE (dest));
++ else if (code == REG || code == SUBREG || code == MEM)
++ invalidate (dest, VOIDmode);
+ }
+
+*************** invalidate_skipped_block (start)
+*** 7845,7850 ****
+ {
+ rtx insn;
+- static struct write_data init = {0, 0, 0, 0};
+- static struct write_data everything = {0, 1, 1, 1};
+
+ for (insn = start; insn && GET_CODE (insn) != CODE_LABEL;
+--- 7715,7718 ----
+*************** invalidate_skipped_block (start)
+*** 7854,7867 ****
+ continue;
+
+- skipped_writes_memory = init;
+-
+ if (GET_CODE (insn) == CALL_INSN)
+ {
+ invalidate_for_call ();
+- skipped_writes_memory = everything;
+ }
+
+ note_stores (PATTERN (insn), invalidate_skipped_set);
+- invalidate_from_clobbers (&skipped_writes_memory, PATTERN (insn));
+ }
+ }
+--- 7722,7733 ----
+ continue;
+
+ if (GET_CODE (insn) == CALL_INSN)
+ {
++ if (! CONST_CALL_P (insn))
++ invalidate_memory ();
+ invalidate_for_call ();
+ }
+
+ note_stores (PATTERN (insn), invalidate_skipped_set);
+ }
+ }
+*************** cse_set_around_loop (x, insn, loop_start
+*** 7913,7920 ****
+ {
+ struct table_elt *src_elt;
+- static struct write_data init = {0, 0, 0, 0};
+- struct write_data writes_memory;
+-
+- writes_memory = init;
+
+ /* If this is a SET, see if we can replace SET_SRC, but ignore SETs that
+--- 7779,7782 ----
+*************** cse_set_around_loop (x, insn, loop_start
+*** 7976,7991 ****
+
+ /* Now invalidate anything modified by X. */
+! note_mem_written (SET_DEST (x), &writes_memory);
+!
+! if (writes_memory.var)
+! invalidate_memory (&writes_memory);
+!
+! /* See comment on similar code in cse_insn for explanation of these tests. */
+ if (GET_CODE (SET_DEST (x)) == REG || GET_CODE (SET_DEST (x)) == SUBREG
+! || (GET_CODE (SET_DEST (x)) == MEM && ! writes_memory.all
+! && ! cse_rtx_addr_varies_p (SET_DEST (x))))
+ invalidate (SET_DEST (x), VOIDmode);
+ else if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
+! || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
+ invalidate (XEXP (SET_DEST (x), 0), GET_MODE (SET_DEST (x)));
+ }
+--- 7838,7849 ----
+
+ /* Now invalidate anything modified by X. */
+! note_mem_written (SET_DEST (x));
+!
+! /* See comment on similar code in cse_insn for explanation of these tests. */
+ if (GET_CODE (SET_DEST (x)) == REG || GET_CODE (SET_DEST (x)) == SUBREG
+! || GET_CODE (SET_DEST (x)) == MEM)
+ invalidate (SET_DEST (x), VOIDmode);
+ else if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
+! || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
+ invalidate (XEXP (SET_DEST (x), 0), GET_MODE (SET_DEST (x)));
+ }
+*************** cse_main (f, nregs, after_loop, file)
+*** 8234,8237 ****
+--- 8092,8096 ----
+
+ init_recog ();
++ init_alias_analysis ();
+
+ max_reg = nregs;
+*************** cse_basic_block (from, to, next_branch,
+*** 8405,8408 ****
+--- 8264,8268 ----
+ int to_usage = 0;
+ int in_libcall_block = 0;
++ int num_insns = 0;
+
+ /* Each of these arrays is undefined before max_reg, so only allocate
+*************** cse_basic_block (from, to, next_branch,
+*** 8437,8440 ****
+--- 8297,8320 ----
+ {
+ register enum rtx_code code;
++ int i;
++ struct table_elt *p, *next;
++
++ /* If we have processed 1,000 insns, flush the hash table to avoid
++ extreme quadratic behavior. */
++ if (num_insns++ > 1000)
++ {
++ for (i = 0; i < NBUCKETS; i++)
++ for (p = table[i]; p; p = next)
++ {
++ next = p->next_same_hash;
++
++ if (GET_CODE (p->exp) == REG)
++ invalidate (p->exp, p->mode);
++ else
++ remove_from_table (p, i);
++ }
++
++ num_insns = 0;
++ }
+
+ /* See if this is a branch that is part of the path. If so, and it is
+diff -rcp2N gcc-2.7.2.3/dwarfout.c gcc-2.7.2.3.f.1/dwarfout.c
+*** gcc-2.7.2.3/dwarfout.c Fri Oct 27 01:40:07 1995
+--- gcc-2.7.2.3.f.1/dwarfout.c Sun Aug 10 22:47:19 1997
+*************** output_bound_representation (bound, dim_
+*** 1629,1705 ****
+ {
+
+! case ERROR_MARK:
+! return;
+
+ /* All fixed-bounds are represented by INTEGER_CST nodes. */
+
+! case INTEGER_CST:
+! ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
+! (unsigned) TREE_INT_CST_LOW (bound));
+! break;
+!
+! /* Dynamic bounds may be represented by NOP_EXPR nodes containing
+! SAVE_EXPR nodes. */
+!
+! case NOP_EXPR:
+! bound = TREE_OPERAND (bound, 0);
+! /* ... fall thru... */
+!
+! case SAVE_EXPR:
+! {
+! char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
+! char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
+!
+! sprintf (begin_label, BOUND_BEGIN_LABEL_FMT,
+! current_dienum, dim_num, u_or_l);
+
+! sprintf (end_label, BOUND_END_LABEL_FMT,
+! current_dienum, dim_num, u_or_l);
+
+! ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
+! ASM_OUTPUT_LABEL (asm_out_file, begin_label);
+
+! /* If we are working on a bound for a dynamic dimension in C,
+! the dynamic dimension in question had better have a static
+! (zero) lower bound and a dynamic *upper* bound. */
+
+! if (u_or_l != 'u')
+! abort ();
+
+! /* If optimization is turned on, the SAVE_EXPRs that describe
+! how to access the upper bound values are essentially bogus.
+! They only describe (at best) how to get at these values at
+! the points in the generated code right after they have just
+! been computed. Worse yet, in the typical case, the upper
+! bound values will not even *be* computed in the optimized
+! code, so these SAVE_EXPRs are entirely bogus.
+!
+! In order to compensate for this fact, we check here to see
+! if optimization is enabled, and if so, we effectively create
+! an empty location description for the (unknown and unknowable)
+! upper bound.
+!
+! This should not cause too much trouble for existing (stupid?)
+! debuggers because they have to deal with empty upper bounds
+! location descriptions anyway in order to be able to deal with
+! incomplete array types.
+!
+! Of course an intelligent debugger (GDB?) should be able to
+! comprehend that a missing upper bound specification in a
+! array type used for a storage class `auto' local array variable
+! indicates that the upper bound is both unknown (at compile-
+! time) and unknowable (at run-time) due to optimization.
+! */
+!
+! if (! optimize)
+! output_loc_descriptor
+! (eliminate_regs (SAVE_EXPR_RTL (bound), 0, NULL_RTX));
+
+! ASM_OUTPUT_LABEL (asm_out_file, end_label);
+! }
+! break;
+
+- default:
+- abort ();
+ }
+ }
+--- 1629,1699 ----
+ {
+
+! case ERROR_MARK:
+! return;
+
+ /* All fixed-bounds are represented by INTEGER_CST nodes. */
+
+! case INTEGER_CST:
+! ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
+! (unsigned) TREE_INT_CST_LOW (bound));
+! break;
+
+! default:
+
+! /* Dynamic bounds may be represented by NOP_EXPR nodes containing
+! SAVE_EXPR nodes, in which case we can do something, or as
+! an expression, which we cannot represent. */
+! {
+! char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
+! char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
+
+! sprintf (begin_label, BOUND_BEGIN_LABEL_FMT,
+! current_dienum, dim_num, u_or_l);
+
+! sprintf (end_label, BOUND_END_LABEL_FMT,
+! current_dienum, dim_num, u_or_l);
+
+! ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
+! ASM_OUTPUT_LABEL (asm_out_file, begin_label);
+!
+! /* If optimization is turned on, the SAVE_EXPRs that describe
+! how to access the upper bound values are essentially bogus.
+! They only describe (at best) how to get at these values at
+! the points in the generated code right after they have just
+! been computed. Worse yet, in the typical case, the upper
+! bound values will not even *be* computed in the optimized
+! code, so these SAVE_EXPRs are entirely bogus.
+!
+! In order to compensate for this fact, we check here to see
+! if optimization is enabled, and if so, we effectively create
+! an empty location description for the (unknown and unknowable)
+! upper bound.
+!
+! This should not cause too much trouble for existing (stupid?)
+! debuggers because they have to deal with empty upper bounds
+! location descriptions anyway in order to be able to deal with
+! incomplete array types.
+!
+! Of course an intelligent debugger (GDB?) should be able to
+! comprehend that a missing upper bound specification in a
+! array type used for a storage class `auto' local array variable
+! indicates that the upper bound is both unknown (at compile-
+! time) and unknowable (at run-time) due to optimization. */
+!
+! if (! optimize)
+! {
+! while (TREE_CODE (bound) == NOP_EXPR
+! || TREE_CODE (bound) == CONVERT_EXPR)
+! bound = TREE_OPERAND (bound, 0);
+!
+! if (TREE_CODE (bound) == SAVE_EXPR)
+! output_loc_descriptor
+! (eliminate_regs (SAVE_EXPR_RTL (bound), 0, NULL_RTX));
+! }
+
+! ASM_OUTPUT_LABEL (asm_out_file, end_label);
+! }
+! break;
+
+ }
+ }
+*************** type_attribute (type, decl_const, decl_v
+*** 2857,2861 ****
+ register int root_type_modified;
+
+! if (TREE_CODE (type) == ERROR_MARK)
+ return;
+
+--- 2851,2855 ----
+ register int root_type_modified;
+
+! if (code == ERROR_MARK)
+ return;
+
+*************** type_attribute (type, decl_const, decl_v
+*** 2864,2869 ****
+ type `void', so this only applies to function return types. */
+
+! if (TREE_CODE (type) == VOID_TYPE)
+ return;
+
+ root_type_modified = (code == POINTER_TYPE || code == REFERENCE_TYPE
+--- 2858,2869 ----
+ type `void', so this only applies to function return types. */
+
+! if (code == VOID_TYPE)
+ return;
++
++ /* If this is a subtype, find the underlying type. Eventually,
++ this should write out the appropriate subtype info. */
++ while ((code == INTEGER_TYPE || code == REAL_TYPE)
++ && TREE_TYPE (type) != 0)
++ type = TREE_TYPE (type), code = TREE_CODE (type);
+
+ root_type_modified = (code == POINTER_TYPE || code == REFERENCE_TYPE
+diff -rcp2N gcc-2.7.2.3/emit-rtl.c gcc-2.7.2.3.f.1/emit-rtl.c
+*** gcc-2.7.2.3/emit-rtl.c Thu Sep 14 20:09:30 1995
+--- gcc-2.7.2.3.f.1/emit-rtl.c Fri Aug 29 07:51:46 1997
+*************** max_label_num ()
+*** 545,548 ****
+--- 545,565 ----
+ }
+
++ /* Identify REG (which may be a CONCAT) as a user register. */
++
++ void
++ mark_user_reg (reg)
++ rtx reg;
++ {
++ if (GET_CODE (reg) == CONCAT)
++ {
++ REG_USERVAR_P (XEXP (reg, 0)) = 1;
++ REG_USERVAR_P (XEXP (reg, 1)) = 1;
++ }
++ else if (GET_CODE (reg) == REG)
++ REG_USERVAR_P (reg) = 1;
++ else
++ abort ();
++ }
++
+ /* Return first label number used in this function (if any were used). */
+
+*************** subreg_lowpart_p (x)
+*** 975,978 ****
+--- 992,997 ----
+ if (GET_CODE (x) != SUBREG)
+ return 1;
++ else if (GET_MODE (SUBREG_REG (x)) == VOIDmode)
++ return 0;
+
+ if (WORDS_BIG_ENDIAN
+*************** change_address (memref, mode, addr)
+*** 1315,1318 ****
+--- 1334,1340 ----
+ addr = memory_address (mode, addr);
+
++ if (rtx_equal_p (addr, XEXP (memref, 0)) && mode == GET_MODE (memref))
++ return memref;
++
+ new = gen_rtx (MEM, mode, addr);
+ MEM_VOLATILE_P (new) = MEM_VOLATILE_P (memref);
+diff -rcp2N gcc-2.7.2.3/explow.c gcc-2.7.2.3.f.1/explow.c
+*** gcc-2.7.2.3/explow.c Thu Jun 15 11:30:10 1995
+--- gcc-2.7.2.3.f.1/explow.c Fri Aug 29 07:52:03 1997
+*************** Boston, MA 02111-1307, USA. */
+*** 32,36 ****
+
+ static rtx break_out_memory_refs PROTO((rtx));
+!
+ /* Return an rtx for the sum of X and the integer C.
+
+--- 32,36 ----
+
+ static rtx break_out_memory_refs PROTO((rtx));
+! static void emit_stack_probe PROTO((rtx));
+ /* Return an rtx for the sum of X and the integer C.
+
+*************** convert_memory_address (to_mode, x)
+*** 305,310 ****
+--- 305,313 ----
+ rtx x;
+ {
++ enum machine_mode from_mode = to_mode == ptr_mode ? Pmode : ptr_mode;
+ rtx temp;
+
++ /* Here we handle some special cases. If none of them apply, fall through
++ to the default case. */
+ switch (GET_CODE (x))
+ {
+*************** convert_memory_address (to_mode, x)
+*** 321,339 ****
+ return temp;
+
+- case PLUS:
+- case MULT:
+- return gen_rtx (GET_CODE (x), to_mode,
+- convert_memory_address (to_mode, XEXP (x, 0)),
+- convert_memory_address (to_mode, XEXP (x, 1)));
+-
+ case CONST:
+ return gen_rtx (CONST, to_mode,
+ convert_memory_address (to_mode, XEXP (x, 0)));
+
+! default:
+! return convert_modes (to_mode,
+! to_mode == ptr_mode ? Pmode : ptr_mode,
+! x, POINTERS_EXTEND_UNSIGNED);
+ }
+ }
+ #endif
+--- 324,348 ----
+ return temp;
+
+ case CONST:
+ return gen_rtx (CONST, to_mode,
+ convert_memory_address (to_mode, XEXP (x, 0)));
+
+! case PLUS:
+! case MULT:
+! /* For addition the second operand is a small constant, we can safely
+! permute the converstion and addition operation. We can always safely
+! permute them if we are making the address narrower. In addition,
+! always permute the operations if this is a constant. */
+! if (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (from_mode)
+! || (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT
+! && (INTVAL (XEXP (x, 1)) + 20000 < 40000
+! || CONSTANT_P (XEXP (x, 0)))))
+! return gen_rtx (GET_CODE (x), to_mode,
+! convert_memory_address (to_mode, XEXP (x, 0)),
+! convert_memory_address (to_mode, XEXP (x, 1)));
+ }
++
++ return convert_modes (to_mode, from_mode,
++ x, POINTERS_EXTEND_UNSIGNED);
+ }
+ #endif
+*************** allocate_dynamic_stack_space (size, targ
+*** 1066,1069 ****
+--- 1075,1083 ----
+ do_pending_stack_adjust ();
+
++ /* If needed, check that we have the required amount of stack. Take into
++ account what has already been checked. */
++ if (flag_stack_check && ! STACK_CHECK_BUILTIN)
++ probe_stack_range (STACK_CHECK_MAX_FRAME_SIZE + STACK_CHECK_PROTECT, size);
++
+ /* Don't use a TARGET that isn't a pseudo. */
+ if (target == 0 || GET_CODE (target) != REG
+*************** allocate_dynamic_stack_space (size, targ
+*** 1133,1136 ****
+--- 1147,1281 ----
+
+ return target;
++ }
++ \f
++ /* Emit one stack probe at ADDRESS, an address within the stack. */
++
++ static void
++ emit_stack_probe (address)
++ rtx address;
++ {
++ rtx memref = gen_rtx (MEM, word_mode, address);
++
++ MEM_VOLATILE_P (memref) = 1;
++
++ if (STACK_CHECK_PROBE_LOAD)
++ emit_move_insn (gen_reg_rtx (word_mode), memref);
++ else
++ emit_move_insn (memref, const0_rtx);
++ }
++
++ /* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive.
++ FIRST is a constant and size is a Pmode RTX. These are offsets from the
++ current stack pointer. STACK_GROWS_DOWNWARD says whether to add or
++ subtract from the stack. If SIZE is constant, this is done
++ with a fixed number of probes. Otherwise, we must make a loop. */
++
++ #ifdef STACK_GROWS_DOWNWARD
++ #define STACK_GROW_OP MINUS
++ #else
++ #define STACK_GROW_OP PLUS
++ #endif
++
++ void
++ probe_stack_range (first, size)
++ HOST_WIDE_INT first;
++ rtx size;
++ {
++ /* First see if we have an insn to check the stack. Use it if so. */
++ #ifdef HAVE_check_stack
++ if (HAVE_check_stack)
++ {
++ rtx last_addr = force_operand (gen_rtx (STACK_GROW_OP, Pmode,
++ stack_pointer_rtx,
++ plus_constant (size, first)),
++ NULL_RTX);
++
++ if (insn_operand_predicate[(int) CODE_FOR_check_stack][0]
++ && ! ((*insn_operand_predicate[(int) CODE_FOR_check_stack][0])
++ (last_address, Pmode)))
++ last_address = copy_to_mode_reg (Pmode, last_address);
++
++ emit_insn (gen_check_stack (last_address));
++ return;
++ }
++ #endif
++
++ /* If we have to generate explicit probes, see if we have a constant
++ small number of them to generate. If so, that's the easy case. */
++ if (GET_CODE (size) == CONST_INT && INTVAL (size) < 10)
++ {
++ HOST_WIDE_INT offset;
++
++ /* Start probing at FIRST + N * STACK_CHECK_PROBE_INTERVAL
++ for values of N from 1 until it exceeds LAST. If only one
++ probe is needed, this will not generate any code. Then probe
++ at LAST. */
++ for (offset = first + STACK_CHECK_PROBE_INTERVAL;
++ offset < INTVAL (size);
++ offset = offset + STACK_CHECK_PROBE_INTERVAL)
++ emit_stack_probe (gen_rtx (STACK_GROW_OP, Pmode,
++ stack_pointer_rtx, GEN_INT (offset)));
++
++ emit_stack_probe (gen_rtx (STACK_GROW_OP, Pmode, stack_pointer_rtx,
++ plus_constant (size, first)));
++ }
++
++ /* In the variable case, do the same as above, but in a loop. We emit loop
++ notes so that loop optimization can be done. */
++ else
++ {
++ rtx test_addr
++ = force_operand (gen_rtx (STACK_GROW_OP, Pmode, stack_pointer_rtx,
++ GEN_INT (first
++ + STACK_CHECK_PROBE_INTERVAL)),
++ NULL_RTX);
++ rtx last_addr
++ = force_operand (gen_rtx (STACK_GROW_OP, Pmode, stack_pointer_rtx,
++ plus_constant (size, first)),
++ NULL_RTX);
++ rtx incr = GEN_INT (STACK_CHECK_PROBE_INTERVAL);
++ rtx loop_lab = gen_label_rtx ();
++ rtx test_lab = gen_label_rtx ();
++ rtx end_lab = gen_label_rtx ();
++ rtx temp;
++
++ if (GET_CODE (test_addr) != REG
++ || REGNO (test_addr) < FIRST_PSEUDO_REGISTER)
++ test_addr = force_reg (Pmode, test_addr);
++
++ emit_note (NULL_PTR, NOTE_INSN_LOOP_BEG);
++ emit_jump (test_lab);
++
++ emit_label (loop_lab);
++ emit_stack_probe (test_addr);
++
++ emit_note (NULL_PTR, NOTE_INSN_LOOP_CONT);
++
++ #ifdef STACK_GROWS_DOWNWARD
++ #define CMP_OPCODE GTU
++ temp = expand_binop (Pmode, sub_optab, test_addr, incr, test_addr,
++ 1, OPTAB_WIDEN);
++ #else
++ #define CMP_OPCODE LTU
++ temp = expand_binop (Pmode, add_optab, test_addr, incr, test_addr,
++ 1, OPTAB_WIDEN);
++ #endif
++
++ if (temp != test_addr)
++ abort ();
++
++ emit_label (test_lab);
++ emit_cmp_insn (test_addr, last_addr, CMP_OPCODE, NULL_RTX, Pmode, 1, 0);
++ emit_jump_insn ((*bcc_gen_fctn[(int) CMP_OPCODE]) (loop_lab));
++ emit_jump (end_lab);
++ emit_note (NULL_PTR, NOTE_INSN_LOOP_END);
++ emit_label (end_lab);
++
++ /* If will be doing stupid optimization, show test_addr is still live. */
++ if (obey_regdecls)
++ emit_insn (gen_rtx (USE, VOIDmode, test_addr));
++
++ emit_stack_probe (last_addr);
++ }
+ }
+ \f
+diff -rcp2N gcc-2.7.2.3/expmed.c gcc-2.7.2.3.f.1/expmed.c
+*** gcc-2.7.2.3/expmed.c Thu Jul 13 23:25:37 1995
+--- gcc-2.7.2.3.f.1/expmed.c Sun Aug 10 22:46:23 1997
+*************** store_bit_field (str_rtx, bitsize, bitnu
+*** 399,402 ****
+--- 399,403 ----
+ #ifdef HAVE_insv
+ if (HAVE_insv
++ && GET_MODE (value) != BLKmode
+ && !(bitsize == 1 && GET_CODE (value) == CONST_INT)
+ /* Ensure insv's size is wide enough for this field. */
+*************** store_split_bit_field (op0, bitsize, bit
+*** 777,781 ****
+ done in extract_bit_field, so that the two calls to
+ extract_fixed_bit_field will have comparable arguments. */
+! if (GET_CODE (value) != MEM)
+ total_bits = BITS_PER_WORD;
+ else
+--- 778,782 ----
+ done in extract_bit_field, so that the two calls to
+ extract_fixed_bit_field will have comparable arguments. */
+! if (GET_CODE (value) != MEM || GET_MODE (value) == BLKmode)
+ total_bits = BITS_PER_WORD;
+ else
+*************** store_split_bit_field (op0, bitsize, bit
+*** 790,797 ****
+ /* The args are chosen so that the last part includes the
+ lsb. Give extract_bit_field the value it needs (with
+! endianness compensation) to fetch the piece we want. */
+! part = extract_fixed_bit_field (word_mode, value, 0, thissize,
+! total_bits - bitsize + bitsdone,
+! NULL_RTX, 1, align);
+ }
+ else
+--- 791,807 ----
+ /* The args are chosen so that the last part includes the
+ lsb. Give extract_bit_field the value it needs (with
+! endianness compensation) to fetch the piece we want.
+!
+! ??? We have no idea what the alignment of VALUE is, so
+! we have to use a guess. */
+! part
+! = extract_fixed_bit_field
+! (word_mode, value, 0, thissize,
+! total_bits - bitsize + bitsdone, NULL_RTX, 1,
+! GET_MODE (value) == VOIDmode
+! ? UNITS_PER_WORD
+! : (GET_MODE (value) == BLKmode
+! ? 1
+! : GET_MODE_ALIGNMENT (GET_MODE (value)) / BITS_PER_UNIT));
+ }
+ else
+*************** store_split_bit_field (op0, bitsize, bit
+*** 803,808 ****
+ & (((HOST_WIDE_INT) 1 << thissize) - 1));
+ else
+! part = extract_fixed_bit_field (word_mode, value, 0, thissize,
+! bitsdone, NULL_RTX, 1, align);
+ }
+
+--- 813,824 ----
+ & (((HOST_WIDE_INT) 1 << thissize) - 1));
+ else
+! part
+! = extract_fixed_bit_field
+! (word_mode, value, 0, thissize, bitsdone, NULL_RTX, 1,
+! GET_MODE (value) == VOIDmode
+! ? UNITS_PER_WORD
+! : (GET_MODE (value) == BLKmode
+! ? 1
+! : GET_MODE_ALIGNMENT (GET_MODE (value)) / BITS_PER_UNIT));
+ }
+
+*************** extract_bit_field (str_rtx, bitsize, bit
+*** 876,882 ****
+ rtx spec_target_subreg = 0;
+
+- if (GET_CODE (str_rtx) == MEM && ! MEM_IN_STRUCT_P (str_rtx))
+- abort ();
+-
+ /* Discount the part of the structure before the desired byte.
+ We need to know how many bytes are safe to reference after it. */
+--- 892,895 ----
+*************** expand_divmod (rem_flag, code, mode, op0
+*** 3189,3193 ****
+ Notice that we compute also the final remainder value here,
+ and return the result right away. */
+! if (target == 0)
+ target = gen_reg_rtx (compute_mode);
+
+--- 3202,3206 ----
+ Notice that we compute also the final remainder value here,
+ and return the result right away. */
+! if (target == 0 || GET_MODE (target) != compute_mode)
+ target = gen_reg_rtx (compute_mode);
+
+*************** expand_divmod (rem_flag, code, mode, op0
+*** 3316,3320 ****
+ remainder. Notice that we compute also the final remainder
+ value here, and return the result right away. */
+! if (target == 0)
+ target = gen_reg_rtx (compute_mode);
+
+--- 3329,3333 ----
+ remainder. Notice that we compute also the final remainder
+ value here, and return the result right away. */
+! if (target == 0 || GET_MODE (target) != compute_mode)
+ target = gen_reg_rtx (compute_mode);
+
+*************** expand_divmod (rem_flag, code, mode, op0
+*** 3418,3422 ****
+ remainder. Notice that we compute also the final remainder
+ value here, and return the result right away. */
+! if (target == 0)
+ target = gen_reg_rtx (compute_mode);
+ if (rem_flag)
+--- 3431,3435 ----
+ remainder. Notice that we compute also the final remainder
+ value here, and return the result right away. */
+! if (target == 0 || GET_MODE (target) != compute_mode)
+ target = gen_reg_rtx (compute_mode);
+ if (rem_flag)
+*************** expand_divmod (rem_flag, code, mode, op0
+*** 3602,3605 ****
+--- 3615,3621 ----
+ if (quotient == 0)
+ {
++ if (target && GET_MODE (target) != compute_mode)
++ target = 0;
++
+ if (rem_flag)
+ {
+*************** expand_divmod (rem_flag, code, mode, op0
+*** 3653,3656 ****
+--- 3669,3675 ----
+ if (rem_flag)
+ {
++ if (target && GET_MODE (target) != compute_mode)
++ target = 0;
++
+ if (quotient == 0)
+ /* No divide instruction either. Use library for remainder. */
+diff -rcp2N gcc-2.7.2.3/expr.c gcc-2.7.2.3.f.1/expr.c
+*** gcc-2.7.2.3/expr.c Sat Jun 29 16:26:15 1996
+--- gcc-2.7.2.3.f.1/expr.c Fri Aug 29 08:01:24 1997
+*************** Boston, MA 02111-1307, USA. */
+*** 27,30 ****
+--- 27,31 ----
+ #include "flags.h"
+ #include "regs.h"
++ #include "hard-reg-set.h"
+ #include "function.h"
+ #include "insn-flags.h"
+*************** extern int stack_depth;
+*** 139,143 ****
+ extern int max_stack_depth;
+ extern struct obstack permanent_obstack;
+!
+
+ static rtx enqueue_insn PROTO((rtx, rtx));
+--- 140,144 ----
+ extern int max_stack_depth;
+ extern struct obstack permanent_obstack;
+! extern rtx arg_pointer_save_area;
+
+ static rtx enqueue_insn PROTO((rtx, rtx));
+*************** static void store_constructor PROTO((tre
+*** 151,155 ****
+ static rtx store_field PROTO((rtx, int, int, enum machine_mode, tree,
+ enum machine_mode, int, int, int));
+- static int get_inner_unaligned_p PROTO((tree));
+ static tree save_noncopied_parts PROTO((tree, tree));
+ static tree init_noncopied_parts PROTO((tree, tree));
+--- 152,155 ----
+*************** move_by_pieces (to, from, len, align)
+*** 1494,1498 ****
+
+ /* The code above should have handled everything. */
+! if (data.len != 0)
+ abort ();
+ }
+--- 1494,1498 ----
+
+ /* The code above should have handled everything. */
+! if (data.len > 0)
+ abort ();
+ }
+*************** emit_move_insn_1 (x, y)
+*** 1989,1993 ****
+
+ /* Show the output dies here. */
+! emit_insn (gen_rtx (CLOBBER, VOIDmode, x));
+
+ for (i = 0;
+--- 1989,1994 ----
+
+ /* Show the output dies here. */
+! if (x != y)
+! emit_insn (gen_rtx (CLOBBER, VOIDmode, x));
+
+ for (i = 0;
+*************** expand_assignment (to, from, want_value,
+*** 2481,2490 ****
+ problem. */
+
+! if (TREE_CODE (to) == COMPONENT_REF
+! || TREE_CODE (to) == BIT_FIELD_REF
+! || (TREE_CODE (to) == ARRAY_REF
+! && ((TREE_CODE (TREE_OPERAND (to, 1)) == INTEGER_CST
+! && TREE_CODE (TYPE_SIZE (TREE_TYPE (to))) == INTEGER_CST)
+! || (SLOW_UNALIGNED_ACCESS && get_inner_unaligned_p (to)))))
+ {
+ enum machine_mode mode1;
+--- 2482,2487 ----
+ problem. */
+
+! if (TREE_CODE (to) == COMPONENT_REF || TREE_CODE (to) == BIT_FIELD_REF
+! || TREE_CODE (to) == ARRAY_REF)
+ {
+ enum machine_mode mode1;
+*************** expand_assignment (to, from, want_value,
+*** 2498,2503 ****
+
+ push_temp_slots ();
+! tem = get_inner_reference (to, &bitsize, &bitpos, &offset,
+! &mode1, &unsignedp, &volatilep);
+
+ /* If we are going to use store_bit_field and extract_bit_field,
+--- 2495,2500 ----
+
+ push_temp_slots ();
+! tem = get_inner_reference (to, &bitsize, &bitpos, &offset, &mode1,
+! &unsignedp, &volatilep, &alignment);
+
+ /* If we are going to use store_bit_field and extract_bit_field,
+*************** expand_assignment (to, from, want_value,
+*** 2507,2511 ****
+ tem = stabilize_reference (tem);
+
+- alignment = TYPE_ALIGN (TREE_TYPE (tem)) / BITS_PER_UNIT;
+ to_rtx = expand_expr (tem, NULL_RTX, VOIDmode, 0);
+ if (offset != 0)
+--- 2504,2507 ----
+*************** expand_assignment (to, from, want_value,
+*** 2518,2529 ****
+ gen_rtx (PLUS, ptr_mode, XEXP (to_rtx, 0),
+ force_reg (ptr_mode, offset_rtx)));
+- /* If we have a variable offset, the known alignment
+- is only that of the innermost structure containing the field.
+- (Actually, we could sometimes do better by using the
+- align of an element of the innermost array, but no need.) */
+- if (TREE_CODE (to) == COMPONENT_REF
+- || TREE_CODE (to) == BIT_FIELD_REF)
+- alignment
+- = TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (to, 0))) / BITS_PER_UNIT;
+ }
+ if (volatilep)
+--- 2514,2517 ----
+*************** expand_assignment (to, from, want_value,
+*** 2535,2539 ****
+ We must make a new MEM before setting the volatile bit. */
+ if (offset == 0)
+! to_rtx = change_address (to_rtx, VOIDmode, XEXP (to_rtx, 0));
+ MEM_VOLATILE_P (to_rtx) = 1;
+ }
+--- 2523,2527 ----
+ We must make a new MEM before setting the volatile bit. */
+ if (offset == 0)
+! to_rtx = copy_rtx (to_rtx);
+ MEM_VOLATILE_P (to_rtx) = 1;
+ }
+*************** store_expr (exp, target, want_value)
+*** 2775,2780 ****
+ which will often result in some optimizations. Do the conversion
+ in two steps: first change the signedness, if needed, then
+! the extend. */
+! if (! want_value)
+ {
+ if (TREE_UNSIGNED (TREE_TYPE (exp))
+--- 2763,2771 ----
+ which will often result in some optimizations. Do the conversion
+ in two steps: first change the signedness, if needed, then
+! the extend. But don't do this if the type of EXP is a subtype
+! of something else since then the conversion might involve
+! more than just converting modes. */
+! if (! want_value && INTEGRAL_TYPE_P (TREE_TYPE (exp))
+! && TREE_TYPE (TREE_TYPE (exp)) == 0)
+ {
+ if (TREE_UNSIGNED (TREE_TYPE (exp))
+*************** store_expr (exp, target, want_value)
+*** 2843,2847 ****
+ Convert the value to TARGET's type first if nec. */
+
+! if (temp != target && TREE_CODE (exp) != ERROR_MARK)
+ {
+ target = protect_from_queue (target, 1);
+--- 2834,2838 ----
+ Convert the value to TARGET's type first if nec. */
+
+! if (! rtx_equal_p (temp, target) && TREE_CODE (exp) != ERROR_MARK)
+ {
+ target = protect_from_queue (target, 1);
+*************** store_constructor (exp, target)
+*** 3071,3074 ****
+--- 3062,3073 ----
+ }
+
++ if (TREE_READONLY (field))
++ {
++ if (GET_CODE (to_rtx) == MEM)
++ to_rtx = copy_rtx (to_rtx);
++
++ RTX_UNCHANGING_P (to_rtx) = 1;
++ }
++
+ store_field (to_rtx, bitsize, bitpos, mode, TREE_VALUE (elt),
+ /* The alignment of TARGET is
+*************** store_field (target, bitsize, bitpos, mo
+*** 3414,3417 ****
+--- 3413,3428 ----
+ rtx temp = expand_expr (exp, NULL_RTX, VOIDmode, 0);
+
++ /* If BITSIZE is narrower than the size of the type of EXP
++ we will be narrowing TEMP. Normally, what's wanted are the
++ low-order bits. However, if EXP's type is a record and this is
++ big-endian machine, we want the upper BITSIZE bits. */
++ if (BYTES_BIG_ENDIAN && GET_MODE_CLASS (GET_MODE (temp)) == MODE_INT
++ && bitsize < GET_MODE_BITSIZE (GET_MODE (temp))
++ && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
++ temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp,
++ size_int (GET_MODE_BITSIZE (GET_MODE (temp))
++ - bitsize),
++ temp, 1);
++
+ /* Unless MODE is VOIDmode or BLKmode, convert TEMP to
+ MODE. */
+*************** store_field (target, bitsize, bitpos, mo
+*** 3420,3423 ****
+--- 3431,3455 ----
+ temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
+
++ /* If the modes of TARGET and TEMP are both BLKmode, both
++ must be in memory and BITPOS must be aligned on a byte
++ boundary. If so, we simply do a block copy. */
++ if (GET_MODE (target) == BLKmode && GET_MODE (temp) == BLKmode)
++ {
++ if (GET_CODE (target) != MEM || GET_CODE (temp) != MEM
++ || bitpos % BITS_PER_UNIT != 0)
++ abort ();
++
++ target = change_address (target, VOIDmode,
++ plus_constant (XEXP (target, 0),
++ bitpos / BITS_PER_UNIT));
++
++ emit_block_move (target, temp,
++ GEN_INT ((bitsize + BITS_PER_UNIT - 1)
++ / BITS_PER_UNIT),
++ 1);
++
++ return value_mode == VOIDmode ? const0_rtx : target;
++ }
++
+ /* Store the value in the bitfield. */
+ store_bit_field (target, bitsize, bitpos, mode, temp, align, total_size);
+*************** store_field (target, bitsize, bitpos, mo
+*** 3466,3471 ****
+ /* Now build a reference to just the desired component. */
+
+! to_rtx = change_address (target, mode,
+! plus_constant (addr, (bitpos / BITS_PER_UNIT)));
+ MEM_IN_STRUCT_P (to_rtx) = 1;
+
+--- 3498,3505 ----
+ /* Now build a reference to just the desired component. */
+
+! to_rtx
+! = copy_rtx (change_address (target, mode,
+! plus_constant (addr,
+! (bitpos / BITS_PER_UNIT))));
+ MEM_IN_STRUCT_P (to_rtx) = 1;
+
+*************** store_field (target, bitsize, bitpos, mo
+*** 3474,3508 ****
+ }
+ \f
+- /* Return true if any object containing the innermost array is an unaligned
+- packed structure field. */
+-
+- static int
+- get_inner_unaligned_p (exp)
+- tree exp;
+- {
+- int needed_alignment = TYPE_ALIGN (TREE_TYPE (exp));
+-
+- while (1)
+- {
+- if (TREE_CODE (exp) == COMPONENT_REF || TREE_CODE (exp) == BIT_FIELD_REF)
+- {
+- if (TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))
+- < needed_alignment)
+- return 1;
+- }
+- else if (TREE_CODE (exp) != ARRAY_REF
+- && TREE_CODE (exp) != NON_LVALUE_EXPR
+- && ! ((TREE_CODE (exp) == NOP_EXPR
+- || TREE_CODE (exp) == CONVERT_EXPR)
+- && (TYPE_MODE (TREE_TYPE (exp))
+- == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))))
+- break;
+-
+- exp = TREE_OPERAND (exp, 0);
+- }
+-
+- return 0;
+- }
+-
+ /* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF,
+ or an ARRAY_REF, look for nested COMPONENT_REFs, BIT_FIELD_REFs, or
+--- 3508,3511 ----
+*************** get_inner_unaligned_p (exp)
+*** 3515,3518 ****
+--- 3518,3524 ----
+ This offset is in addition to the bit position.
+ If the position is not variable, we store 0 in *POFFSET.
++ We set *PALIGNMENT to the alignment in bytes of the address that will be
++ computed. This is the alignment of the thing we return if *POFFSET
++ is zero, but can be more less strictly aligned if *POFFSET is nonzero.
+
+ If any of the extraction expressions is volatile,
+*************** get_inner_unaligned_p (exp)
+*** 3525,3533 ****
+ If the field describes a variable-sized object, *PMODE is set to
+ VOIDmode and *PBITSIZE is set to -1. An access cannot be made in
+! this case, but the address of the object can be found. */
+
+ tree
+ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
+! punsignedp, pvolatilep)
+ tree exp;
+ int *pbitsize;
+--- 3531,3539 ----
+ If the field describes a variable-sized object, *PMODE is set to
+ VOIDmode and *PBITSIZE is set to -1. An access cannot be made in
+! this case, but the address of the object can be found. */
+
+ tree
+ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
+! punsignedp, pvolatilep, palignment)
+ tree exp;
+ int *pbitsize;
+*************** get_inner_reference (exp, pbitsize, pbit
+*** 3537,3540 ****
+--- 3543,3547 ----
+ int *punsignedp;
+ int *pvolatilep;
++ int *palignment;
+ {
+ tree orig_exp = exp;
+*************** get_inner_reference (exp, pbitsize, pbit
+*** 3542,3545 ****
+--- 3549,3553 ----
+ enum machine_mode mode = VOIDmode;
+ tree offset = integer_zero_node;
++ int alignment = BIGGEST_ALIGNMENT;
+
+ if (TREE_CODE (exp) == COMPONENT_REF)
+*************** get_inner_reference (exp, pbitsize, pbit
+*** 3599,3607 ****
+
+ *pbitpos += TREE_INT_CST_LOW (constant);
+!
+! if (var)
+! offset = size_binop (PLUS_EXPR, offset,
+! size_binop (EXACT_DIV_EXPR, var,
+! size_int (BITS_PER_UNIT)));
+ }
+
+--- 3607,3613 ----
+
+ *pbitpos += TREE_INT_CST_LOW (constant);
+! offset = size_binop (PLUS_EXPR, offset,
+! size_binop (EXACT_DIV_EXPR, var,
+! size_int (BITS_PER_UNIT)));
+ }
+
+*************** get_inner_reference (exp, pbitsize, pbit
+*** 3629,3633 ****
+
+ index = fold (build (MULT_EXPR, index_type, index,
+! TYPE_SIZE (TREE_TYPE (exp))));
+
+ if (TREE_CODE (index) == INTEGER_CST
+--- 3635,3640 ----
+
+ index = fold (build (MULT_EXPR, index_type, index,
+! convert (index_type,
+! TYPE_SIZE (TREE_TYPE (exp)))));
+
+ if (TREE_CODE (index) == INTEGER_CST
+*************** get_inner_reference (exp, pbitsize, pbit
+*** 3652,3666 ****
+ if (TREE_THIS_VOLATILE (exp))
+ *pvolatilep = 1;
+ exp = TREE_OPERAND (exp, 0);
+ }
+
+! /* If this was a bit-field, see if there is a mode that allows direct
+! access in case EXP is in memory. */
+! if (mode == VOIDmode && *pbitsize != 0 && *pbitpos % *pbitsize == 0)
+! {
+! mode = mode_for_size (*pbitsize, MODE_INT, 0);
+! if (mode == BLKmode)
+! mode = VOIDmode;
+! }
+
+ if (integer_zerop (offset))
+--- 3659,3675 ----
+ if (TREE_THIS_VOLATILE (exp))
+ *pvolatilep = 1;
++
++ /* If the offset is non-constant already, then we can't assume any
++ alignment more than the alignment here. */
++ if (! integer_zerop (offset))
++ alignment = MIN (alignment, TYPE_ALIGN (TREE_TYPE (exp)));
++
+ exp = TREE_OPERAND (exp, 0);
+ }
+
+! if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd')
+! alignment = MIN (alignment, DECL_ALIGN (exp));
+! else if (TREE_TYPE (exp) != 0)
+! alignment = MIN (alignment, TYPE_ALIGN (TREE_TYPE (exp)));
+
+ if (integer_zerop (offset))
+*************** get_inner_reference (exp, pbitsize, pbit
+*** 3672,3675 ****
+--- 3681,3685 ----
+ *pmode = mode;
+ *poffset = offset;
++ *palignment = alignment / BITS_PER_UNIT;
+ return exp;
+ }
+*************** init_noncopied_parts (lhs, list)
+*** 3812,3820 ****
+ }
+
+! /* Subroutine of expand_expr: return nonzero iff there is no way that
+ EXP can reference X, which is being modified. */
+
+ static int
+! safe_from_p (x, exp)
+ rtx x;
+ tree exp;
+--- 3822,3834 ----
+ }
+
+! static int safe_from_p_count;
+! static int safe_from_p_size;
+! static tree *safe_from_p_rewritten;
+!
+! /* Subroutine of safe_from_p: return nonzero iff there is no way that
+ EXP can reference X, which is being modified. */
+
+ static int
+! safe_from_p_1 (x, exp)
+ rtx x;
+ tree exp;
+*************** safe_from_p (x, exp)
+*** 3822,3825 ****
+--- 3836,3840 ----
+ rtx exp_rtl = 0;
+ int i, nops;
++ int is_save_expr = 0;
+
+ if (x == 0
+*************** safe_from_p (x, exp)
+*** 3860,3878 ****
+
+ case 'x':
+! if (TREE_CODE (exp) == TREE_LIST)
+! return ((TREE_VALUE (exp) == 0
+! || safe_from_p (x, TREE_VALUE (exp)))
+! && (TREE_CHAIN (exp) == 0
+! || safe_from_p (x, TREE_CHAIN (exp))));
+! else
+! return 0;
+
+ case '1':
+! return safe_from_p (x, TREE_OPERAND (exp, 0));
+
+ case '2':
+ case '<':
+! return (safe_from_p (x, TREE_OPERAND (exp, 0))
+! && safe_from_p (x, TREE_OPERAND (exp, 1)));
+
+ case 'e':
+--- 3875,3900 ----
+
+ case 'x':
+! switch (TREE_CODE (exp))
+! {
+! case TREE_LIST:
+! return ((TREE_VALUE (exp) == 0
+! || safe_from_p_1 (x, TREE_VALUE (exp)))
+! && (TREE_CHAIN (exp) == 0
+! || safe_from_p_1 (x, TREE_CHAIN (exp))));
+!
+! case ERROR_MARK:
+! return 1;
+!
+! default:
+! return 0;
+! }
+
+ case '1':
+! return safe_from_p_1 (x, TREE_OPERAND (exp, 0));
+
+ case '2':
+ case '<':
+! return (safe_from_p_1 (x, TREE_OPERAND (exp, 0))
+! && safe_from_p_1 (x, TREE_OPERAND (exp, 1)));
+
+ case 'e':
+*************** safe_from_p (x, exp)
+*** 3887,3891 ****
+ case ADDR_EXPR:
+ return (staticp (TREE_OPERAND (exp, 0))
+! || safe_from_p (x, TREE_OPERAND (exp, 0)));
+
+ case INDIRECT_REF:
+--- 3909,3913 ----
+ case ADDR_EXPR:
+ return (staticp (TREE_OPERAND (exp, 0))
+! || safe_from_p_1 (x, TREE_OPERAND (exp, 0)));
+
+ case INDIRECT_REF:
+*************** safe_from_p (x, exp)
+*** 3922,3928 ****
+
+ case CLEANUP_POINT_EXPR:
+! return safe_from_p (x, TREE_OPERAND (exp, 0));
+
+ case SAVE_EXPR:
+ exp_rtl = SAVE_EXPR_RTL (exp);
+ break;
+--- 3944,3951 ----
+
+ case CLEANUP_POINT_EXPR:
+! return safe_from_p_1 (x, TREE_OPERAND (exp, 0));
+
+ case SAVE_EXPR:
++ is_save_expr = 1;
+ exp_rtl = SAVE_EXPR_RTL (exp);
+ break;
+*************** safe_from_p (x, exp)
+*** 3931,3935 ****
+ /* The only operand we look at is operand 1. The rest aren't
+ part of the expression. */
+! return safe_from_p (x, TREE_OPERAND (exp, 1));
+
+ case METHOD_CALL_EXPR:
+--- 3954,3958 ----
+ /* The only operand we look at is operand 1. The rest aren't
+ part of the expression. */
+! return safe_from_p_1 (x, TREE_OPERAND (exp, 1));
+
+ case METHOD_CALL_EXPR:
+*************** safe_from_p (x, exp)
+*** 3945,3949 ****
+ for (i = 0; i < nops; i++)
+ if (TREE_OPERAND (exp, i) != 0
+! && ! safe_from_p (x, TREE_OPERAND (exp, i)))
+ return 0;
+ }
+--- 3968,3972 ----
+ for (i = 0; i < nops; i++)
+ if (TREE_OPERAND (exp, i) != 0
+! && ! safe_from_p_1 (x, TREE_OPERAND (exp, i)))
+ return 0;
+ }
+*************** safe_from_p (x, exp)
+*** 3969,3975 ****
+--- 3992,4054 ----
+
+ /* If we reach here, it is safe. */
++ if (is_save_expr)
++ {
++ /* This SAVE_EXPR might appear many times in the top-level
++ safe_from_p() expression, and if it has a complex
++ subexpression, examining it multiple times could result
++ in a combinatorial explosion. E.g. on an Alpha Cabriolet
++ running at least 200MHz, a Fortran test case compiled with
++ optimization took about 28 minutes to compile -- even though
++ it was only a few lines long, and the complicated line causing
++ so much time to be spent in the earlier version of safe_from_p()
++ had only 293 or so unique nodes.
++
++ So, turn this SAVE_EXPR into an ERROR_MARK for now, but remember
++ where it is so we can turn it back in the top-level safe_from_p()
++ when we're done. */
++
++ if (safe_from_p_count > safe_from_p_size)
++ return 0; /* For now, don't bother re-sizing the array. */
++ safe_from_p_rewritten[safe_from_p_count++] = exp;
++ TREE_SET_CODE (exp, ERROR_MARK);
++ }
++
+ return 1;
+ }
+
++ /* Subroutine of expand_expr: return nonzero iff there is no way that
++ EXP can reference X, which is being modified. */
++
++ static int
++ safe_from_p (x, exp)
++ rtx x;
++ tree exp;
++ {
++ int rtn;
++ int i;
++ tree trees[128];
++
++ safe_from_p_count = 0;
++ safe_from_p_size = sizeof (trees) / sizeof (trees[0]);
++ safe_from_p_rewritten = &trees[0];
++
++ rtn = safe_from_p_1 (x, exp);
++
++ #if 0
++ if (safe_from_p_count != 0)
++ fprintf (stderr, "%s:%d: safe_from_p_count = %d\n",
++ input_filename, lineno, safe_from_p_count);
++ #endif
++
++ for (i = 0; i < safe_from_p_count; ++i)
++ {
++ if (TREE_CODE (trees [i]) != ERROR_MARK)
++ abort ();
++ TREE_SET_CODE (trees[i], SAVE_EXPR);
++ }
++
++ return rtn;
++ }
++
+ /* Subroutine of expand_expr: return nonzero iff EXP is an
+ expression whose type is statically determinable. */
+*************** expand_expr (exp, target, tmode, modifie
+*** 4300,4303 ****
+--- 4379,4387 ----
+ context = decl_function_context (exp);
+
++ /* If this SAVE_EXPR was at global context, assume we are an
++ initialization function and move it into our context. */
++ if (context == 0)
++ SAVE_EXPR_CONTEXT (exp) = current_function_decl;
++
+ /* We treat inline_function_decl as an alias for the current function
+ because that is the inline function whose vars, types, etc.
+*************** expand_expr (exp, target, tmode, modifie
+*** 4310,4313 ****
+--- 4394,4401 ----
+ if (context)
+ {
++ /* The following call just exists to abort if the context is
++ not of a containing function. */
++ find_function_data (context);
++
+ temp = SAVE_EXPR_RTL (exp);
+ if (temp && GET_CODE (temp) == REG)
+*************** expand_expr (exp, target, tmode, modifie
+*** 4381,4400 ****
+ if (placeholder_list)
+ {
+! tree object;
+ tree old_list = placeholder_list;
+
+! for (object = TREE_PURPOSE (placeholder_list);
+! (TYPE_MAIN_VARIANT (TREE_TYPE (object))
+! != TYPE_MAIN_VARIANT (type))
+! && (TREE_CODE_CLASS (TREE_CODE (object)) == 'r'
+! || TREE_CODE_CLASS (TREE_CODE (object)) == '1'
+! || TREE_CODE_CLASS (TREE_CODE (object)) == '2'
+! || TREE_CODE_CLASS (TREE_CODE (object)) == 'e');
+! object = TREE_OPERAND (object, 0))
+! ;
+!
+! if (object != 0
+! && (TYPE_MAIN_VARIANT (TREE_TYPE (object))
+! == TYPE_MAIN_VARIANT (type)))
+ {
+ /* Expand this object skipping the list entries before
+--- 4469,4501 ----
+ if (placeholder_list)
+ {
+! tree need_type = TYPE_MAIN_VARIANT (type);
+! tree object = 0;
+ tree old_list = placeholder_list;
++ tree elt;
++
++ /* See if the object is the type that we want. */
++ if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_PURPOSE (placeholder_list)))
++ == need_type))
++ object = TREE_PURPOSE (placeholder_list);
++
++ /* Find the innermost reference that is of the type we want. */
++ for (elt = TREE_PURPOSE (placeholder_list);
++ elt != 0
++ && (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
++ || TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
++ || TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
++ || TREE_CODE_CLASS (TREE_CODE (elt)) == 'e');
++ elt = ((TREE_CODE (elt) == COMPOUND_EXPR
++ || TREE_CODE (elt) == COND_EXPR)
++ ? TREE_OPERAND (elt, 1) : TREE_OPERAND (elt, 0)))
++ if (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
++ && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (elt, 0)))
++ == need_type))
++ {
++ object = TREE_OPERAND (elt, 0);
++ break;
++ }
+
+! if (object != 0)
+ {
+ /* Expand this object skipping the list entries before
+*************** expand_expr (exp, target, tmode, modifie
+*** 4534,4537 ****
+--- 4635,4647 ----
+ }
+ }
++
++ if (TREE_READONLY (exp))
++ {
++ if (GET_CODE (target) == MEM)
++ target = copy_rtx (target);
++
++ RTX_UNCHANGING_P (target) = 1;
++ }
++
+ store_constructor (exp, target);
+ return target;
+*************** expand_expr (exp, target, tmode, modifie
+*** 4543,4567 ****
+ tree exp2;
+
+! /* A SAVE_EXPR as the address in an INDIRECT_EXPR is generated
+! for *PTR += ANYTHING where PTR is put inside the SAVE_EXPR.
+! This code has the same general effect as simply doing
+! expand_expr on the save expr, except that the expression PTR
+! is computed for use as a memory address. This means different
+! code, suitable for indexing, may be generated. */
+! if (TREE_CODE (exp1) == SAVE_EXPR
+! && SAVE_EXPR_RTL (exp1) == 0
+! && TYPE_MODE (TREE_TYPE (exp1)) == ptr_mode)
+! {
+! temp = expand_expr (TREE_OPERAND (exp1, 0), NULL_RTX,
+! VOIDmode, EXPAND_SUM);
+! op0 = memory_address (mode, temp);
+! op0 = copy_all_regs (op0);
+! SAVE_EXPR_RTL (exp1) = op0;
+! }
+! else
+! {
+! op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
+! op0 = memory_address (mode, op0);
+! }
+
+ temp = gen_rtx (MEM, mode, op0);
+--- 4653,4658 ----
+ tree exp2;
+
+! op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
+! op0 = memory_address (mode, op0);
+
+ temp = gen_rtx (MEM, mode, op0);
+*************** expand_expr (exp, target, tmode, modifie
+*** 4597,4605 ****
+ tree index = TREE_OPERAND (exp, 1);
+ tree index_type = TREE_TYPE (index);
+! int i;
+!
+! if (TREE_CODE (low_bound) != INTEGER_CST
+! && contains_placeholder_p (low_bound))
+! low_bound = build (WITH_RECORD_EXPR, sizetype, low_bound, exp);
+
+ /* Optimize the special-case of a zero lower bound.
+--- 4688,4692 ----
+ tree index = TREE_OPERAND (exp, 1);
+ tree index_type = TREE_TYPE (index);
+! HOST_WIDE_INT i;
+
+ /* Optimize the special-case of a zero lower bound.
+*************** expand_expr (exp, target, tmode, modifie
+*** 4618,4684 ****
+ convert (sizetype, low_bound)));
+
+- if ((TREE_CODE (index) != INTEGER_CST
+- || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+- && (! SLOW_UNALIGNED_ACCESS || ! get_inner_unaligned_p (exp)))
+- {
+- /* Nonconstant array index or nonconstant element size, and
+- not an array in an unaligned (packed) structure field.
+- Generate the tree for *(&array+index) and expand that,
+- except do it in a language-independent way
+- and don't complain about non-lvalue arrays.
+- `mark_addressable' should already have been called
+- for any array for which this case will be reached. */
+-
+- /* Don't forget the const or volatile flag from the array
+- element. */
+- tree variant_type = build_type_variant (type,
+- TREE_READONLY (exp),
+- TREE_THIS_VOLATILE (exp));
+- tree array_adr = build1 (ADDR_EXPR,
+- build_pointer_type (variant_type), array);
+- tree elt;
+- tree size = size_in_bytes (type);
+-
+- /* Convert the integer argument to a type the same size as sizetype
+- so the multiply won't overflow spuriously. */
+- if (TYPE_PRECISION (index_type) != TYPE_PRECISION (sizetype))
+- index = convert (type_for_size (TYPE_PRECISION (sizetype), 0),
+- index);
+-
+- if (TREE_CODE (size) != INTEGER_CST
+- && contains_placeholder_p (size))
+- size = build (WITH_RECORD_EXPR, sizetype, size, exp);
+-
+- /* Don't think the address has side effects
+- just because the array does.
+- (In some cases the address might have side effects,
+- and we fail to record that fact here. However, it should not
+- matter, since expand_expr should not care.) */
+- TREE_SIDE_EFFECTS (array_adr) = 0;
+-
+- elt
+- = build1
+- (INDIRECT_REF, type,
+- fold (build (PLUS_EXPR,
+- TYPE_POINTER_TO (variant_type),
+- array_adr,
+- fold
+- (build1
+- (NOP_EXPR,
+- TYPE_POINTER_TO (variant_type),
+- fold (build (MULT_EXPR, TREE_TYPE (index),
+- index,
+- convert (TREE_TYPE (index),
+- size))))))));;
+-
+- /* Volatility, etc., of new expression is same as old
+- expression. */
+- TREE_SIDE_EFFECTS (elt) = TREE_SIDE_EFFECTS (exp);
+- TREE_THIS_VOLATILE (elt) = TREE_THIS_VOLATILE (exp);
+- TREE_READONLY (elt) = TREE_READONLY (exp);
+-
+- return expand_expr (elt, target, tmode, modifier);
+- }
+-
+ /* Fold an expression like: "foo"[2].
+ This is not done in fold so it won't happen inside &.
+--- 4705,4708 ----
+*************** expand_expr (exp, target, tmode, modifie
+*** 4720,4725 ****
+ && TREE_CODE (DECL_INITIAL (array)) != ERROR_MARK)
+ {
+! if (TREE_CODE (index) == INTEGER_CST
+! && TREE_INT_CST_HIGH (index) == 0)
+ {
+ tree init = DECL_INITIAL (array);
+--- 4744,4748 ----
+ && TREE_CODE (DECL_INITIAL (array)) != ERROR_MARK)
+ {
+! if (TREE_CODE (index) == INTEGER_CST)
+ {
+ tree init = DECL_INITIAL (array);
+*************** expand_expr (exp, target, tmode, modifie
+*** 4738,4748 ****
+ }
+ else if (TREE_CODE (init) == STRING_CST
+! && i < TREE_STRING_LENGTH (init))
+! return GEN_INT (TREE_STRING_POINTER (init)[i]);
+ }
+ }
+ }
+
+! /* Treat array-ref with constant index as a component-ref. */
+
+ case COMPONENT_REF:
+--- 4761,4775 ----
+ }
+ else if (TREE_CODE (init) == STRING_CST
+! && TREE_INT_CST_HIGH (index) == 0
+! && (TREE_INT_CST_LOW (index)
+! < TREE_STRING_LENGTH (init)))
+! return (GEN_INT
+! (TREE_STRING_POINTER
+! (init)[TREE_INT_CST_LOW (index)]));
+ }
+ }
+ }
+
+! /* ... fall through ... */
+
+ case COMPONENT_REF:
+*************** expand_expr (exp, target, tmode, modifie
+*** 4770,4776 ****
+ tree offset;
+ int volatilep = 0;
+- tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
+- &mode1, &unsignedp, &volatilep);
+ int alignment;
+
+ /* If we got back the original object, something is wrong. Perhaps
+--- 4797,4804 ----
+ tree offset;
+ int volatilep = 0;
+ int alignment;
++ tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
++ &mode1, &unsignedp, &volatilep,
++ &alignment);
+
+ /* If we got back the original object, something is wrong. Perhaps
+*************** expand_expr (exp, target, tmode, modifie
+*** 4793,4797 ****
+ != INTEGER_CST)
+ ? target : NULL_RTX),
+! VOIDmode, EXPAND_SUM);
+
+ /* If this is a constant, put it into a register if it is a
+--- 4821,4826 ----
+ != INTEGER_CST)
+ ? target : NULL_RTX),
+! VOIDmode,
+! modifier == EXPAND_INITIALIZER ? modifier : 0);
+
+ /* If this is a constant, put it into a register if it is a
+*************** expand_expr (exp, target, tmode, modifie
+*** 4806,4810 ****
+ }
+
+- alignment = TYPE_ALIGN (TREE_TYPE (tem)) / BITS_PER_UNIT;
+ if (offset != 0)
+ {
+--- 4835,4838 ----
+*************** expand_expr (exp, target, tmode, modifie
+*** 4816,4827 ****
+ gen_rtx (PLUS, ptr_mode, XEXP (op0, 0),
+ force_reg (ptr_mode, offset_rtx)));
+- /* If we have a variable offset, the known alignment
+- is only that of the innermost structure containing the field.
+- (Actually, we could sometimes do better by using the
+- size of an element of the innermost array, but no need.) */
+- if (TREE_CODE (exp) == COMPONENT_REF
+- || TREE_CODE (exp) == BIT_FIELD_REF)
+- alignment = (TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))
+- / BITS_PER_UNIT);
+ }
+
+--- 4844,4847 ----
+*************** expand_expr (exp, target, tmode, modifie
+*** 4844,4848 ****
+ && modifier != EXPAND_SUM
+ && modifier != EXPAND_INITIALIZER
+! && ((mode1 != BLKmode && ! direct_load[(int) mode1])
+ /* If the field isn't aligned enough to fetch as a memref,
+ fetch it as a bit field. */
+--- 4864,4870 ----
+ && modifier != EXPAND_SUM
+ && modifier != EXPAND_INITIALIZER
+! && ((mode1 != BLKmode && ! direct_load[(int) mode1]
+! && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
+! && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
+ /* If the field isn't aligned enough to fetch as a memref,
+ fetch it as a bit field. */
+*************** expand_expr (exp, target, tmode, modifie
+*** 4857,4861 ****
+
+ if (ext_mode == BLKmode)
+! abort ();
+
+ op0 = extract_bit_field (validize_mem (op0), bitsize, bitpos,
+--- 4879,4907 ----
+
+ if (ext_mode == BLKmode)
+! {
+! /* In this case, BITPOS must start at a byte boundary and
+! TARGET, if specified, must be a MEM. */
+! if (GET_CODE (op0) != MEM
+! || (target != 0 && GET_CODE (target) != MEM)
+! || bitpos % BITS_PER_UNIT != 0)
+! abort ();
+!
+! op0 = change_address (op0, VOIDmode,
+! plus_constant (XEXP (op0, 0),
+! bitpos / BITS_PER_UNIT));
+! if (target == 0)
+! {
+! target
+! = assign_stack_temp (mode, int_size_in_bytes (type), 0);
+! MEM_IN_STRUCT_P (target) = AGGREGATE_TYPE_P (type);
+! }
+!
+! emit_block_move (target, op0,
+! GEN_INT ((bitsize + BITS_PER_UNIT - 1)
+! / BITS_PER_UNIT),
+! 1);
+!
+! return target;
+! }
+
+ op0 = extract_bit_field (validize_mem (op0), bitsize, bitpos,
+*************** expand_expr (exp, target, tmode, modifie
+*** 4863,4866 ****
+--- 4909,4924 ----
+ alignment,
+ int_size_in_bytes (TREE_TYPE (tem)));
++
++ /* If the result is a record type and BITSIZE is narrower than
++ the mode of OP0, an integral mode, and this is a big endian
++ machine, we must put the field into the high-order bits. */
++ if (TREE_CODE (type) == RECORD_TYPE && BYTES_BIG_ENDIAN
++ && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
++ && bitsize < GET_MODE_BITSIZE (GET_MODE (op0)))
++ op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0,
++ size_int (GET_MODE_BITSIZE (GET_MODE (op0))
++ - bitsize),
++ op0, 1);
++
+ if (mode == BLKmode)
+ {
+*************** expand_expr (exp, target, tmode, modifie
+*** 4877,4880 ****
+--- 4935,4943 ----
+ }
+
++ /* If the result is BLKmode, use that to access the object
++ now as well. */
++ if (mode == BLKmode)
++ mode1 = BLKmode;
++
+ /* Get a reference to just this component. */
+ if (modifier == EXPAND_CONST_ADDRESS
+*************** expand_expr (exp, target, tmode, modifie
+*** 4883,4895 ****
+ (bitpos / BITS_PER_UNIT)));
+ else
+! op0 = change_address (op0, mode1,
+! plus_constant (XEXP (op0, 0),
+! (bitpos / BITS_PER_UNIT)));
+ MEM_IN_STRUCT_P (op0) = 1;
+ MEM_VOLATILE_P (op0) |= volatilep;
+! if (mode == mode1 || mode1 == BLKmode || mode1 == tmode)
+ return op0;
+! if (target == 0)
+ target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
+ convert_move (target, op0, unsignedp);
+ return target;
+--- 4946,4964 ----
+ (bitpos / BITS_PER_UNIT)));
+ else
+! op0
+! = copy_rtx
+! (change_address (op0, mode1,
+! plus_constant (XEXP (op0, 0),
+! (bitpos / BITS_PER_UNIT))));
+!
+ MEM_IN_STRUCT_P (op0) = 1;
+ MEM_VOLATILE_P (op0) |= volatilep;
+! if (mode == mode1 || mode1 == BLKmode || mode1 == tmode
+! || modifier == EXPAND_CONST_ADDRESS
+! || modifier == EXPAND_INITIALIZER)
+ return op0;
+! else if (target == 0)
+ target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
++
+ convert_move (target, op0, unsignedp);
+ return target;
+*************** expand_expr (exp, target, tmode, modifie
+*** 6199,6203 ****
+ if (TREE_CODE (lhs) != VAR_DECL
+ && TREE_CODE (lhs) != RESULT_DECL
+! && TREE_CODE (lhs) != PARM_DECL)
+ preexpand_calls (exp);
+
+--- 6268,6274 ----
+ if (TREE_CODE (lhs) != VAR_DECL
+ && TREE_CODE (lhs) != RESULT_DECL
+! && TREE_CODE (lhs) != PARM_DECL
+! && ! (TREE_CODE (lhs) == INDIRECT_REF
+! && TYPE_READONLY (TREE_TYPE (TREE_OPERAND (lhs, 0)))))
+ preexpand_calls (exp);
+
+*************** expand_builtin (exp, target, subtarget,
+*** 7986,7989 ****
+--- 8057,8295 ----
+ #endif
+
++ /* __builtin_setjmp is passed a pointer to an array of five words
++ (not all will be used on all machines). It operates similarly to
++ the C library function of the same name, but is more efficient.
++ Much of the code below (and for longjmp) is copied from the handling
++ of non-local gotos.
++
++ NOTE: This is intended for use by GNAT and will only work in
++ the method used by it. This code will likely NOT survive to
++ the GCC 2.8.0 release. */
++ case BUILT_IN_SETJMP:
++ if (arglist == 0
++ || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE)
++ break;
++
++ {
++ rtx buf_addr = expand_expr (TREE_VALUE (arglist), subtarget,
++ VOIDmode, 0);
++ rtx lab1 = gen_label_rtx (), lab2 = gen_label_rtx ();
++ enum machine_mode sa_mode = Pmode;
++ rtx stack_save;
++ int old_inhibit_defer_pop = inhibit_defer_pop;
++ int return_pops = RETURN_POPS_ARGS (get_identifier ("__dummy"),
++ get_identifier ("__dummy"), 0);
++ rtx next_arg_reg;
++ CUMULATIVE_ARGS args_so_far;
++ int current_call_is_indirect = 1;
++ int i;
++
++ #ifdef POINTERS_EXTEND_UNSIGNED
++ buf_addr = convert_memory_address (Pmode, buf_addr);
++ #endif
++
++ buf_addr = force_reg (Pmode, buf_addr);
++
++ if (target == 0 || GET_CODE (target) != REG
++ || REGNO (target) < FIRST_PSEUDO_REGISTER)
++ target = gen_reg_rtx (value_mode);
++
++ emit_queue ();
++
++ CONST_CALL_P (emit_note (NULL_PTR, NOTE_INSN_SETJMP)) = 1;
++ current_function_calls_setjmp = 1;
++
++ /* We store the frame pointer and the address of lab1 in the buffer
++ and use the rest of it for the stack save area, which is
++ machine-dependent. */
++ emit_move_insn (gen_rtx (MEM, Pmode, buf_addr),
++ virtual_stack_vars_rtx);
++ emit_move_insn
++ (validize_mem (gen_rtx (MEM, Pmode,
++ plus_constant (buf_addr,
++ GET_MODE_SIZE (Pmode)))),
++ gen_rtx (LABEL_REF, Pmode, lab1));
++
++ #ifdef HAVE_save_stack_nonlocal
++ if (HAVE_save_stack_nonlocal)
++ sa_mode = insn_operand_mode[(int) CODE_FOR_save_stack_nonlocal][0];
++ #endif
++
++ current_function_has_nonlocal_goto = 1;
++
++ stack_save = gen_rtx (MEM, sa_mode,
++ plus_constant (buf_addr,
++ 2 * GET_MODE_SIZE (Pmode)));
++ emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
++
++ #ifdef HAVE_setjmp
++ if (HAVE_setjmp)
++ emit_insn (gen_setjmp ());
++ #endif
++
++ /* Set TARGET to zero and branch around the other case. */
++ emit_move_insn (target, const0_rtx);
++ emit_jump_insn (gen_jump (lab2));
++ emit_barrier ();
++ emit_label (lab1);
++
++ /* Note that setjmp clobbers FP when we get here, so we have to
++ make sure it's marked as used by this function. */
++ emit_insn (gen_rtx (USE, VOIDmode, hard_frame_pointer_rtx));
++
++ /* Mark the static chain as clobbered here so life information
++ doesn't get messed up for it. */
++ emit_insn (gen_rtx (CLOBBER, VOIDmode, static_chain_rtx));
++
++ /* Now put in the code to restore the frame pointer, and argument
++ pointer, if needed. The code below is from expand_end_bindings
++ in stmt.c; see detailed documentation there. */
++ #ifdef HAVE_nonlocal_goto
++ if (! HAVE_nonlocal_goto)
++ #endif
++ emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
++
++ #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
++ if (fixed_regs[ARG_POINTER_REGNUM])
++ {
++ #ifdef ELIMINABLE_REGS
++ static struct elims {int from, to;} elim_regs[] = ELIMINABLE_REGS;
++
++ for (i = 0; i < sizeof elim_regs / sizeof elim_regs[0]; i++)
++ if (elim_regs[i].from == ARG_POINTER_REGNUM
++ && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
++ break;
++
++ if (i == sizeof elim_regs / sizeof elim_regs [0])
++ #endif
++ {
++ /* Now restore our arg pointer from the address at which it
++ was saved in our stack frame.
++ If there hasn't be space allocated for it yet, make
++ some now. */
++ if (arg_pointer_save_area == 0)
++ arg_pointer_save_area
++ = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
++ emit_move_insn (virtual_incoming_args_rtx,
++ copy_to_reg (arg_pointer_save_area));
++ }
++ }
++ #endif
++
++ #ifdef HAVE_nonlocal_goto_receiver
++ if (HAVE_nonlocal_goto_receiver)
++ emit_insn (gen_nonlocal_goto_receiver ());
++ #endif
++ /* The static chain pointer contains the address of dummy function.
++ We need to call it here to handle some PIC cases of restoring
++ a global pointer. Then return 1. */
++ op0 = copy_to_mode_reg (Pmode, static_chain_rtx);
++
++ /* We can't actually call emit_library_call here, so do everything
++ it does, which isn't much for a libfunc with no args. */
++ op0 = memory_address (FUNCTION_MODE, op0);
++
++ INIT_CUMULATIVE_ARGS (args_so_far, NULL_TREE,
++ gen_rtx (SYMBOL_REF, Pmode, "__dummy"));
++ next_arg_reg = FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1);
++
++ #ifndef ACCUMULATE_OUTGOING_ARGS
++ #ifdef HAVE_call_pop
++ if (HAVE_call_pop)
++ emit_call_insn (gen_call_pop (gen_rtx (MEM, FUNCTION_MODE, op0),
++ const0_rtx, next_arg_reg,
++ GEN_INT (return_pops)));
++ else
++ #endif
++ #endif
++
++ #ifdef HAVE_call
++ if (HAVE_call)
++ emit_call_insn (gen_call (gen_rtx (MEM, FUNCTION_MODE, op0),
++ const0_rtx, next_arg_reg, const0_rtx));
++ else
++ #endif
++ abort ();
++
++ emit_move_insn (target, const1_rtx);
++ emit_label (lab2);
++ return target;
++ }
++
++ /* __builtin_longjmp is passed a pointer to an array of five words
++ and a value, which is a dummy. It's similar to the C library longjmp
++ function but works with __builtin_setjmp above. */
++ case BUILT_IN_LONGJMP:
++ if (arglist == 0 || TREE_CHAIN (arglist) == 0
++ || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE)
++ break;
++
++ {
++ tree dummy_id = get_identifier ("__dummy");
++ tree dummy_type = build_function_type (void_type_node, NULL_TREE);
++ tree dummy_decl = build_decl (FUNCTION_DECL, dummy_id, dummy_type);
++ #ifdef POINTERS_EXTEND_UNSIGNED
++ rtx buf_addr
++ = force_reg (Pmode,
++ convert_memory_address
++ (Pmode,
++ expand_expr (TREE_VALUE (arglist),
++ NULL_RTX, VOIDmode, 0)));
++ #else
++ rtx buf_addr
++ = force_reg (Pmode, expand_expr (TREE_VALUE (arglist),
++ NULL_RTX,
++ VOIDmode, 0));
++ #endif
++ rtx fp = gen_rtx (MEM, Pmode, buf_addr);
++ rtx lab = gen_rtx (MEM, Pmode,
++ plus_constant (buf_addr, GET_MODE_SIZE (Pmode)));
++ enum machine_mode sa_mode
++ #ifdef HAVE_save_stack_nonlocal
++ = (HAVE_save_stack_nonlocal
++ ? insn_operand_mode[(int) CODE_FOR_save_stack_nonlocal][0]
++ : Pmode);
++ #else
++ = Pmode;
++ #endif
++ rtx stack = gen_rtx (MEM, sa_mode,
++ plus_constant (buf_addr,
++ 2 * GET_MODE_SIZE (Pmode)));
++
++ DECL_EXTERNAL (dummy_decl) = 1;
++ TREE_PUBLIC (dummy_decl) = 1;
++ make_decl_rtl (dummy_decl, NULL_PTR, 1);
++
++ /* Expand the second expression just for side-effects. */
++ expand_expr (TREE_VALUE (TREE_CHAIN (arglist)),
++ const0_rtx, VOIDmode, 0);
++
++ assemble_external (dummy_decl);
++
++ /* Pick up FP, label, and SP from the block and jump. This code is
++ from expand_goto in stmt.c; see there for detailed comments. */
++ #if HAVE_nonlocal_goto
++ if (HAVE_nonlocal_goto)
++ emit_insn (gen_nonlocal_goto (fp, lab, stack,
++ XEXP (DECL_RTL (dummy_decl), 0)));
++ else
++ #endif
++ {
++ lab = copy_to_reg (lab);
++ emit_move_insn (hard_frame_pointer_rtx, fp);
++ emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
++
++ /* Put in the static chain register the address of the dummy
++ function. */
++ emit_move_insn (static_chain_rtx, XEXP (DECL_RTL (dummy_decl), 0));
++ emit_insn (gen_rtx (USE, VOIDmode, hard_frame_pointer_rtx));
++ emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
++ emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx));
++ emit_indirect_jump (lab);
++ }
++
++ return const0_rtx;
++ }
++
+ default: /* just do library call, if unknown builtin */
+ error ("built-in function `%s' not currently supported",
+*************** preexpand_calls (exp)
+*** 8688,8701 ****
+ case CALL_EXPR:
+ /* Do nothing if already expanded. */
+! if (CALL_EXPR_RTL (exp) != 0)
+ return;
+
+! /* Do nothing to built-in functions. */
+! if (TREE_CODE (TREE_OPERAND (exp, 0)) != ADDR_EXPR
+! || TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) != FUNCTION_DECL
+! || ! DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
+! /* Do nothing if the call returns a variable-sized object. */
+! || TREE_CODE (TYPE_SIZE (TREE_TYPE(exp))) != INTEGER_CST)
+! CALL_EXPR_RTL (exp) = expand_call (exp, NULL_RTX, 0);
+ return;
+
+--- 8994,9008 ----
+ case CALL_EXPR:
+ /* Do nothing if already expanded. */
+! if (CALL_EXPR_RTL (exp) != 0
+! /* Do nothing if the call returns a variable-sized object. */
+! || TREE_CODE (TYPE_SIZE (TREE_TYPE(exp))) != INTEGER_CST
+! /* Do nothing to built-in functions. */
+! || (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
+! && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
+! == FUNCTION_DECL)
+! && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))))
+ return;
+
+! CALL_EXPR_RTL (exp) = expand_call (exp, NULL_RTX, 0);
+ return;
+
+*************** do_jump (exp, if_false_label, if_true_la
+*** 9087,9090 ****
+--- 9394,9398 ----
+ push_temp_slots ();
+ expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0);
++ preserve_temp_slots (NULL_RTX);
+ free_temp_slots ();
+ pop_temp_slots ();
+*************** do_jump (exp, if_false_label, if_true_la
+*** 9103,9111 ****
+ tree offset;
+ int volatilep = 0;
+
+ /* Get description of this reference. We don't actually care
+ about the underlying object here. */
+ get_inner_reference (exp, &bitsize, &bitpos, &offset,
+! &mode, &unsignedp, &volatilep);
+
+ type = type_for_size (bitsize, unsignedp);
+--- 9411,9421 ----
+ tree offset;
+ int volatilep = 0;
++ int alignment;
+
+ /* Get description of this reference. We don't actually care
+ about the underlying object here. */
+ get_inner_reference (exp, &bitsize, &bitpos, &offset,
+! &mode, &unsignedp, &volatilep,
+! &alignment);
+
+ type = type_for_size (bitsize, unsignedp);
+diff -rcp2N gcc-2.7.2.3/expr.h gcc-2.7.2.3.f.1/expr.h
+*** gcc-2.7.2.3/expr.h Fri Oct 27 10:16:56 1995
+--- gcc-2.7.2.3.f.1/expr.h Fri Aug 29 07:52:02 1997
+*************** enum direction {none, upward, downward};
+*** 229,232 ****
+--- 229,272 ----
+ #define RETURN_IN_MEMORY(TYPE) (TYPE_MODE (TYPE) == BLKmode)
+ #endif
++
++ /* Provide default values for the macros controlling stack checking. */
++
++ #ifndef STACK_CHECK_BUILTIN
++ #define STACK_CHECK_BUILTIN 0
++ #endif
++
++ /* The default interval is one page. */
++ #ifndef STACK_CHECK_PROBE_INTERVAL
++ #define STACK_CHECK_PROBE_INTERVAL 4096
++ #endif
++
++ /* The default is to do a store into the stack. */
++ #ifndef STACK_CHECK_PROBE_LOAD
++ #define STACK_CHECK_PROBE_LOAD 0
++ #endif
++
++ /* This value is arbitrary, but should be sufficient for most machines. */
++ #ifndef STACK_CHECK_PROTECT
++ #define STACK_CHECK_PROTECT (75 * UNITS_PER_WORD)
++ #endif
++
++ /* Make the maximum frame size be the largest we can and still only need
++ one probe per function. */
++ #ifndef STACK_CHECK_MAX_FRAME_SIZE
++ #define STACK_CHECK_MAX_FRAME_SIZE \
++ (STACK_CHECK_PROBE_INTERVAL - UNITS_PER_WORD)
++ #endif
++
++ /* This is arbitrary, but should be large enough everywhere. */
++ #ifndef STACK_CHECK_FIXED_FRAME_SIZE
++ #define STACK_CHECK_FIXED_FRAME_SIZE (4 * UNITS_PER_WORD)
++ #endif
++
++ /* Provide a reasonable default for the maximum size of an object to
++ allocate in the fixed frame. We may need to be able to make this
++ controllable by the user at some point. */
++ #ifndef STACK_CHECK_MAX_VAR_SIZE
++ #define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100)
++ #endif
+ \f
+ /* Optabs are tables saying how to generate insn bodies
+*************** extern void emit_stack_restore PROTO((en
+*** 828,831 ****
+--- 868,878 ----
+ says how many bytes. */
+ extern rtx allocate_dynamic_stack_space PROTO((rtx, rtx, int));
++
++ /* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive.
++ FIRST is a constant and size is a Pmode RTX. These are offsets from the
++ current stack pointer. STACK_GROWS_DOWNWARD says whether to add or
++ subtract from the stack. If SIZE is constant, this is done
++ with a fixed number of probes. Otherwise, we must make a loop. */
++ extern void probe_stack_range PROTO((HOST_WIDE_INT, rtx));
+
+ /* Emit code to copy function value to a new temp reg and return that reg. */
+diff -rcp2N gcc-2.7.2.3/final.c gcc-2.7.2.3.f.1/final.c
+*** gcc-2.7.2.3/final.c Sun Nov 26 18:50:00 1995
+--- gcc-2.7.2.3.f.1/final.c Fri Jul 11 00:11:16 1997
+*************** profile_function (file)
+*** 983,991 ****
+ text_section ();
+
+! #ifdef STRUCT_VALUE_INCOMING_REGNUM
+ if (sval)
+ ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_INCOMING_REGNUM);
+ #else
+! #ifdef STRUCT_VALUE_REGNUM
+ if (sval)
+ ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_REGNUM);
+--- 983,991 ----
+ text_section ();
+
+! #if defined(STRUCT_VALUE_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
+ if (sval)
+ ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_INCOMING_REGNUM);
+ #else
+! #if defined(STRUCT_VALUE_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
+ if (sval)
+ ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_REGNUM);
+*************** profile_function (file)
+*** 993,1027 ****
+ #endif
+
+! #if 0
+! #ifdef STATIC_CHAIN_INCOMING_REGNUM
+ if (cxt)
+ ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_INCOMING_REGNUM);
+ #else
+! #ifdef STATIC_CHAIN_REGNUM
+ if (cxt)
+ ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_REGNUM);
+ #endif
+ #endif
+- #endif /* 0 */
+
+ FUNCTION_PROFILER (file, profile_label_no);
+
+! #if 0
+! #ifdef STATIC_CHAIN_INCOMING_REGNUM
+ if (cxt)
+ ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_INCOMING_REGNUM);
+ #else
+! #ifdef STATIC_CHAIN_REGNUM
+ if (cxt)
+ ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_REGNUM);
+ #endif
+ #endif
+- #endif /* 0 */
+
+! #ifdef STRUCT_VALUE_INCOMING_REGNUM
+ if (sval)
+ ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_INCOMING_REGNUM);
+ #else
+! #ifdef STRUCT_VALUE_REGNUM
+ if (sval)
+ ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_REGNUM);
+--- 993,1023 ----
+ #endif
+
+! #if defined(STATIC_CHAIN_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
+ if (cxt)
+ ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_INCOMING_REGNUM);
+ #else
+! #if defined(STATIC_CHAIN_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
+ if (cxt)
+ ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_REGNUM);
+ #endif
+ #endif
+
+ FUNCTION_PROFILER (file, profile_label_no);
+
+! #if defined(STATIC_CHAIN_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
+ if (cxt)
+ ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_INCOMING_REGNUM);
+ #else
+! #if defined(STATIC_CHAIN_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
+ if (cxt)
+ ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_REGNUM);
+ #endif
+ #endif
+
+! #if defined(STRUCT_VALUE_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
+ if (sval)
+ ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_INCOMING_REGNUM);
+ #else
+! #if defined(STRUCT_VALUE_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
+ if (sval)
+ ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_REGNUM);
+diff -rcp2N gcc-2.7.2.3/flags.h gcc-2.7.2.3.f.1/flags.h
+*** gcc-2.7.2.3/flags.h Thu Jun 15 11:34:11 1995
+--- gcc-2.7.2.3.f.1/flags.h Fri Aug 29 08:40:01 1997
+*************** extern int flag_unroll_loops;
+*** 204,207 ****
+--- 204,221 ----
+ extern int flag_unroll_all_loops;
+
++ /* Nonzero forces all invariant computations in loops to be moved
++ outside the loop. */
++
++ extern int flag_move_all_movables;
++
++ /* Nonzero forces all general induction variables in loops to be
++ strength reduced. */
++
++ extern int flag_reduce_all_givs;
++
++ /* Nonzero gets another run of loop_optimize performed. */
++
++ extern int flag_rerun_loop_opt;
++
+ /* Nonzero for -fcse-follow-jumps:
+ have cse follow jumps to do a more extensive job. */
+*************** extern int flag_gnu_linker;
+*** 339,342 ****
+--- 353,373 ----
+ /* Tag all structures with __attribute__(packed) */
+ extern int flag_pack_struct;
++
++ /* Emit code to check for stack overflow; also may cause large objects
++ to be allocated dynamically. */
++ extern int flag_stack_check;
++
++ /* 1 if alias checking is enabled: symbols do not alias each other
++ and parameters do not alias the current stack frame. */
++ extern int flag_alias_check;
++
++ /* This flag is only tested if alias checking is enabled.
++ 0 if pointer arguments may alias each other. True in C.
++ 1 if pointer arguments may not alias each other but may alias
++ global variables.
++ 2 if pointer arguments may not alias each other and may not
++ alias global variables. True in Fortran.
++ The value is ignored if flag_alias_check is 0. */
++ extern int flag_argument_noalias;
+ \f
+ /* Other basic status info about current function. */
+diff -rcp2N gcc-2.7.2.3/flow.c gcc-2.7.2.3.f.1/flow.c
+*** gcc-2.7.2.3/flow.c Mon Aug 28 10:23:34 1995
+--- gcc-2.7.2.3.f.1/flow.c Wed Aug 27 11:46:36 1997
+*************** static HARD_REG_SET elim_reg_set;
+*** 288,292 ****
+ /* Forward declarations */
+ static void find_basic_blocks PROTO((rtx, rtx));
+! static int uses_reg_or_mem PROTO((rtx));
+ static void mark_label_ref PROTO((rtx, rtx, int));
+ static void life_analysis PROTO((rtx, int));
+--- 288,292 ----
+ /* Forward declarations */
+ static void find_basic_blocks PROTO((rtx, rtx));
+! static int jmp_uses_reg_or_mem PROTO((rtx));
+ static void mark_label_ref PROTO((rtx, rtx, int));
+ static void life_analysis PROTO((rtx, int));
+*************** find_basic_blocks (f, nonlocal_label_lis
+*** 554,563 ****
+ if (GET_CODE (XVECEXP (pat, 0, i)) == SET
+ && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
+! && uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i))))
+ computed_jump = 1;
+ }
+ else if (GET_CODE (pat) == SET
+ && SET_DEST (pat) == pc_rtx
+! && uses_reg_or_mem (SET_SRC (pat)))
+ computed_jump = 1;
+
+--- 554,563 ----
+ if (GET_CODE (XVECEXP (pat, 0, i)) == SET
+ && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
+! && jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i))))
+ computed_jump = 1;
+ }
+ else if (GET_CODE (pat) == SET
+ && SET_DEST (pat) == pc_rtx
+! && jmp_uses_reg_or_mem (SET_SRC (pat)))
+ computed_jump = 1;
+
+*************** find_basic_blocks (f, nonlocal_label_lis
+*** 760,767 ****
+ /* Subroutines of find_basic_blocks. */
+
+! /* Return 1 if X contain a REG or MEM that is not in the constant pool. */
+
+ static int
+! uses_reg_or_mem (x)
+ rtx x;
+ {
+--- 760,768 ----
+ /* Subroutines of find_basic_blocks. */
+
+! /* Return 1 if X, the SRC_SRC of SET of (pc) contain a REG or MEM that is
+! not in the constant pool and not in the condition of an IF_THEN_ELSE. */
+
+ static int
+! jmp_uses_reg_or_mem (x)
+ rtx x;
+ {
+*************** uses_reg_or_mem (x)
+*** 770,778 ****
+ char *fmt;
+
+! if (code == REG
+! || (code == MEM
+! && ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
+! && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))))
+! return 1;
+
+ fmt = GET_RTX_FORMAT (code);
+--- 771,796 ----
+ char *fmt;
+
+! switch (code)
+! {
+! case CONST:
+! case LABEL_REF:
+! case PC:
+! return 0;
+!
+! case REG:
+! return 1;
+!
+! case MEM:
+! return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
+! && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
+!
+! case IF_THEN_ELSE:
+! return (jmp_uses_reg_or_mem (XEXP (x, 1))
+! || jmp_uses_reg_or_mem (XEXP (x, 2)));
+!
+! case PLUS: case MINUS: case MULT:
+! return (jmp_uses_reg_or_mem (XEXP (x, 0))
+! || jmp_uses_reg_or_mem (XEXP (x, 1)));
+! }
+
+ fmt = GET_RTX_FORMAT (code);
+*************** uses_reg_or_mem (x)
+*** 780,789 ****
+ {
+ if (fmt[i] == 'e'
+! && uses_reg_or_mem (XEXP (x, i)))
+ return 1;
+
+ if (fmt[i] == 'E')
+ for (j = 0; j < XVECLEN (x, i); j++)
+! if (uses_reg_or_mem (XVECEXP (x, i, j)))
+ return 1;
+ }
+--- 798,807 ----
+ {
+ if (fmt[i] == 'e'
+! && jmp_uses_reg_or_mem (XEXP (x, i)))
+ return 1;
+
+ if (fmt[i] == 'E')
+ for (j = 0; j < XVECLEN (x, i); j++)
+! if (jmp_uses_reg_or_mem (XVECEXP (x, i, j)))
+ return 1;
+ }
+*************** propagate_block (old, first, last, final
+*** 1605,1614 ****
+
+ /* Each call clobbers all call-clobbered regs that are not
+! global. Note that the function-value reg is a
+ call-clobbered reg, and mark_set_regs has already had
+ a chance to handle it. */
+
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+! if (call_used_regs[i] && ! global_regs[i])
+ dead[i / REGSET_ELT_BITS]
+ |= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS));
+--- 1623,1633 ----
+
+ /* Each call clobbers all call-clobbered regs that are not
+! global or fixed. Note that the function-value reg is a
+ call-clobbered reg, and mark_set_regs has already had
+ a chance to handle it. */
+
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+! if (call_used_regs[i] && ! global_regs[i]
+! && ! fixed_regs[i])
+ dead[i / REGSET_ELT_BITS]
+ |= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS));
+diff -rcp2N gcc-2.7.2.3/fold-const.c gcc-2.7.2.3.f.1/fold-const.c
+*** gcc-2.7.2.3/fold-const.c Fri Sep 15 22:26:12 1995
+--- gcc-2.7.2.3.f.1/fold-const.c Fri Aug 29 07:52:10 1997
+*************** static tree unextend PROTO((tree, int, i
+*** 80,83 ****
+--- 80,84 ----
+ static tree fold_truthop PROTO((enum tree_code, tree, tree, tree));
+ static tree strip_compound_expr PROTO((tree, tree));
++ static int multiple_of_p PROTO((tree, tree, tree));
+
+ #ifndef BRANCH_COST
+*************** const_binop (code, arg1, arg2, notrunc)
+*** 1077,1080 ****
+--- 1078,1083 ----
+ if (int2h == 0 && int2l > 0
+ && TREE_TYPE (arg1) == sizetype
++ && ! TREE_CONSTANT_OVERFLOW (arg1)
++ && ! TREE_CONSTANT_OVERFLOW (arg2)
+ && int1h == 0 && int1l >= 0)
+ {
+*************** const_binop (code, arg1, arg2, notrunc)
+*** 1230,1233 ****
+--- 1233,1237 ----
+ if (TREE_CODE (arg1) == COMPLEX_CST)
+ {
++ register tree type = TREE_TYPE (arg1);
+ register tree r1 = TREE_REALPART (arg1);
+ register tree i1 = TREE_IMAGPART (arg1);
+*************** const_binop (code, arg1, arg2, notrunc)
+*** 1239,1253 ****
+ {
+ case PLUS_EXPR:
+! t = build_complex (const_binop (PLUS_EXPR, r1, r2, notrunc),
+ const_binop (PLUS_EXPR, i1, i2, notrunc));
+ break;
+
+ case MINUS_EXPR:
+! t = build_complex (const_binop (MINUS_EXPR, r1, r2, notrunc),
+ const_binop (MINUS_EXPR, i1, i2, notrunc));
+ break;
+
+ case MULT_EXPR:
+! t = build_complex (const_binop (MINUS_EXPR,
+ const_binop (MULT_EXPR,
+ r1, r2, notrunc),
+--- 1243,1260 ----
+ {
+ case PLUS_EXPR:
+! t = build_complex (type,
+! const_binop (PLUS_EXPR, r1, r2, notrunc),
+ const_binop (PLUS_EXPR, i1, i2, notrunc));
+ break;
+
+ case MINUS_EXPR:
+! t = build_complex (type,
+! const_binop (MINUS_EXPR, r1, r2, notrunc),
+ const_binop (MINUS_EXPR, i1, i2, notrunc));
+ break;
+
+ case MULT_EXPR:
+! t = build_complex (type,
+! const_binop (MINUS_EXPR,
+ const_binop (MULT_EXPR,
+ r1, r2, notrunc),
+*************** const_binop (code, arg1, arg2, notrunc)
+*** 1271,1293 ****
+ notrunc);
+
+! t = build_complex
+! (const_binop (INTEGRAL_TYPE_P (TREE_TYPE (r1))
+! ? TRUNC_DIV_EXPR : RDIV_EXPR,
+! const_binop (PLUS_EXPR,
+! const_binop (MULT_EXPR, r1, r2,
+! notrunc),
+! const_binop (MULT_EXPR, i1, i2,
+! notrunc),
+! notrunc),
+! magsquared, notrunc),
+! const_binop (INTEGRAL_TYPE_P (TREE_TYPE (r1))
+! ? TRUNC_DIV_EXPR : RDIV_EXPR,
+! const_binop (MINUS_EXPR,
+! const_binop (MULT_EXPR, i1, r2,
+! notrunc),
+! const_binop (MULT_EXPR, r1, i2,
+! notrunc),
+! notrunc),
+! magsquared, notrunc));
+ }
+ break;
+--- 1278,1302 ----
+ notrunc);
+
+! t = build_complex (type,
+! const_binop
+! (INTEGRAL_TYPE_P (TREE_TYPE (r1))
+! ? TRUNC_DIV_EXPR : RDIV_EXPR,
+! const_binop (PLUS_EXPR,
+! const_binop (MULT_EXPR, r1, r2,
+! notrunc),
+! const_binop (MULT_EXPR, i1, i2,
+! notrunc),
+! notrunc),
+! magsquared, notrunc),
+! const_binop
+! (INTEGRAL_TYPE_P (TREE_TYPE (r1))
+! ? TRUNC_DIV_EXPR : RDIV_EXPR,
+! const_binop (MINUS_EXPR,
+! const_binop (MULT_EXPR, i1, r2,
+! notrunc),
+! const_binop (MULT_EXPR, r1, i2,
+! notrunc),
+! notrunc),
+! magsquared, notrunc));
+ }
+ break;
+*************** const_binop (code, arg1, arg2, notrunc)
+*** 1296,1300 ****
+ abort ();
+ }
+- TREE_TYPE (t) = TREE_TYPE (arg1);
+ return t;
+ }
+--- 1305,1308 ----
+*************** size_binop (code, arg0, arg1)
+*** 1346,1363 ****
+ {
+ /* And some specific cases even faster than that. */
+! if (code == PLUS_EXPR
+! && TREE_INT_CST_LOW (arg0) == 0
+! && TREE_INT_CST_HIGH (arg0) == 0)
+ return arg1;
+! if (code == MINUS_EXPR
+! && TREE_INT_CST_LOW (arg1) == 0
+! && TREE_INT_CST_HIGH (arg1) == 0)
+ return arg0;
+! if (code == MULT_EXPR
+! && TREE_INT_CST_LOW (arg0) == 1
+! && TREE_INT_CST_HIGH (arg0) == 0)
+ return arg1;
+ /* Handle general case of two integer constants. */
+! return const_binop (code, arg0, arg1, 0);
+ }
+
+--- 1354,1367 ----
+ {
+ /* And some specific cases even faster than that. */
+! if (code == PLUS_EXPR && integer_zerop (arg0))
+ return arg1;
+! else if ((code == MINUS_EXPR || code == PLUS_EXPR)
+! && integer_zerop (arg1))
+ return arg0;
+! else if (code == MULT_EXPR && integer_onep (arg0))
+ return arg1;
++
+ /* Handle general case of two integer constants. */
+! return const_binop (code, arg0, arg1, 1);
+ }
+
+*************** fold_convert (t, arg1)
+*** 1482,1486 ****
+ {
+ if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
+! return arg1;
+ else if (setjmp (float_error))
+ {
+--- 1486,1494 ----
+ {
+ if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
+! {
+! t = arg1;
+! TREE_TYPE (arg1) = type;
+! return t;
+! }
+ else if (setjmp (float_error))
+ {
+*************** operand_equal_p (arg0, arg1, only_const)
+*** 1644,1687 ****
+ STRIP_NOPS (arg1);
+
+! /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
+! We don't care about side effects in that case because the SAVE_EXPR
+! takes care of that for us. */
+! if (TREE_CODE (arg0) == SAVE_EXPR && arg0 == arg1)
+! return ! only_const;
+!
+! if (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1))
+ return 0;
+
+! if (TREE_CODE (arg0) == TREE_CODE (arg1)
+! && TREE_CODE (arg0) == ADDR_EXPR
+! && TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0))
+! return 1;
+!
+! if (TREE_CODE (arg0) == TREE_CODE (arg1)
+! && TREE_CODE (arg0) == INTEGER_CST
+! && TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1)
+! && TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1))
+ return 1;
+
+! /* Detect when real constants are equal. */
+! if (TREE_CODE (arg0) == TREE_CODE (arg1)
+! && TREE_CODE (arg0) == REAL_CST)
+! return !bcmp ((char *) &TREE_REAL_CST (arg0),
+! (char *) &TREE_REAL_CST (arg1),
+! sizeof (REAL_VALUE_TYPE));
+
+ if (only_const)
+ return 0;
+
+- if (arg0 == arg1)
+- return 1;
+-
+- if (TREE_CODE (arg0) != TREE_CODE (arg1))
+- return 0;
+- /* This is needed for conversions and for COMPONENT_REF.
+- Might as well play it safe and always test this. */
+- if (TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
+- return 0;
+-
+ switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
+ {
+--- 1652,1710 ----
+ STRIP_NOPS (arg1);
+
+! if (TREE_CODE (arg0) != TREE_CODE (arg1)
+! /* This is needed for conversions and for COMPONENT_REF.
+! Might as well play it safe and always test this. */
+! || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
+ return 0;
+
+! /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
+! We don't care about side effects in that case because the SAVE_EXPR
+! takes care of that for us. In all other cases, two expressions are
+! equal if they have no side effects. If we have two identical
+! expressions with side effects that should be treated the same due
+! to the only side effects being identical SAVE_EXPR's, that will
+! be detected in the recursive calls below. */
+! if (arg0 == arg1 && ! only_const
+! && (TREE_CODE (arg0) == SAVE_EXPR
+! || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
+ return 1;
+
+! /* Next handle constant cases, those for which we can return 1 even
+! if ONLY_CONST is set. */
+! if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
+! switch (TREE_CODE (arg0))
+! {
+! case INTEGER_CST:
+! return (! TREE_CONSTANT_OVERFLOW (arg0)
+! && ! TREE_CONSTANT_OVERFLOW (arg1)
+! && TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1)
+! && TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1));
+!
+! case REAL_CST:
+! return (! TREE_CONSTANT_OVERFLOW (arg0)
+! && ! TREE_CONSTANT_OVERFLOW (arg1)
+! && REAL_VALUES_EQUAL (TREE_REAL_CST (arg0),
+! TREE_REAL_CST (arg1)));
+!
+! case COMPLEX_CST:
+! return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
+! only_const)
+! && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
+! only_const));
+!
+! case STRING_CST:
+! return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
+! && ! strncmp (TREE_STRING_POINTER (arg0),
+! TREE_STRING_POINTER (arg1),
+! TREE_STRING_LENGTH (arg0)));
+!
+! case ADDR_EXPR:
+! return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
+! 0);
+! }
+
+ if (only_const)
+ return 0;
+
+ switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
+ {
+*************** operand_equal_p (arg0, arg1, only_const)
+*** 1698,1705 ****
+ case '<':
+ case '2':
+! return (operand_equal_p (TREE_OPERAND (arg0, 0),
+! TREE_OPERAND (arg1, 0), 0)
+ && operand_equal_p (TREE_OPERAND (arg0, 1),
+! TREE_OPERAND (arg1, 1), 0));
+
+ case 'r':
+--- 1721,1740 ----
+ case '<':
+ case '2':
+! if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0)
+! && operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1),
+! 0))
+! return 1;
+!
+! /* For commutative ops, allow the other order. */
+! return ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MULT_EXPR
+! || TREE_CODE (arg0) == MIN_EXPR || TREE_CODE (arg0) == MAX_EXPR
+! || TREE_CODE (arg0) == BIT_IOR_EXPR
+! || TREE_CODE (arg0) == BIT_XOR_EXPR
+! || TREE_CODE (arg0) == BIT_AND_EXPR
+! || TREE_CODE (arg0) == NE_EXPR || TREE_CODE (arg0) == EQ_EXPR)
+! && operand_equal_p (TREE_OPERAND (arg0, 0),
+! TREE_OPERAND (arg1, 1), 0)
+ && operand_equal_p (TREE_OPERAND (arg0, 1),
+! TREE_OPERAND (arg1, 0), 0));
+
+ case 'r':
+*************** optimize_bit_field_compare (code, compar
+*** 2212,2215 ****
+--- 2247,2251 ----
+ int lunsignedp, runsignedp;
+ int lvolatilep = 0, rvolatilep = 0;
++ int alignment;
+ tree linner, rinner;
+ tree mask;
+*************** optimize_bit_field_compare (code, compar
+*** 2220,2224 ****
+ extraction at all and so can do nothing. */
+ linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
+! &lunsignedp, &lvolatilep);
+ if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
+ || offset != 0)
+--- 2256,2260 ----
+ extraction at all and so can do nothing. */
+ linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
+! &lunsignedp, &lvolatilep, &alignment);
+ if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
+ || offset != 0)
+*************** optimize_bit_field_compare (code, compar
+*** 2229,2234 ****
+ /* If this is not a constant, we can only do something if bit positions,
+ sizes, and signedness are the same. */
+! rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset,
+! &rmode, &runsignedp, &rvolatilep);
+
+ if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
+--- 2265,2270 ----
+ /* If this is not a constant, we can only do something if bit positions,
+ sizes, and signedness are the same. */
+! rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
+! &runsignedp, &rvolatilep, &alignment);
+
+ if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
+*************** decode_field_reference (exp, pbitsize, p
+*** 2403,2406 ****
+--- 2439,2443 ----
+ tree unsigned_type;
+ int precision;
++ int alignment;
+
+ /* All the optimizations using this function assume integer fields.
+*************** decode_field_reference (exp, pbitsize, p
+*** 2423,2427 ****
+
+ inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
+! punsignedp, pvolatilep);
+ if ((inner == exp && and_mask == 0)
+ || *pbitsize < 0 || offset != 0)
+--- 2460,2464 ----
+
+ inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
+! punsignedp, pvolatilep, &alignment);
+ if ((inner == exp && and_mask == 0)
+ || *pbitsize < 0 || offset != 0)
+*************** fold_truthop (code, truth_type, lhs, rhs
+*** 2767,2770 ****
+--- 2804,2810 ----
+ {
+ /* Avoid evaluating the variable part twice. */
++ if (current_function_decl == 0)
++ return 0;
++
+ ll_arg = save_expr (ll_arg);
+ lhs = build (lcode, TREE_TYPE (lhs), ll_arg, lr_arg);
+*************** strip_compound_expr (t, s)
+*** 3065,3068 ****
+--- 3105,3208 ----
+ }
+ \f
++ /* Determine if first argument is a multiple of second argument.
++ Return 0 if it is not, or is not easily determined to so be.
++
++ An example of the sort of thing we care about (at this point --
++ this routine could surely be made more general, and expanded
++ to do what the *_DIV_EXPR's fold() cases do now) is discovering
++ that
++
++ SAVE_EXPR (I) * SAVE_EXPR (J * 8)
++
++ is a multiple of
++
++ SAVE_EXPR (J * 8)
++
++ when we know that the two `SAVE_EXPR (J * 8)' nodes are the
++ same node (which means they will have the same value at run
++ time, even though we don't know when they'll be assigned).
++
++ This code also handles discovering that
++
++ SAVE_EXPR (I) * SAVE_EXPR (J * 8)
++
++ is a multiple of
++
++ 8
++
++ (of course) so we don't have to worry about dealing with a
++ possible remainder.
++
++ Note that we _look_ inside a SAVE_EXPR only to determine
++ how it was calculated; it is not safe for fold() to do much
++ of anything else with the internals of a SAVE_EXPR, since
++ fold() cannot know when it will be evaluated at run time.
++ For example, the latter example above _cannot_ be implemented
++ as
++
++ SAVE_EXPR (I) * J
++
++ or any variant thereof, since the value of J at evaluation time
++ of the original SAVE_EXPR is not necessarily the same at the time
++ the new expression is evaluated. The only optimization of this
++ sort that would be valid is changing
++
++ SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
++ divided by
++ 8
++
++ to
++
++ SAVE_EXPR (I) * SAVE_EXPR (J)
++
++ (where the same SAVE_EXPR (J) is used in the original and the
++ transformed version). */
++
++ static int
++ multiple_of_p (type, top, bottom)
++ tree type;
++ tree top;
++ tree bottom;
++ {
++ if (operand_equal_p (top, bottom, 0))
++ return 1;
++
++ if (TREE_CODE (type) != INTEGER_TYPE)
++ return 0;
++
++ switch (TREE_CODE (top))
++ {
++ case MULT_EXPR:
++ return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
++ || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
++
++ case PLUS_EXPR:
++ case MINUS_EXPR:
++ return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
++ && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
++
++ case NOP_EXPR:
++ /* Punt if conversion from non-integral or wider integral type. */
++ if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
++ || (TYPE_PRECISION (type)
++ < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
++ return 0;
++ /* Fall through. */
++ case SAVE_EXPR:
++ return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
++
++ case INTEGER_CST:
++ if ((TREE_CODE (bottom) != INTEGER_CST)
++ || (tree_int_cst_sgn (top) < 0)
++ || (tree_int_cst_sgn (bottom) < 0))
++ return 0;
++ return integer_zerop (const_binop (TRUNC_MOD_EXPR,
++ top, bottom, 0));
++
++ default:
++ return 0;
++ }
++ }
++ \f
+ /* Perform constant folding and related simplification of EXPR.
+ The related simplifications include x*1 => x, x*0 => 0, etc.,
+*************** fold (expr)
+*** 3091,3096 ****
+ int wins = 1;
+
+! /* Don't try to process an RTL_EXPR since its operands aren't trees. */
+! if (code == RTL_EXPR)
+ return t;
+
+--- 3231,3237 ----
+ int wins = 1;
+
+! /* Don't try to process an RTL_EXPR since its operands aren't trees.
+! Likewise for a SAVE_EXPR that's already been evaluated. */
+! if (code == RTL_EXPR || (code == SAVE_EXPR && SAVE_EXPR_RTL (t)) != 0)
+ return t;
+
+*************** fold (expr)
+*** 3280,3285 ****
+ fold (build (code, type,
+ arg0, TREE_OPERAND (arg1, 1))));
+! else if (TREE_CODE (arg1) == COND_EXPR
+! || TREE_CODE_CLASS (TREE_CODE (arg1)) == '<')
+ {
+ tree test, true_value, false_value;
+--- 3421,3427 ----
+ fold (build (code, type,
+ arg0, TREE_OPERAND (arg1, 1))));
+! else if ((TREE_CODE (arg1) == COND_EXPR
+! || TREE_CODE_CLASS (TREE_CODE (arg1)) == '<')
+! && (! TREE_SIDE_EFFECTS (arg0) || current_function_decl != 0))
+ {
+ tree test, true_value, false_value;
+*************** fold (expr)
+*** 3319,3323 ****
+ return fold (build (COND_EXPR, type, test, lhs, rhs));
+
+! arg0 = save_expr (arg0);
+ }
+
+--- 3461,3466 ----
+ return fold (build (COND_EXPR, type, test, lhs, rhs));
+
+! if (current_function_decl != 0)
+! arg0 = save_expr (arg0);
+ }
+
+*************** fold (expr)
+*** 3336,3341 ****
+ return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
+ fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
+! else if (TREE_CODE (arg0) == COND_EXPR
+! || TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
+ {
+ tree test, true_value, false_value;
+--- 3479,3485 ----
+ return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
+ fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
+! else if ((TREE_CODE (arg0) == COND_EXPR
+! || TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
+! && (! TREE_SIDE_EFFECTS (arg1) || current_function_decl != 0))
+ {
+ tree test, true_value, false_value;
+*************** fold (expr)
+*** 3367,3371 ****
+ return fold (build (COND_EXPR, type, test, lhs, rhs));
+
+! arg1 = save_expr (arg1);
+ }
+
+--- 3511,3516 ----
+ return fold (build (COND_EXPR, type, test, lhs, rhs));
+
+! if (current_function_decl != 0)
+! arg1 = save_expr (arg1);
+ }
+
+*************** fold (expr)
+*** 3611,3615 ****
+ TREE_OPERAND (arg0, 1))));
+ else if (TREE_CODE (arg0) == COMPLEX_CST)
+! return build_complex (TREE_OPERAND (arg0, 0),
+ fold (build1 (NEGATE_EXPR,
+ TREE_TYPE (TREE_TYPE (arg0)),
+--- 3756,3760 ----
+ TREE_OPERAND (arg0, 1))));
+ else if (TREE_CODE (arg0) == COMPLEX_CST)
+! return build_complex (type, TREE_OPERAND (arg0, 0),
+ fold (build1 (NEGATE_EXPR,
+ TREE_TYPE (TREE_TYPE (arg0)),
+*************** fold (expr)
+*** 3889,3893 ****
+ return non_lvalue (convert (type, arg0));
+ /* x*2 is x+x */
+! if (! wins && real_twop (arg1))
+ {
+ tree arg = save_expr (arg0);
+--- 4034,4038 ----
+ return non_lvalue (convert (type, arg0));
+ /* x*2 is x+x */
+! if (! wins && real_twop (arg1) && current_function_decl != 0)
+ {
+ tree arg = save_expr (arg0);
+*************** fold (expr)
+*** 4014,4018 ****
+ return non_lvalue (convert (type, arg0));
+ if (integer_zerop (arg1))
+! return t;
+
+ /* If we have ((a / C1) / C2) where both division are the same type, try
+--- 4159,4179 ----
+ return non_lvalue (convert (type, arg0));
+ if (integer_zerop (arg1))
+! {
+! if (extra_warnings)
+! warning ("integer division by zero");
+! return t;
+! }
+!
+! /* If arg0 is a multiple of arg1, then rewrite to the fastest div
+! operation, EXACT_DIV_EXPR. Otherwise, handle folding of
+! general divide. Note that only CEIL_DIV_EXPR is rewritten now,
+! only because the others seem to be faster in some cases, e.g. the
+! nonoptimized TRUNC_DIV_EXPR or FLOOR_DIV_EXPR on DEC Alpha. This
+! is probably just due to more work being done on it in expmed.c than
+! on EXACT_DIV_EXPR, and could presumably be fixed, since
+! EXACT_DIV_EXPR should _never_ be slower than *_DIV_EXPR. */
+! if ((code == CEIL_DIV_EXPR)
+! && multiple_of_p (type, arg0, arg1))
+! return fold (build (EXACT_DIV_EXPR, type, arg0, arg1));
+
+ /* If we have ((a / C1) / C2) where both division are the same type, try
+*************** fold (expr)
+*** 4049,4053 ****
+ tree xarg0 = arg0;
+
+! if (TREE_CODE (xarg0) == SAVE_EXPR)
+ have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
+
+--- 4210,4214 ----
+ tree xarg0 = arg0;
+
+! if (TREE_CODE (xarg0) == SAVE_EXPR && SAVE_EXPR_RTL (xarg0) == 0)
+ have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
+
+*************** fold (expr)
+*** 4067,4071 ****
+ }
+
+! if (TREE_CODE (xarg0) == SAVE_EXPR)
+ have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
+
+--- 4228,4232 ----
+ }
+
+! if (TREE_CODE (xarg0) == SAVE_EXPR && SAVE_EXPR_RTL (xarg0) == 0)
+ have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
+
+*************** fold (expr)
+*** 5050,5054 ****
+ case COMPLEX_EXPR:
+ if (wins)
+! return build_complex (arg0, arg1);
+ return t;
+
+--- 5211,5215 ----
+ case COMPLEX_EXPR:
+ if (wins)
+! return build_complex (type, arg0, arg1);
+ return t;
+
+diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
+*** gcc-2.7.2.3/function.c Sun Aug 31 09:39:47 1997
+--- gcc-2.7.2.3.f.1/function.c Sun Aug 31 09:21:15 1997
+*************** assign_stack_temp (mode, size, keep)
+*** 917,920 ****
+--- 917,925 ----
+ p->keep = keep;
+ }
++
++ /* We may be reusing an old slot, so clear any MEM flags that may have been
++ set from before. */
++ RTX_UNCHANGING_P (p->slot) = 0;
++ MEM_IN_STRUCT_P (p->slot) = 0;
+ return p->slot;
+ }
+*************** find_temp_slot_from_address (x)
+*** 994,999 ****
+ if (! p->in_use)
+ continue;
+! else if (XEXP (p->slot, 0) == x
+! || p->address == x)
+ return p;
+
+--- 999,1004 ----
+ if (! p->in_use)
+ continue;
+! else if (rtx_equal_p (XEXP (p->slot, 0), x)
+! || rtx_equal_p (p->address, x))
+ return p;
+
+*************** free_temps_for_rtl_expr (t)
+*** 1184,1187 ****
+--- 1189,1207 ----
+ }
+
++ /* Mark all temporaries ever allocated in this functon as not suitable
++ for reuse until the current level is exited. */
++
++ void
++ mark_all_temps_used ()
++ {
++ struct temp_slot *p;
++
++ for (p = temp_slots; p; p = p->next)
++ {
++ p->in_use = p->keep = 1;
++ p->level = MIN (p->level, temp_slot_level);
++ }
++ }
++
+ /* Push deeper into the nesting level for stack temporaries. */
+
+*************** pop_temp_slots ()
+*** 1208,1211 ****
+--- 1228,1242 ----
+ temp_slot_level--;
+ }
++
++ /* Initialize temporary slots. */
++
++ void
++ init_temp_slots ()
++ {
++ /* We have not allocated any temporaries yet. */
++ temp_slots = 0;
++ temp_slot_level = 0;
++ target_temp_slot_level = 0;
++ }
+ \f
+ /* Retroactively move an auto variable from a register to a stack slot.
+*************** instantiate_virtual_regs_1 (loc, object,
+*** 2838,2842 ****
+ case MEM:
+ /* Most cases of MEM that convert to valid addresses have already been
+! handled by our scan of regno_reg_rtx. The only special handling we
+ need here is to make a copy of the rtx to ensure it isn't being
+ shared if we have to change it to a pseudo.
+--- 2869,2873 ----
+ case MEM:
+ /* Most cases of MEM that convert to valid addresses have already been
+! handled by our scan of decls. The only special handling we
+ need here is to make a copy of the rtx to ensure it isn't being
+ shared if we have to change it to a pseudo.
+*************** instantiate_virtual_regs_1 (loc, object,
+*** 2896,2900 ****
+ has less restrictions on an address that some other insn.
+ In that case, we will modify the shared address. This case
+! doesn't seem very likely, though. */
+
+ if (instantiate_virtual_regs_1 (&XEXP (x, 0),
+--- 2927,2933 ----
+ has less restrictions on an address that some other insn.
+ In that case, we will modify the shared address. This case
+! doesn't seem very likely, though. One case where this could
+! happen is in the case of a USE or CLOBBER reference, but we
+! take care of that below. */
+
+ if (instantiate_virtual_regs_1 (&XEXP (x, 0),
+*************** instantiate_virtual_regs_1 (loc, object,
+*** 2909,2914 ****
+
+ /* Fall through to generic unary operation case. */
+- case USE:
+- case CLOBBER:
+ case SUBREG:
+ case STRICT_LOW_PART:
+--- 2942,2945 ----
+*************** instantiate_virtual_regs_1 (loc, object,
+*** 2927,2930 ****
+--- 2958,2978 ----
+ goto restart;
+
++ case USE:
++ case CLOBBER:
++ /* If the operand is a MEM, see if the change is a valid MEM. If not,
++ go ahead and make the invalid one, but do it to a copy. For a REG,
++ just make the recursive call, since there's no chance of a problem. */
++
++ if ((GET_CODE (XEXP (x, 0)) == MEM
++ && instantiate_virtual_regs_1 (&XEXP (XEXP (x, 0), 0), XEXP (x, 0),
++ 0))
++ || (GET_CODE (XEXP (x, 0)) == REG
++ && instantiate_virtual_regs_1 (&XEXP (x, 0), object, 0)))
++ return 1;
++
++ XEXP (x, 0) = copy_rtx (XEXP (x, 0));
++ loc = &XEXP (x, 0);
++ goto restart;
++
+ case REG:
+ /* Try to replace with a PLUS. If that doesn't work, compute the sum
+*************** assign_parms (fndecl, second_time)
+*** 3404,3409 ****
+
+ /* If this is a memory ref that contains aggregate components,
+! mark it as such for cse and loop optimize. */
+ MEM_IN_STRUCT_P (stack_parm) = aggregate;
+ }
+
+--- 3452,3459 ----
+
+ /* If this is a memory ref that contains aggregate components,
+! mark it as such for cse and loop optimize. Likewise if it
+! is readonly. */
+ MEM_IN_STRUCT_P (stack_parm) = aggregate;
++ RTX_UNCHANGING_P (stack_parm) = TREE_READONLY (parm);
+ }
+
+*************** assign_parms (fndecl, second_time)
+*** 3627,3631 ****
+
+ parmreg = gen_reg_rtx (promoted_nominal_mode);
+! REG_USERVAR_P (parmreg) = 1;
+
+ /* If this was an item that we received a pointer to, set DECL_RTL
+--- 3677,3681 ----
+
+ parmreg = gen_reg_rtx (promoted_nominal_mode);
+! mark_user_reg (parmreg);
+
+ /* If this was an item that we received a pointer to, set DECL_RTL
+*************** assign_parms (fndecl, second_time)
+*** 3695,3699 ****
+ Pmode above. We must use the actual mode of the parm. */
+ parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
+! REG_USERVAR_P (parmreg) = 1;
+ emit_move_insn (parmreg, DECL_RTL (parm));
+ DECL_RTL (parm) = parmreg;
+--- 3745,3749 ----
+ Pmode above. We must use the actual mode of the parm. */
+ parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
+! mark_user_reg (parmreg);
+ emit_move_insn (parmreg, DECL_RTL (parm));
+ DECL_RTL (parm) = parmreg;
+*************** init_function_start (subr, filename, lin
+*** 4814,4821 ****
+ rtl_expr_chain = 0;
+
+! /* We have not allocated any temporaries yet. */
+! temp_slots = 0;
+! temp_slot_level = 0;
+! target_temp_slot_level = 0;
+
+ /* Within function body, compute a type's size as soon it is laid out. */
+--- 4864,4869 ----
+ rtl_expr_chain = 0;
+
+! /* Set up to allocate temporaries. */
+! init_temp_slots ();
+
+ /* Within function body, compute a type's size as soon it is laid out. */
+*************** expand_function_end (filename, line, end
+*** 5295,5298 ****
+--- 5343,5366 ----
+ /* Put those insns at entry to the containing function (this one). */
+ emit_insns_before (seq, tail_recursion_reentry);
++ }
++
++ /* If we are doing stack checking and this function makes calls,
++ do a stack probe at the start of the function to ensure we have enough
++ space for another stack frame. */
++ if (flag_stack_check && ! STACK_CHECK_BUILTIN)
++ {
++ rtx insn, seq;
++
++ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
++ if (GET_CODE (insn) == CALL_INSN)
++ {
++ start_sequence ();
++ probe_stack_range (STACK_CHECK_PROTECT,
++ GEN_INT (STACK_CHECK_MAX_FRAME_SIZE));
++ seq = get_insns ();
++ end_sequence ();
++ emit_insns_before (seq, tail_recursion_reentry);
++ break;
++ }
+ }
+
+diff -rcp2N gcc-2.7.2.3/gcc.c gcc-2.7.2.3.f.1/gcc.c
+*** gcc-2.7.2.3/gcc.c Sun Aug 31 09:39:48 1997
+--- gcc-2.7.2.3.f.1/gcc.c Sun Aug 31 09:21:16 1997
+*************** static int is_directory PROTO((char *,
+*** 296,300 ****
+ static void validate_switches PROTO((char *));
+ static void validate_all_switches PROTO((void));
+! static void give_switch PROTO((int, int));
+ static int used_arg PROTO((char *, int));
+ static int default_arg PROTO((char *, int));
+--- 296,300 ----
+ static void validate_switches PROTO((char *));
+ static void validate_all_switches PROTO((void));
+! static void give_switch PROTO((int, int, int));
+ static int used_arg PROTO((char *, int));
+ static int default_arg PROTO((char *, int));
+*************** or with constant text in a single argume
+*** 405,408 ****
+--- 405,409 ----
+ name starts with `o'. %{o*} would substitute this text,
+ including the space; thus, two arguments would be generated.
++ %{^S*} likewise, but don't put a blank between a switch and any args.
+ %{S*:X} substitutes X if one or more switches whose names start with -S are
+ specified to CC. Note that the tail part of the -S option
+*************** process_command (argc, argv)
+*** 2649,2655 ****
+ else
+ {
+! char *string = xmalloc (len + 1);
+ strncpy (string, value, len-7);
+! strcat (string, "include");
+ add_prefix (&include_prefixes, string, 1, 0, 0);
+ }
+--- 2650,2656 ----
+ else
+ {
+! char *string = xmalloc (len);
+ strncpy (string, value, len-7);
+! strcpy (string+len-7, "include");
+ add_prefix (&include_prefixes, string, 1, 0, 0);
+ }
+*************** process_command (argc, argv)
+*** 2828,2831 ****
+--- 2829,2835 ----
+ infiles[n_infiles++].name = argv[i];
+ }
++ /* -save-temps overrides -pipe, so that temp files are produced */
++ else if (save_temps_flag && strcmp (argv[i], "-pipe") == 0)
++ ;
+ else if (argv[i][0] == '-' && argv[i][1] != 0)
+ {
+*************** handle_braces (p)
+*** 3832,3835 ****
+--- 3836,3844 ----
+ int negate = 0;
+ int suffix = 0;
++ int include_blanks = 1;
++
++ if (*p == '^')
++ /* A '^' after the open-brace means to not give blanks before args. */
++ include_blanks = 0, ++p;
+
+ if (*p == '|')
+*************** handle_braces (p)
+*** 3897,3901 ****
+ if (!strncmp (switches[i].part1, filter, p - filter)
+ && check_live_switch (i, p - filter))
+! give_switch (i, 0);
+ }
+ else
+--- 3906,3910 ----
+ if (!strncmp (switches[i].part1, filter, p - filter)
+ && check_live_switch (i, p - filter))
+! give_switch (i, 0, include_blanks);
+ }
+ else
+*************** handle_braces (p)
+*** 3936,3940 ****
+ do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
+ /* Pass any arguments this switch has. */
+! give_switch (i, 1);
+ }
+
+--- 3945,3949 ----
+ do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
+ /* Pass any arguments this switch has. */
+! give_switch (i, 1, 1);
+ }
+
+*************** handle_braces (p)
+*** 3980,3984 ****
+ if (*p == '}')
+ {
+! give_switch (i, 0);
+ }
+ else
+--- 3989,3993 ----
+ if (*p == '}')
+ {
+! give_switch (i, 0, include_blanks);
+ }
+ else
+*************** check_live_switch (switchnum, prefix_len
+*** 4081,4090 ****
+ This cannot fail since it never finishes a command line.
+
+! If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
+
+ static void
+! give_switch (switchnum, omit_first_word)
+ int switchnum;
+ int omit_first_word;
+ {
+ if (!omit_first_word)
+--- 4090,4103 ----
+ This cannot fail since it never finishes a command line.
+
+! If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
+!
+! If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
+! of the switch. */
+
+ static void
+! give_switch (switchnum, omit_first_word, include_blanks)
+ int switchnum;
+ int omit_first_word;
++ int include_blanks;
+ {
+ if (!omit_first_word)
+*************** give_switch (switchnum, omit_first_word)
+*** 4093,4097 ****
+ do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
+ }
+! do_spec_1 (" ", 0, NULL_PTR);
+ if (switches[switchnum].args != 0)
+ {
+--- 4106,4110 ----
+ do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
+ }
+!
+ if (switches[switchnum].args != 0)
+ {
+*************** give_switch (switchnum, omit_first_word)
+*** 4099,4106 ****
+ for (p = switches[switchnum].args; *p; p++)
+ {
+ do_spec_1 (*p, 1, NULL_PTR);
+- do_spec_1 (" ", 0, NULL_PTR);
+ }
+ }
+ switches[switchnum].valid = 1;
+ }
+--- 4112,4122 ----
+ for (p = switches[switchnum].args; *p; p++)
+ {
++ if (include_blanks)
++ do_spec_1 (" ", 0, NULL_PTR);
+ do_spec_1 (*p, 1, NULL_PTR);
+ }
+ }
++
++ do_spec_1 (" ", 0, NULL_PTR);
+ switches[switchnum].valid = 1;
+ }
+diff -rcp2N gcc-2.7.2.3/gcc.texi gcc-2.7.2.3.f.1/gcc.texi
+*** gcc-2.7.2.3/gcc.texi Wed Jul 24 18:57:41 1996
+--- gcc-2.7.2.3.f.1/gcc.texi Fri Jul 11 00:08:58 1997
+*************** original English.
+*** 149,152 ****
+--- 149,153 ----
+ @sp 3
+ @center Last updated 29 June 1996
++ @center (Revised for GNU Fortran 1997-01-10)
+ @sp 1
+ @c The version number appears twice more in this file.
+diff -rcp2N gcc-2.7.2.3/glimits.h gcc-2.7.2.3.f.1/glimits.h
+*** gcc-2.7.2.3/glimits.h Wed Sep 29 21:30:54 1993
+--- gcc-2.7.2.3.f.1/glimits.h Fri Jul 11 00:08:58 1997
+***************
+*** 64,68 ****
+ (Same as `int'). */
+ #ifndef __LONG_MAX__
+! #define __LONG_MAX__ 2147483647L
+ #endif
+ #undef LONG_MIN
+--- 64,72 ----
+ (Same as `int'). */
+ #ifndef __LONG_MAX__
+! # ifndef __alpha__
+! # define __LONG_MAX__ 2147483647L
+! # else
+! # define __LONG_MAX__ 9223372036854775807LL
+! # endif /* __alpha__ */
+ #endif
+ #undef LONG_MIN
+diff -rcp2N gcc-2.7.2.3/integrate.c gcc-2.7.2.3.f.1/integrate.c
+*** gcc-2.7.2.3/integrate.c Fri Oct 20 22:48:13 1995
+--- gcc-2.7.2.3.f.1/integrate.c Sun Aug 10 22:46:31 1997
+*************** static rtx copy_for_inline PROTO((rtx));
+*** 67,70 ****
+--- 67,71 ----
+ static void integrate_parm_decls PROTO((tree, struct inline_remap *, rtvec));
+ static void integrate_decl_tree PROTO((tree, int, struct inline_remap *));
++ static void save_constants_in_decl_trees PROTO ((tree));
+ static void subst_constants PROTO((rtx *, rtx, struct inline_remap *));
+ static void restore_constants PROTO((rtx *));
+*************** save_for_inline_copying (fndecl)
+*** 435,438 ****
+--- 436,443 ----
+ }
+
++ /* Also scan all decls, and replace any constant pool references with the
++ actual constant. */
++ save_constants_in_decl_trees (DECL_INITIAL (fndecl));
++
+ /* Clear out the constant pool so that we can recreate it with the
+ copied constants below. */
+*************** save_for_inline_nocopy (fndecl)
+*** 781,784 ****
+--- 786,793 ----
+ }
+
++ /* Also scan all decls, and replace any constant pool references with the
++ actual constant. */
++ save_constants_in_decl_trees (DECL_INITIAL (fndecl));
++
+ /* We have now allocated all that needs to be allocated permanently
+ on the rtx obstack. Set our high-water mark, so that we
+*************** expand_inline_function (fndecl, parms, t
+*** 1571,1575 ****
+ if (GET_CODE (XEXP (loc, 0)) == REG)
+ {
+! temp = force_reg (Pmode, structure_value_addr);
+ map->reg_map[REGNO (XEXP (loc, 0))] = temp;
+ if ((CONSTANT_P (structure_value_addr)
+--- 1580,1585 ----
+ if (GET_CODE (XEXP (loc, 0)) == REG)
+ {
+! temp = force_reg (Pmode,
+! force_operand (structure_value_addr, NULL_RTX));
+ map->reg_map[REGNO (XEXP (loc, 0))] = temp;
+ if ((CONSTANT_P (structure_value_addr)
+*************** integrate_decl_tree (let, level, map)
+*** 2029,2032 ****
+--- 2039,2059 ----
+ }
+ }
++ }
++
++ /* Given a BLOCK node LET, search for all DECL_RTL fields, and pass them
++ through save_constants. */
++
++ static void
++ save_constants_in_decl_trees (let)
++ tree let;
++ {
++ tree t;
++
++ for (t = BLOCK_VARS (let); t; t = TREE_CHAIN (t))
++ if (DECL_RTL (t) != 0)
++ save_constants (&DECL_RTL (t));
++
++ for (t = BLOCK_SUBBLOCKS (let); t; t = TREE_CHAIN (t))
++ save_constants_in_decl_trees (t);
+ }
+ \f
+diff -rcp2N gcc-2.7.2.3/invoke.texi gcc-2.7.2.3.f.1/invoke.texi
+*** gcc-2.7.2.3/invoke.texi Tue Oct 3 15:40:43 1995
+--- gcc-2.7.2.3.f.1/invoke.texi Fri Aug 29 07:52:17 1997
+***************
+*** 1,3 ****
+! @c Copyright (C) 1988, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
+ @c This is part of the GCC manual.
+ @c For copying conditions, see the file gcc.texi.
+--- 1,3 ----
+! @c Copyright (C) 1988, 89, 92-95, 1997 Free Software Foundation, Inc.
+ @c This is part of the GCC manual.
+ @c For copying conditions, see the file gcc.texi.
+*************** in the following sections.
+*** 149,152 ****
+--- 149,153 ----
+ -fschedule-insns2 -fstrength-reduce -fthread-jumps
+ -funroll-all-loops -funroll-loops
++ -fmove-all-movables -freduce-all-givs -frerun-loop-opt
+ -O -O0 -O1 -O2 -O3
+ @end smallexample
+*************** in addition to the above:
+*** 330,334 ****
+ -freg-struct-return -fshared-data -fshort-enums
+ -fshort-double -fvolatile -fvolatile-global
+! -fverbose-asm -fpack-struct +e0 +e1
+ @end smallexample
+ @end table
+--- 331,337 ----
+ -freg-struct-return -fshared-data -fshort-enums
+ -fshort-double -fvolatile -fvolatile-global
+! -fverbose-asm -fpack-struct -fstack-check +e0 +e1
+! -fargument-alias -fargument-noalias
+! -fargument-noalias-global
+ @end smallexample
+ @end table
+*************** Print extra warning messages for these e
+*** 1253,1256 ****
+--- 1256,1304 ----
+
+ @itemize @bullet
++ @cindex division by zero
++ @cindex zero, division by
++ @item
++ An integer division by zero is detected.
++
++ Some cases of division by zero might occur as the result
++ of using so-called ``safe'' macros.
++ For example:
++
++ @smallexample
++ #define BUCKETS(b) (((b) != NULL) ? (b)->buckets : 0)
++ @dots{...}
++ i = j / BUCKETS(b);
++ @end smallexample
++
++ Although analysis of the context of the above code could
++ prove that @samp{b} is never null when it is executed,
++ the division-by-zero warning is still useful, because
++ @code{gcc} generates code to do the division by zero at
++ run time so as to generate a run-time fault,
++ and tidy programmers will want to find ways to prevent
++ this needless code from being generated.
++
++ Note that @code{gcc} transforms expressions so as to find
++ opportunities for performing expensive operations
++ (such as division) at compile time instead of generating
++ code to perform them at run time.
++ For example, @code{gcc} transforms:
++
++ @smallexample
++ 2 / (i == 0)
++ @end smallexample
++
++ into:
++
++ @smallexample
++ (i == 0) ? (2 / 1) : (2 / 0)
++ @end smallexample
++
++ As a result, the division-by-zero warning might occur
++ in contexts where the divisor seems to be a non-constant.
++ It is useful in this case as well, because programmers might want
++ to clean up the code so the compiled code does not include
++ dead code to divide by zero.
++
+ @cindex @code{longjmp} warnings
+ @item
+*************** and usually makes programs run more slow
+*** 1941,1944 ****
+--- 1989,2037 ----
+ implies @samp{-fstrength-reduce} as well as @samp{-frerun-cse-after-loop}.
+
++ @item -fmove-all-movables
++ Forces all invariant computations in loops to be moved
++ outside the loop.
++ This option is provided primarily to improve performance
++ for some Fortran code, though it might improve code written
++ in other languages.
++
++ @emph{Note:} When compiling programs written in Fortran,
++ this option is enabled by default.
++
++ Analysis of Fortran code optimization and the resulting
++ optimizations triggered by this option, and the
++ @samp{-freduce-all-givs} and @samp{-frerun-loop-opt}
++ options as well, were
++ contributed by Toon Moene (@code{toon@@moene.indiv.nluug.nl}).
++
++ These three options are intended to be removed someday, once
++ they have helped determine the efficacy of various
++ approaches to improving the performance of Fortran code.
++
++ Please let us (@code{fortran@@gnu.ai.mit.edu})
++ know how use of these options affects
++ the performance of your production code.
++ We're very interested in code that runs @emph{slower}
++ when these options are @emph{enabled}.
++
++ @item -freduce-all-givs
++ Forces all general-induction variables in loops to be
++ strength-reduced.
++ This option is provided primarily to improve performance
++ for some Fortran code, though it might improve code written
++ in other languages.
++
++ @emph{Note:} When compiling programs written in Fortran,
++ this option is enabled by default.
++
++ @item -frerun-loop-opt
++ Runs loop optimizations a second time.
++ This option is provided primarily to improve performance
++ for some Fortran code, though it might improve code written
++ in other languages.
++
++ @emph{Note:} When compiling programs written in Fortran,
++ this option is enabled by default.
++
+ @item -fno-peephole
+ Disable any machine-specific peephole optimizations.
+*************** not want to use this option, since it ma
+*** 4212,4215 ****
+--- 4305,4315 ----
+ the offsets of structure members won't agree with system libraries.
+
++ @item -fstack-check
++ Generate code to verify that you do not go beyond the boundary of the
++ stack. You should specify this flag if you are running in an
++ environment with multiple threads, but only rarely need to specify it in
++ a single-threaded environment since stack overflow is automatically
++ detected on nearly all systems if there is only one stack.
++
+ @item +e0
+ @itemx +e1
+*************** compilation).
+*** 4229,4232 ****
+--- 4329,4404 ----
+ With @samp{+e1}, G++ actually generates the code implementing virtual
+ functions defined in the code, and makes them publicly visible.
++
++ @cindex aliasing of parameters
++ @cindex parameters, aliased
++ @item -fargument-alias
++ @item -fargument-noalias
++ @item -fargument-noalias-global
++ Specify the possible relationships among parameters and between
++ parameters and global data.
++
++ @samp{-fargument-alias} specifies that arguments (parameters) may
++ alias each other and may alias global storage.
++ @samp{-fargument-noalias} specifies that arguments do not alias
++ each other, but may alias global storage.
++ @samp{-fargument-noalias-global} specifies that arguments do not
++ alias each other and do not alias global storage.
++
++ For code written in C, C++, and Objective-C, @samp{-fargument-alias}
++ is the default.
++ For code written in Fortran, @samp{-fargument-noalias-global} is
++ the default, though this is pertinent only on systems where
++ @code{g77} is installed.
++ (See the documentation for other compilers for information on the
++ defaults for their respective languages.)
++
++ Normally, @code{gcc} assumes that a write through a pointer
++ passed as a parameter to the current function might modify a
++ value pointed to by another pointer passed as a parameter, or
++ in global storage.
++
++ For example, consider this code:
++
++ @example
++ void x(int *i, int *j)
++ @{
++ extern int k;
++
++ ++*i;
++ ++*j;
++ ++k;
++ @}
++ @end example
++
++ When compiling the above function, @code{gcc} assumes that @samp{i} might
++ be a pointer to the same variable as @samp{j}, and that either @samp{i},
++ @samp{j}, or both might be a pointer to @samp{k}.
++
++ Therefore, @code{gcc} does not assume it can generate code to read
++ @samp{*i}, @samp{*j}, and @samp{k} into separate registers, increment
++ each register, then write the incremented values back out.
++
++ Instead, @code{gcc} must generate code that reads @samp{*i},
++ increments it, and writes it back before reading @samp{*j},
++ in case @samp{i} and @samp{j} are aliased, and, similarly,
++ that writes @samp{*j} before reading @samp{k}.
++ The result is code that, on many systems, takes longer to execute,
++ due to the way many processors schedule instruction execution.
++
++ Compiling the above code with the @samp{-fargument-noalias} option
++ allows @code{gcc} to assume that @samp{i} and @samp{j} do not alias
++ each other, but either might alias @samp{k}.
++
++ Compiling the above code with the @samp{-fargument-noalias-global}
++ option allows @code{gcc} to assume that no combination of @samp{i},
++ @samp{j}, and @samp{k} are aliases for each other.
++
++ @emph{Note:} Use the @samp{-fargument-noalias} and
++ @samp{-fargument-noalias-global} options with care.
++ While they can result in faster executables, they can
++ also result in executables with subtle bugs, bugs that
++ show up only when compiled for specific target systems,
++ or bugs that show up only when compiled by specific versions
++ of @code{g77}.
+ @end table
+
+diff -rcp2N gcc-2.7.2.3/libgcc2.c gcc-2.7.2.3.f.1/libgcc2.c
+*** gcc-2.7.2.3/libgcc2.c Sun Nov 26 19:39:21 1995
+--- gcc-2.7.2.3.f.1/libgcc2.c Sun Aug 10 22:46:07 1997
+*************** __gcc_bcmp (s1, s2, size)
+*** 1193,1196 ****
+--- 1193,1201 ----
+ #endif
+ \f\f
++ #ifdef L__dummy
++ void
++ __dummy () {}
++ #endif
++
+ #ifdef L_varargs
+ #ifdef __i860__
+diff -rcp2N gcc-2.7.2.3/local-alloc.c gcc-2.7.2.3.f.1/local-alloc.c
+*** gcc-2.7.2.3/local-alloc.c Mon Aug 21 17:15:44 1995
+--- gcc-2.7.2.3.f.1/local-alloc.c Sun Aug 10 22:46:10 1997
+*************** static int this_insn_number;
+*** 243,246 ****
+--- 243,250 ----
+ static rtx this_insn;
+
++ /* Used to communicate changes made by update_equiv_regs to
++ memref_referenced_p. */
++ static rtx *reg_equiv_replacement;
++
+ static void alloc_qty PROTO((int, enum machine_mode, int, int));
+ static void alloc_qty_for_scratch PROTO((rtx, int, rtx, int, int));
+*************** validate_equiv_mem_from_store (dest, set
+*** 545,549 ****
+ && reg_overlap_mentioned_p (dest, equiv_mem))
+ || (GET_CODE (dest) == MEM
+! && true_dependence (dest, equiv_mem)))
+ equiv_mem_modified = 1;
+ }
+--- 549,553 ----
+ && reg_overlap_mentioned_p (dest, equiv_mem))
+ || (GET_CODE (dest) == MEM
+! && true_dependence (dest, VOIDmode, equiv_mem, rtx_varies_p)))
+ equiv_mem_modified = 1;
+ }
+*************** memref_referenced_p (memref, x)
+*** 617,621 ****
+ switch (code)
+ {
+- case REG:
+ case CONST_INT:
+ case CONST:
+--- 621,624 ----
+*************** memref_referenced_p (memref, x)
+*** 629,634 ****
+ return 0;
+
+ case MEM:
+! if (true_dependence (memref, x))
+ return 1;
+ break;
+--- 632,642 ----
+ return 0;
+
++ case REG:
++ return (reg_equiv_replacement[REGNO (x)] == 0
++ || memref_referenced_p (memref,
++ reg_equiv_replacement[REGNO (x)]));
++
+ case MEM:
+! if (true_dependence (memref, VOIDmode, x, rtx_varies_p))
+ return 1;
+ break;
+*************** optimize_reg_copy_1 (insn, dest, src)
+*** 818,827 ****
+ if (sregno >= FIRST_PSEUDO_REGISTER)
+ {
+! reg_live_length[sregno] -= length;
+! /* reg_live_length is only an approximation after combine
+! if sched is not run, so make sure that we still have
+! a reasonable value. */
+! if (reg_live_length[sregno] < 2)
+! reg_live_length[sregno] = 2;
+ reg_n_calls_crossed[sregno] -= n_calls;
+ }
+--- 826,839 ----
+ if (sregno >= FIRST_PSEUDO_REGISTER)
+ {
+! if (reg_live_length[sregno] >= 0)
+! {
+! reg_live_length[sregno] -= length;
+! /* reg_live_length is only an approximation after
+! combine if sched is not run, so make sure that we
+! still have a reasonable value. */
+! if (reg_live_length[sregno] < 2)
+! reg_live_length[sregno] = 2;
+! }
+!
+ reg_n_calls_crossed[sregno] -= n_calls;
+ }
+*************** optimize_reg_copy_1 (insn, dest, src)
+*** 829,833 ****
+ if (dregno >= FIRST_PSEUDO_REGISTER)
+ {
+! reg_live_length[dregno] += d_length;
+ reg_n_calls_crossed[dregno] += d_n_calls;
+ }
+--- 841,847 ----
+ if (dregno >= FIRST_PSEUDO_REGISTER)
+ {
+! if (reg_live_length[dregno] >= 0)
+! reg_live_length[dregno] += d_length;
+!
+ reg_n_calls_crossed[dregno] += d_n_calls;
+ }
+*************** update_equiv_regs ()
+*** 948,953 ****
+ {
+ rtx *reg_equiv_init_insn = (rtx *) alloca (max_regno * sizeof (rtx *));
+- rtx *reg_equiv_replacement = (rtx *) alloca (max_regno * sizeof (rtx *));
+ rtx insn;
+
+ bzero ((char *) reg_equiv_init_insn, max_regno * sizeof (rtx *));
+--- 962,968 ----
+ {
+ rtx *reg_equiv_init_insn = (rtx *) alloca (max_regno * sizeof (rtx *));
+ rtx insn;
++
++ reg_equiv_replacement = (rtx *) alloca (max_regno * sizeof (rtx *));
+
+ bzero ((char *) reg_equiv_init_insn, max_regno * sizeof (rtx *));
+diff -rcp2N gcc-2.7.2.3/loop.c gcc-2.7.2.3.f.1/loop.c
+*** gcc-2.7.2.3/loop.c Sat Jun 29 16:26:59 1996
+--- gcc-2.7.2.3.f.1/loop.c Sun Aug 10 22:46:43 1997
+*************** int *loop_number_exit_count;
+*** 111,116 ****
+ unsigned HOST_WIDE_INT loop_n_iterations;
+
+! /* Nonzero if there is a subroutine call in the current loop.
+! (unknown_address_altered is also nonzero in this case.) */
+
+ static int loop_has_call;
+--- 111,115 ----
+ unsigned HOST_WIDE_INT loop_n_iterations;
+
+! /* Nonzero if there is a subroutine call in the current loop. */
+
+ static int loop_has_call;
+*************** static char *moved_once;
+*** 160,164 ****
+ here, we just turn on unknown_address_altered. */
+
+! #define NUM_STORES 20
+ static rtx loop_store_mems[NUM_STORES];
+
+--- 159,163 ----
+ here, we just turn on unknown_address_altered. */
+
+! #define NUM_STORES 30
+ static rtx loop_store_mems[NUM_STORES];
+
+*************** scan_loop (loop_start, end, nregs)
+*** 669,673 ****
+ {
+ temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
+! if (temp && CONSTANT_P (XEXP (temp, 0)))
+ src = XEXP (temp, 0), move_insn = 1;
+ if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
+--- 668,673 ----
+ {
+ temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
+! if (temp && CONSTANT_P (XEXP (temp, 0))
+! && LEGITIMATE_CONSTANT_P (XEXP (temp, 0)))
+ src = XEXP (temp, 0), move_insn = 1;
+ if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
+*************** move_movables (movables, threshold, insn
+*** 1629,1632 ****
+--- 1629,1633 ----
+
+ if (already_moved[regno]
++ || flag_move_all_movables
+ || (threshold * savings * m->lifetime) >= insn_count
+ || (m->forces && m->forces->done
+*************** prescan_loop (start, end)
+*** 2199,2203 ****
+ else if (GET_CODE (insn) == CALL_INSN)
+ {
+! unknown_address_altered = 1;
+ loop_has_call = 1;
+ }
+--- 2200,2205 ----
+ else if (GET_CODE (insn) == CALL_INSN)
+ {
+! if (! CONST_CALL_P (insn))
+! unknown_address_altered = 1;
+ loop_has_call = 1;
+ }
+*************** invariant_p (x)
+*** 2777,2781 ****
+ /* See if there is any dependence between a store and this load. */
+ for (i = loop_store_mems_idx - 1; i >= 0; i--)
+! if (true_dependence (loop_store_mems[i], x))
+ return 0;
+
+--- 2779,2783 ----
+ /* See if there is any dependence between a store and this load. */
+ for (i = loop_store_mems_idx - 1; i >= 0; i--)
+! if (true_dependence (loop_store_mems[i], VOIDmode, x, rtx_varies_p))
+ return 0;
+
+*************** strength_reduce (scan_start, end, loop_t
+*** 3821,3826 ****
+ exit. */
+
+! if (v->lifetime * threshold * benefit < insn_count
+! && ! bl->reversed)
+ {
+ if (loop_dump_stream)
+--- 3823,3828 ----
+ exit. */
+
+! if ( ! flag_reduce_all_givs && v->lifetime * threshold * benefit < insn_count
+! && ! bl->reversed )
+ {
+ if (loop_dump_stream)
+*************** record_giv (v, insn, src_reg, dest_reg,
+*** 4375,4378 ****
+--- 4377,4382 ----
+ v->final_value = 0;
+ v->same_insn = 0;
++ v->unrolled = 0;
++ v->shared = 0;
+
+ /* The v->always_computable field is used in update_giv_derive, to
+*************** check_final_value (v, loop_start, loop_e
+*** 4652,4657 ****
+ if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
+ && LABEL_NAME (JUMP_LABEL (p))
+! && ((INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (v->insn)
+! && INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop_start))
+ || (INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (last_giv_use)
+ && INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop_end))))
+--- 4656,4664 ----
+ if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
+ && LABEL_NAME (JUMP_LABEL (p))
+! && ((INSN_UID (JUMP_LABEL (p)) >= max_uid_for_loop)
+! || (INSN_UID (v->insn) >= max_uid_for_loop)
+! || (INSN_UID (last_giv_use) >= max_uid_for_loop)
+! || (INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (v->insn)
+! && INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop_start))
+ || (INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (last_giv_use)
+ && INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop_end))))
+*************** emit_iv_add_mult (b, m, a, reg, insert_b
+*** 5560,5563 ****
+--- 5567,5572 ----
+
+ emit_insn_before (seq, insert_before);
++
++ record_base_value (REGNO (reg), b);
+ }
+ \f
+diff -rcp2N gcc-2.7.2.3/loop.h gcc-2.7.2.3.f.1/loop.h
+*** gcc-2.7.2.3/loop.h Fri Jul 14 12:23:28 1995
+--- gcc-2.7.2.3.f.1/loop.h Fri Jul 11 00:09:03 1997
+*************** struct induction
+*** 89,92 ****
+--- 89,95 ----
+ we won't use it to eliminate a biv, it
+ would probably lose. */
++ unsigned unrolled : 1; /* 1 if new register has been allocated in
++ unrolled loop. */
++ unsigned shared : 1;
+ int lifetime; /* Length of life of this giv */
+ int times_used; /* # times this giv is used. */
+diff -rcp2N gcc-2.7.2.3/md.texi gcc-2.7.2.3.f.1/md.texi
+*** gcc-2.7.2.3/md.texi Sun Nov 26 19:05:33 1995
+--- gcc-2.7.2.3.f.1/md.texi Fri Aug 29 07:52:18 1997
+*************** Some machines require other operations s
+*** 2334,2337 ****
+--- 2334,2347 ----
+ maintaining the back chain. Define this pattern to emit those
+ operations in addition to updating the stack pointer.
++
++ @cindex @code{check_stack} instruction pattern
++ @item @samp{check_stack}
++ If stack checking cannot be done on your system by probing the stack with
++ a load or store instruction (@pxref{Stack Checking}), define this pattern
++ to perform the needed check and signaling an error if the stack
++ has overflowed. The single operand is the location in the stack furthest
++ from the current stack pointer that you need to validate. Normally,
++ on machines where this pattern is needed, you would obtain the stack
++ limit from a global or thread-specific variable or register.
+ @end table
+
+diff -rcp2N gcc-2.7.2.3/optabs.c gcc-2.7.2.3.f.1/optabs.c
+*** gcc-2.7.2.3/optabs.c Sat Oct 21 22:16:13 1995
+--- gcc-2.7.2.3.f.1/optabs.c Fri Aug 29 07:51:36 1997
+*************** expand_fix (to, from, unsignedp)
+*** 3878,3885 ****
+ }
+
+! if (GET_MODE (to) == GET_MODE (target))
+! emit_move_insn (to, target);
+! else
+! convert_move (to, target, 0);
+ }
+ \f
+--- 3878,3888 ----
+ }
+
+! if (target != to)
+! {
+! if (GET_MODE (to) == GET_MODE (target))
+! emit_move_insn (to, target);
+! else
+! convert_move (to, target, 0);
+! }
+ }
+ \f
+diff -rcp2N gcc-2.7.2.3/real.c gcc-2.7.2.3.f.1/real.c
+*** gcc-2.7.2.3/real.c Tue Aug 15 21:57:18 1995
+--- gcc-2.7.2.3.f.1/real.c Fri Jul 11 00:09:04 1997
+*************** make_nan (nan, sign, mode)
+*** 5625,5633 ****
+ }
+
+! /* Convert an SFmode target `float' value to a REAL_VALUE_TYPE.
+! This is the inverse of the function `etarsingle' invoked by
+ REAL_VALUE_TO_TARGET_SINGLE. */
+
+ REAL_VALUE_TYPE
+ ereal_from_float (f)
+ HOST_WIDE_INT f;
+--- 5625,5699 ----
+ }
+
+! /* This is the inverse of the function `etarsingle' invoked by
+ REAL_VALUE_TO_TARGET_SINGLE. */
+
+ REAL_VALUE_TYPE
++ ereal_unto_float (f)
++ long f;
++ {
++ REAL_VALUE_TYPE r;
++ unsigned EMUSHORT s[2];
++ unsigned EMUSHORT e[NE];
++
++ /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
++ This is the inverse operation to what the function `endian' does. */
++ if (REAL_WORDS_BIG_ENDIAN)
++ {
++ s[0] = (unsigned EMUSHORT) (f >> 16);
++ s[1] = (unsigned EMUSHORT) f;
++ }
++ else
++ {
++ s[0] = (unsigned EMUSHORT) f;
++ s[1] = (unsigned EMUSHORT) (f >> 16);
++ }
++ /* Convert and promote the target float to E-type. */
++ e24toe (s, e);
++ /* Output E-type to REAL_VALUE_TYPE. */
++ PUT_REAL (e, &r);
++ return r;
++ }
++
++
++ /* This is the inverse of the function `etardouble' invoked by
++ REAL_VALUE_TO_TARGET_DOUBLE. */
++
++ REAL_VALUE_TYPE
++ ereal_unto_double (d)
++ long d[];
++ {
++ REAL_VALUE_TYPE r;
++ unsigned EMUSHORT s[4];
++ unsigned EMUSHORT e[NE];
++
++ /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */
++ if (REAL_WORDS_BIG_ENDIAN)
++ {
++ s[0] = (unsigned EMUSHORT) (d[0] >> 16);
++ s[1] = (unsigned EMUSHORT) d[0];
++ s[2] = (unsigned EMUSHORT) (d[1] >> 16);
++ s[3] = (unsigned EMUSHORT) d[1];
++ }
++ else
++ {
++ /* Target float words are little-endian. */
++ s[0] = (unsigned EMUSHORT) d[0];
++ s[1] = (unsigned EMUSHORT) (d[0] >> 16);
++ s[2] = (unsigned EMUSHORT) d[1];
++ s[3] = (unsigned EMUSHORT) (d[1] >> 16);
++ }
++ /* Convert target double to E-type. */
++ e53toe (s, e);
++ /* Output E-type to REAL_VALUE_TYPE. */
++ PUT_REAL (e, &r);
++ return r;
++ }
++
++
++ /* Convert an SFmode target `float' value to a REAL_VALUE_TYPE.
++ This is somewhat like ereal_unto_float, but the input types
++ for these are different. */
++
++ REAL_VALUE_TYPE
+ ereal_from_float (f)
+ HOST_WIDE_INT f;
+*************** ereal_from_float (f)
+*** 5658,5663 ****
+
+ /* Convert a DFmode target `double' value to a REAL_VALUE_TYPE.
+! This is the inverse of the function `etardouble' invoked by
+! REAL_VALUE_TO_TARGET_DOUBLE.
+
+ The DFmode is stored as an array of HOST_WIDE_INT in the target's
+--- 5724,5729 ----
+
+ /* Convert a DFmode target `double' value to a REAL_VALUE_TYPE.
+! This is somewhat like ereal_unto_double, but the input types
+! for these are different.
+
+ The DFmode is stored as an array of HOST_WIDE_INT in the target's
+diff -rcp2N gcc-2.7.2.3/real.h gcc-2.7.2.3.f.1/real.h
+*** gcc-2.7.2.3/real.h Thu Jun 15 11:57:56 1995
+--- gcc-2.7.2.3.f.1/real.h Fri Jul 11 00:09:05 1997
+*************** extern void ereal_to_decimal PROTO((REAL
+*** 152,155 ****
+--- 152,157 ----
+ extern int ereal_cmp PROTO((REAL_VALUE_TYPE, REAL_VALUE_TYPE));
+ extern int ereal_isneg PROTO((REAL_VALUE_TYPE));
++ extern REAL_VALUE_TYPE ereal_unto_float PROTO((long));
++ extern REAL_VALUE_TYPE ereal_unto_double PROTO((long *));
+ extern REAL_VALUE_TYPE ereal_from_float PROTO((HOST_WIDE_INT));
+ extern REAL_VALUE_TYPE ereal_from_double PROTO((HOST_WIDE_INT *));
+*************** extern REAL_VALUE_TYPE real_value_trunca
+*** 197,200 ****
+--- 199,208 ----
+ /* IN is a REAL_VALUE_TYPE. OUT is a long. */
+ #define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) ((OUT) = etarsingle ((IN)))
++
++ /* Inverse of REAL_VALUE_TO_TARGET_DOUBLE. */
++ #define REAL_VALUE_UNTO_TARGET_DOUBLE(d) (ereal_unto_double (d))
++
++ /* Inverse of REAL_VALUE_TO_TARGET_SINGLE. */
++ #define REAL_VALUE_UNTO_TARGET_SINGLE(f) (ereal_unto_float (f))
+
+ /* d is an array of HOST_WIDE_INT that holds a double precision
+diff -rcp2N gcc-2.7.2.3/recog.c gcc-2.7.2.3.f.1/recog.c
+*** gcc-2.7.2.3/recog.c Sat Jul 1 10:52:35 1995
+--- gcc-2.7.2.3.f.1/recog.c Sun Aug 10 22:46:55 1997
+*************** register_operand (op, mode)
+*** 872,876 ****
+ REGNO (SUBREG_REG (op)))
+ && (GET_MODE_SIZE (mode)
+! != GET_MODE_SIZE (GET_MODE (SUBREG_REG (op)))))
+ return 0;
+ #endif
+--- 872,878 ----
+ REGNO (SUBREG_REG (op)))
+ && (GET_MODE_SIZE (mode)
+! != GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
+! && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op))) != MODE_COMPLEX_INT
+! && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op))) != MODE_COMPLEX_FLOAT)
+ return 0;
+ #endif
+diff -rcp2N gcc-2.7.2.3/reg-stack.c gcc-2.7.2.3.f.1/reg-stack.c
+*** gcc-2.7.2.3/reg-stack.c Thu Jun 15 21:36:05 1995
+--- gcc-2.7.2.3.f.1/reg-stack.c Wed Aug 27 11:44:55 1997
+*************** subst_stack_regs (insn, regstack)
+*** 2620,2623 ****
+--- 2620,2624 ----
+ register rtx *note_link, note;
+ register int i;
++ rtx head, jump, pat, cipat;
+ int n_operands;
+
+*************** subst_stack_regs (insn, regstack)
+*** 2690,2693 ****
+--- 2691,2728 ----
+ if (GET_CODE (insn) == NOTE)
+ return;
++
++ /* If we are reached by a computed goto which sets this same stack register,
++ then pop this stack register, but maintain regstack. */
++
++ if (INSN_UID (insn) <= max_uid)
++ {
++ head = block_begin[BLOCK_NUM(insn)];
++ pat = PATTERN(insn);
++ if (GET_CODE (head) == CODE_LABEL
++ && GET_CODE (pat) == SET && STACK_REG_P (SET_DEST (pat)))
++ for (jump = LABEL_REFS (head);
++ jump != head;
++ jump = LABEL_NEXTREF (jump))
++ {
++ cipat = PATTERN (CONTAINING_INSN (jump));
++ if (GET_CODE (cipat) == SET
++ && SET_DEST (cipat) == pc_rtx
++ && uses_reg_or_mem (SET_SRC (cipat))
++ && INSN_UID (CONTAINING_INSN (jump)) <= max_uid)
++ {
++ int from_block = BLOCK_NUM (CONTAINING_INSN (jump));
++ if (TEST_HARD_REG_BIT (block_out_reg_set[from_block],
++ REGNO (SET_DEST (pat))))
++ {
++ struct stack_def old;
++ bcopy (regstack->reg, old.reg, sizeof (old.reg));
++ emit_pop_insn (insn, regstack, SET_DEST (pat), emit_insn_before);
++ regstack->top += 1;
++ bcopy (old.reg, regstack->reg, sizeof (old.reg));
++ SET_HARD_REG_BIT (regstack->reg_set, REGNO (SET_DEST (pat)));
++ }
++ }
++ }
++ }
+
+ /* If there is a REG_UNUSED note on a stack register on this insn,
+diff -rcp2N gcc-2.7.2.3/reload.c gcc-2.7.2.3.f.1/reload.c
+*** gcc-2.7.2.3/reload.c Sat Nov 11 13:23:54 1995
+--- gcc-2.7.2.3.f.1/reload.c Sat Aug 30 20:42:37 1997
+***************
+*** 1,4 ****
+ /* Search an insn for pseudo regs that must be in hard regs and are not.
+! Copyright (C) 1987, 88, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
+
+ This file is part of GNU CC.
+--- 1,4 ----
+ /* Search an insn for pseudo regs that must be in hard regs and are not.
+! Copyright (C) 1987, 88, 89, 92-5, 1996 Free Software Foundation, Inc.
+
+ This file is part of GNU CC.
+*************** static int push_secondary_reload PROTO((
+*** 292,295 ****
+--- 292,296 ----
+ enum machine_mode, enum reload_type,
+ enum insn_code *));
++ static enum reg_class find_valid_class PROTO((enum machine_mode, int));
+ static int push_reload PROTO((rtx, rtx, rtx *, rtx *, enum reg_class,
+ enum machine_mode, enum machine_mode,
+*************** static struct decomposition decompose PR
+*** 305,312 ****
+ static int immune_p PROTO((rtx, rtx, struct decomposition));
+ static int alternative_allows_memconst PROTO((char *, int));
+! static rtx find_reloads_toplev PROTO((rtx, int, enum reload_type, int, int));
+ static rtx make_memloc PROTO((rtx, int));
+ static int find_reloads_address PROTO((enum machine_mode, rtx *, rtx, rtx *,
+! int, enum reload_type, int));
+ static rtx subst_reg_equivs PROTO((rtx));
+ static rtx subst_indexed_address PROTO((rtx));
+--- 306,313 ----
+ static int immune_p PROTO((rtx, rtx, struct decomposition));
+ static int alternative_allows_memconst PROTO((char *, int));
+! static rtx find_reloads_toplev PROTO((rtx, int, enum reload_type, int, int, short *));
+ static rtx make_memloc PROTO((rtx, int));
+ static int find_reloads_address PROTO((enum machine_mode, rtx *, rtx, rtx *,
+! int, enum reload_type, int, short *));
+ static rtx subst_reg_equivs PROTO((rtx));
+ static rtx subst_indexed_address PROTO((rtx));
+*************** push_secondary_reload (in_p, x, opnum, o
+*** 590,599 ****
+
+ if (in_p && icode == CODE_FOR_nothing
+! && SECONDARY_MEMORY_NEEDED (class, reload_class, reload_mode))
+! get_secondary_mem (x, reload_mode, opnum, type);
+
+ if (! in_p && icode == CODE_FOR_nothing
+! && SECONDARY_MEMORY_NEEDED (reload_class, class, reload_mode))
+! get_secondary_mem (x, reload_mode, opnum, type);
+ #endif
+ }
+--- 591,600 ----
+
+ if (in_p && icode == CODE_FOR_nothing
+! && SECONDARY_MEMORY_NEEDED (class, reload_class, mode))
+! get_secondary_mem (x, mode, opnum, type);
+
+ if (! in_p && icode == CODE_FOR_nothing
+! && SECONDARY_MEMORY_NEEDED (reload_class, class, mode))
+! get_secondary_mem (x, mode, opnum, type);
+ #endif
+ }
+*************** get_secondary_mem (x, mode, opnum, type)
+*** 673,677 ****
+
+ find_reloads_address (mode, NULL_PTR, XEXP (loc, 0), &XEXP (loc, 0),
+! opnum, type, 0);
+ }
+
+--- 674,678 ----
+
+ find_reloads_address (mode, NULL_PTR, XEXP (loc, 0), &XEXP (loc, 0),
+! opnum, type, 0, NULL);
+ }
+
+*************** clear_secondary_mem ()
+*** 689,692 ****
+--- 690,725 ----
+ #endif /* SECONDARY_MEMORY_NEEDED */
+ \f
++ /* Find the largest class for which every register number plus N is valid in
++ M1 (if in range). Abort if no such class exists. */
++
++ static enum reg_class
++ find_valid_class (m1, n)
++ enum machine_mode m1;
++ int n;
++ {
++ int class;
++ int regno;
++ enum reg_class best_class;
++ int best_size = 0;
++
++ for (class = 1; class < N_REG_CLASSES; class++)
++ {
++ int bad = 0;
++ for (regno = 0; regno < FIRST_PSEUDO_REGISTER && ! bad; regno++)
++ if (TEST_HARD_REG_BIT (reg_class_contents[class], regno)
++ && TEST_HARD_REG_BIT (reg_class_contents[class], regno + n)
++ && ! HARD_REGNO_MODE_OK (regno + n, m1))
++ bad = 1;
++
++ if (! bad && reg_class_size[class] > best_size)
++ best_class = class, best_size = reg_class_size[class];
++ }
++
++ if (best_size == 0)
++ abort ();
++
++ return best_class;
++ }
++ \f
+ /* Record one reload that needs to be performed.
+ IN is an rtx saying where the data are to be found before this instruction.
+*************** push_reload (in, out, inloc, outloc, cla
+*** 894,898 ****
+ && GET_CODE (SUBREG_REG (in)) == REG
+ && REGNO (SUBREG_REG (in)) < FIRST_PSEUDO_REGISTER
+! && (! HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (in)), inmode)
+ || (GET_MODE_SIZE (inmode) <= UNITS_PER_WORD
+ && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in)))
+--- 927,932 ----
+ && GET_CODE (SUBREG_REG (in)) == REG
+ && REGNO (SUBREG_REG (in)) < FIRST_PSEUDO_REGISTER
+! && (! HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (in)) + SUBREG_WORD (in),
+! inmode)
+ || (GET_MODE_SIZE (inmode) <= UNITS_PER_WORD
+ && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in)))
+*************** push_reload (in, out, inloc, outloc, cla
+*** 909,913 ****
+ output before the outer reload. */
+ push_reload (SUBREG_REG (in), NULL_RTX, &SUBREG_REG (in), NULL_PTR,
+! GENERAL_REGS, VOIDmode, VOIDmode, 0, 0, opnum, type);
+ dont_remove_subreg = 1;
+ }
+--- 943,948 ----
+ output before the outer reload. */
+ push_reload (SUBREG_REG (in), NULL_RTX, &SUBREG_REG (in), NULL_PTR,
+! find_valid_class (inmode, SUBREG_WORD (in)),
+! VOIDmode, VOIDmode, 0, 0, opnum, type);
+ dont_remove_subreg = 1;
+ }
+*************** push_reload (in, out, inloc, outloc, cla
+*** 982,986 ****
+ && GET_CODE (SUBREG_REG (out)) == REG
+ && REGNO (SUBREG_REG (out)) < FIRST_PSEUDO_REGISTER
+! && (! HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (out)), outmode)
+ || (GET_MODE_SIZE (outmode) <= UNITS_PER_WORD
+ && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))
+--- 1017,1022 ----
+ && GET_CODE (SUBREG_REG (out)) == REG
+ && REGNO (SUBREG_REG (out)) < FIRST_PSEUDO_REGISTER
+! && (! HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (out)) + SUBREG_WORD (out),
+! outmode)
+ || (GET_MODE_SIZE (outmode) <= UNITS_PER_WORD
+ && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))
+*************** push_reload (in, out, inloc, outloc, cla
+*** 998,1002 ****
+ dont_remove_subreg = 1;
+ push_reload (SUBREG_REG (out), SUBREG_REG (out), &SUBREG_REG (out),
+! &SUBREG_REG (out), ALL_REGS, VOIDmode, VOIDmode, 0, 0,
+ opnum, RELOAD_OTHER);
+ }
+--- 1034,1040 ----
+ dont_remove_subreg = 1;
+ push_reload (SUBREG_REG (out), SUBREG_REG (out), &SUBREG_REG (out),
+! &SUBREG_REG (out),
+! find_valid_class (outmode, SUBREG_WORD (out)),
+! VOIDmode, VOIDmode, 0, 0,
+ opnum, RELOAD_OTHER);
+ }
+*************** find_reloads (insn, replace, ind_levels,
+*** 2241,2244 ****
+--- 2279,2283 ----
+ int goal_earlyclobber, this_earlyclobber;
+ enum machine_mode operand_mode[MAX_RECOG_OPERANDS];
++ short force_update[MAX_RECOG_OPERANDS];
+
+ this_insn = insn;
+*************** find_reloads (insn, replace, ind_levels,
+*** 2272,2275 ****
+--- 2311,2316 ----
+ #endif
+
++ bzero ((char *) force_update, sizeof force_update);
++
+ /* Find what kind of insn this is. NOPERANDS gets number of operands.
+ Make OPERANDS point to a vector of operand values.
+*************** find_reloads (insn, replace, ind_levels,
+*** 2469,2473 ****
+ find_reloads_address (VOIDmode, NULL_PTR,
+ recog_operand[i], recog_operand_loc[i],
+! i, operand_type[i], ind_levels);
+ substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
+ }
+--- 2510,2515 ----
+ find_reloads_address (VOIDmode, NULL_PTR,
+ recog_operand[i], recog_operand_loc[i],
+! i, operand_type[i], ind_levels,
+! &force_update[i]);
+ substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
+ }
+*************** find_reloads (insn, replace, ind_levels,
+*** 2478,2482 ****
+ XEXP (recog_operand[i], 0),
+ &XEXP (recog_operand[i], 0),
+! i, address_type[i], ind_levels))
+ address_reloaded[i] = 1;
+ substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
+--- 2520,2525 ----
+ XEXP (recog_operand[i], 0),
+ &XEXP (recog_operand[i], 0),
+! i, address_type[i], ind_levels,
+! &force_update[i]))
+ address_reloaded[i] = 1;
+ substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
+*************** find_reloads (insn, replace, ind_levels,
+*** 2487,2491 ****
+ ind_levels,
+ set != 0
+! && &SET_DEST (set) == recog_operand_loc[i]);
+ else if (code == PLUS)
+ /* We can get a PLUS as an "operand" as a result of
+--- 2530,2535 ----
+ ind_levels,
+ set != 0
+! && &SET_DEST (set) == recog_operand_loc[i],
+! &force_update[i]);
+ else if (code == PLUS)
+ /* We can get a PLUS as an "operand" as a result of
+*************** find_reloads (insn, replace, ind_levels,
+*** 2493,2497 ****
+ substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]
+ = find_reloads_toplev (recog_operand[i], i, address_type[i],
+! ind_levels, 0);
+ else if (code == REG)
+ {
+--- 2537,2541 ----
+ substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]
+ = find_reloads_toplev (recog_operand[i], i, address_type[i],
+! ind_levels, 0, &force_update[i]);
+ else if (code == REG)
+ {
+*************** find_reloads (insn, replace, ind_levels,
+*** 2505,2510 ****
+ if (reg_equiv_constant[regno] != 0
+ && (set == 0 || &SET_DEST (set) != recog_operand_loc[i]))
+! substed_operand[i] = recog_operand[i]
+! = reg_equiv_constant[regno];
+ #if 0 /* This might screw code in reload1.c to delete prior output-reload
+ that feeds this insn. */
+--- 2549,2557 ----
+ if (reg_equiv_constant[regno] != 0
+ && (set == 0 || &SET_DEST (set) != recog_operand_loc[i]))
+! {
+! substed_operand[i] = recog_operand[i]
+! = reg_equiv_constant[regno];
+! force_update[i] = 1;
+! }
+ #if 0 /* This might screw code in reload1.c to delete prior output-reload
+ that feeds this insn. */
+*************** find_reloads (insn, replace, ind_levels,
+*** 2545,2549 ****
+ XEXP (recog_operand[i], 0),
+ &XEXP (recog_operand[i], 0),
+! i, address_type[i], ind_levels);
+ substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
+ }
+--- 2592,2597 ----
+ XEXP (recog_operand[i], 0),
+ &XEXP (recog_operand[i], 0),
+! i, address_type[i], ind_levels,
+! &force_update[i]);
+ substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
+ }
+*************** find_reloads (insn, replace, ind_levels,
+*** 3415,3419 ****
+ = find_reloads_toplev (force_const_mem (operand_mode[i],
+ recog_operand[i]),
+! i, address_type[i], ind_levels, 0);
+ if (alternative_allows_memconst (constraints1[i],
+ goal_alternative_number))
+--- 3463,3467 ----
+ = find_reloads_toplev (force_const_mem (operand_mode[i],
+ recog_operand[i]),
+! i, address_type[i], ind_levels, 0, NULL);
+ if (alternative_allows_memconst (constraints1[i],
+ goal_alternative_number))
+*************** find_reloads (insn, replace, ind_levels,
+*** 3595,3604 ****
+ Don't do this if we aren't making replacements because we might be
+ propagating things allocated by frame pointer elimination into places
+! it doesn't expect. */
+
+! if (insn_code_number >= 0 && replace)
+ for (i = insn_n_dups[insn_code_number] - 1; i >= 0; i--)
+ {
+ int opno = recog_dup_num[i];
+ *recog_dup_loc[i] = *recog_operand_loc[opno];
+ if (operand_reloadnum[opno] >= 0)
+--- 3643,3657 ----
+ Don't do this if we aren't making replacements because we might be
+ propagating things allocated by frame pointer elimination into places
+! it doesn't expect. However, always do it for replaces of pseudos
+! by constants. */
+
+! if (insn_code_number >= 0)
+ for (i = insn_n_dups[insn_code_number] - 1; i >= 0; i--)
+ {
+ int opno = recog_dup_num[i];
++
++ if (! replace && ! force_update[opno])
++ continue;
++
+ *recog_dup_loc[i] = *recog_operand_loc[opno];
+ if (operand_reloadnum[opno] >= 0)
+*************** find_reloads (insn, replace, ind_levels,
+*** 3829,3832 ****
+--- 3882,3886 ----
+ register RTX_CODE code = GET_CODE (recog_operand[i]);
+ int is_set_dest = GET_CODE (body) == SET && (i == 0);
++ short ign;
+
+ if (insn_code_number >= 0)
+*************** find_reloads (insn, replace, ind_levels,
+*** 3834,3838 ****
+ find_reloads_address (VOIDmode, NULL_PTR,
+ recog_operand[i], recog_operand_loc[i],
+! i, RELOAD_FOR_INPUT, ind_levels);
+
+ /* In these cases, we can't tell if the operand is an input
+--- 3888,3892 ----
+ find_reloads_address (VOIDmode, NULL_PTR,
+ recog_operand[i], recog_operand_loc[i],
+! i, RELOAD_FOR_INPUT, ind_levels, &ign);
+
+ /* In these cases, we can't tell if the operand is an input
+*************** find_reloads (insn, replace, ind_levels,
+*** 3845,3853 ****
+ XEXP (recog_operand[i], 0),
+ &XEXP (recog_operand[i], 0),
+! i, RELOAD_OTHER, ind_levels);
+ if (code == SUBREG)
+ recog_operand[i] = *recog_operand_loc[i]
+ = find_reloads_toplev (recog_operand[i], i, RELOAD_OTHER,
+! ind_levels, is_set_dest);
+ if (code == REG)
+ {
+--- 3899,3907 ----
+ XEXP (recog_operand[i], 0),
+ &XEXP (recog_operand[i], 0),
+! i, RELOAD_OTHER, ind_levels, &ign);
+ if (code == SUBREG)
+ recog_operand[i] = *recog_operand_loc[i]
+ = find_reloads_toplev (recog_operand[i], i, RELOAD_OTHER,
+! ind_levels, is_set_dest, &ign);
+ if (code == REG)
+ {
+*************** alternative_allows_memconst (constraint,
+*** 3908,3915 ****
+
+ IS_SET_DEST is true if X is the destination of a SET, which is not
+! appropriate to be replaced by a constant. */
+
+ static rtx
+! find_reloads_toplev (x, opnum, type, ind_levels, is_set_dest)
+ rtx x;
+ int opnum;
+--- 3962,3972 ----
+
+ IS_SET_DEST is true if X is the destination of a SET, which is not
+! appropriate to be replaced by a constant.
+!
+! FORCE_UPDATE, if non-NULL, is the address of a SHORT that is set to
+! 1 if X is replaced with something based on reg_equiv_constant. */
+
+ static rtx
+! find_reloads_toplev (x, opnum, type, ind_levels, is_set_dest, force_update)
+ rtx x;
+ int opnum;
+*************** find_reloads_toplev (x, opnum, type, ind
+*** 3917,3920 ****
+--- 3974,3978 ----
+ int ind_levels;
+ int is_set_dest;
++ short *force_update;
+ {
+ register RTX_CODE code = GET_CODE (x);
+*************** find_reloads_toplev (x, opnum, type, ind
+*** 3928,3932 ****
+ register int regno = REGNO (x);
+ if (reg_equiv_constant[regno] != 0 && !is_set_dest)
+! x = reg_equiv_constant[regno];
+ #if 0
+ /* This creates (subreg (mem...)) which would cause an unnecessary
+--- 3986,3996 ----
+ register int regno = REGNO (x);
+ if (reg_equiv_constant[regno] != 0 && !is_set_dest)
+! {
+! x = reg_equiv_constant[regno];
+! if (force_update)
+! *force_update = 1;
+! else
+! abort (); /* Learn why this happens. */
+! }
+ #if 0
+ /* This creates (subreg (mem...)) which would cause an unnecessary
+*************** find_reloads_toplev (x, opnum, type, ind
+*** 3951,3955 ****
+ find_reloads_address (GET_MODE (x), NULL_PTR,
+ XEXP (x, 0),
+! &XEXP (x, 0), opnum, type, ind_levels);
+ }
+ return x;
+--- 4015,4020 ----
+ find_reloads_address (GET_MODE (x), NULL_PTR,
+ XEXP (x, 0),
+! &XEXP (x, 0), opnum, type, ind_levels,
+! force_update);
+ }
+ return x;
+*************** find_reloads_toplev (x, opnum, type, ind
+*** 3959,3963 ****
+ rtx tem = x;
+ find_reloads_address (GET_MODE (x), &tem, XEXP (x, 0), &XEXP (x, 0),
+! opnum, type, ind_levels);
+ return tem;
+ }
+--- 4024,4028 ----
+ rtx tem = x;
+ find_reloads_address (GET_MODE (x), &tem, XEXP (x, 0), &XEXP (x, 0),
+! opnum, type, ind_levels, force_update);
+ return tem;
+ }
+*************** find_reloads_toplev (x, opnum, type, ind
+*** 3982,3986 ****
+ && (tem = gen_lowpart_common (GET_MODE (x),
+ reg_equiv_constant[regno])) != 0)
+! return tem;
+
+ if (GET_MODE_BITSIZE (GET_MODE (x)) == BITS_PER_WORD
+--- 4047,4057 ----
+ && (tem = gen_lowpart_common (GET_MODE (x),
+ reg_equiv_constant[regno])) != 0)
+! {
+! if (force_update)
+! *force_update = 1;
+! else
+! abort (); /* Learn why this happens. */
+! return tem;
+! }
+
+ if (GET_MODE_BITSIZE (GET_MODE (x)) == BITS_PER_WORD
+*************** find_reloads_toplev (x, opnum, type, ind
+*** 3990,3994 ****
+ SUBREG_WORD (x), 0,
+ GET_MODE (SUBREG_REG (x)))) != 0)
+! return tem;
+
+ if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
+--- 4061,4071 ----
+ SUBREG_WORD (x), 0,
+ GET_MODE (SUBREG_REG (x)))) != 0)
+! {
+! if (force_update)
+! *force_update = 1;
+! else
+! abort (); /* Learn why this happens. */
+! return tem;
+! }
+
+ if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
+*************** find_reloads_toplev (x, opnum, type, ind
+*** 4040,4044 ****
+ find_reloads_address (GET_MODE (x), NULL_PTR,
+ XEXP (x, 0),
+! &XEXP (x, 0), opnum, type, ind_levels);
+ }
+
+--- 4117,4122 ----
+ find_reloads_address (GET_MODE (x), NULL_PTR,
+ XEXP (x, 0),
+! &XEXP (x, 0), opnum, type, ind_levels,
+! force_update);
+ }
+
+*************** find_reloads_toplev (x, opnum, type, ind
+*** 4049,4053 ****
+ if (fmt[i] == 'e')
+ XEXP (x, i) = find_reloads_toplev (XEXP (x, i), opnum, type,
+! ind_levels, is_set_dest);
+ }
+ return x;
+--- 4127,4131 ----
+ if (fmt[i] == 'e')
+ XEXP (x, i) = find_reloads_toplev (XEXP (x, i), opnum, type,
+! ind_levels, is_set_dest, NULL);
+ }
+ return x;
+*************** make_memloc (ad, regno)
+*** 4110,4114 ****
+
+ static int
+! find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels)
+ enum machine_mode mode;
+ rtx *memrefloc;
+--- 4188,4193 ----
+
+ static int
+! find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels,
+! force_update)
+ enum machine_mode mode;
+ rtx *memrefloc;
+*************** find_reloads_address (mode, memrefloc, a
+*** 4118,4121 ****
+--- 4197,4201 ----
+ enum reload_type type;
+ int ind_levels;
++ short *force_update;
+ {
+ register int regno;
+*************** find_reloads_address (mode, memrefloc, a
+*** 4134,4137 ****
+--- 4214,4221 ----
+ {
+ *loc = ad = reg_equiv_constant[regno];
++ if (force_update)
++ *force_update = 1;
++ else
++ abort (); /* Learn why this happens. */
+ return 1;
+ }
+*************** find_reloads_address (mode, memrefloc, a
+*** 4141,4145 ****
+ tem = make_memloc (ad, regno);
+ find_reloads_address (GET_MODE (tem), NULL_PTR, XEXP (tem, 0),
+! &XEXP (tem, 0), opnum, type, ind_levels);
+ push_reload (tem, NULL_RTX, loc, NULL_PTR, BASE_REG_CLASS,
+ GET_MODE (ad), VOIDmode, 0, 0,
+--- 4225,4229 ----
+ tem = make_memloc (ad, regno);
+ find_reloads_address (GET_MODE (tem), NULL_PTR, XEXP (tem, 0),
+! &XEXP (tem, 0), opnum, type, ind_levels, NULL);
+ push_reload (tem, NULL_RTX, loc, NULL_PTR, BASE_REG_CLASS,
+ GET_MODE (ad), VOIDmode, 0, 0,
+*************** find_reloads_address (mode, memrefloc, a
+*** 4214,4218 ****
+ tem = ad;
+ find_reloads_address (GET_MODE (ad), &tem, XEXP (ad, 0), &XEXP (ad, 0),
+! opnum, type, ind_levels == 0 ? 0 : ind_levels - 1);
+
+ /* If tem was changed, then we must create a new memory reference to
+--- 4298,4303 ----
+ tem = ad;
+ find_reloads_address (GET_MODE (ad), &tem, XEXP (ad, 0), &XEXP (ad, 0),
+! opnum, type, ind_levels == 0 ? 0 : ind_levels - 1,
+! NULL);
+
+ /* If tem was changed, then we must create a new memory reference to
+*************** find_reloads_address_1 (x, context, loc,
+*** 4722,4726 ****
+ /* First reload the memory location's address. */
+ find_reloads_address (GET_MODE (tem), 0, XEXP (tem, 0),
+! &XEXP (tem, 0), opnum, type, ind_levels);
+ /* Put this inside a new increment-expression. */
+ x = gen_rtx (GET_CODE (x), GET_MODE (x), tem);
+--- 4807,4812 ----
+ /* First reload the memory location's address. */
+ find_reloads_address (GET_MODE (tem), 0, XEXP (tem, 0),
+! &XEXP (tem, 0), opnum, type, ind_levels,
+! NULL);
+ /* Put this inside a new increment-expression. */
+ x = gen_rtx (GET_CODE (x), GET_MODE (x), tem);
+*************** find_reloads_address_1 (x, context, loc,
+*** 4788,4792 ****
+ find_reloads_address (GET_MODE (x), &XEXP (x, 0),
+ XEXP (XEXP (x, 0), 0), &XEXP (XEXP (x, 0), 0),
+! opnum, type, ind_levels);
+
+ reloadnum = push_reload (x, NULL_RTX, loc, NULL_PTR,
+--- 4874,4878 ----
+ find_reloads_address (GET_MODE (x), &XEXP (x, 0),
+ XEXP (XEXP (x, 0), 0), &XEXP (XEXP (x, 0), 0),
+! opnum, type, ind_levels, NULL);
+
+ reloadnum = push_reload (x, NULL_RTX, loc, NULL_PTR,
+*************** find_reloads_address_1 (x, context, loc,
+*** 4818,4822 ****
+
+ find_reloads_address (GET_MODE (x), loc, XEXP (x, 0), &XEXP (x, 0),
+! opnum, type, ind_levels);
+ push_reload (*loc, NULL_RTX, loc, NULL_PTR,
+ context ? INDEX_REG_CLASS : BASE_REG_CLASS,
+--- 4904,4908 ----
+
+ find_reloads_address (GET_MODE (x), loc, XEXP (x, 0), &XEXP (x, 0),
+! opnum, type, ind_levels, NULL);
+ push_reload (*loc, NULL_RTX, loc, NULL_PTR,
+ context ? INDEX_REG_CLASS : BASE_REG_CLASS,
+*************** find_reloads_address_1 (x, context, loc,
+*** 4852,4856 ****
+ x = make_memloc (x, regno);
+ find_reloads_address (GET_MODE (x), 0, XEXP (x, 0), &XEXP (x, 0),
+! opnum, type, ind_levels);
+ }
+
+--- 4938,4942 ----
+ x = make_memloc (x, regno);
+ find_reloads_address (GET_MODE (x), 0, XEXP (x, 0), &XEXP (x, 0),
+! opnum, type, ind_levels, NULL);
+ }
+
+*************** find_reloads_address_part (x, loc, class
+*** 4965,4969 ****
+ rtx tem = x = force_const_mem (mode, x);
+ find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),
+! opnum, type, ind_levels);
+ }
+
+--- 5051,5055 ----
+ rtx tem = x = force_const_mem (mode, x);
+ find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),
+! opnum, type, ind_levels, NULL);
+ }
+
+*************** find_reloads_address_part (x, loc, class
+*** 4977,4981 ****
+ x = gen_rtx (PLUS, GET_MODE (x), XEXP (x, 0), tem);
+ find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),
+! opnum, type, ind_levels);
+ }
+
+--- 5063,5067 ----
+ x = gen_rtx (PLUS, GET_MODE (x), XEXP (x, 0), tem);
+ find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),
+! opnum, type, ind_levels, NULL);
+ }
+
+*************** find_equiv_reg (goal, insn, class, other
+*** 5518,5522 ****
+ and is also a register that appears in the address of GOAL. */
+
+! if (goal_mem && value == SET_DEST (PATTERN (where))
+ && refers_to_regno_for_reload_p (valueno,
+ (valueno
+--- 5604,5608 ----
+ and is also a register that appears in the address of GOAL. */
+
+! if (goal_mem && value == SET_DEST (single_set (where))
+ && refers_to_regno_for_reload_p (valueno,
+ (valueno
+*************** debug_reload()
+*** 5900,5904 ****
+
+ if (reload_nocombine[r])
+! fprintf (stderr, ", can combine", reload_nocombine[r]);
+
+ if (reload_secondary_p[r])
+--- 5986,5990 ----
+
+ if (reload_nocombine[r])
+! fprintf (stderr, ", can't combine %d", reload_nocombine[r]);
+
+ if (reload_secondary_p[r])
+diff -rcp2N gcc-2.7.2.3/reload1.c gcc-2.7.2.3.f.1/reload1.c
+*** gcc-2.7.2.3/reload1.c Sun Nov 5 16:22:22 1995
+--- gcc-2.7.2.3.f.1/reload1.c Fri Aug 29 07:52:04 1997
+*************** reload (first, global, dumpfile)
+*** 542,546 ****
+ Also find all paradoxical subregs and find largest such for each pseudo.
+ On machines with small register classes, record hard registers that
+! are used for user variables. These can never be used for spills. */
+
+ for (insn = first; insn; insn = NEXT_INSN (insn))
+--- 542,548 ----
+ Also find all paradoxical subregs and find largest such for each pseudo.
+ On machines with small register classes, record hard registers that
+! are used for user variables. These can never be used for spills.
+! Also look for a "constant" NOTE_INSN_SETJMP. This means that all
+! caller-saved registers must be marked live. */
+
+ for (insn = first; insn; insn = NEXT_INSN (insn))
+*************** reload (first, global, dumpfile)
+*** 548,551 ****
+--- 550,559 ----
+ rtx set = single_set (insn);
+
++ if (GET_CODE (insn) == NOTE && CONST_CALL_P (insn)
++ && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP)
++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
++ if (! call_used_regs[i])
++ regs_ever_live[i] = 1;
++
+ if (set != 0 && GET_CODE (SET_DEST (set)) == REG)
+ {
+*************** reload (first, global, dumpfile)
+*** 564,568 ****
+ if (GET_CODE (x) == MEM)
+ reg_equiv_memory_loc[i] = x;
+! else if (CONSTANT_P (x))
+ {
+ if (LEGITIMATE_CONSTANT_P (x))
+--- 572,578 ----
+ if (GET_CODE (x) == MEM)
+ reg_equiv_memory_loc[i] = x;
+! else if (CONSTANT_P (x)
+! && ! (GET_CODE (x) == CONST
+! && GET_CODE (XEXP (x, 0)) == MINUS))
+ {
+ if (LEGITIMATE_CONSTANT_P (x))
+*************** reload (first, global, dumpfile)
+*** 2013,2016 ****
+--- 2023,2040 ----
+ #endif
+
++ /* If we are doing stack checking, give a warning if this function's
++ frame size is larger than we expect. */
++ if (flag_stack_check && ! STACK_CHECK_BUILTIN)
++ {
++ HOST_WIDE_INT size = get_frame_size () + STACK_CHECK_FIXED_FRAME_SIZE;
++
++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
++ if (regs_ever_live[i] && ! fixed_regs[i] && call_used_regs[i])
++ size += UNITS_PER_WORD;
++
++ if (size > STACK_CHECK_MAX_FRAME_SIZE)
++ warning ("frame size too large for reliable stack checking");
++ }
++
+ /* Indicate that we no longer have known memory locations or constants. */
+ reg_equiv_constant = 0;
+*************** eliminate_regs (x, mem_mode, insn)
+*** 2886,2890 ****
+
+ /* Fall through to generic unary operation case. */
+- case USE:
+ case STRICT_LOW_PART:
+ case NEG: case NOT:
+--- 2910,2913 ----
+*************** eliminate_regs (x, mem_mode, insn)
+*** 2975,2978 ****
+--- 2998,3014 ----
+ return x;
+
++ case USE:
++ /* If using a register that is the source of an eliminate we still
++ think can be performed, note it cannot be performed since we don't
++ know how this register is used. */
++ for (ep = reg_eliminate; ep < ®_eliminate[NUM_ELIMINABLE_REGS]; ep++)
++ if (ep->from_rtx == XEXP (x, 0))
++ ep->can_eliminate = 0;
++
++ new = eliminate_regs (XEXP (x, 0), mem_mode, insn);
++ if (new != XEXP (x, 0))
++ return gen_rtx (code, GET_MODE (x), new);
++ return x;
++
+ case CLOBBER:
+ /* If clobbering a register that is the replacement register for an
+*************** gen_reload (out, in, opnum, type)
+*** 6736,6741 ****
+--- 6772,6779 ----
+ if (GET_CODE (in) == PLUS
+ && (GET_CODE (XEXP (in, 0)) == REG
++ || GET_CODE (XEXP (in, 0)) == SUBREG
+ || GET_CODE (XEXP (in, 0)) == MEM)
+ && (GET_CODE (XEXP (in, 1)) == REG
++ || GET_CODE (XEXP (in, 1)) == SUBREG
+ || CONSTANT_P (XEXP (in, 1))
+ || GET_CODE (XEXP (in, 1)) == MEM))
+*************** gen_reload (out, in, opnum, type)
+*** 6798,6807 ****
+ we emit below. */
+
+! if (CONSTANT_P (op1) || GET_CODE (op1) == MEM
+ || (GET_CODE (op1) == REG
+ && REGNO (op1) >= FIRST_PSEUDO_REGISTER))
+ tem = op0, op0 = op1, op1 = tem;
+
+! emit_insn (gen_move_insn (out, op0));
+
+ /* If OP0 and OP1 are the same, we can use OUT for OP1.
+--- 6836,6845 ----
+ we emit below. */
+
+! if (CONSTANT_P (op1) || GET_CODE (op1) == MEM || GET_CODE (op1) == SUBREG
+ || (GET_CODE (op1) == REG
+ && REGNO (op1) >= FIRST_PSEUDO_REGISTER))
+ tem = op0, op0 = op1, op1 = tem;
+
+! gen_reload (out, op0, opnum, type);
+
+ /* If OP0 and OP1 are the same, we can use OUT for OP1.
+*************** gen_reload (out, in, opnum, type)
+*** 6831,6835 ****
+ delete_insns_since (last);
+
+! emit_insn (gen_move_insn (out, op1));
+ emit_insn (gen_add2_insn (out, op0));
+ }
+--- 6869,6873 ----
+ delete_insns_since (last);
+
+! gen_reload (out, op1, opnum, type);
+ emit_insn (gen_add2_insn (out, op0));
+ }
+*************** gen_reload (out, in, opnum, type)
+*** 6852,6857 ****
+ in = gen_rtx (REG, GET_MODE (loc), REGNO (in));
+
+! emit_insn (gen_move_insn (loc, in));
+! emit_insn (gen_move_insn (out, loc));
+ }
+ #endif
+--- 6890,6895 ----
+ in = gen_rtx (REG, GET_MODE (loc), REGNO (in));
+
+! gen_reload (loc, in, opnum, type);
+! gen_reload (out, loc, opnum, type);
+ }
+ #endif
+diff -rcp2N gcc-2.7.2.3/reorg.c gcc-2.7.2.3.f.1/reorg.c
+*** gcc-2.7.2.3/reorg.c Fri Sep 15 21:38:55 1995
+--- gcc-2.7.2.3.f.1/reorg.c Fri Aug 29 07:52:00 1997
+*************** redundant_insn (insn, target, delay_list
+*** 1961,1964 ****
+--- 1961,1969 ----
+ int i;
+
++ /* If INSN has any REG_UNUSED notes, it can't match anything since we
++ are allowed to not actually assign to such a register. */
++ if (find_reg_note (insn, REG_UNUSED, NULL_RTX) != 0)
++ return 0;
++
+ /* Scan backwards looking for a match. */
+ for (trial = PREV_INSN (target); trial; trial = PREV_INSN (trial))
+*************** redundant_insn (insn, target, delay_list
+*** 1999,2003 ****
+ for (i = XVECLEN (pat, 0) - 1; i > 0; i--)
+ if (GET_CODE (XVECEXP (pat, 0, i)) == GET_CODE (insn)
+! && rtx_equal_p (PATTERN (XVECEXP (pat, 0, i)), ipat))
+ break;
+
+--- 2004,2009 ----
+ for (i = XVECLEN (pat, 0) - 1; i > 0; i--)
+ if (GET_CODE (XVECEXP (pat, 0, i)) == GET_CODE (insn)
+! && rtx_equal_p (PATTERN (XVECEXP (pat, 0, i)), ipat)
+! && ! find_reg_note (XVECEXP (pat, 0, i), REG_UNUSED, NULL_RTX))
+ break;
+
+*************** redundant_insn (insn, target, delay_list
+*** 2007,2011 ****
+ }
+
+! else if (GET_CODE (trial) == GET_CODE (insn) && rtx_equal_p (pat, ipat))
+ break;
+ }
+--- 2013,2018 ----
+ }
+
+! else if (GET_CODE (trial) == GET_CODE (insn) && rtx_equal_p (pat, ipat)
+! && ! find_reg_note (trial, REG_UNUSED, NULL_RTX))
+ break;
+ }
+diff -rcp2N gcc-2.7.2.3/rtl.c gcc-2.7.2.3.f.1/rtl.c
+*** gcc-2.7.2.3/rtl.c Thu Jun 15 12:02:59 1995
+--- gcc-2.7.2.3.f.1/rtl.c Fri Jul 11 00:09:06 1997
+*************** char *reg_note_name[] = { "", "REG_DEAD"
+*** 179,183 ****
+ "REG_NONNEG", "REG_NO_CONFLICT", "REG_UNUSED",
+ "REG_CC_SETTER", "REG_CC_USER", "REG_LABEL",
+! "REG_DEP_ANTI", "REG_DEP_OUTPUT" };
+
+ /* Allocate an rtx vector of N elements.
+--- 179,183 ----
+ "REG_NONNEG", "REG_NO_CONFLICT", "REG_UNUSED",
+ "REG_CC_SETTER", "REG_CC_USER", "REG_LABEL",
+! "REG_DEP_ANTI", "REG_DEP_OUTPUT", "REG_NOALIAS" };
+
+ /* Allocate an rtx vector of N elements.
+diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2.3.f.1/rtl.h
+*** gcc-2.7.2.3/rtl.h Thu Jun 15 12:03:16 1995
+--- gcc-2.7.2.3.f.1/rtl.h Fri Jul 11 00:09:07 1997
+*************** enum reg_note { REG_DEAD = 1, REG_INC =
+*** 349,353 ****
+ REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
+ REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13,
+! REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15 };
+
+ /* Define macros to extract and insert the reg-note kind in an EXPR_LIST. */
+--- 349,353 ----
+ REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
+ REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13,
+! REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15, REG_NOALIAS = 16 };
+
+ /* Define macros to extract and insert the reg-note kind in an EXPR_LIST. */
+*************** extern char *reg_note_name[];
+*** 432,436 ****
+ #define NOTE_INSN_FUNCTION_BEG -13
+
+-
+ #if 0 /* These are not used, and I don't know what they were for. --rms. */
+ #define NOTE_DECL_NAME(INSN) ((INSN)->fld[3].rtstr)
+--- 432,435 ----
+*************** extern char *note_insn_name[];
+*** 576,579 ****
+--- 575,579 ----
+ /* For a TRAP_IF rtx, TRAP_CONDITION is an expression. */
+ #define TRAP_CONDITION(RTX) ((RTX)->fld[0].rtx)
++ #define TRAP_CODE(RTX) ((RTX)->fld[1].rtint)
+
+ /* 1 in a SYMBOL_REF if it addresses this function's constants pool. */
+*************** extern rtx eliminate_constant_term PROTO
+*** 817,820 ****
+--- 817,830 ----
+ extern rtx expand_complex_abs PROTO((enum machine_mode, rtx, rtx, int));
+ extern enum machine_mode choose_hard_reg_mode PROTO((int, int));
++ extern int rtx_varies_p PROTO((rtx));
++ extern int may_trap_p PROTO((rtx));
++ extern int side_effects_p PROTO((rtx));
++ extern int volatile_refs_p PROTO((rtx));
++ extern int volatile_insn_p PROTO((rtx));
++ extern void remove_note PROTO((rtx, rtx));
++ extern void note_stores PROTO((rtx, void (*)()));
++ extern int refers_to_regno_p PROTO((int, int, rtx, rtx *));
++ extern int reg_overlap_mentioned_p PROTO((rtx, rtx));
++
+
+ /* Maximum number of parallel sets and clobbers in any insn in this fn.
+*************** extern rtx *regno_reg_rtx;
+*** 967,968 ****
+--- 977,987 ----
+
+ extern int rtx_to_tree_code PROTO((enum rtx_code));
++
++ extern int true_dependence PROTO((rtx, enum machine_mode, rtx, int (*)()));
++ extern int read_dependence PROTO((rtx, rtx));
++ extern int anti_dependence PROTO((rtx, rtx));
++ extern int output_dependence PROTO((rtx, rtx));
++ extern void init_alias_analysis PROTO((void));
++ extern void end_alias_analysis PROTO((void));
++ extern void mark_user_reg PROTO((rtx));
++ extern void mark_reg_pointer PROTO((rtx));
+diff -rcp2N gcc-2.7.2.3/sched.c gcc-2.7.2.3.f.1/sched.c
+*** gcc-2.7.2.3/sched.c Thu Jun 15 12:06:39 1995
+--- gcc-2.7.2.3.f.1/sched.c Sun Aug 10 22:46:13 1997
+*************** Boston, MA 02111-1307, USA. */
+*** 126,129 ****
+--- 126,132 ----
+ #include "insn-attr.h"
+
++ extern char *reg_known_equiv_p;
++ extern rtx *reg_known_value;
++
+ #ifdef INSN_SCHEDULING
+ /* Arrays set up by scheduling for the same respective purposes as
+*************** static int *sched_reg_live_length;
+*** 143,146 ****
+--- 146,150 ----
+ by splitting insns. */
+ static rtx *reg_last_uses;
++ static int reg_last_uses_size;
+ static rtx *reg_last_sets;
+ static regset reg_pending_sets;
+*************** struct sometimes
+*** 294,302 ****
+
+ /* Forward declarations. */
+- static rtx canon_rtx PROTO((rtx));
+- static int rtx_equal_for_memref_p PROTO((rtx, rtx));
+- static rtx find_symbolic_term PROTO((rtx));
+- static int memrefs_conflict_p PROTO((int, rtx, int, rtx,
+- HOST_WIDE_INT));
+ static void add_dependence PROTO((rtx, rtx, enum reg_note));
+ static void remove_dependence PROTO((rtx, rtx));
+--- 298,301 ----
+*************** static int priority PROTO((rtx));
+*** 314,318 ****
+ static void free_pending_lists PROTO((void));
+ static void add_insn_mem_dependence PROTO((rtx *, rtx *, rtx, rtx));
+! static void flush_pending_lists PROTO((rtx));
+ static void sched_analyze_1 PROTO((rtx, rtx));
+ static void sched_analyze_2 PROTO((rtx, rtx));
+--- 313,317 ----
+ static void free_pending_lists PROTO((void));
+ static void add_insn_mem_dependence PROTO((rtx *, rtx *, rtx, rtx));
+! static void flush_pending_lists PROTO((rtx, int));
+ static void sched_analyze_1 PROTO((rtx, rtx));
+ static void sched_analyze_2 PROTO((rtx, rtx));
+*************** void schedule_insns PROTO((FILE *));
+*** 346,885 ****
+ #endif /* INSN_SCHEDULING */
+ \f
+- #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
+-
+- /* Vector indexed by N giving the initial (unchanging) value known
+- for pseudo-register N. */
+- static rtx *reg_known_value;
+-
+- /* Vector recording for each reg_known_value whether it is due to a
+- REG_EQUIV note. Future passes (viz., reload) may replace the
+- pseudo with the equivalent expression and so we account for the
+- dependences that would be introduced if that happens. */
+- /* ??? This is a problem only on the Convex. The REG_EQUIV notes created in
+- assign_parms mention the arg pointer, and there are explicit insns in the
+- RTL that modify the arg pointer. Thus we must ensure that such insns don't
+- get scheduled across each other because that would invalidate the REG_EQUIV
+- notes. One could argue that the REG_EQUIV notes are wrong, but solving
+- the problem in the scheduler will likely give better code, so we do it
+- here. */
+- static char *reg_known_equiv_p;
+-
+- /* Indicates number of valid entries in reg_known_value. */
+- static int reg_known_value_size;
+-
+- static rtx
+- canon_rtx (x)
+- rtx x;
+- {
+- if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER
+- && REGNO (x) <= reg_known_value_size)
+- return reg_known_value[REGNO (x)];
+- else if (GET_CODE (x) == PLUS)
+- {
+- rtx x0 = canon_rtx (XEXP (x, 0));
+- rtx x1 = canon_rtx (XEXP (x, 1));
+-
+- if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
+- {
+- /* We can tolerate LO_SUMs being offset here; these
+- rtl are used for nothing other than comparisons. */
+- if (GET_CODE (x0) == CONST_INT)
+- return plus_constant_for_output (x1, INTVAL (x0));
+- else if (GET_CODE (x1) == CONST_INT)
+- return plus_constant_for_output (x0, INTVAL (x1));
+- return gen_rtx (PLUS, GET_MODE (x), x0, x1);
+- }
+- }
+- return x;
+- }
+-
+- /* Set up all info needed to perform alias analysis on memory references. */
+-
+- void
+- init_alias_analysis ()
+- {
+- int maxreg = max_reg_num ();
+- rtx insn;
+- rtx note;
+- rtx set;
+-
+- reg_known_value_size = maxreg;
+-
+- reg_known_value
+- = (rtx *) oballoc ((maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx))
+- - FIRST_PSEUDO_REGISTER;
+- bzero ((char *) (reg_known_value + FIRST_PSEUDO_REGISTER),
+- (maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx));
+-
+- reg_known_equiv_p
+- = (char *) oballoc ((maxreg -FIRST_PSEUDO_REGISTER) * sizeof (char))
+- - FIRST_PSEUDO_REGISTER;
+- bzero (reg_known_equiv_p + FIRST_PSEUDO_REGISTER,
+- (maxreg - FIRST_PSEUDO_REGISTER) * sizeof (char));
+-
+- /* Fill in the entries with known constant values. */
+- for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+- if ((set = single_set (insn)) != 0
+- && GET_CODE (SET_DEST (set)) == REG
+- && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
+- && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
+- && reg_n_sets[REGNO (SET_DEST (set))] == 1)
+- || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
+- && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
+- {
+- int regno = REGNO (SET_DEST (set));
+- reg_known_value[regno] = XEXP (note, 0);
+- reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV;
+- }
+-
+- /* Fill in the remaining entries. */
+- while (--maxreg >= FIRST_PSEUDO_REGISTER)
+- if (reg_known_value[maxreg] == 0)
+- reg_known_value[maxreg] = regno_reg_rtx[maxreg];
+- }
+-
+- /* Return 1 if X and Y are identical-looking rtx's.
+-
+- We use the data in reg_known_value above to see if two registers with
+- different numbers are, in fact, equivalent. */
+-
+- static int
+- rtx_equal_for_memref_p (x, y)
+- rtx x, y;
+- {
+- register int i;
+- register int j;
+- register enum rtx_code code;
+- register char *fmt;
+-
+- if (x == 0 && y == 0)
+- return 1;
+- if (x == 0 || y == 0)
+- return 0;
+- x = canon_rtx (x);
+- y = canon_rtx (y);
+-
+- if (x == y)
+- return 1;
+-
+- code = GET_CODE (x);
+- /* Rtx's of different codes cannot be equal. */
+- if (code != GET_CODE (y))
+- return 0;
+-
+- /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
+- (REG:SI x) and (REG:HI x) are NOT equivalent. */
+-
+- if (GET_MODE (x) != GET_MODE (y))
+- return 0;
+-
+- /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */
+-
+- if (code == REG)
+- return REGNO (x) == REGNO (y);
+- if (code == LABEL_REF)
+- return XEXP (x, 0) == XEXP (y, 0);
+- if (code == SYMBOL_REF)
+- return XSTR (x, 0) == XSTR (y, 0);
+-
+- /* For commutative operations, the RTX match if the operand match in any
+- order. Also handle the simple binary and unary cases without a loop. */
+- if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
+- return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
+- && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
+- || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
+- && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
+- else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
+- return (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
+- && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)));
+- else if (GET_RTX_CLASS (code) == '1')
+- return rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0));
+-
+- /* Compare the elements. If any pair of corresponding elements
+- fail to match, return 0 for the whole things. */
+-
+- fmt = GET_RTX_FORMAT (code);
+- for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
+- {
+- switch (fmt[i])
+- {
+- case 'w':
+- if (XWINT (x, i) != XWINT (y, i))
+- return 0;
+- break;
+-
+- case 'n':
+- case 'i':
+- if (XINT (x, i) != XINT (y, i))
+- return 0;
+- break;
+-
+- case 'V':
+- case 'E':
+- /* Two vectors must have the same length. */
+- if (XVECLEN (x, i) != XVECLEN (y, i))
+- return 0;
+-
+- /* And the corresponding elements must match. */
+- for (j = 0; j < XVECLEN (x, i); j++)
+- if (rtx_equal_for_memref_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
+- return 0;
+- break;
+-
+- case 'e':
+- if (rtx_equal_for_memref_p (XEXP (x, i), XEXP (y, i)) == 0)
+- return 0;
+- break;
+-
+- case 'S':
+- case 's':
+- if (strcmp (XSTR (x, i), XSTR (y, i)))
+- return 0;
+- break;
+-
+- case 'u':
+- /* These are just backpointers, so they don't matter. */
+- break;
+-
+- case '0':
+- break;
+-
+- /* It is believed that rtx's at this level will never
+- contain anything but integers and other rtx's,
+- except for within LABEL_REFs and SYMBOL_REFs. */
+- default:
+- abort ();
+- }
+- }
+- return 1;
+- }
+-
+- /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
+- X and return it, or return 0 if none found. */
+-
+- static rtx
+- find_symbolic_term (x)
+- rtx x;
+- {
+- register int i;
+- register enum rtx_code code;
+- register char *fmt;
+-
+- code = GET_CODE (x);
+- if (code == SYMBOL_REF || code == LABEL_REF)
+- return x;
+- if (GET_RTX_CLASS (code) == 'o')
+- return 0;
+-
+- fmt = GET_RTX_FORMAT (code);
+- for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
+- {
+- rtx t;
+-
+- if (fmt[i] == 'e')
+- {
+- t = find_symbolic_term (XEXP (x, i));
+- if (t != 0)
+- return t;
+- }
+- else if (fmt[i] == 'E')
+- break;
+- }
+- return 0;
+- }
+-
+- /* Return nonzero if X and Y (memory addresses) could reference the
+- same location in memory. C is an offset accumulator. When
+- C is nonzero, we are testing aliases between X and Y + C.
+- XSIZE is the size in bytes of the X reference,
+- similarly YSIZE is the size in bytes for Y.
+-
+- If XSIZE or YSIZE is zero, we do not know the amount of memory being
+- referenced (the reference was BLKmode), so make the most pessimistic
+- assumptions.
+-
+- We recognize the following cases of non-conflicting memory:
+-
+- (1) addresses involving the frame pointer cannot conflict
+- with addresses involving static variables.
+- (2) static variables with different addresses cannot conflict.
+-
+- Nice to notice that varying addresses cannot conflict with fp if no
+- local variables had their addresses taken, but that's too hard now. */
+-
+- /* ??? In Fortran, references to a array parameter can never conflict with
+- another array parameter. */
+-
+- static int
+- memrefs_conflict_p (xsize, x, ysize, y, c)
+- rtx x, y;
+- int xsize, ysize;
+- HOST_WIDE_INT c;
+- {
+- if (GET_CODE (x) == HIGH)
+- x = XEXP (x, 0);
+- else if (GET_CODE (x) == LO_SUM)
+- x = XEXP (x, 1);
+- else
+- x = canon_rtx (x);
+- if (GET_CODE (y) == HIGH)
+- y = XEXP (y, 0);
+- else if (GET_CODE (y) == LO_SUM)
+- y = XEXP (y, 1);
+- else
+- y = canon_rtx (y);
+-
+- if (rtx_equal_for_memref_p (x, y))
+- return (xsize == 0 || ysize == 0 ||
+- (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
+-
+- if (y == frame_pointer_rtx || y == hard_frame_pointer_rtx
+- || y == stack_pointer_rtx)
+- {
+- rtx t = y;
+- int tsize = ysize;
+- y = x; ysize = xsize;
+- x = t; xsize = tsize;
+- }
+-
+- if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
+- || x == stack_pointer_rtx)
+- {
+- rtx y1;
+-
+- if (CONSTANT_P (y))
+- return 0;
+-
+- if (GET_CODE (y) == PLUS
+- && canon_rtx (XEXP (y, 0)) == x
+- && (y1 = canon_rtx (XEXP (y, 1)))
+- && GET_CODE (y1) == CONST_INT)
+- {
+- c += INTVAL (y1);
+- return (xsize == 0 || ysize == 0
+- || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
+- }
+-
+- if (GET_CODE (y) == PLUS
+- && (y1 = canon_rtx (XEXP (y, 0)))
+- && CONSTANT_P (y1))
+- return 0;
+-
+- return 1;
+- }
+-
+- if (GET_CODE (x) == PLUS)
+- {
+- /* The fact that X is canonicalized means that this
+- PLUS rtx is canonicalized. */
+- rtx x0 = XEXP (x, 0);
+- rtx x1 = XEXP (x, 1);
+-
+- if (GET_CODE (y) == PLUS)
+- {
+- /* The fact that Y is canonicalized means that this
+- PLUS rtx is canonicalized. */
+- rtx y0 = XEXP (y, 0);
+- rtx y1 = XEXP (y, 1);
+-
+- if (rtx_equal_for_memref_p (x1, y1))
+- return memrefs_conflict_p (xsize, x0, ysize, y0, c);
+- if (rtx_equal_for_memref_p (x0, y0))
+- return memrefs_conflict_p (xsize, x1, ysize, y1, c);
+- if (GET_CODE (x1) == CONST_INT)
+- if (GET_CODE (y1) == CONST_INT)
+- return memrefs_conflict_p (xsize, x0, ysize, y0,
+- c - INTVAL (x1) + INTVAL (y1));
+- else
+- return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
+- else if (GET_CODE (y1) == CONST_INT)
+- return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
+-
+- /* Handle case where we cannot understand iteration operators,
+- but we notice that the base addresses are distinct objects. */
+- x = find_symbolic_term (x);
+- if (x == 0)
+- return 1;
+- y = find_symbolic_term (y);
+- if (y == 0)
+- return 1;
+- return rtx_equal_for_memref_p (x, y);
+- }
+- else if (GET_CODE (x1) == CONST_INT)
+- return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
+- }
+- else if (GET_CODE (y) == PLUS)
+- {
+- /* The fact that Y is canonicalized means that this
+- PLUS rtx is canonicalized. */
+- rtx y0 = XEXP (y, 0);
+- rtx y1 = XEXP (y, 1);
+-
+- if (GET_CODE (y1) == CONST_INT)
+- return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
+- else
+- return 1;
+- }
+-
+- if (GET_CODE (x) == GET_CODE (y))
+- switch (GET_CODE (x))
+- {
+- case MULT:
+- {
+- /* Handle cases where we expect the second operands to be the
+- same, and check only whether the first operand would conflict
+- or not. */
+- rtx x0, y0;
+- rtx x1 = canon_rtx (XEXP (x, 1));
+- rtx y1 = canon_rtx (XEXP (y, 1));
+- if (! rtx_equal_for_memref_p (x1, y1))
+- return 1;
+- x0 = canon_rtx (XEXP (x, 0));
+- y0 = canon_rtx (XEXP (y, 0));
+- if (rtx_equal_for_memref_p (x0, y0))
+- return (xsize == 0 || ysize == 0
+- || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
+-
+- /* Can't properly adjust our sizes. */
+- if (GET_CODE (x1) != CONST_INT)
+- return 1;
+- xsize /= INTVAL (x1);
+- ysize /= INTVAL (x1);
+- c /= INTVAL (x1);
+- return memrefs_conflict_p (xsize, x0, ysize, y0, c);
+- }
+- }
+-
+- if (CONSTANT_P (x))
+- {
+- if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT)
+- {
+- c += (INTVAL (y) - INTVAL (x));
+- return (xsize == 0 || ysize == 0
+- || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
+- }
+-
+- if (GET_CODE (x) == CONST)
+- {
+- if (GET_CODE (y) == CONST)
+- return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
+- ysize, canon_rtx (XEXP (y, 0)), c);
+- else
+- return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
+- ysize, y, c);
+- }
+- if (GET_CODE (y) == CONST)
+- return memrefs_conflict_p (xsize, x, ysize,
+- canon_rtx (XEXP (y, 0)), c);
+-
+- if (CONSTANT_P (y))
+- return (rtx_equal_for_memref_p (x, y)
+- && (xsize == 0 || ysize == 0
+- || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)));
+-
+- return 1;
+- }
+- return 1;
+- }
+-
+- /* Functions to compute memory dependencies.
+-
+- Since we process the insns in execution order, we can build tables
+- to keep track of what registers are fixed (and not aliased), what registers
+- are varying in known ways, and what registers are varying in unknown
+- ways.
+-
+- If both memory references are volatile, then there must always be a
+- dependence between the two references, since their order can not be
+- changed. A volatile and non-volatile reference can be interchanged
+- though.
+-
+- A MEM_IN_STRUCT reference at a non-QImode varying address can never
+- conflict with a non-MEM_IN_STRUCT reference at a fixed address. We must
+- allow QImode aliasing because the ANSI C standard allows character
+- pointers to alias anything. We are assuming that characters are
+- always QImode here. */
+-
+- /* Read dependence: X is read after read in MEM takes place. There can
+- only be a dependence here if both reads are volatile. */
+-
+- int
+- read_dependence (mem, x)
+- rtx mem;
+- rtx x;
+- {
+- return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
+- }
+-
+- /* True dependence: X is read after store in MEM takes place. */
+-
+- int
+- true_dependence (mem, x)
+- rtx mem;
+- rtx x;
+- {
+- /* If X is an unchanging read, then it can't possibly conflict with any
+- non-unchanging store. It may conflict with an unchanging write though,
+- because there may be a single store to this address to initialize it.
+- Just fall through to the code below to resolve the case where we have
+- both an unchanging read and an unchanging write. This won't handle all
+- cases optimally, but the possible performance loss should be
+- negligible. */
+- if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
+- return 0;
+-
+- return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
+- || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
+- SIZE_FOR_MODE (x), XEXP (x, 0), 0)
+- && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
+- && GET_MODE (mem) != QImode
+- && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
+- && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
+- && GET_MODE (x) != QImode
+- && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem))));
+- }
+-
+- /* Anti dependence: X is written after read in MEM takes place. */
+-
+- int
+- anti_dependence (mem, x)
+- rtx mem;
+- rtx x;
+- {
+- /* If MEM is an unchanging read, then it can't possibly conflict with
+- the store to X, because there is at most one store to MEM, and it must
+- have occurred somewhere before MEM. */
+- if (RTX_UNCHANGING_P (mem))
+- return 0;
+-
+- return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
+- || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
+- SIZE_FOR_MODE (x), XEXP (x, 0), 0)
+- && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
+- && GET_MODE (mem) != QImode
+- && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
+- && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
+- && GET_MODE (x) != QImode
+- && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem))));
+- }
+-
+- /* Output dependence: X is written after store in MEM takes place. */
+-
+- int
+- output_dependence (mem, x)
+- rtx mem;
+- rtx x;
+- {
+- return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
+- || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
+- SIZE_FOR_MODE (x), XEXP (x, 0), 0)
+- && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
+- && GET_MODE (mem) != QImode
+- && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
+- && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
+- && GET_MODE (x) != QImode
+- && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem))));
+- }
+- \f
+ /* Helper functions for instruction scheduling. */
+
+--- 345,348 ----
+*************** add_insn_mem_dependence (insn_list, mem_
+*** 1609,1621 ****
+ \f
+ /* Make a dependency between every memory reference on the pending lists
+! and INSN, thus flushing the pending lists. */
+
+ static void
+! flush_pending_lists (insn)
+ rtx insn;
+ {
+ rtx link;
+
+! while (pending_read_insns)
+ {
+ add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI);
+--- 1072,1086 ----
+ \f
+ /* Make a dependency between every memory reference on the pending lists
+! and INSN, thus flushing the pending lists. If ONLY_WRITE, don't flush
+! the read list. */
+
+ static void
+! flush_pending_lists (insn, only_write)
+ rtx insn;
++ int only_write;
+ {
+ rtx link;
+
+! while (pending_read_insns && ! only_write)
+ {
+ add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI);
+*************** sched_analyze_1 (x, insn)
+*** 1746,1750 ****
+ this flush occurs 8 times for sparc, and 10 times for m88k using
+ the number 32. */
+! flush_pending_lists (insn);
+ }
+ else
+--- 1211,1215 ----
+ this flush occurs 8 times for sparc, and 10 times for m88k using
+ the number 32. */
+! flush_pending_lists (insn, 0);
+ }
+ else
+*************** sched_analyze_2 (x, insn)
+*** 1922,1926 ****
+ /* If a dependency already exists, don't create a new one. */
+ if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
+! if (true_dependence (XEXP (pending_mem, 0), x))
+ add_dependence (insn, XEXP (pending, 0), 0);
+
+--- 1387,1392 ----
+ /* If a dependency already exists, don't create a new one. */
+ if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
+! if (true_dependence (XEXP (pending_mem, 0), VOIDmode,
+! x, rtx_varies_p))
+ add_dependence (insn, XEXP (pending, 0), 0);
+
+*************** sched_analyze_2 (x, insn)
+*** 1968,1972 ****
+ reg_pending_sets_all = 1;
+
+! flush_pending_lists (insn);
+ }
+
+--- 1434,1438 ----
+ reg_pending_sets_all = 1;
+
+! flush_pending_lists (insn, 0);
+ }
+
+*************** sched_analyze_insn (x, insn, loop_notes)
+*** 2021,2025 ****
+ register RTX_CODE code = GET_CODE (x);
+ rtx link;
+! int maxreg = max_reg_num ();
+ int i;
+
+--- 1487,1491 ----
+ register RTX_CODE code = GET_CODE (x);
+ rtx link;
+! int maxreg = reg_last_uses_size;
+ int i;
+
+*************** sched_analyze_insn (x, insn, loop_notes)
+*** 2058,2062 ****
+ if (loop_notes)
+ {
+! int max_reg = max_reg_num ();
+ rtx link;
+
+--- 1524,1528 ----
+ if (loop_notes)
+ {
+! int max_reg = reg_last_uses_size;
+ rtx link;
+
+*************** sched_analyze_insn (x, insn, loop_notes)
+*** 2072,2076 ****
+ reg_pending_sets_all = 1;
+
+! flush_pending_lists (insn);
+
+ link = loop_notes;
+--- 1538,1542 ----
+ reg_pending_sets_all = 1;
+
+! flush_pending_lists (insn, 0);
+
+ link = loop_notes;
+*************** sched_analyze (head, tail)
+*** 2202,2207 ****
+ && NOTE_LINE_NUMBER (NEXT_INSN (insn)) == NOTE_INSN_SETJMP)
+ {
+! int max_reg = max_reg_num ();
+! for (i = 0; i < max_reg; i++)
+ {
+ for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
+--- 1668,1672 ----
+ && NOTE_LINE_NUMBER (NEXT_INSN (insn)) == NOTE_INSN_SETJMP)
+ {
+! for (i = 0; i < reg_last_uses_size; i++)
+ {
+ for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
+*************** sched_analyze (head, tail)
+*** 2247,2259 ****
+ loop_notes = 0;
+
+! /* We don't need to flush memory for a function call which does
+! not involve memory. */
+! if (! CONST_CALL_P (insn))
+! {
+! /* In the absence of interprocedural alias analysis,
+! we must flush all pending reads and writes, and
+! start new dependencies starting from here. */
+! flush_pending_lists (insn);
+! }
+
+ /* Depend this function call (actually, the user of this
+--- 1712,1720 ----
+ loop_notes = 0;
+
+! /* In the absence of interprocedural alias analysis, we must flush
+! all pending reads and writes, and start new dependencies starting
+! from here. But only flush writes for constant calls (which may
+! be passed a pointer to something we haven't written yet). */
+! flush_pending_lists (insn, CONST_CALL_P (insn));
+
+ /* Depend this function call (actually, the user of this
+*************** sched_analyze (head, tail)
+*** 2264,2270 ****
+ else if (GET_CODE (insn) == NOTE
+ && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
+! || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END))
+! loop_notes = gen_rtx (EXPR_LIST, REG_DEAD,
+! GEN_INT (NOTE_LINE_NUMBER (insn)), loop_notes);
+
+ if (insn == tail)
+--- 1725,1736 ----
+ else if (GET_CODE (insn) == NOTE
+ && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
+! || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END
+! || (NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP
+! && GET_CODE (PREV_INSN (insn)) != CALL_INSN)))
+! {
+! loop_notes = gen_rtx (EXPR_LIST, REG_DEAD,
+! GEN_INT (NOTE_LINE_NUMBER (insn)), loop_notes);
+! CONST_CALL_P (loop_notes) = CONST_CALL_P (insn);
+! }
+
+ if (insn == tail)
+*************** sched_note_set (b, x, death)
+*** 2372,2380 ****
+
+ #define SCHED_SORT(READY, NEW_READY, OLD_READY) \
+! do { if ((NEW_READY) - (OLD_READY) == 1) \
+! swap_sort (READY, NEW_READY); \
+! else if ((NEW_READY) - (OLD_READY) > 1) \
+! qsort (READY, NEW_READY, sizeof (rtx), rank_for_schedule); } \
+! while (0)
+
+ /* Returns a positive value if y is preferred; returns a negative value if
+--- 1838,1845 ----
+
+ #define SCHED_SORT(READY, NEW_READY, OLD_READY) \
+! if ((NEW_READY) - (OLD_READY) == 1) \
+! swap_sort (READY, NEW_READY); \
+! else if ((NEW_READY) - (OLD_READY) > 1) \
+! qsort (READY, NEW_READY, sizeof (rtx), rank_for_schedule); else \
+
+ /* Returns a positive value if y is preferred; returns a negative value if
+*************** reemit_notes (insn, last)
+*** 3128,3132 ****
+ {
+ if (INTVAL (XEXP (note, 0)) == NOTE_INSN_SETJMP)
+! emit_note_after (INTVAL (XEXP (note, 0)), insn);
+ else
+ last = emit_note_before (INTVAL (XEXP (note, 0)), last);
+--- 2593,2598 ----
+ {
+ if (INTVAL (XEXP (note, 0)) == NOTE_INSN_SETJMP)
+! CONST_CALL_P (emit_note_after (INTVAL (XEXP (note, 0)), insn))
+! = CONST_CALL_P (note);
+ else
+ last = emit_note_before (INTVAL (XEXP (note, 0)), last);
+*************** schedule_block (b, file)
+*** 3174,3178 ****
+ b, INSN_UID (basic_block_head[b]), INSN_UID (basic_block_end[b]));
+
+! i = max_reg_num ();
+ reg_last_uses = (rtx *) alloca (i * sizeof (rtx));
+ bzero ((char *) reg_last_uses, i * sizeof (rtx));
+--- 2640,2644 ----
+ b, INSN_UID (basic_block_head[b]), INSN_UID (basic_block_end[b]));
+
+! reg_last_uses_size = i = max_reg_num ();
+ reg_last_uses = (rtx *) alloca (i * sizeof (rtx));
+ bzero ((char *) reg_last_uses, i * sizeof (rtx));
+*************** schedule_block (b, file)
+*** 3800,3804 ****
+ made live again later. */
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+! if (call_used_regs[i] || global_regs[i])
+ {
+ register int offset = i / REGSET_ELT_BITS;
+--- 3266,3271 ----
+ made live again later. */
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+! if ((call_used_regs[i] && ! fixed_regs[i])
+! || global_regs[i])
+ {
+ register int offset = i / REGSET_ELT_BITS;
+*************** schedule_insns (dump_file)
+*** 4717,4721 ****
+ bcopy ((char *) reg_n_deaths, (char *) sched_reg_n_deaths,
+ max_regno * sizeof (short));
+- init_alias_analysis ();
+ }
+ else
+--- 4184,4187 ----
+*************** schedule_insns (dump_file)
+*** 4726,4732 ****
+ bb_dead_regs = 0;
+ bb_live_regs = 0;
+- if (! flag_schedule_insns)
+- init_alias_analysis ();
+ }
+
+ if (write_symbols != NO_DEBUG)
+--- 4192,4213 ----
+ bb_dead_regs = 0;
+ bb_live_regs = 0;
+ }
++ init_alias_analysis ();
++ #if 0
++ if (dump_file)
++ {
++ extern rtx *reg_base_value;
++ extern int reg_base_value_size;
++ int i;
++ for (i = 0; i < reg_base_value_size; i++)
++ if (reg_base_value[i])
++ {
++ fprintf (dump_file, ";; reg_base_value[%d] = ", i);
++ print_rtl (dump_file, reg_base_value[i]);
++ fputc ('\n', dump_file);
++ }
++ }
++ #endif
++
+
+ if (write_symbols != NO_DEBUG)
+diff -rcp2N gcc-2.7.2.3/sdbout.c gcc-2.7.2.3.f.1/sdbout.c
+*** gcc-2.7.2.3/sdbout.c Thu Jun 15 12:07:11 1995
+--- gcc-2.7.2.3.f.1/sdbout.c Mon Aug 11 05:42:22 1997
+*************** plain_type_1 (type, level)
+*** 539,543 ****
+ sdb_dims[sdb_n_dims++]
+ = (TYPE_DOMAIN (type)
+! ? TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) + 1
+ : 0);
+ return PUSH_DERIVED_LEVEL (DT_ARY, m);
+--- 539,546 ----
+ sdb_dims[sdb_n_dims++]
+ = (TYPE_DOMAIN (type)
+! && TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) == INTEGER_CST
+! && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) == INTEGER_CST
+! ? (TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))
+! - TREE_INT_CST_LOW (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) + 1)
+ : 0);
+ return PUSH_DERIVED_LEVEL (DT_ARY, m);
+diff -rcp2N gcc-2.7.2.3/stmt.c gcc-2.7.2.3.f.1/stmt.c
+*** gcc-2.7.2.3/stmt.c Tue Sep 12 23:01:54 1995
+--- gcc-2.7.2.3.f.1/stmt.c Fri Aug 29 07:52:05 1997
+*************** fixup_gotos (thisblock, stack_level, cle
+*** 1244,1249 ****
+ poplevel (1, 0, 0);
+ end_sequence ();
+! f->before_jump
+! = emit_insns_after (cleanup_insns, f->before_jump);
+
+ f->cleanup_list_list = TREE_CHAIN (lists);
+--- 1244,1250 ----
+ poplevel (1, 0, 0);
+ end_sequence ();
+! if (cleanup_insns != 0)
+! f->before_jump
+! = emit_insns_after (cleanup_insns, f->before_jump);
+
+ f->cleanup_list_list = TREE_CHAIN (lists);
+*************** expand_expr_stmt (exp)
+*** 1721,1725 ****
+
+ last_expr_type = TREE_TYPE (exp);
+! if (! flag_syntax_only)
+ last_expr_value = expand_expr (exp,
+ (expr_stmts_for_value
+--- 1722,1726 ----
+
+ last_expr_type = TREE_TYPE (exp);
+! if (! flag_syntax_only || expr_stmts_for_value)
+ last_expr_value = expand_expr (exp,
+ (expr_stmts_for_value
+*************** expand_end_bindings (vars, mark_ends, do
+*** 3160,3163 ****
+--- 3161,3169 ----
+ #endif
+
++ #ifdef HAVE_nonlocal_goto_receiver
++ if (HAVE_nonlocal_goto_receiver)
++ emit_insn (gen_nonlocal_goto_receiver ());
++ #endif
++
+ /* The handler expects the desired label address in the static chain
+ register. It tests the address and does an appropriate jump
+*************** expand_decl (decl)
+*** 3369,3395 ****
+ = promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
+
+! if (TREE_CODE (type) == COMPLEX_TYPE)
+! {
+! rtx realpart, imagpart;
+! enum machine_mode partmode = TYPE_MODE (TREE_TYPE (type));
+
+! /* For a complex type variable, make a CONCAT of two pseudos
+! so that the real and imaginary parts
+! can be allocated separately. */
+! realpart = gen_reg_rtx (partmode);
+! REG_USERVAR_P (realpart) = 1;
+! imagpart = gen_reg_rtx (partmode);
+! REG_USERVAR_P (imagpart) = 1;
+! DECL_RTL (decl) = gen_rtx (CONCAT, reg_mode, realpart, imagpart);
+! }
+! else
+! {
+! DECL_RTL (decl) = gen_reg_rtx (reg_mode);
+! if (TREE_CODE (type) == POINTER_TYPE)
+! mark_reg_pointer (DECL_RTL (decl));
+! REG_USERVAR_P (DECL_RTL (decl)) = 1;
+! }
+ }
+! else if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
+ {
+ /* Variable of fixed size that goes on the stack. */
+--- 3375,3389 ----
+ = promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
+
+! DECL_RTL (decl) = gen_reg_rtx (reg_mode);
+! mark_user_reg (DECL_RTL (decl));
+
+! if (TREE_CODE (type) == POINTER_TYPE)
+! mark_reg_pointer (DECL_RTL (decl));
+ }
+! else if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST
+! && ! (flag_stack_check && ! STACK_CHECK_BUILTIN
+! && (TREE_INT_CST_HIGH (DECL_SIZE (decl)) != 0
+! || (TREE_INT_CST_LOW (DECL_SIZE (decl))
+! > STACK_CHECK_MAX_VAR_SIZE * BITS_PER_UNIT))))
+ {
+ /* Variable of fixed size that goes on the stack. */
+*************** expand_decl (decl)
+*** 3462,3468 ****
+ free_temp_slots ();
+
+! /* Allocate space on the stack for the variable. */
+ address = allocate_dynamic_stack_space (size, NULL_RTX,
+! DECL_ALIGN (decl));
+
+ /* Reference the variable indirect through that rtx. */
+--- 3456,3465 ----
+ free_temp_slots ();
+
+! /* Allocate space on the stack for the variable. Note that
+! DECL_ALIGN says how the variable is to be aligned and we
+! cannot use it to conclude anything about the alignment of
+! the size. */
+ address = allocate_dynamic_stack_space (size, NULL_RTX,
+! TYPE_ALIGN (TREE_TYPE (decl)));
+
+ /* Reference the variable indirect through that rtx. */
+*************** pushcase_range (value1, value2, converte
+*** 4155,4158 ****
+--- 4152,4159 ----
+ return 1;
+
++ /* Fail if the range is empty. */
++ if (tree_int_cst_lt (value2, value1))
++ return 4;
++
+ if (stack_block_stack
+ && stack_block_stack->depth > case_stack->depth)
+*************** pushcase_range (value1, value2, converte
+*** 4189,4197 ****
+ /* Convert VALUEs to type in which the comparisons are nominally done. */
+ if (value1 == 0) /* Negative infinity. */
+! value1 = TYPE_MIN_VALUE(index_type);
+ value1 = (*converter) (nominal_type, value1);
+
+ if (value2 == 0) /* Positive infinity. */
+! value2 = TYPE_MAX_VALUE(index_type);
+ value2 = (*converter) (nominal_type, value2);
+
+--- 4190,4198 ----
+ /* Convert VALUEs to type in which the comparisons are nominally done. */
+ if (value1 == 0) /* Negative infinity. */
+! value1 = TYPE_MIN_VALUE (index_type);
+ value1 = (*converter) (nominal_type, value1);
+
+ if (value2 == 0) /* Positive infinity. */
+! value2 = TYPE_MAX_VALUE (index_type);
+ value2 = (*converter) (nominal_type, value2);
+
+*************** pushcase_range (value1, value2, converte
+*** 4202,4209 ****
+ if (! int_fits_type_p (value2, index_type))
+ return 3;
+-
+- /* Fail if the range is empty. */
+- if (tree_int_cst_lt (value2, value1))
+- return 4;
+
+ /* If the bounds are equal, turn this into the one-value case. */
+--- 4203,4206 ----
+diff -rcp2N gcc-2.7.2.3/stor-layout.c gcc-2.7.2.3.f.1/stor-layout.c
+*** gcc-2.7.2.3/stor-layout.c Sat Jun 29 16:26:51 1996
+--- gcc-2.7.2.3.f.1/stor-layout.c Mon Aug 11 10:47:50 1997
+*************** layout_decl (decl, known_align)
+*** 255,259 ****
+ if (maximum_field_alignment != 0)
+ DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment);
+! else if (flag_pack_struct)
+ DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
+ }
+--- 255,259 ----
+ if (maximum_field_alignment != 0)
+ DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment);
+! else if (DECL_PACKED (decl))
+ DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
+ }
+*************** layout_decl (decl, known_align)
+*** 261,265 ****
+ if (DECL_BIT_FIELD (decl)
+ && TYPE_SIZE (type) != 0
+! && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
+ {
+ register enum machine_mode xmode
+--- 261,266 ----
+ if (DECL_BIT_FIELD (decl)
+ && TYPE_SIZE (type) != 0
+! && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
+! && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT)
+ {
+ register enum machine_mode xmode
+*************** layout_decl (decl, known_align)
+*** 278,281 ****
+--- 279,291 ----
+ }
+
++ /* Turn off DECL_BIT_FIELD if we won't need it set. */
++ if (DECL_BIT_FIELD (decl) && TYPE_MODE (type) == BLKmode
++ && known_align % TYPE_ALIGN (type) == 0
++ && DECL_SIZE (decl) != 0
++ && (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST
++ || (TREE_INT_CST_LOW (DECL_SIZE (decl)) % BITS_PER_UNIT) == 0)
++ && DECL_ALIGN (decl) >= TYPE_ALIGN (type))
++ DECL_BIT_FIELD (decl) = 0;
++
+ /* Evaluate nonconstant size only once, either now or as soon as safe. */
+ if (DECL_SIZE (decl) != 0 && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
+*************** layout_record (rec)
+*** 380,384 ****
+ if (maximum_field_alignment != 0)
+ type_align = MIN (type_align, maximum_field_alignment);
+! else if (flag_pack_struct)
+ type_align = MIN (type_align, BITS_PER_UNIT);
+
+--- 390,394 ----
+ if (maximum_field_alignment != 0)
+ type_align = MIN (type_align, maximum_field_alignment);
+! else if (TYPE_PACKED (rec))
+ type_align = MIN (type_align, BITS_PER_UNIT);
+
+*************** layout_record (rec)
+*** 422,428 ****
+ && DECL_BIT_FIELD_TYPE (field)
+ && !DECL_PACKED (field)
+- /* If #pragma pack is in effect, turn off this feature. */
+ && maximum_field_alignment == 0
+- && !flag_pack_struct
+ && !integer_zerop (DECL_SIZE (field)))
+ {
+--- 432,436 ----
+*************** layout_record (rec)
+*** 459,463 ****
+ if (maximum_field_alignment != 0)
+ type_align = MIN (type_align, maximum_field_alignment);
+! else if (flag_pack_struct)
+ type_align = MIN (type_align, BITS_PER_UNIT);
+
+--- 467,471 ----
+ if (maximum_field_alignment != 0)
+ type_align = MIN (type_align, maximum_field_alignment);
+! else if (TYPE_PACKED (rec))
+ type_align = MIN (type_align, BITS_PER_UNIT);
+
+*************** layout_record (rec)
+*** 500,505 ****
+ /* Do nothing. */;
+ else if (TREE_CODE (dsize) == INTEGER_CST
+ && TREE_INT_CST_HIGH (dsize) == 0
+! && TREE_INT_CST_LOW (dsize) + const_size > const_size)
+ /* Use const_size if there's no overflow. */
+ const_size += TREE_INT_CST_LOW (dsize);
+--- 508,514 ----
+ /* Do nothing. */;
+ else if (TREE_CODE (dsize) == INTEGER_CST
++ && ! TREE_CONSTANT_OVERFLOW (dsize)
+ && TREE_INT_CST_HIGH (dsize) == 0
+! && TREE_INT_CST_LOW (dsize) + const_size >= const_size)
+ /* Use const_size if there's no overflow. */
+ const_size += TREE_INT_CST_LOW (dsize);
+*************** get_best_mode (bitsize, bitpos, align, l
+*** 1172,1175 ****
+--- 1181,1192 ----
+ enum machine_mode mode;
+ int unit;
++
++ if (bitpos < 0)
++ {
++ /* For correct calculations and convenience, bias negative bitpos
++ to become a non-negative value that is [1,bitsize], such that
++ the relative bit offset to a multiple of bitsize is preserved. */
++ bitpos = bitsize - ((-bitpos) % bitsize);
++ }
+
+ /* Find the narrowest integer mode that contains the bit field. */
+diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
+*** gcc-2.7.2.3/stupid.c Sun Oct 29 12:45:22 1995
+--- gcc-2.7.2.3.f.1/stupid.c Sun Aug 10 22:46:01 1997
+*************** static int *uid_suid;
+*** 66,69 ****
+--- 66,74 ----
+ static int last_call_suid;
+
++ /* Record the suid of the last NOTE_INSN_SETJMP
++ so we can tell whether a pseudo reg crosses any setjmp. */
++
++ static int last_setjmp_suid;
++
+ /* Element N is suid of insn where life span of pseudo reg N ends.
+ Element is 0 if register N has not been seen yet on backward scan. */
+*************** static char *regs_live;
+*** 89,92 ****
+--- 94,101 ----
+ static char *regs_change_size;
+
++ /* Indexed by reg number, nonzero if reg crosses a setjmp. */
++
++ static char *regs_crosses_setjmp;
++
+ /* Indexed by insn's suid, the set of hard regs live after that insn. */
+
+*************** stupid_life_analysis (f, nregs, file)
+*** 149,152 ****
+--- 158,162 ----
+
+ last_call_suid = i + 1;
++ last_setjmp_suid = i + 1;
+ max_suid = i + 1;
+
+*************** stupid_life_analysis (f, nregs, file)
+*** 167,170 ****
+--- 177,183 ----
+ bzero ((char *) regs_change_size, nregs * sizeof (char));
+
++ regs_crosses_setjmp = (char *) alloca (nregs * sizeof (char));
++ bzero ((char *) regs_crosses_setjmp, nregs * sizeof (char));
++
+ reg_renumber = (short *) oballoc (nregs * sizeof (short));
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+*************** stupid_life_analysis (f, nregs, file)
+*** 216,219 ****
+--- 229,236 ----
+ stupid_mark_refs (PATTERN (insn), insn);
+
++ if (GET_CODE (insn) == NOTE
++ && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP)
++ last_setjmp_suid = INSN_SUID (insn);
++
+ /* Mark all call-clobbered regs as live after each call insn
+ so that a pseudo whose life span includes this insn
+*************** stupid_life_analysis (f, nregs, file)
+*** 254,259 ****
+ register int r = reg_order[i];
+
+! /* Some regnos disappear from the rtl. Ignore them to avoid crash. */
+! if (regno_reg_rtx[r] == 0)
+ continue;
+
+--- 271,277 ----
+ register int r = reg_order[i];
+
+! /* Some regnos disappear from the rtl. Ignore them to avoid crash.
+! Also don't allocate registers that cross a setjmp. */
+! if (regno_reg_rtx[r] == 0 || regs_crosses_setjmp[r])
+ continue;
+
+*************** stupid_reg_compare (r1p, r2p)
+*** 309,314 ****
+ that can hold a value of machine-mode MODE
+ (but actually we test only the first of the block for holding MODE)
+! currently free from after insn whose suid is BIRTH
+! through the insn whose suid is DEATH,
+ and return the number of the first of them.
+ Return -1 if such a block cannot be found.
+--- 327,332 ----
+ that can hold a value of machine-mode MODE
+ (but actually we test only the first of the block for holding MODE)
+! currently free from after insn whose suid is BORN_INSN
+! through the insn whose suid is DEAD_INSN,
+ and return the number of the first of them.
+ Return -1 if such a block cannot be found.
+*************** stupid_find_reg (call_preserved, class,
+*** 338,341 ****
+--- 356,366 ----
+ #endif
+
++ /* If this register's life is more than 5,000 insns, we probably
++ can't allocate it, so don't waste the time trying. This avoid
++ quadratic behavior on programs that have regularly-occurring
++ SAVE_EXPRs. */
++ if (dead_insn > born_insn + 5000)
++ return -1;
++
+ COPY_HARD_REG_SET (used,
+ call_preserved ? call_used_reg_set : fixed_reg_set);
+*************** stupid_mark_refs (x, insn)
+*** 488,491 ****
+--- 513,519 ----
+ if (last_call_suid < reg_where_dead[regno])
+ reg_n_calls_crossed[regno] += 1;
++
++ if (last_setjmp_suid < reg_where_dead[regno])
++ regs_crosses_setjmp[regno] = 1;
+ }
+ }
+diff -rcp2N gcc-2.7.2.3/tm.texi gcc-2.7.2.3.f.1/tm.texi
+*** gcc-2.7.2.3/tm.texi Sun Sep 3 12:59:01 1995
+--- gcc-2.7.2.3.f.1/tm.texi Fri Aug 29 07:52:19 1997
+*************** This describes the stack layout and call
+*** 1951,1954 ****
+--- 1951,1955 ----
+ @menu
+ * Frame Layout::
++ * Stack Checking::
+ * Frame Registers::
+ * Elimination::
+*************** This discusses registers that address th
+*** 2070,2073 ****
+--- 2071,2156 ----
+ @table @code
+ @findex STACK_POINTER_REGNUM
++ @end table
++
++ @node Stack Checking
++ @subsection Specifying How Stack Checking is Done
++
++ GNU CC will check that stack references are within the boundaries of
++ the stack, if the @samp{-fstack-check} is specified, in one of three ways:
++
++ @enumerate
++ @item
++ If the value of the @code{STACK_CHECK_BUILTIN} macro is nonzero, GNU CC
++ will assume that you have arranged for stack checking to be done at
++ appropriate places in the configuration files, e.g., in
++ @code{FUNCTION_PROLOGUE}. GNU CC will do not other special processing.
++
++ @item
++ If @code{STACK_CHECK_BUILTIN} is zero and you defined a named pattern
++ called @code{check_stack} in your @file{md} file, GNU CC will call that
++ pattern with one argument which is the address to compare the stack
++ value against. You must arrange for this pattern to report an error if
++ the stack pointer is out of range.
++
++ @item
++ If neither of the above are true, GNU CC will generate code to periodically
++ ``probe'' the stack pointer using the values of the macros defined below.
++ @end enumerate
++
++ Normally, you will use the default values of these macros, so GNU CC
++ will use the third approach.
++
++ @table @code
++ @findex STACK_CHECK_BUILTIN
++ @item STACK_CHECK_BUILTIN
++ A nonzero value if stack checking is done by the configuration files in a
++ machine-dependent manner. You should define this macro if stack checking
++ is require by the ABI of your machine or if you would like to have to stack
++ checking in some more efficient way than GNU CC's portable approach.
++ The default value of this macro is zero.
++
++ @findex STACK_CHECK_PROBE_INTERVAL
++ @item STACK_CHECK_PROBE_INTERVAL
++ An integer representing the interval at which GNU CC must generate stack
++ probe instructions. You will normally define this macro to be no larger
++ than the size of the ``guard pages'' at the end of a stack area. The
++ default value of 4096 is suitable for most systems.
++
++ @findex STACK_CHECK_PROBE_LOAD
++ @item STACK_CHECK_PROBE_LOAD
++ A integer which is nonzero if GNU CC should perform the stack probe
++ as a load instruction and zero if GNU CC should use a store instruction.
++ The default is zero, which is the most efficient choice on most systems.
++
++ @findex STACK_CHECK_PROTECT
++ @item STACK_CHECK_PROTECT
++ The number of bytes of stack needed to recover from a stack overflow,
++ for languages where such a recovery is supported. The default value of
++ 75 words should be adequate for most machines.
++
++ @findex STACK_CHECK_MAX_FRAME_SIZE
++ @item STACK_CHECK_MAX_FRAME_SIZE
++ The maximum size of a stack frame, in bytes. GNU CC will generate probe
++ instructions in non-leaf functions to ensure at least this many bytes of
++ stack are available. If a stack frame is larger than this size, stack
++ checking will not be reliable and GNU CC will issue a warning. The
++ default is chosen so that GNU CC only generates one instruction on most
++ systems. You should normally not change the default value of this macro.
++
++ @findex STACK_CHECK_FIXED_FRAME_SIZE
++ @item STACK_CHECK_FIXED_FRAME_SIZE
++ GNU CC uses this value to generate the above warning message. It
++ represents the amount of fixed frame used by a function, not including
++ space for any callee-saved registers, temporaries and user variables.
++ You need only specify an upper bound for this amount and will normally
++ use the default of four words.
++
++ @findex STACK_CHECK_MAX_VAR_SIZE
++ @item STACK_CHECK_MAX_VAR_SIZE
++ The maximum size, in bytes, of an object that GNU CC will place in the
++ fixed area of the stack frame when the user specifies
++ @samp{-fstack-check}.
++ GNU CC computed the default from the values of the above macros and you will
++ normally not need to override that default.
+ @item STACK_POINTER_REGNUM
+ The register number of the stack pointer register, which must also be a
+diff -rcp2N gcc-2.7.2.3/toplev.c gcc-2.7.2.3.f.1/toplev.c
+*** gcc-2.7.2.3/toplev.c Fri Oct 20 21:56:35 1995
+--- gcc-2.7.2.3.f.1/toplev.c Fri Aug 29 09:13:14 1997
+*************** int flag_unroll_loops;
+*** 388,391 ****
+--- 388,405 ----
+ int flag_unroll_all_loops;
+
++ /* Nonzero forces all invariant computations in loops to be moved
++ outside the loop. */
++
++ int flag_move_all_movables = 0;
++
++ /* Nonzero forces all general induction variables in loops to be
++ strength reduced. */
++
++ int flag_reduce_all_givs = 0;
++
++ /* Nonzero gets another run of loop_optimize performed. */
++
++ int flag_rerun_loop_opt = 0;
++
+ /* Nonzero for -fwritable-strings:
+ store string constants in data segment and don't uniquize them. */
+*************** int flag_gnu_linker = 1;
+*** 522,525 ****
+--- 536,554 ----
+ int flag_pack_struct = 0;
+
++ /* 1 if alias checking is on (by default, when -O). */
++ int flag_alias_check = 0;
++
++ /* 0 if pointer arguments may alias each other. True in C.
++ 1 if pointer arguments may not alias each other but may alias
++ global variables.
++ 2 if pointer arguments may not alias each other and may not
++ alias global variables. True in Fortran.
++ This defaults to 0 for C. */
++ int flag_argument_noalias = 0;
++
++ /* Emit code to check for stack overflow; also may cause large objects
++ to be allocated dynamically. */
++ int flag_stack_check;
++
+ /* Table of language-independent -f options.
+ STRING is the option name. VARIABLE is the address of the variable.
+*************** struct { char *string; int *variable; in
+*** 542,545 ****
+--- 571,577 ----
+ {"unroll-loops", &flag_unroll_loops, 1},
+ {"unroll-all-loops", &flag_unroll_all_loops, 1},
++ {"move-all-movables", &flag_move_all_movables, 1},
++ {"reduce-all-givs", &flag_reduce_all_givs, 1},
++ {"rerun-loop-opt", &flag_rerun_loop_opt, 1},
+ {"writable-strings", &flag_writable_strings, 1},
+ {"peephole", &flag_no_peephole, 0},
+*************** struct { char *string; int *variable; in
+*** 568,572 ****
+ {"gnu-linker", &flag_gnu_linker, 1},
+ {"pack-struct", &flag_pack_struct, 1},
+! {"bytecode", &output_bytecode, 1}
+ };
+
+--- 600,609 ----
+ {"gnu-linker", &flag_gnu_linker, 1},
+ {"pack-struct", &flag_pack_struct, 1},
+! {"bytecode", &output_bytecode, 1},
+! {"alias-check", &flag_alias_check, 1},
+! {"argument-alias", &flag_argument_noalias, 0},
+! {"argument-noalias", &flag_argument_noalias, 1},
+! {"argument-noalias-global", &flag_argument_noalias, 2},
+! {"stack-check", &flag_stack_check, 1}
+ };
+
+*************** rest_of_compilation (decl)
+*** 2715,2725 ****
+ finish_compilation will call rest_of_compilation again
+ for those functions that need to be output. Also defer those
+! functions that we are supposed to defer. */
+!
+! if (DECL_DEFER_OUTPUT (decl)
+! || ((specd || DECL_INLINE (decl))
+! && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
+! && ! flag_keep_inline_functions)
+! || DECL_EXTERNAL (decl))))
+ {
+ DECL_DEFER_OUTPUT (decl) = 1;
+--- 2752,2765 ----
+ finish_compilation will call rest_of_compilation again
+ for those functions that need to be output. Also defer those
+! functions that we are supposed to defer. We cannot defer
+! functions containing nested functions since the nested function
+! data is in our non-saved obstack. */
+!
+! if (! current_function_contains_functions
+! && (DECL_DEFER_OUTPUT (decl)
+! || ((specd || DECL_INLINE (decl))
+! && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
+! && ! flag_keep_inline_functions)
+! || DECL_EXTERNAL (decl)))))
+ {
+ DECL_DEFER_OUTPUT (decl) = 1;
+*************** rest_of_compilation (decl)
+*** 2893,2897 ****
+--- 2933,2956 ----
+ TIMEVAR (loop_time,
+ {
++ int save_unroll_flag;
++ int save_unroll_all_flag;
++
++ if (flag_rerun_loop_opt)
++ {
++ save_unroll_flag = flag_unroll_loops;
++ save_unroll_all_flag = flag_unroll_all_loops;
++ flag_unroll_loops = 0;
++ flag_unroll_all_loops = 0;
++ }
++
+ loop_optimize (insns, loop_dump_file);
++
++ if (flag_rerun_loop_opt)
++ {
++ flag_unroll_loops = save_unroll_flag;
++ flag_unroll_all_loops = save_unroll_all_flag;
++
++ loop_optimize (insns, loop_dump_file);
++ }
+ });
+ }
+*************** rest_of_compilation (decl)
+*** 3280,3283 ****
+--- 3339,3346 ----
+ resume_temporary_allocation ();
+
++ /* Show no temporary slots allocated. */
++
++ init_temp_slots ();
++
+ /* The parsing time is all the time spent in yyparse
+ *except* what is spent in this function. */
+*************** main (argc, argv, envp)
+*** 3383,3386 ****
+--- 3446,3450 ----
+ flag_omit_frame_pointer = 1;
+ #endif
++ flag_alias_check = 1;
+ }
+
+diff -rcp2N gcc-2.7.2.3/tree.c gcc-2.7.2.3.f.1/tree.c
+*** gcc-2.7.2.3/tree.c Mon Oct 2 01:26:56 1995
+--- gcc-2.7.2.3.f.1/tree.c Fri Aug 29 08:15:03 1997
+*************** build_string (len, str)
+*** 1428,1436 ****
+ /* Return a newly constructed COMPLEX_CST node whose value is
+ specified by the real and imaginary parts REAL and IMAG.
+! Both REAL and IMAG should be constant nodes.
+! The TREE_TYPE is not initialized. */
+
+ tree
+! build_complex (real, imag)
+ tree real, imag;
+ {
+--- 1428,1437 ----
+ /* Return a newly constructed COMPLEX_CST node whose value is
+ specified by the real and imaginary parts REAL and IMAG.
+! Both REAL and IMAG should be constant nodes. TYPE, if specified,
+! will be the type of the COMPLEX_CST; otherwise a new type will be made. */
+
+ tree
+! build_complex (type, real, imag)
+! tree type;
+ tree real, imag;
+ {
+*************** build_complex (real, imag)
+*** 1439,1443 ****
+ TREE_REALPART (t) = real;
+ TREE_IMAGPART (t) = imag;
+! TREE_TYPE (t) = build_complex_type (TREE_TYPE (real));
+ TREE_OVERFLOW (t) = TREE_OVERFLOW (real) | TREE_OVERFLOW (imag);
+ TREE_CONSTANT_OVERFLOW (t)
+--- 1440,1444 ----
+ TREE_REALPART (t) = real;
+ TREE_IMAGPART (t) = imag;
+! TREE_TYPE (t) = type ? type : build_complex_type (TREE_TYPE (real));
+ TREE_OVERFLOW (t) = TREE_OVERFLOW (real) | TREE_OVERFLOW (imag);
+ TREE_CONSTANT_OVERFLOW (t)
+*************** integer_zerop (expr)
+*** 1484,1487 ****
+--- 1485,1489 ----
+
+ return ((TREE_CODE (expr) == INTEGER_CST
++ && ! TREE_CONSTANT_OVERFLOW (expr)
+ && TREE_INT_CST_LOW (expr) == 0
+ && TREE_INT_CST_HIGH (expr) == 0)
+*************** integer_onep (expr)
+*** 1501,1504 ****
+--- 1503,1507 ----
+
+ return ((TREE_CODE (expr) == INTEGER_CST
++ && ! TREE_CONSTANT_OVERFLOW (expr)
+ && TREE_INT_CST_LOW (expr) == 1
+ && TREE_INT_CST_HIGH (expr) == 0)
+*************** integer_all_onesp (expr)
+*** 1525,1529 ****
+ return 1;
+
+! else if (TREE_CODE (expr) != INTEGER_CST)
+ return 0;
+
+--- 1528,1533 ----
+ return 1;
+
+! else if (TREE_CODE (expr) != INTEGER_CST
+! || TREE_CONSTANT_OVERFLOW (expr))
+ return 0;
+
+*************** integer_pow2p (expr)
+*** 1574,1578 ****
+ return 1;
+
+! if (TREE_CODE (expr) != INTEGER_CST)
+ return 0;
+
+--- 1578,1582 ----
+ return 1;
+
+! if (TREE_CODE (expr) != INTEGER_CST || TREE_CONSTANT_OVERFLOW (expr))
+ return 0;
+
+*************** real_zerop (expr)
+*** 1596,1599 ****
+--- 1600,1604 ----
+
+ return ((TREE_CODE (expr) == REAL_CST
++ && ! TREE_CONSTANT_OVERFLOW (expr)
+ && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0))
+ || (TREE_CODE (expr) == COMPLEX_CST
+*************** real_onep (expr)
+*** 1611,1614 ****
+--- 1616,1620 ----
+
+ return ((TREE_CODE (expr) == REAL_CST
++ && ! TREE_CONSTANT_OVERFLOW (expr)
+ && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1))
+ || (TREE_CODE (expr) == COMPLEX_CST
+*************** real_twop (expr)
+*** 1626,1629 ****
+--- 1632,1636 ----
+
+ return ((TREE_CODE (expr) == REAL_CST
++ && ! TREE_CONSTANT_OVERFLOW (expr)
+ && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2))
+ || (TREE_CODE (expr) == COMPLEX_CST
+*************** staticp (arg)
+*** 2055,2061 ****
+ return 1;
+
+ case COMPONENT_REF:
+ case BIT_FIELD_REF:
+! return staticp (TREE_OPERAND (arg, 0));
+
+ #if 0
+--- 2062,2073 ----
+ return 1;
+
++ /* If we are referencing a bitfield, we can't evaluate an
++ ADDR_EXPR at compile time and so it isn't a constant. */
+ case COMPONENT_REF:
++ return (! DECL_BIT_FIELD (TREE_OPERAND (arg, 1))
++ && staticp (TREE_OPERAND (arg, 0)));
++
+ case BIT_FIELD_REF:
+! return 0;
+
+ #if 0
+*************** save_expr (expr)
+*** 2141,2148 ****
+ \f
+ /* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
+! or offset that depends on a field within a record.
+!
+! Note that we only allow such expressions within simple arithmetic
+! or a COND_EXPR. */
+
+ int
+--- 2153,2157 ----
+ \f
+ /* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
+! or offset that depends on a field within a record. */
+
+ int
+*************** contains_placeholder_p (exp)
+*** 2151,2155 ****
+ {
+ register enum tree_code code = TREE_CODE (exp);
+- tree inner;
+
+ /* If we have a WITH_RECORD_EXPR, it "cancels" any PLACEHOLDER_EXPR
+--- 2160,2163 ----
+*************** contains_placeholder_p (exp)
+*** 2157,2173 ****
+ if (code == WITH_RECORD_EXPR)
+ return 0;
+
+ switch (TREE_CODE_CLASS (code))
+ {
+ case 'r':
+! for (inner = TREE_OPERAND (exp, 0);
+! TREE_CODE_CLASS (TREE_CODE (inner)) == 'r';
+! inner = TREE_OPERAND (inner, 0))
+! ;
+! return TREE_CODE (inner) == PLACEHOLDER_EXPR;
+
+ case '1':
+ case '2': case '<':
+ case 'e':
+ switch (tree_code_length[(int) code])
+ {
+--- 2165,2203 ----
+ if (code == WITH_RECORD_EXPR)
+ return 0;
++ else if (code == PLACEHOLDER_EXPR)
++ return 1;
+
+ switch (TREE_CODE_CLASS (code))
+ {
+ case 'r':
+! /* Don't look at any PLACEHOLDER_EXPRs that might be in index or bit
+! position computations since they will be converted into a
+! WITH_RECORD_EXPR involving the reference, which will assume
+! here will be valid. */
+! return contains_placeholder_p (TREE_OPERAND (exp, 0));
+
+ case '1':
+ case '2': case '<':
+ case 'e':
++ switch (code)
++ {
++ case COMPOUND_EXPR:
++ /* Ignoring the first operand isn't quite right, but works best. */
++ return contains_placeholder_p (TREE_OPERAND (exp, 1));
++
++ case RTL_EXPR:
++ case CONSTRUCTOR:
++ return 0;
++
++ case COND_EXPR:
++ return (contains_placeholder_p (TREE_OPERAND (exp, 0))
++ || contains_placeholder_p (TREE_OPERAND (exp, 1))
++ || contains_placeholder_p (TREE_OPERAND (exp, 2)));
++
++ case SAVE_EXPR:
++ return (SAVE_EXPR_RTL (exp) == 0
++ && contains_placeholder_p (TREE_OPERAND (exp, 0)));
++ }
++
+ switch (tree_code_length[(int) code])
+ {
+*************** contains_placeholder_p (exp)
+*** 2175,2189 ****
+ return contains_placeholder_p (TREE_OPERAND (exp, 0));
+ case 2:
+! return (code != RTL_EXPR
+! && code != CONSTRUCTOR
+! && ! (code == SAVE_EXPR && SAVE_EXPR_RTL (exp) != 0)
+! && code != WITH_RECORD_EXPR
+! && (contains_placeholder_p (TREE_OPERAND (exp, 0))
+! || contains_placeholder_p (TREE_OPERAND (exp, 1))));
+! case 3:
+! return (code == COND_EXPR
+! && (contains_placeholder_p (TREE_OPERAND (exp, 0))
+! || contains_placeholder_p (TREE_OPERAND (exp, 1))
+! || contains_placeholder_p (TREE_OPERAND (exp, 2))));
+ }
+ }
+--- 2205,2210 ----
+ return contains_placeholder_p (TREE_OPERAND (exp, 0));
+ case 2:
+! return (contains_placeholder_p (TREE_OPERAND (exp, 0))
+! || contains_placeholder_p (TREE_OPERAND (exp, 1)));
+ }
+ }
+*************** substitute_in_expr (exp, f, r)
+*** 2204,2207 ****
+--- 2225,2229 ----
+ {
+ enum tree_code code = TREE_CODE (exp);
++ tree op0, op1, op2;
+ tree new = 0;
+ tree inner;
+*************** substitute_in_expr (exp, f, r)
+*** 2225,2231 ****
+ {
+ case 1:
+! new = fold (build1 (code, TREE_TYPE (exp),
+! substitute_in_expr (TREE_OPERAND (exp, 0),
+! f, r)));
+ break;
+
+--- 2247,2255 ----
+ {
+ case 1:
+! op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
+! if (op0 == TREE_OPERAND (exp, 0))
+! return exp;
+!
+! new = fold (build1 (code, TREE_TYPE (exp), op0));
+ break;
+
+*************** substitute_in_expr (exp, f, r)
+*** 2238,2245 ****
+ abort ();
+
+! new = fold (build (code, TREE_TYPE (exp),
+! substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
+! substitute_in_expr (TREE_OPERAND (exp, 1),
+! f, r)));
+ break;
+
+--- 2262,2271 ----
+ abort ();
+
+! op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
+! op1 = substitute_in_expr (TREE_OPERAND (exp, 1), f, r);
+! if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1))
+! return exp;
+!
+! new = fold (build (code, TREE_TYPE (exp), op0, op1));
+ break;
+
+*************** substitute_in_expr (exp, f, r)
+*** 2253,2261 ****
+ abort ();
+
+! new = fold (build (code, TREE_TYPE (exp),
+! substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
+! substitute_in_expr (TREE_OPERAND (exp, 1), f, r),
+! substitute_in_expr (TREE_OPERAND (exp, 2),
+! f, r)));
+ }
+
+--- 2279,2290 ----
+ abort ();
+
+! op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
+! op1 = substitute_in_expr (TREE_OPERAND (exp, 1), f, r);
+! op2 = substitute_in_expr (TREE_OPERAND (exp, 2), f, r);
+! if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1)
+! && op2 == TREE_OPERAND (exp, 2))
+! return exp;
+!
+! new = fold (build (code, TREE_TYPE (exp), op0, op1, op2));
+ }
+
+*************** substitute_in_expr (exp, f, r)
+*** 2276,2302 ****
+ return r;
+
+! new = fold (build (code, TREE_TYPE (exp),
+! substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
+ TREE_OPERAND (exp, 1)));
+ break;
+
+ case BIT_FIELD_REF:
+! new = fold (build (code, TREE_TYPE (exp),
+! substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
+! substitute_in_expr (TREE_OPERAND (exp, 1), f, r),
+! substitute_in_expr (TREE_OPERAND (exp, 2), f, r)));
+ break;
+
+ case INDIRECT_REF:
+ case BUFFER_REF:
+! new = fold (build1 (code, TREE_TYPE (exp),
+! substitute_in_expr (TREE_OPERAND (exp, 0),
+! f, r)));
+ break;
+
+ case OFFSET_REF:
+! new = fold (build (code, TREE_TYPE (exp),
+! substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
+! substitute_in_expr (TREE_OPERAND (exp, 1), f, r)));
+ break;
+ }
+--- 2305,2349 ----
+ return r;
+
+! /* If this expression hasn't been completed let, leave it
+! alone. */
+! if (TREE_CODE (inner) == PLACEHOLDER_EXPR
+! && TREE_TYPE (inner) == 0)
+! return exp;
+!
+! op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
+! if (op0 == TREE_OPERAND (exp, 0))
+! return exp;
+!
+! new = fold (build (code, TREE_TYPE (exp), op0,
+ TREE_OPERAND (exp, 1)));
+ break;
+
+ case BIT_FIELD_REF:
+! op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
+! op1 = substitute_in_expr (TREE_OPERAND (exp, 1), f, r);
+! op2 = substitute_in_expr (TREE_OPERAND (exp, 2), f, r);
+! if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1)
+! && op2 == TREE_OPERAND (exp, 2))
+! return exp;
+!
+! new = fold (build (code, TREE_TYPE (exp), op0, op1, op2));
+ break;
+
+ case INDIRECT_REF:
+ case BUFFER_REF:
+! op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
+! if (op0 == TREE_OPERAND (exp, 0))
+! return exp;
+!
+! new = fold (build1 (code, TREE_TYPE (exp), op0));
+ break;
+
+ case OFFSET_REF:
+! op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
+! op1 = substitute_in_expr (TREE_OPERAND (exp, 1), f, r);
+! if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1))
+! return exp;
+!
+! new = fold (build (code, TREE_TYPE (exp), op0, op1));
+ break;
+ }
+*************** substitute_in_expr (exp, f, r)
+*** 2311,2454 ****
+ }
+ \f
+- /* Given a type T, a FIELD_DECL F, and a replacement value R,
+- return a new type with all size expressions that contain F
+- updated by replacing F with R. */
+-
+- tree
+- substitute_in_type (t, f, r)
+- tree t, f, r;
+- {
+- switch (TREE_CODE (t))
+- {
+- case POINTER_TYPE:
+- case VOID_TYPE:
+- return t;
+- case INTEGER_TYPE:
+- case ENUMERAL_TYPE:
+- case BOOLEAN_TYPE:
+- case CHAR_TYPE:
+- if ((TREE_CODE (TYPE_MIN_VALUE (t)) != INTEGER_CST
+- && contains_placeholder_p (TYPE_MIN_VALUE (t)))
+- || (TREE_CODE (TYPE_MAX_VALUE (t)) != INTEGER_CST
+- && contains_placeholder_p (TYPE_MAX_VALUE (t))))
+- return build_range_type (t,
+- substitute_in_expr (TYPE_MIN_VALUE (t), f, r),
+- substitute_in_expr (TYPE_MAX_VALUE (t), f, r));
+- return t;
+-
+- case REAL_TYPE:
+- if ((TYPE_MIN_VALUE (t) != 0
+- && TREE_CODE (TYPE_MIN_VALUE (t)) != REAL_CST
+- && contains_placeholder_p (TYPE_MIN_VALUE (t)))
+- || (TYPE_MAX_VALUE (t) != 0
+- && TREE_CODE (TYPE_MAX_VALUE (t)) != REAL_CST
+- && contains_placeholder_p (TYPE_MAX_VALUE (t))))
+- {
+- t = build_type_copy (t);
+-
+- if (TYPE_MIN_VALUE (t))
+- TYPE_MIN_VALUE (t) = substitute_in_expr (TYPE_MIN_VALUE (t), f, r);
+- if (TYPE_MAX_VALUE (t))
+- TYPE_MAX_VALUE (t) = substitute_in_expr (TYPE_MAX_VALUE (t), f, r);
+- }
+- return t;
+-
+- case COMPLEX_TYPE:
+- return build_complex_type (substitute_in_type (TREE_TYPE (t), f, r));
+-
+- case OFFSET_TYPE:
+- case METHOD_TYPE:
+- case REFERENCE_TYPE:
+- case FILE_TYPE:
+- case SET_TYPE:
+- case FUNCTION_TYPE:
+- case LANG_TYPE:
+- /* Don't know how to do these yet. */
+- abort ();
+-
+- case ARRAY_TYPE:
+- t = build_array_type (substitute_in_type (TREE_TYPE (t), f, r),
+- substitute_in_type (TYPE_DOMAIN (t), f, r));
+- TYPE_SIZE (t) = 0;
+- layout_type (t);
+- return t;
+-
+- case RECORD_TYPE:
+- case UNION_TYPE:
+- case QUAL_UNION_TYPE:
+- {
+- tree new = copy_node (t);
+- tree field;
+- tree last_field = 0;
+-
+- /* Start out with no fields, make new fields, and chain them
+- in. */
+-
+- TYPE_FIELDS (new) = 0;
+- TYPE_SIZE (new) = 0;
+-
+- for (field = TYPE_FIELDS (t); field;
+- field = TREE_CHAIN (field))
+- {
+- tree new_field = copy_node (field);
+-
+- TREE_TYPE (new_field)
+- = substitute_in_type (TREE_TYPE (new_field), f, r);
+-
+- /* If this is an anonymous field and the type of this field is
+- a UNION_TYPE or RECORD_TYPE with no elements, ignore it. If
+- the type just has one element, treat that as the field.
+- But don't do this if we are processing a QUAL_UNION_TYPE. */
+- if (TREE_CODE (t) != QUAL_UNION_TYPE && DECL_NAME (new_field) == 0
+- && (TREE_CODE (TREE_TYPE (new_field)) == UNION_TYPE
+- || TREE_CODE (TREE_TYPE (new_field)) == RECORD_TYPE))
+- {
+- if (TYPE_FIELDS (TREE_TYPE (new_field)) == 0)
+- continue;
+-
+- if (TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new_field))) == 0)
+- new_field = TYPE_FIELDS (TREE_TYPE (new_field));
+- }
+-
+- DECL_CONTEXT (new_field) = new;
+- DECL_SIZE (new_field) = 0;
+-
+- if (TREE_CODE (t) == QUAL_UNION_TYPE)
+- {
+- /* Do the substitution inside the qualifier and if we find
+- that this field will not be present, omit it. */
+- DECL_QUALIFIER (new_field)
+- = substitute_in_expr (DECL_QUALIFIER (field), f, r);
+- if (integer_zerop (DECL_QUALIFIER (new_field)))
+- continue;
+- }
+-
+- if (last_field == 0)
+- TYPE_FIELDS (new) = new_field;
+- else
+- TREE_CHAIN (last_field) = new_field;
+-
+- last_field = new_field;
+-
+- /* If this is a qualified type and this field will always be
+- present, we are done. */
+- if (TREE_CODE (t) == QUAL_UNION_TYPE
+- && integer_onep (DECL_QUALIFIER (new_field)))
+- break;
+- }
+-
+- /* If this used to be a qualified union type, but we now know what
+- field will be present, make this a normal union. */
+- if (TREE_CODE (new) == QUAL_UNION_TYPE
+- && (TYPE_FIELDS (new) == 0
+- || integer_onep (DECL_QUALIFIER (TYPE_FIELDS (new)))))
+- TREE_SET_CODE (new, UNION_TYPE);
+-
+- layout_type (new);
+- return new;
+- }
+- }
+- }
+- \f
+ /* Stabilize a reference so that we can use it any number of times
+ without causing its operands to be evaluated more than once.
+--- 2358,2361 ----
+*************** build_type_variant (type, constp, volati
+*** 3141,3145 ****
+ preserve the TYPE_NAME, since there is code that depends on this. */
+
+! for (t = TYPE_MAIN_VARIANT(type); t; t = TYPE_NEXT_VARIANT (t))
+ if (constp == TYPE_READONLY (t) && volatilep == TYPE_VOLATILE (t)
+ && TYPE_NAME (t) == TYPE_NAME (type))
+--- 3048,3052 ----
+ preserve the TYPE_NAME, since there is code that depends on this. */
+
+! for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
+ if (constp == TYPE_READONLY (t) && volatilep == TYPE_VOLATILE (t)
+ && TYPE_NAME (t) == TYPE_NAME (type))
+*************** get_unwidened (op, for_type)
+*** 4051,4055 ****
+ if (TREE_CODE (op) == COMPONENT_REF
+ /* Since type_for_size always gives an integer type. */
+! && TREE_CODE (type) != REAL_TYPE)
+ {
+ unsigned innerprec = TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (op, 1)));
+--- 3958,3964 ----
+ if (TREE_CODE (op) == COMPONENT_REF
+ /* Since type_for_size always gives an integer type. */
+! && TREE_CODE (type) != REAL_TYPE
+! /* Don't crash if field not layed out yet. */
+! && DECL_SIZE (TREE_OPERAND (op, 1)) != 0)
+ {
+ unsigned innerprec = TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (op, 1)));
+diff -rcp2N gcc-2.7.2.3/tree.h gcc-2.7.2.3.f.1/tree.h
+*** gcc-2.7.2.3/tree.h Mon Sep 25 21:49:40 1995
+--- gcc-2.7.2.3.f.1/tree.h Sun Aug 10 22:47:08 1997
+*************** enum built_in_function
+*** 98,101 ****
+--- 98,103 ----
+ BUILT_IN_APPLY,
+ BUILT_IN_RETURN,
++ BUILT_IN_SETJMP,
++ BUILT_IN_LONGJMP,
+
+ /* C++ extensions */
+*************** struct tree_int_cst
+*** 408,411 ****
+--- 410,415 ----
+ {
+ char common[sizeof (struct tree_common)];
++ struct rtx_def *rtl; /* acts as link to register transfer language
++ (rtl) info */
+ HOST_WIDE_INT int_cst_low;
+ HOST_WIDE_INT int_cst_high;
+*************** struct tree_type
+*** 957,960 ****
+--- 961,967 ----
+ #define DECL_STATIC_DESTRUCTOR(NODE) ((NODE)->decl.static_dtor_flag)
+
++ /* In a PARM_DECL, nonzero if this is a restricted pointer. */
++ #define DECL_RESTRICT(NODE) (NODE)->decl.static_ctor_flag
++
+ /* Used to indicate that this DECL represents a compiler-generated entity. */
+ #define DECL_ARTIFICIAL(NODE) ((NODE)->decl.artificial_flag)
+*************** extern tree build_int_2_wide PROTO((HOS
+*** 1176,1180 ****
+ extern tree build_real PROTO((tree, REAL_VALUE_TYPE));
+ extern tree build_real_from_int_cst PROTO((tree, tree));
+! extern tree build_complex PROTO((tree, tree));
+ extern tree build_string PROTO((int, char *));
+ extern tree build1 PROTO((enum tree_code, tree, tree));
+--- 1183,1187 ----
+ extern tree build_real PROTO((tree, REAL_VALUE_TYPE));
+ extern tree build_real_from_int_cst PROTO((tree, tree));
+! extern tree build_complex PROTO((tree, tree, tree));
+ extern tree build_string PROTO((int, char *));
+ extern tree build1 PROTO((enum tree_code, tree, tree));
+*************** extern int contains_placeholder_p PROTO(
+*** 1378,1387 ****
+ extern tree substitute_in_expr PROTO((tree, tree, tree));
+
+- /* Given a type T, a FIELD_DECL F, and a replacement value R,
+- return a new type with all size expressions that contain F
+- updated by replacing the reference to F with R. */
+-
+- extern tree substitute_in_type PROTO((tree, tree, tree));
+-
+ /* variable_size (EXP) is like save_expr (EXP) except that it
+ is for the special case of something that is part of a
+--- 1385,1388 ----
+*************** extern tree maybe_build_cleanup PROTO((
+*** 1456,1460 ****
+ and find the ultimate containing object, which is returned. */
+
+! extern tree get_inner_reference PROTO((tree, int *, int *, tree *, enum machine_mode *, int *, int *));
+
+ /* Return the FUNCTION_DECL which provides this _DECL with its context,
+--- 1457,1463 ----
+ and find the ultimate containing object, which is returned. */
+
+! extern tree get_inner_reference PROTO((tree, int *, int *, tree *,
+! enum machine_mode *, int *,
+! int *, int *));
+
+ /* Return the FUNCTION_DECL which provides this _DECL with its context,
+diff -rcp2N gcc-2.7.2.3/unroll.c gcc-2.7.2.3.f.1/unroll.c
+*** gcc-2.7.2.3/unroll.c Sun Aug 31 09:39:49 1997
+--- gcc-2.7.2.3.f.1/unroll.c Sun Aug 31 09:21:17 1997
+*************** unroll_loop (loop_end, insn_count, loop_
+*** 268,273 ****
+ structure of the function. This can happen as a result of the
+ "if (foo) bar; else break;" optimization in jump.c. */
+
+! if (write_symbols != NO_DEBUG)
+ {
+ int block_begins = 0;
+--- 268,277 ----
+ structure of the function. This can happen as a result of the
+ "if (foo) bar; else break;" optimization in jump.c. */
++ /* ??? Gcc has a general policy that -g is never supposed to change the code
++ that the compiler emits, so we must disable this optimization always,
++ even if debug info is not being output. This is rare, so this should
++ not be a significant performance problem. */
+
+! if (1 /* write_symbols != NO_DEBUG */)
+ {
+ int block_begins = 0;
+*************** unroll_loop (loop_end, insn_count, loop_
+*** 633,636 ****
+--- 637,657 ----
+ }
+
++ if (unroll_type == UNROLL_NAIVE
++ && GET_CODE (last_loop_insn) == JUMP_INSN
++ && start_label != JUMP_LABEL (last_loop_insn))
++ {
++ /* ??? The loop ends with a conditional branch that does not branch back
++ to the loop start label. In this case, we must emit an unconditional
++ branch to the loop exit after emitting the final branch.
++ copy_loop_body does not have support for this currently, so we
++ give up. It doesn't seem worthwhile to unroll anyways since
++ unrolling would increase the number of branch instructions
++ executed. */
++ if (loop_dump_stream)
++ fprintf (loop_dump_stream,
++ "Unrolling failure: final conditional branch not to loop start\n");
++ return;
++ }
++
+ /* Allocate a translation table for the labels and insn numbers.
+ They will be filled in as we copy the insns in the loop. */
+*************** unroll_loop (loop_end, insn_count, loop_
+*** 995,999 ****
+ for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
+ if (local_regno[j])
+! map->reg_map[j] = gen_reg_rtx (GET_MODE (regno_reg_rtx[j]));
+
+ /* The last copy needs the compare/branch insns at the end,
+--- 1016,1024 ----
+ for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
+ if (local_regno[j])
+! {
+! map->reg_map[j] = gen_reg_rtx (GET_MODE (regno_reg_rtx[j]));
+! record_base_value (REGNO (map->reg_map[j]),
+! regno_reg_rtx[j]);
+! }
+
+ /* The last copy needs the compare/branch insns at the end,
+*************** unroll_loop (loop_end, insn_count, loop_
+*** 1136,1140 ****
+ for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
+ if (local_regno[j])
+! map->reg_map[j] = gen_reg_rtx (GET_MODE (regno_reg_rtx[j]));
+
+ /* If loop starts with a branch to the test, then fix it so that
+--- 1161,1169 ----
+ for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
+ if (local_regno[j])
+! {
+! map->reg_map[j] = gen_reg_rtx (GET_MODE (regno_reg_rtx[j]));
+! record_base_value (REGNO (map->reg_map[j]),
+! regno_reg_rtx[j]);
+! }
+
+ /* If loop starts with a branch to the test, then fix it so that
+*************** copy_loop_body (copy_start, copy_end, ma
+*** 1605,1608 ****
+--- 1634,1641 ----
+ int this_giv_inc = INTVAL (giv_inc);
+
++ /* If this DEST_ADDR giv was not split, then ignore it. */
++ if (*tv->location != tv->dest_reg)
++ continue;
++
+ /* Scale this_giv_inc if the multiplicative factors of
+ the two givs are different. */
+*************** copy_loop_body (copy_start, copy_end, ma
+*** 1631,1635 ****
+ incrementing the shared pseudo reg more than
+ once. */
+! if (! tv->same_insn)
+ {
+ /* tv->dest_reg may actually be a (PLUS (REG)
+--- 1664,1668 ----
+ incrementing the shared pseudo reg more than
+ once. */
+! if (! tv->same_insn && ! tv->shared)
+ {
+ /* tv->dest_reg may actually be a (PLUS (REG)
+*************** copy_loop_body (copy_start, copy_end, ma
+*** 1757,1760 ****
+--- 1790,1794 ----
+ giv_dest_reg = tem;
+ map->reg_map[regno] = tem;
++ record_base_value (REGNO (tem), giv_src_reg);
+ }
+ else
+*************** iteration_info (iteration_var, initial_v
+*** 2220,2231 ****
+ return;
+ }
+! /* Reject iteration variables larger than the host long size, since they
+ could result in a number of iterations greater than the range of our
+! `unsigned long' variable loop_n_iterations. */
+! else if (GET_MODE_BITSIZE (GET_MODE (iteration_var)) > HOST_BITS_PER_LONG)
+ {
+ if (loop_dump_stream)
+ fprintf (loop_dump_stream,
+! "Loop unrolling: Iteration var rejected because mode larger than host long.\n");
+ return;
+ }
+--- 2254,2266 ----
+ return;
+ }
+! /* Reject iteration variables larger than the host wide int size, since they
+ could result in a number of iterations greater than the range of our
+! `unsigned HOST_WIDE_INT' variable loop_n_iterations. */
+! else if ((GET_MODE_BITSIZE (GET_MODE (iteration_var))
+! > HOST_BITS_PER_WIDE_INT))
+ {
+ if (loop_dump_stream)
+ fprintf (loop_dump_stream,
+! "Loop unrolling: Iteration var rejected because mode too large.\n");
+ return;
+ }
+*************** find_splittable_regs (unroll_type, loop_
+*** 2443,2447 ****
+ {
+ rtx tem = gen_reg_rtx (bl->biv->mode);
+!
+ emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
+ loop_start);
+--- 2478,2483 ----
+ {
+ rtx tem = gen_reg_rtx (bl->biv->mode);
+!
+! record_base_value (REGNO (tem), bl->biv->add_val);
+ emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
+ loop_start);
+*************** find_splittable_regs (unroll_type, loop_
+*** 2500,2503 ****
+--- 2536,2541 ----
+ exits. */
+ rtx tem = gen_reg_rtx (bl->biv->mode);
++ record_base_value (REGNO (tem), bl->biv->add_val);
++
+ emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
+ loop_start);
+*************** find_splittable_givs (bl, unroll_type, l
+*** 2675,2678 ****
+--- 2713,2717 ----
+ rtx tem = gen_reg_rtx (bl->biv->mode);
+
++ record_base_value (REGNO (tem), bl->biv->add_val);
+ emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
+ loop_start);
+*************** find_splittable_givs (bl, unroll_type, l
+*** 2716,2719 ****
+--- 2755,2759 ----
+ {
+ rtx tem = gen_reg_rtx (v->mode);
++ record_base_value (REGNO (tem), v->add_val);
+ emit_iv_add_mult (bl->initial_value, v->mult_val,
+ v->add_val, tem, loop_start);
+*************** find_splittable_givs (bl, unroll_type, l
+*** 2734,2747 ****
+ register for the split addr giv, just to be safe. */
+
+! /* ??? If there are multiple address givs which have been
+! combined with the same dest_reg giv, then we may only need
+! one new register for them. Pulling out constants below will
+! catch some of the common cases of this. Currently, I leave
+! the work of simplifying multiple address givs to the
+! following cse pass. */
+!
+! /* As a special case, if we have multiple identical address givs
+! within a single instruction, then we do use a single pseudo
+! reg for both. This is necessary in case one is a match_dup
+ of the other. */
+
+--- 2774,2780 ----
+ register for the split addr giv, just to be safe. */
+
+! /* If we have multiple identical address givs within a
+! single instruction, then use a single pseudo reg for
+! both. This is necessary in case one is a match_dup
+ of the other. */
+
+*************** find_splittable_givs (bl, unroll_type, l
+*** 2756,2759 ****
+--- 2789,2812 ----
+ INSN_UID (v->insn));
+ }
++ /* If multiple address GIVs have been combined with the
++ same dest_reg GIV, do not create a new register for
++ each. */
++ else if (unroll_type != UNROLL_COMPLETELY
++ && v->giv_type == DEST_ADDR
++ && v->same && v->same->giv_type == DEST_ADDR
++ && v->same->unrolled
++ #ifdef ADDRESS_COST
++ /* combine_givs_p may return true when ADDRESS_COST is
++ defined even if the multiply and add values are
++ not equal. To share a register here, the values
++ must be equal, as well as related. */
++ && rtx_equal_p (v->mult_val, v->same->mult_val)
++ && rtx_equal_p (v->add_val, v->same->add_val)
++ #endif
++ )
++ {
++ v->dest_reg = v->same->dest_reg;
++ v->shared = 1;
++ }
+ else if (unroll_type != UNROLL_COMPLETELY)
+ {
+*************** find_splittable_givs (bl, unroll_type, l
+*** 2761,2765 ****
+ register to hold the split value of the DEST_ADDR giv.
+ Emit insn to initialize its value before loop start. */
+! tem = gen_reg_rtx (v->mode);
+
+ /* If the address giv has a constant in its new_reg value,
+--- 2814,2821 ----
+ register to hold the split value of the DEST_ADDR giv.
+ Emit insn to initialize its value before loop start. */
+!
+! rtx tem = gen_reg_rtx (v->mode);
+! record_base_value (REGNO (tem), v->add_val);
+! v->unrolled = 1;
+
+ /* If the address giv has a constant in its new_reg value,
+*************** find_splittable_givs (bl, unroll_type, l
+*** 2772,2781 ****
+ v->dest_reg
+ = plus_constant (tem, INTVAL (XEXP (v->new_reg,1)));
+!
+ /* Only succeed if this will give valid addresses.
+ Try to validate both the first and the last
+ address resulting from loop unrolling, if
+ one fails, then can't do const elim here. */
+! if (! verify_addresses (v, giv_inc, unroll_number))
+ {
+ /* Save the negative of the eliminated const, so
+--- 2828,2837 ----
+ v->dest_reg
+ = plus_constant (tem, INTVAL (XEXP (v->new_reg,1)));
+!
+ /* Only succeed if this will give valid addresses.
+ Try to validate both the first and the last
+ address resulting from loop unrolling, if
+ one fails, then can't do const elim here. */
+! if (verify_addresses (v, giv_inc, unroll_number))
+ {
+ /* Save the negative of the eliminated const, so
+*************** final_biv_value (bl, loop_start, loop_en
+*** 3068,3071 ****
+--- 3124,3128 ----
+
+ tem = gen_reg_rtx (bl->biv->mode);
++ record_base_value (REGNO (tem), bl->biv->add_val);
+ /* Make sure loop_end is not the last insn. */
+ if (NEXT_INSN (loop_end) == 0)
+*************** final_giv_value (v, loop_start, loop_end
+*** 3161,3164 ****
+--- 3218,3222 ----
+ /* Put the final biv value in tem. */
+ tem = gen_reg_rtx (bl->biv->mode);
++ record_base_value (REGNO (tem), bl->biv->add_val);
+ emit_iv_add_mult (increment, GEN_INT (loop_n_iterations),
+ bl->initial_value, tem, insert_before);
+diff -rcp2N gcc-2.7.2.3/varasm.c gcc-2.7.2.3.f.1/varasm.c
+*** gcc-2.7.2.3/varasm.c Sun Aug 31 09:39:49 1997
+--- gcc-2.7.2.3.f.1/varasm.c Sun Aug 31 09:21:18 1997
+*************** assemble_variable (decl, top_level, at_e
+*** 1067,1070 ****
+--- 1067,1072 ----
+ if (! dont_output_data)
+ {
++ int size;
++
+ if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
+ goto finish;
+*************** assemble_variable (decl, top_level, at_e
+*** 1072,1078 ****
+ /* This is better than explicit arithmetic, since it avoids overflow. */
+ size_tree = size_binop (CEIL_DIV_EXPR,
+! DECL_SIZE (decl), size_int (BITS_PER_UNIT));
+
+! if (TREE_INT_CST_HIGH (size_tree) != 0)
+ {
+ error_with_decl (decl, "size of variable `%s' is too large");
+--- 1074,1082 ----
+ /* This is better than explicit arithmetic, since it avoids overflow. */
+ size_tree = size_binop (CEIL_DIV_EXPR,
+! DECL_SIZE (decl), size_int (BITS_PER_UNIT));
+
+! size = TREE_INT_CST_LOW (size_tree);
+! if (TREE_INT_CST_HIGH (size_tree) != 0
+! || size != TREE_INT_CST_LOW (size_tree))
+ {
+ error_with_decl (decl, "size of variable `%s' is too large");
+*************** decode_addr_const (exp, value)
+*** 2134,2137 ****
+--- 2138,2142 ----
+ case COMPLEX_CST:
+ case CONSTRUCTOR:
++ case INTEGER_CST:
+ x = TREE_CST_RTL (target);
+ break;
+*************** const_hash (exp)
+*** 2249,2253 ****
+ return const_hash (TREE_OPERAND (exp, 0)) * 9
+ + const_hash (TREE_OPERAND (exp, 1));
+! else if (code == NOP_EXPR || code == CONVERT_EXPR)
+ return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
+
+--- 2254,2258 ----
+ return const_hash (TREE_OPERAND (exp, 0)) * 9
+ + const_hash (TREE_OPERAND (exp, 1));
+! else if (code == NOP_EXPR || code == CONVERT_EXPR || code == NON_LVALUE_EXPR)
+ return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
+
+*************** compare_constant_1 (exp, p)
+*** 2314,2317 ****
+--- 2319,2324 ----
+ if (flag_writable_strings)
+ return 0;
++ if (*p++ != TYPE_MODE (TREE_TYPE (exp)))
++ return 0;
+ strp = TREE_STRING_POINTER (exp);
+ len = TREE_STRING_LENGTH (exp);
+*************** compare_constant_1 (exp, p)
+*** 2403,2407 ****
+ return p;
+ }
+! else if (code == NOP_EXPR || code == CONVERT_EXPR)
+ {
+ p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
+--- 2410,2414 ----
+ return p;
+ }
+! else if (code == NOP_EXPR || code == CONVERT_EXPR || code == NON_LVALUE_EXPR)
+ {
+ p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
+*************** record_constant_1 (exp)
+*** 2469,2472 ****
+--- 2476,2480 ----
+ return;
+
++ obstack_1grow (&permanent_obstack, TYPE_MODE (TREE_TYPE (exp)));
+ strp = TREE_STRING_POINTER (exp);
+ len = TREE_STRING_LENGTH (exp);
+*************** copy_constant (exp)
+*** 2635,2639 ****
+
+ case COMPLEX_CST:
+! return build_complex (copy_constant (TREE_REALPART (exp)),
+ copy_constant (TREE_IMAGPART (exp)));
+
+--- 2643,2648 ----
+
+ case COMPLEX_CST:
+! return build_complex (TREE_TYPE (exp),
+! copy_constant (TREE_REALPART (exp)),
+ copy_constant (TREE_IMAGPART (exp)));
+
+*************** copy_constant (exp)
+*** 2646,2649 ****
+--- 2655,2659 ----
+ case NOP_EXPR:
+ case CONVERT_EXPR:
++ case NON_LVALUE_EXPR:
+ return build1 (TREE_CODE (exp), TREE_TYPE (exp),
+ copy_constant (TREE_OPERAND (exp, 0)));
+*************** output_constant_def (exp)
+*** 2692,2698 ****
+ register rtx def;
+
+- if (TREE_CODE (exp) == INTEGER_CST)
+- abort (); /* No TREE_CST_RTL slot in these. */
+-
+ if (TREE_CST_RTL (exp))
+ return TREE_CST_RTL (exp);
+--- 2702,2705 ----
+*************** bc_assemble_integer (exp, size)
+*** 3622,3626 ****
+ exp = fold (exp);
+
+! while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR)
+ exp = TREE_OPERAND (exp, 0);
+ if (TREE_CODE (exp) == INTEGER_CST)
+--- 3629,3634 ----
+ exp = fold (exp);
+
+! while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
+! || TREE_CODE (exp) == NON_LVALUE_EXPR)
+ exp = TREE_OPERAND (exp, 0);
+ if (TREE_CODE (exp) == INTEGER_CST)
+*************** bc_assemble_integer (exp, size)
+*** 3633,3641 ****
+ const_part = TREE_OPERAND (exp, 0);
+ while (TREE_CODE (const_part) == NOP_EXPR
+! || TREE_CODE (const_part) == CONVERT_EXPR)
+ const_part = TREE_OPERAND (const_part, 0);
+ addr_part = TREE_OPERAND (exp, 1);
+ while (TREE_CODE (addr_part) == NOP_EXPR
+! || TREE_CODE (addr_part) == CONVERT_EXPR)
+ addr_part = TREE_OPERAND (addr_part, 0);
+ if (TREE_CODE (const_part) != INTEGER_CST)
+--- 3641,3651 ----
+ const_part = TREE_OPERAND (exp, 0);
+ while (TREE_CODE (const_part) == NOP_EXPR
+! || TREE_CODE (const_part) == CONVERT_EXPR
+! || TREE_CODE (const_part) == NON_LVALUE_EXPR)
+ const_part = TREE_OPERAND (const_part, 0);
+ addr_part = TREE_OPERAND (exp, 1);
+ while (TREE_CODE (addr_part) == NOP_EXPR
+! || TREE_CODE (addr_part) == CONVERT_EXPR
+! || TREE_CODE (addr_part) == NON_LVALUE_EXPR)
+ addr_part = TREE_OPERAND (addr_part, 0);
+ if (TREE_CODE (const_part) != INTEGER_CST)
+diff -rcp2N gcc-2.7.2.3/version.c gcc-2.7.2.3.f.1/version.c
+*** gcc-2.7.2.3/version.c Sun Aug 31 09:39:50 1997
+--- gcc-2.7.2.3.f.1/version.c Tue Sep 9 04:13:48 1997
+***************
+*** 1 ****
+! char *version_string = "2.7.2.3";
+--- 1 ----
+! char *version_string = "2.7.2.3.f.1";