mirror of
https://github.com/netwide-assembler/nasm.git
synced 2024-12-21 09:19:31 +08:00
nasm.c: min 2 optimization passes, don't re-run pass 1
We may not even have the most basic stabilization done unless we run at least two optimization passes, e.g. in the case of subsections. However, we cannot run more than one stabilization pass (pass0 == 1); for one thing we'll call ofmt->symdef() multiple times on the same symbol, which is not allowed. If we haven't achieved stability by the time we decide to run a stabilization pass, plod on and hope for the best. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
This commit is contained in:
parent
58a275c3e9
commit
12810fac92
@ -1620,7 +1620,14 @@ static void assemble_file(const char *fname, StrList **depend_ptr)
|
||||
if (pass1 == 1)
|
||||
preproc->cleanup(1);
|
||||
|
||||
if ((passn > 1 && !global_offset_changed) || pass0 == 2) {
|
||||
/*
|
||||
* Always run at least two optimization passes (pass0 == 0);
|
||||
* things like subsections will fail miserably without that.
|
||||
* Once we commit to a stabilization pass (pass0 == 1), we can't
|
||||
* go back, and if something goes bad, we can only hope
|
||||
* that we don't end up with a phase error at the end.
|
||||
*/
|
||||
if ((passn > 1 && !global_offset_changed) || pass0 > 0) {
|
||||
pass0++;
|
||||
} else if (global_offset_changed &&
|
||||
global_offset_changed < prev_offset_changed) {
|
||||
|
Loading…
Reference in New Issue
Block a user