comp.lang.ada
 help / color / mirror / Atom feed
From: dewar@merv.cs.nyu.edu (Robert Dewar)
Subject: Re: Effort to Port TSG to Ada-95 and How Fast it Ran in Gnat
Date: 1997/02/20
Date: 1997-02-20T00:00:00+00:00	[thread overview]
Message-ID: <dewar.856443595@merv> (raw)
In-Reply-To: 5efjta$jlm@top.mitre.org


Some more followup on Michael's posts about porting experiences. I think
posts like this can be very useful, and indeed we have certainly learned
a lot from porting large programs in the million line range from various
Ada 83 compilers to GNAT, but it is always risky to draw conclusions from
porting one small (only 50K line) program, so here are some cuationary
notes on Michael's recommendations, which come from our much more
extensive experience with this kind of porting.

(my responses are idented, original recommendations preceded by >)

> 1. Before porting an Ada-83 application to Ada-95, you might wish to
> port it to one or two other Ada-83 compilers to get rid of the compiler
> dependencies. That way you can factor out the two sources of effort:
> (a) eliminating compiler dependencies, and (b) porting from compiler
> independent Ada-83 to compiler independent Ada-95.

    In practice nearly all porting problems will be due to one of the
    following:

       o  Implementation dependencies in the original code
       o  Rep clauses in the original code treated differently
       o  Bugs in the original code
       o  Bugs in the original compiler
       o  Bugs in the new compiler

    Very few will be due to Ada-83 to Ada-95 changes. In Michael's case,
    it looks like just ONE of his problems (the wide character case)
    may be a geniune Ada 95 problem. He identifies several others as
    being Ada 83 to Ada 95 issues, but is confused in all these cases
    between language changes and implementation dependencies.

> 2. When you see program_error, immediately suspect that you have to
> call something from outside the package that you are now calling
> from the bottom of the package during elaboration time.

    I would just say "access before elaboration". Such cases are always
    due to incorrect coding in the original program, but such errors
    are common. I am not sure what "bottom of the package" means, but
    the cases that can cause program error are well defined in the RM.

> 3. Wherever possible put pragma pure, pragma preelaborate, pragme
> elaborate_body in your visible parts. Where needed, put pragma
> elaborate in your package bodies.

    This is not porting advice, but really programming advice (write
    code in a correct manner). In particular, missing pragma
    Elaborate's are instances of bugs in the original code.

> 4. Before even running a test, convert all roundings and truncations
> to Ada-95 rounding and truncation attributes.

    Definitely NOT required in the usual case unless again the original
    code or the original compiler has bugs in it.

> 5. Although there is a very large space advantage for not using the
> -g attribute on your compile and bind, the run time penalty appears
> insignificant.

    Using -g does not just cause an insignificant run time penalty it
    causes ABSOLUTELY ZERO penalty. A fundamental point of the design
    of the debugging capability in GNAT is that it is entirely 
    non-intrusive. It does not change one bit of the executable. There
    is also zero space penalty, except in the space required to store
    the executable on disk. A constant error that people make is to
    assume that executable program size is proportional to the size
    of the executable file. This is not so, precisely because the
    executable file contains debugging information that is loaded
    ONLY if you run GDB or some other debugger that accesses the
    information.

> 6. Optimization levels O2, O3, and gnatn may not gain as much execution
> time as level O1 gained.

    That's often true. Of course it is clear that the program that Michael
    is porting does not do much arithmetic, that's clear rom the next
    point, so you cannot necessarily assume this will be true for you.
    In particular, -gnatn may result in HUGE gains for some programs.
    How much gain -gnatn will generate is of course dependent on how
    aggressively pragma Inline has been used. You might also try using
    -gnatN if you are on version 3.09, which forces all possible inlining
    but generates LOTS of dependencies.

> 7. Although the documentation states that overflow checking (the -gnato
> option) generates a lot of code, in this example there was not much of
> an execution time penalty, so for safety, you can probably always compile
> with both -g and -gnato.

    The conclusion here is entirely unwarranted. Just because one small
    program shows this behavior does not mean you can extend this to
    other programs. A factor of 2 slowdown with -gnato is not unusual
    for programs doing heavy arithmetic, and it is easy to construct
    examples of bigger slowdowns. Of course if these inefficiencies
    are not a problem, then it is certainly a good idea to use -gnato,
    and you certainly want to use -gnato while porting to smoke out 
    elaboration order errors in the original code.

> 8. When gnatmake says you are up to date and you know you just changed
> the source code (possibly to an earlier dated source code, in order to
> switch back ends), just delete the appropriate ALI files and reissue
> the gnatmake.

    If this is accurately reported, it is a bug in gnatmake, and certainly
    with the current version, we know of no such serious bugs. If you find
    this happening, it may be because you have things set up wrong, or it
    may be a bug. If you suspect the latter, try to narrow it down and
    report it. Certainly we, and our customers, use gnatmake extensively,
    and no one has ever reported this bug.

> 9. Learn the b, run, and bt commands of gdb and use them extensively. Gnat
> out of the box without gdb does not print stack traces when you get
> an unhandled exception, such as a constraint_error.

    That is certainly one bit of unambiguously good advice here. Actually
    gdb has a very powerful command set and can do all sorts of things. It is
    worth reading the GDB manual to find out all it can do.

> 10. When you get messages like variable has not been initialized, take it
> with a grain of salt, because gnat does not always see initializations across
> generics, separately compiler packages, and some other forms of aliasing.
> However, investigate those occurrences, as well as all other warning
> messages. When the warning is accurate, fix the problem. Happy porting.

    If there are cases where this warning is not noticing initializations
    across generics or separate compiler packages, that is a bug. We are
    aware of no such bugs, and indeed it would be surprising if there are
    any such cases. However, if you find one, then please surprise us by
    sending in the appropriate bug report.

    If you are doing nasty aliasing, e.g. using overlaying, then indeed
    you can fool this warning, but these are cases where you also fool
    the optimizer potentially, so be very careful.

    Several of the warnings in GNAT are not always "correct". For example,
    if there is a procedure with no parameters that contains a recursive
    call to itself, then you get a warning about potential infinite
    recursion. Someone complained about this the other day, and I was
    considering taking it out, when the following day, it rescued me from
    what would have been a tricky bug to find, so I kept it in. Remember
    that you can always suppress a particular annoying warning by using
    -gnatws on the unit, or putting pragma Warnings (Off) in the unit.
    If you really want to narrow the suppress down to a single statement,
    put Warnings (Off) before and Warnings (On) after.

    HOWEVER, I do not know of a single instance where the warning about
    a variable never being assigned a value has been wrong. I am not
    exactly sure what warning Michael is referring to.

    As in the case of confusing error messages in general, if you get a
    warning that you think is definitely wrong, report it as a bug. We
    may not be able to "fix" it, but we may, you never know.

Robert Dewar
Ada Core Technologies.





  parent reply	other threads:[~1997-02-20  0:00 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1997-02-19  0:00 Effort to Port TSG to Ada-95 and How Fast it Ran in Gnat Michael F Brenner
1997-02-19  0:00 ` Robert Dewar
1997-02-20  0:00   ` Larry Kilgallen
1997-02-21  0:00     ` Robert Dewar
1997-02-21  0:00   ` Keith Thompson
1997-02-21  0:00     ` Robert Dewar
1997-02-20  0:00 ` Robert Dewar [this message]
1997-02-27  0:00   ` Mats Weber
1997-03-01  0:00     ` Robert Dewar
1997-03-03  0:00       ` Elaboration order (was: Effort to Port TSG to Ada-95 and How Fast it Ran in Gnat) Mats Weber
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox