| This is Info file g77.info, produced by Makeinfo version 1.68 from the |
| input file g77.texi. |
| |
| This file explains how to use the GNU Fortran system. |
| |
| Published by the Free Software Foundation 59 Temple Place - Suite 330 |
| Boston, MA 02111-1307 USA |
| |
| Copyright (C) 1995-1997 Free Software Foundation, Inc. |
| |
| Permission is granted to make and distribute verbatim copies of this |
| manual provided the copyright notice and this permission notice are |
| preserved on all copies. |
| |
| Permission is granted to copy and distribute modified versions of |
| this manual under the conditions for verbatim copying, provided also |
| that the sections entitled "GNU General Public License," "Funding for |
| Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are |
| included exactly as in the original, and provided that the entire |
| resulting derived work is distributed under the terms of a permission |
| notice identical to this one. |
| |
| Permission is granted to copy and distribute translations of this |
| manual into another language, under the above conditions for modified |
| versions, except that the sections entitled "GNU General Public |
| License," "Funding for Free Software," and "Protect Your Freedom--Fight |
| `Look And Feel'", and this permission notice, may be included in |
| translations approved by the Free Software Foundation instead of in the |
| original English. |
| |
| Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a |
| first pass at translating `g77-0.5.16/f/DOC' that was contributed to |
| Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>). |
| |
| INFO-DIR-SECTION Fortran Programming |
| START-INFO-DIR-ENTRY |
| * g77: (g77). The GNU Fortran compilation system. |
| END-INFO-DIR-ENTRY |
| |
| |
| File: g77.info, Node: Bug Criteria, Next: Bug Lists, Up: Bugs |
| |
| Have You Found a Bug? |
| ===================== |
| |
| If you are not sure whether you have found a bug, here are some |
| guidelines: |
| |
| * If the compiler gets a fatal signal, for any input whatever, that |
| is a compiler bug. Reliable compilers never crash--they just |
| remain obsolete. |
| |
| * If the compiler produces invalid assembly code, for any input |
| whatever, that is a compiler bug, unless the compiler reports |
| errors (not just warnings) which would ordinarily prevent the |
| assembler from being run. |
| |
| * If the compiler produces valid assembly code that does not |
| correctly execute the input source code, that is a compiler bug. |
| |
| However, you must double-check to make sure, because you might |
| have run into an incompatibility between GNU Fortran and |
| traditional Fortran. These incompatibilities might be considered |
| bugs, but they are inescapable consequences of valuable features. |
| |
| Or you might have a program whose behavior is undefined, which |
| happened by chance to give the desired results with another |
| Fortran compiler. It is best to check the relevant Fortran |
| standard thoroughly if it is possible that the program indeed does |
| something undefined. |
| |
| After you have localized the error to a single source line, it |
| should be easy to check for these things. If your program is |
| correct and well defined, you have found a compiler bug. |
| |
| It might help if, in your submission, you identified the specific |
| language in the relevant Fortran standard that specifies the |
| desired behavior, if it isn't likely to be obvious and agreed-upon |
| by all Fortran users. |
| |
| * If the compiler produces an error message for valid input, that is |
| a compiler bug. |
| |
| * If the compiler does not produce an error message for invalid |
| input, that is a compiler bug. However, you should note that your |
| idea of "invalid input" might be someone else's idea of "an |
| extension" or "support for traditional practice". |
| |
| * If you are an experienced user of Fortran compilers, your |
| suggestions for improvement of GNU Fortran are welcome in any case. |
| |
| Many, perhaps most, bug reports against `g77' turn out to be bugs in |
| the user's code. While we find such bug reports educational, they |
| sometimes take a considerable amount of time to track down or at least |
| respond to--time we could be spending making `g77', not some user's |
| code, better. |
| |
| Some steps you can take to verify that the bug is not certainly in |
| the code you're compiling with `g77': |
| |
| * Compile your code using the `g77' options `-W -Wall -O'. These |
| options enable many useful warning; the `-O' option enables flow |
| analysis that enables the uninitialized-variable warning. |
| |
| If you investigate the warnings and find evidence of possible bugs |
| in your code, fix them first and retry `g77'. |
| |
| * Compile your code using the `g77' options `-finit-local-zero', |
| `-fno-automatic', `-ffloat-store', and various combinations |
| thereof. |
| |
| If your code works with any of these combinations, that is not |
| proof that the bug isn't in `g77'--a `g77' bug exposed by your |
| code might simply be avoided, or have a different, more subtle |
| effect, when different options are used--but it can be a strong |
| indicator that your code is making unawarranted assumptions about |
| the Fortran dialect and/or underlying machine it is being compiled |
| and run on. |
| |
| *Note Overly Convenient Command-Line Options: Overly Convenient |
| Options, for information on the `-fno-automatic' and |
| `-finit-local-zero' options and how to convert their use into |
| selective changes in your own code. |
| |
| * Validate your code with `ftnchek' or a similar code-checking tool. |
| `ftncheck' can be found at `ftp://ftp.netlib.org/fortran' or |
| `ftp://ftp.dsm.fordham.edu'. |
| |
| Here are some sample `Makefile' rules using `ftnchek' "project" |
| files to do cross-file checking and `sfmakedepend' (from |
| `ftp://ahab.rutgers.edu/pub/perl/sfmakedepend') to maintain |
| dependencies automatically. These assume the use of GNU `make'. |
| |
| # Dummy suffix for ftnchek targets: |
| .SUFFIXES: .chek |
| .PHONY: chekall |
| |
| # How to compile .f files (for implicit rule): |
| FC = g77 |
| # Assume `include' directory: |
| FFLAGS = -Iinclude -g -O -Wall |
| |
| # Flags for ftnchek: |
| CHEK1 = -array=0 -include=includes -noarray |
| CHEK2 = -nonovice -usage=1 -notruncation |
| CHEKFLAGS = $(CHEK1) $(CHEK2) |
| |
| # Run ftnchek with all the .prj files except the one corresponding |
| # to the target's root: |
| %.chek : %.f ; \ |
| ftnchek $(filter-out $*.prj,$(PRJS)) $(CHEKFLAGS) \ |
| -noextern -library $< |
| |
| # Derive a project file from a source file: |
| %.prj : %.f ; \ |
| ftnchek $(CHEKFLAGS) -noextern -project -library $< |
| |
| # The list of objects is assumed to be in variable OBJS. |
| # Sources corresponding to the objects: |
| SRCS = $(OBJS:%.o=%.f) |
| # ftnchek project files: |
| PRJS = $(OBJS:%.o=%.prj) |
| |
| # Build the program |
| prog: $(OBJS) ; \ |
| $(FC) -o $ $(OBJS) |
| |
| chekall: $(PRJS) ; \ |
| ftnchek $(CHEKFLAGS) $(PRJS) |
| |
| prjs: $(PRJS) |
| |
| # For Emacs M-x find-tag: |
| TAGS: $(SRCS) ; \ |
| etags $(SRCS) |
| |
| # Rebuild dependencies: |
| depend: ; \ |
| sfmakedepend -I $(PLTLIBDIR) -I includes -a prj $(SRCS1) |
| |
| * Try your code out using other Fortran compilers, such as `f2c'. |
| If it does not work on at least one other compiler (assuming the |
| compiler supports the features the code needs), that is a strong |
| indicator of a bug in the code. |
| |
| However, even if your code works on many compilers *except* `g77', |
| that does *not* mean the bug is in `g77'. It might mean the bug |
| is in your code, and that `g77' simply exposes it more readily |
| than other compilers. |
| |
| |
| File: g77.info, Node: Bug Lists, Next: Bug Reporting, Prev: Bug Criteria, Up: Bugs |
| |
| Where to Report Bugs |
| ==================== |
| |
| Send bug reports for GNU Fortran to <fortran@gnu.org>. |
| |
| Often people think of posting bug reports to a newsgroup instead of |
| mailing them. This sometimes appears to work, but it has one problem |
| which can be crucial: a newsgroup posting does not contain a mail path |
| back to the sender. Thus, if maintainers need more information, they |
| might be unable to reach you. For this reason, you should always send |
| bug reports by mail to the proper mailing list. |
| |
| As a last resort, send bug reports on paper to: |
| |
| GNU Compiler Bugs |
| Free Software Foundation |
| 59 Temple Place - Suite 330 |
| Boston, MA 02111-1307, USA |
| |
| |
| File: g77.info, Node: Bug Reporting, Next: Sending Patches, Prev: Bug Lists, Up: Bugs |
| |
| How to Report Bugs |
| ================== |
| |
| The fundamental principle of reporting bugs usefully is this: |
| *report all the facts*. If you are not sure whether to state a fact or |
| leave it out, state it! |
| |
| Often people omit facts because they think they know what causes the |
| problem and they conclude that some details don't matter. Thus, you |
| might assume that the name of the variable you use in an example does |
| not matter. Well, probably it doesn't, but one cannot be sure. |
| Perhaps the bug is a stray memory reference which happens to fetch from |
| the location where that name is stored in memory; perhaps, if the name |
| were different, the contents of that location would fool the compiler |
| into doing the right thing despite the bug. Play it safe and give a |
| specific, complete example. That is the easiest thing for you to do, |
| and the most helpful. |
| |
| Keep in mind that the purpose of a bug report is to enable someone to |
| fix the bug if it is not known. It isn't very important what happens if |
| the bug is already known. Therefore, always write your bug reports on |
| the assumption that the bug is not known. |
| |
| Sometimes people give a few sketchy facts and ask, "Does this ring a |
| bell?" This cannot help us fix a bug, so it is rarely helpful. We |
| respond by asking for enough details to enable us to investigate. You |
| might as well expedite matters by sending them to begin with. |
| (Besides, there are enough bells ringing around here as it is.) |
| |
| Try to make your bug report self-contained. If we have to ask you |
| for more information, it is best if you include all the previous |
| information in your response, as well as the information that was |
| missing. |
| |
| Please report each bug in a separate message. This makes it easier |
| for us to track which bugs have been fixed and to forward your bugs |
| reports to the appropriate maintainer. |
| |
| Do not compress and encode any part of your bug report using programs |
| such as `uuencode'. If you do so it will slow down the processing of |
| your bug. If you must submit multiple large files, use `shar', which |
| allows us to read your message without having to run any decompression |
| programs. |
| |
| (As a special exception for GNU Fortran bug-reporting, at least for |
| now, if you are sending more than a few lines of code, if your |
| program's source file format contains "interesting" things like |
| trailing spaces or strange characters, or if you need to include binary |
| data files, it is acceptable to put all the files together in a `tar' |
| archive, and, whether you need to do that, it is acceptable to then |
| compress the single file (`tar' archive or source file) using `gzip' |
| and encode it via `uuencode'. Do not use any MIME stuff--the current |
| maintainer can't decode this. Using `compress' instead of `gzip' is |
| acceptable, assuming you have licensed the use of the patented |
| algorithm in `compress' from Unisys.) |
| |
| To enable someone to investigate the bug, you should include all |
| these things: |
| |
| * The version of GNU Fortran. You can get this by running `g77' |
| with the `-v' option. (Ignore any error messages that might be |
| displayed when the linker is run.) |
| |
| Without this, we won't know whether there is any point in looking |
| for the bug in the current version of GNU Fortran. |
| |
| * A complete input file that will reproduce the bug. If the bug is |
| in the compiler proper (`f771') and you are using the C |
| preprocessor, run your source file through the C preprocessor by |
| doing `g77 -E SOURCEFILE > OUTFILE', then include the contents of |
| OUTFILE in the bug report. (When you do this, use the same `-I', |
| `-D' or `-U' options that you used in actual compilation.) |
| |
| A single statement is not enough of an example. In order to |
| compile it, it must be embedded in a complete file of compiler |
| input; and the bug might depend on the details of how this is done. |
| |
| Without a real example one can compile, all anyone can do about |
| your bug report is wish you luck. It would be futile to try to |
| guess how to provoke the bug. For example, bugs in register |
| allocation and reloading frequently depend on every little detail |
| of the function they happen in. |
| |
| * Note that you should include with your bug report any files |
| included by the source file (via the `#include' or `INCLUDE' |
| directive) that you send, and any files they include, and so on. |
| |
| It is not necessary to replace the `#include' and `INCLUDE' |
| directives with the actual files in the version of the source file |
| that you send, but it might make submitting the bug report easier |
| in the end. However, be sure to *reproduce* the bug using the |
| *exact* version of the source material you submit, to avoid |
| wild-goose chases. |
| |
| * The command arguments you gave GNU Fortran to compile that example |
| and observe the bug. For example, did you use `-O'? To guarantee |
| you won't omit something important, list all the options. |
| |
| If we were to try to guess the arguments, we would probably guess |
| wrong and then we would not encounter the bug. |
| |
| * The type of machine you are using, and the operating system name |
| and version number. (Much of this information is printed by `g77 |
| -v'--if you include that, send along any additional info you have |
| that you don't see clearly represented in that output.) |
| |
| * The operands you gave to the `configure' command when you installed |
| the compiler. |
| |
| * A complete list of any modifications you have made to the compiler |
| source. (We don't promise to investigate the bug unless it |
| happens in an unmodified compiler. But if you've made |
| modifications and don't tell us, then you are sending us on a |
| wild-goose chase.) |
| |
| Be precise about these changes. A description in English is not |
| enough--send a context diff for them. |
| |
| Adding files of your own (such as a machine description for a |
| machine we don't support) is a modification of the compiler source. |
| |
| * Details of any other deviations from the standard procedure for |
| installing GNU Fortran. |
| |
| * A description of what behavior you observe that you believe is |
| incorrect. For example, "The compiler gets a fatal signal," or, |
| "The assembler instruction at line 208 in the output is incorrect." |
| |
| Of course, if the bug is that the compiler gets a fatal signal, |
| then one can't miss it. But if the bug is incorrect output, the |
| maintainer might not notice unless it is glaringly wrong. None of |
| us has time to study all the assembler code from a 50-line Fortran |
| program just on the chance that one instruction might be wrong. |
| We need *you* to do this part! |
| |
| Even if the problem you experience is a fatal signal, you should |
| still say so explicitly. Suppose something strange is going on, |
| such as, your copy of the compiler is out of synch, or you have |
| encountered a bug in the C library on your system. (This has |
| happened!) Your copy might crash and the copy here would not. If |
| you said to expect a crash, then when the compiler here fails to |
| crash, we would know that the bug was not happening. If you don't |
| say to expect a crash, then we would not know whether the bug was |
| happening. We would not be able to draw any conclusion from our |
| observations. |
| |
| If the problem is a diagnostic when building GNU Fortran with some |
| other compiler, say whether it is a warning or an error. |
| |
| Often the observed symptom is incorrect output when your program |
| is run. Sad to say, this is not enough information unless the |
| program is short and simple. None of us has time to study a large |
| program to figure out how it would work if compiled correctly, |
| much less which line of it was compiled wrong. So you will have |
| to do that. Tell us which source line it is, and what incorrect |
| result happens when that line is executed. A person who |
| understands the program can find this as easily as finding a bug |
| in the program itself. |
| |
| * If you send examples of assembler code output from GNU Fortran, |
| please use `-g' when you make them. The debugging information |
| includes source line numbers which are essential for correlating |
| the output with the input. |
| |
| * If you wish to mention something in the GNU Fortran source, refer |
| to it by context, not by line number. |
| |
| The line numbers in the development sources don't match those in |
| your sources. Your line numbers would convey no convenient |
| information to the maintainers. |
| |
| * Additional information from a debugger might enable someone to |
| find a problem on a machine which he does not have available. |
| However, you need to think when you collect this information if |
| you want it to have any chance of being useful. |
| |
| For example, many people send just a backtrace, but that is never |
| useful by itself. A simple backtrace with arguments conveys little |
| about GNU Fortran because the compiler is largely data-driven; the |
| same functions are called over and over for different RTL insns, |
| doing different things depending on the details of the insn. |
| |
| Most of the arguments listed in the backtrace are useless because |
| they are pointers to RTL list structure. The numeric values of the |
| pointers, which the debugger prints in the backtrace, have no |
| significance whatever; all that matters is the contents of the |
| objects they point to (and most of the contents are other such |
| pointers). |
| |
| In addition, most compiler passes consist of one or more loops that |
| scan the RTL insn sequence. The most vital piece of information |
| about such a loop--which insn it has reached--is usually in a |
| local variable, not in an argument. |
| |
| What you need to provide in addition to a backtrace are the values |
| of the local variables for several stack frames up. When a local |
| variable or an argument is an RTX, first print its value and then |
| use the GDB command `pr' to print the RTL expression that it points |
| to. (If GDB doesn't run on your machine, use your debugger to call |
| the function `debug_rtx' with the RTX as an argument.) In |
| general, whenever a variable is a pointer, its value is no use |
| without the data it points to. |
| |
| Here are some things that are not necessary: |
| |
| * A description of the envelope of the bug. |
| |
| Often people who encounter a bug spend a lot of time investigating |
| which changes to the input file will make the bug go away and which |
| changes will not affect it. |
| |
| This is often time consuming and not very useful, because the way |
| we will find the bug is by running a single example under the |
| debugger with breakpoints, not by pure deduction from a series of |
| examples. You might as well save your time for something else. |
| |
| Of course, if you can find a simpler example to report *instead* of |
| the original one, that is a convenience. Errors in the output |
| will be easier to spot, running under the debugger will take less |
| time, etc. Most GNU Fortran bugs involve just one function, so |
| the most straightforward way to simplify an example is to delete |
| all the function definitions except the one where the bug occurs. |
| Those earlier in the file may be replaced by external declarations |
| if the crucial function depends on them. (Exception: inline |
| functions might affect compilation of functions defined later in |
| the file.) |
| |
| However, simplification is not vital; if you don't want to do this, |
| report the bug anyway and send the entire test case you used. |
| |
| * In particular, some people insert conditionals `#ifdef BUG' around |
| a statement which, if removed, makes the bug not happen. These |
| are just clutter; we won't pay any attention to them anyway. |
| Besides, you should send us preprocessor output, and that can't |
| have conditionals. |
| |
| * A patch for the bug. |
| |
| A patch for the bug is useful if it is a good one. But don't omit |
| the necessary information, such as the test case, on the |
| assumption that a patch is all we need. We might see problems |
| with your patch and decide to fix the problem another way, or we |
| might not understand it at all. |
| |
| Sometimes with a program as complicated as GNU Fortran it is very |
| hard to construct an example that will make the program follow a |
| certain path through the code. If you don't send the example, we |
| won't be able to construct one, so we won't be able to verify that |
| the bug is fixed. |
| |
| And if we can't understand what bug you are trying to fix, or why |
| your patch should be an improvement, we won't install it. A test |
| case will help us to understand. |
| |
| *Note Sending Patches::, for guidelines on how to make it easy for |
| us to understand and install your patches. |
| |
| * A guess about what the bug is or what it depends on. |
| |
| Such guesses are usually wrong. Even the maintainer can't guess |
| right about such things without first using the debugger to find |
| the facts. |
| |
| * A core dump file. |
| |
| We have no way of examining a core dump for your type of machine |
| unless we have an identical system--and if we do have one, we |
| should be able to reproduce the crash ourselves. |
| |
| |
| File: g77.info, Node: Sending Patches, Prev: Bug Reporting, Up: Bugs |
| |
| Sending Patches for GNU Fortran |
| =============================== |
| |
| If you would like to write bug fixes or improvements for the GNU |
| Fortran compiler, that is very helpful. Send suggested fixes to the |
| bug report mailing list, <fortran@gnu.org>. |
| |
| Please follow these guidelines so we can study your patches |
| efficiently. If you don't follow these guidelines, your information |
| might still be useful, but using it will take extra work. Maintaining |
| GNU Fortran is a lot of work in the best of circumstances, and we can't |
| keep up unless you do your best to help. |
| |
| * Send an explanation with your changes of what problem they fix or |
| what improvement they bring about. For a bug fix, just include a |
| copy of the bug report, and explain why the change fixes the bug. |
| |
| (Referring to a bug report is not as good as including it, because |
| then we will have to look it up, and we have probably already |
| deleted it if we've already fixed the bug.) |
| |
| * Always include a proper bug report for the problem you think you |
| have fixed. We need to convince ourselves that the change is |
| right before installing it. Even if it is right, we might have |
| trouble judging it if we don't have a way to reproduce the problem. |
| |
| * Include all the comments that are appropriate to help people |
| reading the source in the future understand why this change was |
| needed. |
| |
| * Don't mix together changes made for different reasons. Send them |
| *individually*. |
| |
| If you make two changes for separate reasons, then we might not |
| want to install them both. We might want to install just one. If |
| you send them all jumbled together in a single set of diffs, we |
| have to do extra work to disentangle them--to figure out which |
| parts of the change serve which purpose. If we don't have time |
| for this, we might have to ignore your changes entirely. |
| |
| If you send each change as soon as you have written it, with its |
| own explanation, then the two changes never get tangled up, and we |
| can consider each one properly without any extra work to |
| disentangle them. |
| |
| Ideally, each change you send should be impossible to subdivide |
| into parts that we might want to consider separately, because each |
| of its parts gets its motivation from the other parts. |
| |
| * Send each change as soon as that change is finished. Sometimes |
| people think they are helping us by accumulating many changes to |
| send them all together. As explained above, this is absolutely |
| the worst thing you could do. |
| |
| Since you should send each change separately, you might as well |
| send it right away. That gives us the option of installing it |
| immediately if it is important. |
| |
| * Use `diff -c' to make your diffs. Diffs without context are hard |
| for us to install reliably. More than that, they make it hard for |
| us to study the diffs to decide whether we want to install them. |
| Unidiff format is better than contextless diffs, but not as easy |
| to read as `-c' format. |
| |
| If you have GNU `diff', use `diff -cp', which shows the name of the |
| function that each change occurs in. (The maintainer of GNU |
| Fortran currently uses `diff -rcp2N'.) |
| |
| * Write the change log entries for your changes. We get lots of |
| changes, and we don't have time to do all the change log writing |
| ourselves. |
| |
| Read the `ChangeLog' file to see what sorts of information to put |
| in, and to learn the style that we use. The purpose of the change |
| log is to show people where to find what was changed. So you need |
| to be specific about what functions you changed; in large |
| functions, it's often helpful to indicate where within the |
| function the change was. |
| |
| On the other hand, once you have shown people where to find the |
| change, you need not explain its purpose. Thus, if you add a new |
| function, all you need to say about it is that it is new. If you |
| feel that the purpose needs explaining, it probably does--but the |
| explanation will be much more useful if you put it in comments in |
| the code. |
| |
| If you would like your name to appear in the header line for who |
| made the change, send us the header line. |
| |
| * When you write the fix, keep in mind that we can't install a |
| change that would break other systems. |
| |
| People often suggest fixing a problem by changing |
| machine-independent files such as `toplev.c' to do something |
| special that a particular system needs. Sometimes it is totally |
| obvious that such changes would break GNU Fortran for almost all |
| users. We can't possibly make a change like that. At best it |
| might tell us how to write another patch that would solve the |
| problem acceptably. |
| |
| Sometimes people send fixes that *might* be an improvement in |
| general--but it is hard to be sure of this. It's hard to install |
| such changes because we have to study them very carefully. Of |
| course, a good explanation of the reasoning by which you concluded |
| the change was correct can help convince us. |
| |
| The safest changes are changes to the configuration files for a |
| particular machine. These are safe because they can't create new |
| bugs on other machines. |
| |
| Please help us keep up with the workload by designing the patch in |
| a form that is good to install. |
| |
| |
| File: g77.info, Node: Service, Next: Adding Options, Prev: Bugs, Up: Top |
| |
| How To Get Help with GNU Fortran |
| ******************************** |
| |
| If you need help installing, using or changing GNU Fortran, there |
| are two ways to find it: |
| |
| * Look in the service directory for someone who might help you for a |
| fee. The service directory is found in the file named `SERVICE' |
| in the GNU CC distribution. |
| |
| * Send a message to <fortran@gnu.org>. |
| |
| |
| File: g77.info, Node: Adding Options, Next: Projects, Prev: Service, Up: Top |
| |
| Adding Options |
| ************** |
| |
| To add a new command-line option to `g77', first decide what kind of |
| option you wish to add. Search the `g77' and `gcc' documentation for |
| one or more options that is most closely like the one you want to add |
| (in terms of what kind of effect it has, and so on) to help clarify its |
| nature. |
| |
| * *Fortran options* are options that apply only when compiling |
| Fortran programs. They are accepted by `g77' and `gcc', but they |
| apply only when compiling Fortran programs. |
| |
| * *Compiler options* are options that apply when compiling most any |
| kind of program. |
| |
| *Fortran options* are listed in the file `gcc/f/lang-options.h', |
| which is used during the build of `gcc' to build a list of all options |
| that are accepted by at least one language's compiler. This list goes |
| into the `lang_options' array in `gcc/toplev.c', which uses this array |
| to determine whether a particular option should be offered to the |
| linked-in front end for processing by calling `lang_option_decode', |
| which, for `g77', is in `gcc/f/com.c' and just calls |
| `ffe_decode_option'. |
| |
| If the linked-in front end "rejects" a particular option passed to |
| it, `toplev.c' just ignores the option, because *some* language's |
| compiler is willing to accept it. |
| |
| This allows commands like `gcc -fno-asm foo.c bar.f' to work, even |
| though Fortran compilation does not currently support the `-fno-asm' |
| option; even though the `f771' version of `lang_decode_option' rejects |
| `-fno-asm', `toplev.c' doesn't produce a diagnostic because some other |
| language (C) does accept it. |
| |
| This also means that commands like `g77 -fno-asm foo.f' yield no |
| diagnostics, despite the fact that no phase of the command was able to |
| recognize and process `-fno-asm'--perhaps a warning about this would be |
| helpful if it were possible. |
| |
| Code that processes Fortran options is found in `gcc/f/top.c', |
| function `ffe_decode_option'. This code needs to check positive and |
| negative forms of each option. |
| |
| The defaults for Fortran options are set in their global |
| definitions, also found in `gcc/f/top.c'. Many of these defaults are |
| actually macros defined in `gcc/f/target.h', since they might be |
| machine-specific. However, since, in practice, GNU compilers should |
| behave the same way on all configurations (especially when it comes to |
| language constructs), the practice of setting defaults in `target.h' is |
| likely to be deprecated and, ultimately, stopped in future versions of |
| `g77'. |
| |
| Accessor macros for Fortran options, used by code in the `g77' FFE, |
| are defined in `gcc/f/top.h'. |
| |
| *Compiler options* are listed in `gcc/toplev.c' in the array |
| `f_options'. An option not listed in `lang_options' is looked up in |
| `f_options' and handled from there. |
| |
| The defaults for compiler options are set in the global definitions |
| for the corresponding variables, some of which are in `gcc/toplev.c'. |
| |
| You can set different defaults for *Fortran-oriented* or |
| *Fortran-reticent* compiler options by changing the way `f771' handles |
| the `-fset-g77-defaults' option, which is always provided as the first |
| option when called by `g77' or `gcc'. |
| |
| This code is in `ffe_decode_options' in `gcc/f/top.c'. Have it |
| change just the variables that you want to default to a different |
| setting for Fortran compiles compared to compiles of other languages. |
| |
| The `-fset-g77-defaults' option is passed to `f771' automatically |
| because of the specification information kept in `gcc/f/lang-specs.h'. |
| This file tells the `gcc' command how to recognize, in this case, |
| Fortran source files (those to be preprocessed, and those that are |
| not), and further, how to invoke the appropriate programs (including |
| `f771') to process those source files. |
| |
| It is in `gcc/f/lang-specs.h' that `-fset-g77-defaults', |
| `-fversion', and other options are passed, as appropriate, even when |
| the user has not explicitly specified them. Other "internal" options |
| such as `-quiet' also are passed via this mechanism. |
| |
| |
| File: g77.info, Node: Projects, Next: Diagnostics, Prev: Adding Options, Up: Top |
| |
| Projects |
| ******** |
| |
| If you want to contribute to `g77' by doing research, design, |
| specification, documentation, coding, or testing, the following |
| information should give you some ideas. |
| |
| * Menu: |
| |
| * Efficiency:: Make `g77' itself compile code faster. |
| * Better Optimization:: Teach `g77' to generate faster code. |
| * Simplify Porting:: Make `g77' easier to configure, build, |
| and install. |
| * More Extensions:: Features many users won't know to ask for. |
| * Machine Model:: `g77' should better leverage `gcc'. |
| * Internals Documentation:: Make maintenance easier. |
| * Internals Improvements:: Make internals more robust. |
| * Better Diagnostics:: Make using `g77' on new code easier. |
| |
| |
| File: g77.info, Node: Efficiency, Next: Better Optimization, Up: Projects |
| |
| Improve Efficiency |
| ================== |
| |
| Don't bother doing any performance analysis until most of the |
| following items are taken care of, because there's no question they |
| represent serious space/time problems, although some of them show up |
| only given certain kinds of (popular) input. |
| |
| * Improve `malloc' package and its uses to specify more info about |
| memory pools and, where feasible, use obstacks to implement them. |
| |
| * Skip over uninitialized portions of aggregate areas (arrays, |
| `COMMON' areas, `EQUIVALENCE' areas) so zeros need not be output. |
| This would reduce memory usage for large initialized aggregate |
| areas, even ones with only one initialized element. |
| |
| As of version 0.5.18, a portion of this item has already been |
| accomplished. |
| |
| * Prescan the statement (in `sta.c') so that the nature of the |
| statement is determined as much as possible by looking entirely at |
| its form, and not looking at any context (previous statements, |
| including types of symbols). This would allow ripping out of the |
| statement-confirmation, symbol retraction/confirmation, and |
| diagnostic inhibition mechanisms. Plus, it would result in |
| much-improved diagnostics. For example, `CALL |
| some-intrinsic(...)', where the intrinsic is not a subroutine |
| intrinsic, would result actual error instead of the |
| unimplemented-statement catch-all. |
| |
| * Throughout `g77', don't pass line/column pairs where a simple |
| `ffewhere' type, which points to the error as much as is desired |
| by the configuration, will do, and don't pass `ffelexToken' types |
| where a simple `ffewhere' type will do. Then, allow new default |
| configuration of `ffewhere' such that the source line text is not |
| preserved, and leave it to things like Emacs' next-error function |
| to point to them (now that `next-error' supports column, or, |
| perhaps, character-offset, numbers). The change in calling |
| sequences should improve performance somewhat, as should not |
| having to save source lines. (Whether this whole item will |
| improve performance is questionable, but it should improve |
| maintainability.) |
| |
| * Handle `DATA (A(I),I=1,1000000)/1000000*2/' more efficiently, |
| especially as regards the assembly output. Some of this might |
| require improving the back end, but lots of improvement in |
| space/time required in `g77' itself can be fairly easily obtained |
| without touching the back end. Maybe type-conversion, where |
| necessary, can be speeded up as well in cases like the one shown |
| (converting the `2' into `2.'). |
| |
| * If analysis shows it to be worthwhile, optimize `lex.c'. |
| |
| * Consider redesigning `lex.c' to not need any feedback during |
| tokenization, by keeping track of enough parse state on its own. |
| |
| |
| File: g77.info, Node: Better Optimization, Next: Simplify Porting, Prev: Efficiency, Up: Projects |
| |
| Better Optimization |
| =================== |
| |
| Much of this work should be put off until after `g77' has all the |
| features necessary for its widespread acceptance as a useful F77 |
| compiler. However, perhaps this work can be done in parallel during |
| the feature-adding work. |
| |
| * Do the equivalent of the trick of putting `extern inline' in front |
| of every function definition in `libf2c' and #include'ing the |
| resulting file in `f2c'+`gcc'--that is, inline all |
| run-time-library functions that are at all worth inlining. (Some |
| of this has already been done, such as for integral |
| exponentiation.) |
| |
| * When doing `CHAR_VAR = CHAR_FUNC(...)', and it's clear that types |
| line up and `CHAR_VAR' is addressable or not a `VAR_DECL', make |
| `CHAR_VAR', not a temporary, be the receiver for `CHAR_FUNC'. |
| (This is now done for `COMPLEX' variables.) |
| |
| * Design and implement Fortran-specific optimizations that don't |
| really belong in the back end, or where the front end needs to |
| give the back end more info than it currently does. |
| |
| * Design and implement a new run-time library interface, with the |
| code going into `libgcc' so no special linking is required to link |
| Fortran programs using standard language features. This library |
| would speed up lots of things, from I/O (using precompiled formats, |
| doing just one, or, at most, very few, calls for arrays or array |
| sections, and so on) to general computing (array/section |
| implementations of various intrinsics, implementation of commonly |
| performed loops that aren't likely to be optimally compiled |
| otherwise, etc.). |
| |
| Among the important things the library would do are: |
| |
| * Be a one-stop-shop-type library, hence shareable and usable |
| by all, in that what are now library-build-time options in |
| `libf2c' would be moved at least to the `g77' compile phase, |
| if not to finer grains (such as choosing how list-directed |
| I/O formatting is done by default at `OPEN' time, for |
| preconnected units via options or even statements in the main |
| program unit, maybe even on a per-I/O basis with appropriate |
| pragma-like devices). |
| |
| * Probably requiring the new library design, change interface to |
| normally have `COMPLEX' functions return their values in the way |
| `gcc' would if they were declared `__complex__ float', rather than |
| using the mechanism currently used by `CHARACTER' functions |
| (whereby the functions are compiled as returning void and their |
| first arg is a pointer to where to store the result). (Don't |
| append underscores to external names for `COMPLEX' functions in |
| some cases once `g77' uses `gcc' rather than `f2c' calling |
| conventions.) |
| |
| * Do something useful with `doiter' references where possible. For |
| example, `CALL FOO(I)' cannot modify `I' if within a `DO' loop |
| that uses `I' as the iteration variable, and the back end might |
| find that info useful in determining whether it needs to read `I' |
| back into a register after the call. (It normally has to do that, |
| unless it knows `FOO' never modifies its passed-by-reference |
| argument, which is rarely the case for Fortran-77 code.) |
| |
| |
| File: g77.info, Node: Simplify Porting, Next: More Extensions, Prev: Better Optimization, Up: Projects |
| |
| Simplify Porting |
| ================ |
| |
| Making `g77' easier to configure, port, build, and install, either |
| as a single-system compiler or as a cross-compiler, would be very |
| useful. |
| |
| * A new library (replacing `libf2c') should improve portability as |
| well as produce more optimal code. Further, `g77' and the new |
| library should conspire to simplify naming of externals, such as |
| by removing unnecessarily added underscores, and to |
| reduce/eliminate the possibility of naming conflicts, while making |
| debugger more straightforward. |
| |
| Also, it should make multi-language applications more feasible, |
| such as by providing Fortran intrinsics that get Fortran unit |
| numbers given C `FILE *' descriptors. |
| |
| * Possibly related to a new library, `g77' should produce the |
| equivalent of a `gcc' `main(argc, argv)' function when it compiles |
| a main program unit, instead of compiling something that must be |
| called by a library implementation of `main()'. |
| |
| This would do many useful things such as provide more flexibility |
| in terms of setting up exception handling, not requiring |
| programmers to start their debugging sessions with `breakpoint |
| MAIN__' followed by `run', and so on. |
| |
| * The GBE needs to understand the difference between alignment |
| requirements and desires. For example, on Intel x86 machines, |
| `g77' currently imposes overly strict alignment requirements, due |
| to the back end, but it would be useful for Fortran and C |
| programmers to be able to override these *recommendations* as long |
| as they don't violate the actual processor *requirements*. |
| |
| |
| File: g77.info, Node: More Extensions, Next: Machine Model, Prev: Simplify Porting, Up: Projects |
| |
| More Extensions |
| =============== |
| |
| These extensions are not the sort of things users ask for "by name", |
| but they might improve the usability of `g77', and Fortran in general, |
| in the long run. Some of these items really pertain to improving `g77' |
| internals so that some popular extensions can be more easily supported. |
| |
| * Look through all the documentation on the GNU Fortran language, |
| dialects, compiler, missing features, bugs, and so on. Many |
| mentions of incomplete or missing features are sprinkled |
| throughout. It is not worth repeating them here. |
| |
| * Support arbitrary operands for concatenation, even in contexts |
| where run-time allocation is required. |
| |
| * Consider adding a `NUMERIC' type to designate typeless numeric |
| constants, named and unnamed. The idea is to provide a |
| forward-looking, effective replacement for things like the |
| old-style `PARAMETER' statement when people really need |
| typelessness in a maintainable, portable, clearly documented way. |
| Maybe `TYPELESS' would include `CHARACTER', `POINTER', and |
| whatever else might come along. (This is not really a call for |
| polymorphism per se, just an ability to express limited, syntactic |
| polymorphism.) |
| |
| * Support `OPEN(...,KEY=(...),...)'. |
| |
| * Support arbitrary file unit numbers, instead of limiting them to 0 |
| through `MXUNIT-1'. (This is a `libf2c' issue.) |
| |
| * `OPEN(NOSPANBLOCKS,...)' is treated as |
| `OPEN(UNIT=NOSPANBLOCKS,...)', so a later `UNIT=' in the first |
| example is invalid. Make sure this is what users of this feature |
| would expect. |
| |
| * Currently `g77' disallows `READ(1'10)' since it is an obnoxious |
| syntax, but supporting it might be pretty easy if needed. More |
| details are needed, such as whether general expressions separated |
| by an apostrophe are supported, or maybe the record number can be |
| a general expression, and so on. |
| |
| * Support `STRUCTURE', `UNION', `MAP', and `RECORD' fully. |
| Currently there is no support at all for `%FILL' in `STRUCTURE' |
| and related syntax, whereas the rest of the stuff has at least |
| some parsing support. This requires either major changes to |
| `libf2c' or its replacement. |
| |
| * F90 and `g77' probably disagree about label scoping relative to |
| `INTERFACE' and `END INTERFACE', and their contained procedure |
| interface bodies (blocks?). |
| |
| * `ENTRY' doesn't support F90 `RESULT()' yet, since that was added |
| after S8.112. |
| |
| * Empty-statement handling (10 ;;CONTINUE;;) probably isn't |
| consistent with the final form of the standard (it was vague at |
| S8.112). |
| |
| * It seems to be an "open" question whether a file, immediately |
| after being `OPEN'ed,is positioned at the beginning, the end, or |
| wherever--it might be nice to offer an option of opening to |
| "undefined" status, requiring an explicit absolute-positioning |
| operation to be performed before any other (besides `CLOSE') to |
| assist in making applications port to systems (some IBM?) that |
| `OPEN' to the end of a file or some such thing. |
| |
| |
| File: g77.info, Node: Machine Model, Next: Internals Documentation, Prev: More Extensions, Up: Projects |
| |
| Machine Model |
| ============= |
| |
| This items pertain to generalizing `g77''s view of the machine model |
| to more fully accept whatever the GBE provides it via its configuration. |
| |
| * Switch to using `REAL_VALUE_TYPE' to represent floating-point |
| constants exclusively so the target float format need not be |
| required. This means changing the way `g77' handles |
| initialization of aggregate areas having more than one type, such |
| as `REAL' and `INTEGER', because currently it initializes them as |
| if they were arrays of `char' and uses the bit patterns of the |
| constants of the various types in them to determine what to stuff |
| in elements of the arrays. |
| |
| * Rely more and more on back-end info and capabilities, especially |
| in the area of constants (where having the `g77' front-end's IL |
| just store the appropriate tree nodes containing constants might |
| be best). |
| |
| * Suite of C and Fortran programs that a user/administrator can run |
| on a machine to help determine the configuration for `g77' before |
| building and help determine if the compiler works (especially with |
| whatever libraries are installed) after building. |
| |
| |
| File: g77.info, Node: Internals Documentation, Next: Internals Improvements, Prev: Machine Model, Up: Projects |
| |
| Internals Documentation |
| ======================= |
| |
| Better info on how `g77' works and how to port it is needed. Much |
| of this should be done only after the redesign planned for 0.6 is |
| complete. |
| |
| |
| File: g77.info, Node: Internals Improvements, Next: Better Diagnostics, Prev: Internals Documentation, Up: Projects |
| |
| Internals Improvements |
| ====================== |
| |
| Some more items that would make `g77' more reliable and easier to |
| maintain: |
| |
| * Generally make expression handling focus more on critical syntax |
| stuff, leaving semantics to callers. For example, anything a |
| caller can check, semantically, let it do so, rather than having |
| `expr.c' do it. (Exceptions might include things like diagnosing |
| `FOO(I--K:)=BAR' where `FOO' is a `PARAMETER'--if it seems |
| important to preserve the left-to-right-in-source order of |
| production of diagnostics.) |
| |
| * Come up with better naming conventions for `-D' to establish |
| requirements to achieve desired implementation dialect via |
| `proj.h'. |
| |
| * Clean up used tokens and `ffewhere's in `ffeglobal_terminate_1'. |
| |
| * Replace `sta.c' `outpooldisp' mechanism with `malloc_pool_use'. |
| |
| * Check for `opANY' in more places in `com.c', `std.c', and `ste.c', |
| and get rid of the `opCONVERT(opANY)' kludge (after determining if |
| there is indeed no real need for it). |
| |
| * Utility to read and check `bad.def' messages and their references |
| in the code, to make sure calls are consistent with message |
| templates. |
| |
| * Search and fix `&ffe...' and similar so that `ffe...ptr...' macros |
| are available instead (a good argument for wishing this could have |
| written all this stuff in C++, perhaps). On the other hand, it's |
| questionable whether this sort of improvement is really necessary, |
| given the availability of tools such as Emacs and Perl, which make |
| finding any address-taking of structure members easy enough? |
| |
| * Some modules truly export the member names of their structures |
| (and the structures themselves), maybe fix this, and fix other |
| modules that just appear to as well (by appending `_', though it'd |
| be ugly and probably not worth the time). |
| |
| * Implement C macros `RETURNS(value)' and `SETS(something,value)' in |
| `proj.h' and use them throughout `g77' source code (especially in |
| the definitions of access macros in `.h' files) so they can be |
| tailored to catch code writing into a `RETURNS()' or reading from |
| a `SETS()'. |
| |
| * Decorate throughout with `const' and other such stuff. |
| |
| * All F90 notational derivations in the source code are still based |
| on the S8.112 version of the draft standard. Probably should |
| update to the official standard, or put documentation of the rules |
| as used in the code...uh...in the code. |
| |
| * Some `ffebld_new' calls (those outside of `ffeexpr.c' or inside |
| but invoked via paths not involving `ffeexpr_lhs' or |
| `ffeexpr_rhs') might be creating things in improper pools, leading |
| to such things staying around too long or (doubtful, but possible |
| and dangerous) not long enough. |
| |
| * Some `ffebld_list_new' (or whatever) calls might not be matched by |
| `ffebld_list_bottom' (or whatever) calls, which might someday |
| matter. (It definitely is not a problem just yet.) |
| |
| * Probably not doing clean things when we fail to `EQUIVALENCE' |
| something due to alignment/mismatch or other problems--they end up |
| without `ffestorag' objects, so maybe the backend (and other parts |
| of the front end) can notice that and handle like an `opANY' (do |
| what it wants, just don't complain or crash). Most of this seems |
| to have been addressed by now, but a code review wouldn't hurt. |
| |
| |
| File: g77.info, Node: Better Diagnostics, Prev: Internals Improvements, Up: Projects |
| |
| Better Diagnostics |
| ================== |
| |
| These are things users might not ask about, or that need to be |
| looked into, before worrying about. Also here are items that involve |
| reducing unnecessary diagnostic clutter. |
| |
| * When `FUNCTION' and `ENTRY' point types disagree (`CHARACTER' |
| lengths, type classes, and so on), `ANY'-ize the offending `ENTRY' |
| point and any *new* dummies it specifies. |
| |
| * Speed up and improve error handling for data when repeat-count is |
| specified. For example, don't output 20 unnecessary messages |
| after the first necessary one for: |
| |
| INTEGER X(20) |
| CONTINUE |
| DATA (X(I), J= 1, 20) /20*5/ |
| END |
| |
| (The `CONTINUE' statement ensures the `DATA' statement is |
| processed in the context of executable, not specification, |
| statements.) |
| |
| |
| File: g77.info, Node: Diagnostics, Next: Index, Prev: Projects, Up: Top |
| |
| Diagnostics |
| *********** |
| |
| Some diagnostics produced by `g77' require sufficient explanation |
| that the explanations are given below, and the diagnostics themselves |
| identify the appropriate explanation. |
| |
| Identification uses the GNU Info format--specifically, the `info' |
| command that displays the explanation is given within square brackets |
| in the diagnostic. For example: |
| |
| foo.f:5: Invalid statement [info -f g77 M FOOEY] |
| |
| More details about the above diagnostic is found in the `g77' Info |
| documentation, menu item `M', submenu item `FOOEY', which is displayed |
| by typing the UNIX command `info -f g77 M FOOEY'. |
| |
| Other Info readers, such as EMACS, may be just as easily used to |
| display the pertinent node. In the above example, `g77' is the Info |
| document name, `M' is the top-level menu item to select, and, in that |
| node (named `Diagnostics', the name of this chapter, which is the very |
| text you're reading now), `FOOEY' is the menu item to select. |
| |
| * Menu: |
| |
| * CMPAMBIG:: Ambiguous use of intrinsic. |
| * EXPIMP:: Intrinsic used explicitly and implicitly. |
| * INTGLOB:: Intrinsic also used as name of global. |
| * LEX:: Various lexer messages |
| * GLOBALS:: Disagreements about globals. |
| |