| | man : g77
File: g77.info, Node: Top, Next: Copying, Up: (DIR)
Introduction
************
This manual documents how to run, install and port `g77', as well as
its new features and incompatibilities, and how to report bugs. It
corresponds to the GCC-3.3.5 version of `g77'.
* Menu:
* Copying:: GNU General Public License says
how you can copy and share GNU Fortran.
* GNU Free Documentation License::
How you can copy and share this manual.
* 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.
* 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.
* 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.
* Front End:: Design and implementation of the `g77' front end.
* M: Diagnostics. Diagnostics produced by `g77'.
* Keyword Index:: Index of concepts and symbol names.
File: g77.info, Node: Copying, Next: GNU Free Documentation License, 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) YEAR 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) YEAR 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.
File: g77.info, Node: GNU Free Documentation License, Next: Contributors, Prev: Copying, Up: Top
GNU Free Documentation License
******************************
Version 1.2, November 2002
Copyright (C) 2000,2001,2002 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.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or
noncommercially. Secondarily, this License preserves for the
author and publisher a way to get credit for their work, while not
being considered responsible for modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.
It complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for
free software, because free software needs free documentation: a
free program should come with manuals providing the same freedoms
that the software does. But this License is not limited to
software manuals; it can be used for any textual work, regardless
of subject matter or whether it is published as a printed book.
We recommend this License principally for works whose purpose is
instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium,
that contains a notice placed by the copyright holder saying it
can be distributed under the terms of this License. Such a notice
grants a world-wide, royalty-free license, unlimited in duration,
to use that work under the conditions stated herein. The
"Document", below, refers to any such manual or work. Any member
of the public is a licensee, and is addressed as "you". You
accept the license if you copy, modify or distribute the work in a
way requiring permission under copyright law.
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could
fall directly within that overall subject. (Thus, if the Document
is in part a textbook of mathematics, a Secondary Section may not
explain any mathematics.) The relationship could be a matter of
historical connection with the subject or with related matters, or
of legal, commercial, philosophical, ethical or political position
regarding them.
The "Invariant Sections" are certain Secondary Sections whose
titles are designated, as being those of Invariant Sections, in
the notice that says that the Document is released under this
License. If a section does not fit the above definition of
Secondary then it is not allowed to be designated as Invariant.
The Document may contain zero Invariant Sections. If the Document
does not identify any Invariant Sections then there are none.
The "Cover Texts" are certain short passages of text that are
listed, as Front-Cover Texts or Back-Cover Texts, in the notice
that says that the Document is released under this License. A
Front-Cover Text may be at most 5 words, and a Back-Cover Text may
be at most 25 words.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images
composed of pixels) generic paint programs or (for drawings) some
widely available drawing editor, and that is suitable for input to
text formatters or for automatic translation to a variety of
formats suitable for input to text formatters. A copy made in an
otherwise Transparent file format whose markup, or absence of
markup, has been arranged to thwart or discourage subsequent
modification by readers is not Transparent. An image format is
not Transparent if used for any substantial amount of text. A
copy that is not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format,
SGML or XML using a publicly available DTD, and
standard-conforming simple HTML, PostScript or PDF designed for
human modification. Examples of transparent image formats include
PNG, XCF and JPG. Opaque formats include proprietary formats that
can be read and edited only by proprietary word processors, SGML or
XML for which the DTD and/or processing tools are not generally
available, and the machine-generated HTML, PostScript or PDF
produced by some word processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the
material this License requires to appear in the title page. For
works in formats which do not have any title page as such, "Title
Page" means the text near the most prominent appearance of the
work's title, preceding the beginning of the body of the text.
A section "Entitled XYZ" means a named subunit of the Document
whose title either is precisely XYZ or contains XYZ in parentheses
following text that translates XYZ in another language. (Here XYZ
stands for a specific section name mentioned below, such as
"Acknowledgements", "Dedications", "Endorsements", or "History".)
To "Preserve the Title" of such a section when you modify the
Document means that it remains a section "Entitled XYZ" according
to this definition.
The Document may include Warranty Disclaimers next to the notice
which states that this License applies to the Document. These
Warranty Disclaimers are considered to be included by reference in
this License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and
has no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License
applies to the Document are reproduced in all copies, and that you
add no other conditions whatsoever to those of this License. You
may not use technical measures to obstruct or control the reading
or further copying of the copies you make or distribute. However,
you may accept compensation in exchange for copies. If you
distribute a large enough number of copies you must also follow
the conditions in section 3.
You may also lend copies, under the same conditions stated above,
and you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly
have printed covers) of the Document, numbering more than 100, and
the Document's license notice requires Cover Texts, you must
enclose the copies in covers that carry, clearly and legibly, all
these Cover Texts: Front-Cover Texts on the front cover, and
Back-Cover Texts on the back cover. Both covers must also clearly
and legibly identify you as the publisher of these copies. The
front cover must present the full title with all words of the
title equally prominent and visible. You may add other material
on the covers in addition. Copying with changes limited to the
covers, as long as they preserve the title of the Document and
satisfy these conditions, can be treated as verbatim copying in
other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto
adjacent pages.
If you publish or distribute Opaque copies of the Document
numbering more than 100, you must either include a
machine-readable Transparent copy along with each Opaque copy, or
state in or with each Opaque copy a computer-network location from
which the general network-using public has access to download
using public-standard network protocols a complete Transparent
copy of the Document, free of added material. If you use the
latter option, you must take reasonably prudent steps, when you
begin distribution of Opaque copies in quantity, to ensure that
this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you
distribute an Opaque copy (directly or through your agents or
retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of
the Document well before redistributing any large number of
copies, to give them a chance to provide you with an updated
version of the Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document
under the conditions of sections 2 and 3 above, provided that you
release the Modified Version under precisely this License, with
the Modified Version filling the role of the Document, thus
licensing distribution and modification of the Modified Version to
whoever possesses a copy of it. In addition, you must do these
things in the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title
distinct from that of the Document, and from those of
previous versions (which should, if there were any, be listed
in the History section of the Document). You may use the
same title as a previous version if the original publisher of
that version gives permission.
B. List on the Title Page, as authors, one or more persons or
entities responsible for authorship of the modifications in
the Modified Version, together with at least five of the
principal authors of the Document (all of its principal
authors, if it has fewer than five), unless they release you
from this requirement.
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license
notice giving the public permission to use the Modified
Version under the terms of this License, in the form shown in
the Addendum below.
G. Preserve in that license notice the full lists of Invariant
Sections and required Cover Texts given in the Document's
license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title,
and add to it an item stating at least the title, year, new
authors, and publisher of the Modified Version as given on
the Title Page. If there is no section Entitled "History" in
the Document, create one stating the title, year, authors,
and publisher of the Document as given on its Title Page,
then add an item describing the Modified Version as stated in
the previous sentence.
J. Preserve the network location, if any, given in the Document
for public access to a Transparent copy of the Document, and
likewise the network locations given in the Document for
previous versions it was based on. These may be placed in
the "History" section. You may omit a network location for a
work that was published at least four years before the
Document itself, or if the original publisher of the version
it refers to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
Preserve the Title of the section, and preserve in the
section all the substance and tone of each of the contributor
acknowledgements and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section
titles.
M. Delete any section Entitled "Endorsements". Such a section
may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled
"Endorsements" or to conflict in title with any Invariant
Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no
material copied from the Document, you may at your option
designate some or all of these sections as invariant. To do this,
add their titles to the list of Invariant Sections in the Modified
Version's license notice. These titles must be distinct from any
other section titles.
You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text
has been approved by an organization as the authoritative
definition of a standard.
You may add a passage of up to five words as a Front-Cover Text,
and a passage of up to 25 words as a Back-Cover Text, to the end
of the list of Cover Texts in the Modified Version. Only one
passage of Front-Cover Text and one of Back-Cover Text may be
added by (or through arrangements made by) any one entity. If the
Document already includes a cover text for the same cover,
previously added by you or by arrangement made by the same entity
you are acting on behalf of, you may not add another; but you may
replace the old one, on explicit permission from the previous
publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this
License give permission to use their names for publicity for or to
assert or imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under
this License, under the terms defined in section 4 above for
modified versions, provided that you include in the combination
all of the Invariant Sections of all of the original documents,
unmodified, and list them all as Invariant Sections of your
combined work in its license notice, and that you preserve all
their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name
but different contents, make the title of each such section unique
by adding at the end of it, in parentheses, the name of the
original author or publisher of that section if known, or else a
unique number. Make the same adjustment to the section titles in
the list of Invariant Sections in the license notice of the
combined work.
In the combination, you must combine any sections Entitled
"History" in the various original documents, forming one section
Entitled "History"; likewise combine any sections Entitled
"Acknowledgements", and any sections Entitled "Dedications". You
must delete all sections Entitled "Endorsements."
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other
documents released under this License, and replace the individual
copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the
rules of this License for verbatim copying of each of the
documents in all other respects.
You may extract a single document from such a collection, and
distribute it individually under this License, provided you insert
a copy of this License into the extracted document, and follow
this License in all other respects regarding verbatim copying of
that document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other
separate and independent documents or works, in or on a volume of
a storage or distribution medium, is called an "aggregate" if the
copyright resulting from the compilation is not used to limit the
legal rights of the compilation's users beyond what the individual
works permit. When the Document is included an aggregate, this
License does not apply to the other works in the aggregate which
are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half
of the entire aggregate, the Document's Cover Texts may be placed
on covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic
form. Otherwise they must appear on printed covers that bracket
the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section
4. Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warrany Disclaimers, provided that you also
include the original English version of this License and the
original versions of those notices and disclaimers. In case of a
disagreement between the translation and the original version of
this License or a notice or disclaimer, the original version will
prevail.
If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to
Preserve its Title (section 1) will typically require changing the
actual title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided for under this License. Any other
attempt to copy, modify, sublicense or distribute the Document 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.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of
the GNU Free Documentation 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. See
`http://www.gnu.org/copyleft/'.
Each version of the License is given a distinguishing version
number. If the Document specifies that a particular numbered
version of this License "or any later version" applies to it, you
have the option of following the terms and conditions either of
that specified version or of any later version that has been
published (not as a draft) by the Free Software Foundation. If
the Document does not specify a version number of this License,
you may choose any version ever published (not as a draft) by the
Free Software Foundation.
ADDENDUM: How to use this License for your documents
====================================================
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:
Copyright (C) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts." line with this:
with the Invariant Sections being LIST THEIR TITLES, with
the Front-Cover Texts being LIST, and with the Back-Cover Texts
being LIST.
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License, to
permit their use in free software.
File: g77.info, Node: Contributors, Next: Funding, Prev: GNU Free Documentation License, 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 GCC:
(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)--<takafumiATu-aizu.jp>
Kate Hedstrom
Michel Kern (INRIA and Rice
University)--<Michel.KernATinria.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
* Dave Love (<d.loveATdl.uk>) wrote the libU77 part of the
run-time library.
* Scott Snyder (<snyderATd0sgif.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.
* David Ronis (<ronisATonsager.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 (<toonATmoene.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.
(These, in turn, had made their way into the `egcs' version of the
compiler, and do not exist in `gcc' version 2.8 or versions of
`g77' based on that version of `gcc'.)
* John Carr (<jfcATmit.edu>) wrote the alias analysis improvements.
* Thanks to Mary Cortani and the staff at Craftwork Solutions
(<supportATcraftwork.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.
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 Compiler Collection
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.
File: g77.info, Node: Funding GNU Fortran, Next: Getting Started, Prev: Funding, Up: Top
1 Funding GNU Fortran
*********************
James Craig Burley (<craigATjcb-sc.com>), the original author of `g77',
stopped working on it in September 1999 (He has a web page at
`http://world.std.com/%7Eburley/'.)
GNU Fortran is currently maintained by Toon Moene
(<toonATmoene.nl>), with the help of countless other
volunteers.
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 <gnuATgnu.org> for information on funding
the FSF.
Another important way to support work on GNU Fortran is to volunteer
to help out.
Email <gccATgcc.org> to volunteer for this work.
However, we strongly expect that there will never be a version 0.6
of `g77'. Work on this compiler has stopped as of the release of GCC
3.1, except for bug fixing. `g77' will be succeeded by `g95' - see
`http://g95.sourceforge.net'.
*Note Funding Free Software: Funding, for more information.
File: g77.info, Node: Getting Started, Next: What is GNU Fortran?, Prev: Funding GNU Fortran, Up: Top
2 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 About GNU Fortran: 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 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::.
File: g77.info, Node: What is GNU Fortran?, Next: G77 and GCC, Prev: Getting Started, Up: Top
3 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 `libg2c' 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.
`libg2c' is just the unique name `g77' gives to its version of
`libf2c' to distinguish it from any copy of `libf2c' installed
from `f2c' (or versions of `g77' that built `libf2c' under that
same name) on the system.
The maintainer of `libf2c' currently is <dmgATbell-labs.com>.
* 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 (`libg2c' 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 `libg2c', so
`libg2c' 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 `libg2c' component comes from the `libf2c' component
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).
File: g77.info, Node: G77 and GCC, Next: Invoking G77, Prev: What is GNU Fortran?, Up: Top
4 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++; Objective-C; Ada; Fortran; or Java: (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.
File: g77.info, Node: Invoking G77, Next: News, Prev: G77 and GCC, Up: Top
5 GNU Fortran Command Options
*****************************
The `g77' command supports all the options supported by the `gcc'
command. *Note GCC Command Options: (gcc)Invoking GCC, for information
on the non-Fortran-specific aspects of the `gcc' command (and,
therefore, the `g77' command).
All `gcc' and `g77' options are accepted both by `g77' and by `gcc'
(as well as any other drivers built at the same time, such as `g++'),
since adding `g77' to the `gcc' distribution enables acceptance of
`g77' options by all of the relevant drivers.
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.
File: g77.info, Node: Option Summary, Next: Overall Options, Up: Invoking G77
5.1 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.
-fversion -fset-g77-defaults -fno-silent
_Shorthand Options_
*Note Shorthand Options::.
-ff66 -fno-f66 -ff77 -fno-f77 -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
-fbadu77-intrinsics-delete -fbadu77-intrinsics-hide
-fbadu77-intrinsics-disable -fbadu77-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
-funsafe-math-optimizations -ffinite-math-only -fno-trapping-math
-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
-femulate-complex
-falias-check -fargument-alias
-fargument-noalias -fno-argument-noalias-global
-fno-globals -fflatten-arrays
-fbounds-check -ffortran-bounds-check
* 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.
File: g77.info, Node: Overall Options, Next: Shorthand Options, Prev: Option Summary, Up: Invoking G77
5.2 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 Options Controlling
the Kind of Output: (gcc)Overall Options, for information on suffixes
recognized by GNU CC.
`FILE.f'
`FILE.for'
`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.
You can force `.f' files to be preprocessed by `cpp' by using `-x
f77-cpp-input'. *Note LEX::.
`FILE.F'
`FILE.fpp'
`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). A public domain version in C is at
`http://sepwww.stanford.edu/sep/prof/ratfor.shar.2'.
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 help 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.
Unfortunately, the `-traditional' flag will not avoid an error from
anything that `cpp' sees as an unterminated C comment, such as:
C Some Fortran compilers accept /* as starting
C an inline comment.
*Note Trailing Comment::.
The following options that affect overall processing are recognized
by the `g77' and `gcc' commands in a GNU Fortran installation:
`-fversion'
Ensure that the `g77' version of the compiler phase is reported,
if run, and, starting in `egcs' version 1.1, that internal
consistency checks in the `f771' program are run.
This option 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.
In GCC 3.1, this is changed back to the behavior `gcc' displays
for `.c' files.
`-fset-g77-defaults'
_Version info:_ This option was obsolete as of `egcs' version 1.1.
The effect is instead achieved by the `lang_init_options' routine
in `gcc/gcc/f/com.c'.
Set up whatever `gcc' options are to apply to Fortran
compilations, and avoid running internal consistency checks that
might take some time.
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).
File: g77.info, Node: Shorthand Options, Next: Fortran Dialect Options, Prev: Overall Options, Up: Invoking G77
5.3 Shorthand Options
=====================
The following options serve as "shorthand" for other options accepted
by the compiler:
`-fugly'
_Note:_ This option is no longer supported. The information,
below, is provided to aid in the conversion of old scripts.
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.
`-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.
File: g77.info, Node: Fortran Dialect Options, Next: Warning Options, Prev: Shorthand Options, Up: Invoking G77
5.4 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'
In an external-procedure invocation, treat a trailing comma in the
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. So, by default, `CALL
FOO(X,)' is treated exactly the same as `CALL FOO(X)'.
*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'
Executable iterative `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 iterative `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 (iterative)
`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'.)
`-fbadu77-intrinsics-delete'
`-fbadu77-intrinsics-hide'
`-fbadu77-intrinsics-disable'
`-fbadu77-intrinsics-enable'
Specify status of UNIX intrinsics having inappropriate forms.
`-fbadu77-intrinsics-enable' is the default. *Note Intrinsic
Groups::.
`-ff2c-intrinsics-delete'
`-ff2c-intrinsics-hide'
`-ff2c-intrinsics-disable'
`-ff2c-intrinsics-enable'
Specify status of f2c-specific intrinsics.
`-ff2c-intrinsics-enable' is the default. *Note Intrinsic
Groups::.
`-ff90-intrinsics-delete'
`-ff90-intrinsics-hide'
`-ff90-intrinsics-disable'
`-ff90-intrinsics-enable'
Specify status of F90-specific intrinsics.
`-ff90-intrinsics-enable' is the default. *Note Intrinsic
Groups::.
`-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. *Note Intrinsic
Groups::.
`-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. *Note Intrinsic
Groups::.
`-funix-intrinsics-delete'
`-funix-intrinsics-hide'
`-funix-intrinsics-disable'
`-funix-intrinsics-enable'
Specify status of UNIX intrinsics. `-funix-intrinsics-enable' is
the default. *Note Intrinsic Groups::.
`-fvxt-intrinsics-delete'
`-fvxt-intrinsics-hide'
`-fvxt-intrinsics-disable'
`-fvxt-intrinsics-enable'
Specify status of VXT intrinsics. `-fvxt-intrinsics-enable' is
the default. *Note Intrinsic Groups::.
`-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.
File: g77.info, Node: Warning Options, Next: Debugging Options, Prev: Fortran Dialect Options, Up: Invoking G77
5.5 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'
`-Wswitch-default'
`-Wswitch-enum'
`-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.
File: g77.info, Node: Debugging Options, Next: Optimize Options, Prev: Warning Options, Up: Invoking G77
5.6 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.
A sample debugging session looks like this (note the use of the
breakpoint):
$ cat gdb.f
PROGRAM PROG
DIMENSION A(10)
DATA A /1.,2.,3.,4.,5.,6.,7.,8.,9.,10./
A(5) = 4.
PRINT*,A
END
$ g77 -g -O gdb.f
$ gdb a.out
...
(gdb) break MAIN__
Breakpoint 1 at 0x8048e96: file gdb.f, line 4.
(gdb) run
Starting program: /home/toon/g77-bugs/./a.out
Breakpoint 1, MAIN__ () at gdb.f:4
4 A(5) = 4.
Current language: auto; currently fortran
(gdb) print a(5)
$1 = 5
(gdb) step
5 PRINT*,A
(gdb) print a(5)
$2 = 4
...
One could also add the setting of the breakpoint and the first run
command to the file `.gdbinit' in the current directory, to
simplify the debugging session.
*Note Options for Debugging Your Program or GCC: (gcc)Debugging
Options, for more information on debugging options.
File: g77.info, Node: Optimize Options, Next: Preprocessor Options, Prev: Debugging Options, Up: Invoking G77
5.7 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. However, note that certain
diagnostics--such as for uninitialized variables--depend on the flow
analysis done by `-O', i.e. you must use `-O' or `-O2' to get such
diagnostics.
The following flags have particular applicability when compiling
Fortran programs:
`-malign-double'
(Intel x86 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'
*Note Aligned Data::, for more information on alignment issues.
_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.
This option is effective when the floating-point unit is set to
work in IEEE 854 `extended precision'--as it typically is on x86
and m68k GNU systems--rather than IEEE 754 double precision.
`-ffloat-store' tries to remove the extra precision by spilling
data from floating-point registers into memory and this typically
involves a big performance hit. However, it doesn't affect
intermediate results, so that it is only partially effective.
`Excess precision' is avoided in code like:
a = b + c
d = a * e
but not in code like:
d = (b + c) * e
For another, potentially better, way of controlling the precision,
see *Note Floating-point precision::.
`-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. Sets
`-funsafe-math-optimizations', `-ffinite-math-only', and
`-fno-trapping-math'.
`-funsafe-math-optimizations'
Allow optimizations that may be give incorrect results for certain
IEEE inputs.
`-ffinite-math-only'
Allow optimizations for floating-point arithmetic that assume that
arguments and results are not NaNs or +-Infs.
This option should never be turned on by any `-O' option since it
can result in incorrect output for programs which depend on an
exact implementation of IEEE or ISO rules/specifications.
The default is `-fno-finite-math-only'.
`-fno-trapping-math'
Allow the compiler to assume that floating-point arithmetic will
not generate traps on any inputs. This is useful, for example,
when running a program using IEEE "non-stop" floating-point
arithmetic.
`-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'
Typically improves performance on code using iterative `DO' loops
by unrolling them and is probably generally appropriate for
Fortran, though it is not turned on at any optimization level.
Note that outer loop unrolling isn't done specifically; decisions
about whether to unroll a loop are made on the basis of its
instruction count.
Also, no `loop discovery'(1) is done, so only loops written with
`DO' benefit from loop optimizations, including--but not limited
to--unrolling. Loops written with `IF' and `GOTO' are not
currently recognized as such. This option unrolls only iterative
`DO' loops, not `DO WHILE' loops.
`-funroll-all-loops'
Probably improves performance on code using `DO WHILE' loops by
unrolling them in addition to iterative `DO' loops. In the absence
of `DO WHILE', this option is equivalent to `-funroll-loops' but
possibly slower.
`-fno-move-all-movables'
`-fno-reduce-all-givs'
`-fno-rerun-loop-opt'
In general, the optimizations enabled with these options will lead
to faster code being generated by GNU Fortran; hence they are
enabled by default when issuing the `g77' command.
`-fmove-all-movables' and `-freduce-all-givs' will enable loop
optimization to move all loop-invariant index computations in
nested loops over multi-rank array dummy arguments out of these
loops.
`-frerun-loop-opt' will move offset calculations resulting from
the fact that Fortran arrays by default have a lower bound of 1
out of the loops.
These three options are intended to be removed someday, once loop
optimization is sufficiently advanced to perform all those
transformations without help from these options.
*Note Options That Control Optimization: (gcc)Optimize Options, for
more information on options to optimize the generated machine code.
---------- Footnotes ----------
(1) "loop discovery" refers to the process by which a compiler, or
indeed any reader of a program, determines which portions of the
program are more likely to be executed repeatedly as it is being run.
Such discovery typically is done early when compiling using
optimization techniques, so the "discovered" loops get more
attention--and more run-time resources, such as registers--from the
compiler. It is easy to "discover" loops that are constructed out of
looping constructs in the language (such as Fortran's `DO'). For some
programs, "discovering" loops constructed out of lower-level constructs
(such as `IF' and `GOTO') can lead to generation of more optimal code
than otherwise.
File: g77.info, Node: Preprocessor Options, Next: Directory Options, Prev: Optimize Options, Up: Invoking G77
5.8 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.
File: g77.info, Node: Directory Options, Next: Code Gen Options, Prev: Preprocessor Options, Up: Invoking G77
5.9 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 preprocessor 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.
File: g77.info, Node: Code Gen Options, Next: Environment Variables, Prev: Directory Options, Up: Invoking G77
5.10 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 `libg2c' library.
However, because the `libg2c' 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' 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 `libg2c' (or the original `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' 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.
`-femulate-complex'
Implement `COMPLEX' arithmetic via emulation, instead of using the
facilities of the `gcc' back end that provide direct support of
`complex' arithmetic.
(`gcc' had some bugs in its back-end support for `complex'
arithmetic, due primarily to the support not being completed as of
version 2.8.1 and `egcs' 1.1.2.)
Use `-femulate-complex' if you suspect code-generation bugs, or
experience compiler crashes, that might result from `g77' using
the `COMPLEX' support in the `gcc' back end. If using that option
fixes the bugs or crashes you are seeing, that indicates a likely
`g77' bugs (though, all compiler crashes are considered bugs), so,
please report it. (Note that the known bugs, now believed fixed,
produced compiler crashes rather than causing 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'
As of GCC version 3.0, this option is not necessary anymore.
_Caution:_ Future versions of `g77' might ignore both forms of
this option.
`-falias-check'
`-fargument-alias'
`-fargument-noalias'
`-fno-argument-noalias-global'
_Version info:_ These options are not supported by versions of
`g77' based on `gcc' version 2.8.
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 which `g77' diagnoses.
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 as (fatal) errors, and
warns about similar disagreements that are currently believed to
not likely to result in the compiler later crashing or producing
incorrect code.
`-fflatten-arrays'
Use back end's C-like constructs (pointer plus offset) instead of
its `ARRAY_REF' construct to handle all array references.
_Note:_ This option is not supported. It is intended for use only
by `g77' developers, to evaluate code-generation issues. It might
be removed at any time.
`-fbounds-check'
`-ffortran-bounds-check'
Enable generation of run-time checks for array subscripts and
substring start and end points against the (locally) declared
minimum and maximum values.
The current implementation uses the `libf2c' library routine
`s_rnge' to print the diagnostic.
However, whereas `f2c' generates a single check per reference for
a multi-dimensional array, of the computed offset against the
valid offset range (0 through the size of the array), `g77'
generates a single check per _subscript_ expression. This catches
some cases of potential bugs that `f2c' does not, such as
references to below the beginning of an assumed-size array.
`g77' also generates checks for `CHARACTER' substring references,
something `f2c' currently does not do.
Use the new `-ffortran-bounds-check' option to specify
bounds-checking for only the Fortran code you are compiling, not
necessarily for code written in other languages.
_Note:_ To provide more detailed information on the offending
subscript, `g77' provides the `libg2c' run-time library routine
`s_rnge' with somewhat differently-formatted information. Here's
a sample diagnostic:
Subscript out of range on file line 4, procedure rnge.f/bf.
Attempt to access the -6-th element of variable b[subscript-2-of-2].
Aborted
The above message indicates that the offending source line is line
4 of the file `rnge.f', within the program unit (or statement
function) named `bf'. The offended array is named `b'. The
offended array dimension is the second for a two-dimensional array,
and the offending, computed subscript expression was `-6'.
For a `CHARACTER' substring reference, the second line has this
appearance:
Attempt to access the 11-th element of variable a[start-substring].
This indicates that the offended `CHARACTER' variable or array is
named `a', the offended substring position is the starting
(leftmost) position, and the offending substring expression is
`11'.
(Though the verbage of `s_rnge' is not ideal for the purpose of
the `g77' compiler, the above information should provide adequate
diagnostic abilities to it users.)
*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 `libg2c' 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 `libg2c' library, at the
very least, even if it is built with the same option.
File: g77.info, Node: Environment Variables, Prev: Code Gen Options, Up: Invoking G77
5.11 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 GCC: (gcc)Environment
Variables, for information on environment variables.
File: g77.info, Node: News, Next: Changes, Prev: Invoking G77, Up: Top
6 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 in order:
1. Code-generation and run-time-library bug-fixes
2. Compiler and run-time-library crashes involving valid code that
|