Currently, I believe, GCC combines various calls to abort in a single function, because it knows that none of them returns.
To give this request a little context, consider the attached example. If I compile this with -O2 -g, and run it under the debugger, it tells me that the program died at line 7 (j == 0) which is impossible. It is easy to tell what went wrong in a trivial example like this, but in a big program like gcc this can be very confusing. This reduces the usefulness of using abort in combination with -g and optimization.
The optimization that causes the problem is crossjumping. If I compile with -O2 -fno-crossjumping I get the desired result. So rms's request is essentially to disable crossjumping of abort calls.
Incidentally, we have already pushed crossjumping back from -O to -O2. If I use gcc-3.3, the example fails with -O -g. But with gcc-4, it works at -O -g and fails only at -O2 (or -Os) -g. Since -O -g works with current sources, perhaps this is a good enough solution. Or perhaps just asking people to use -fno-crossjumping is a good enough solution.
Otherwise, we need to consider the merits of disabling an optimization to make debugging easier. This is a difficult choice to make, but at -O2, I'd prefer that we optimize, and suggest other debugging techniques intead of relying on the line numbers of abort calls. Such as using assert instead.
I suppose there is yet another alternative, which is to extend the debug info to indicate that the single abort call is both line 5 and line 7, and then extend gdb to handle this gracefully, but this does not seem to be a practical solution, at least not a practical short term one.
--
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com