From 09b33db929514c565b37e1b15151c56bf381a9df Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Wed, 4 Nov 2009 11:37:48 +0000 Subject: [PATCH] document the algorithm a bit [r26713] --- ir/be/beemitter_binary.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/ir/be/beemitter_binary.c b/ir/be/beemitter_binary.c index 57650784a..e9291e680 100644 --- a/ir/be/beemitter_binary.c +++ b/ir/be/beemitter_binary.c @@ -121,7 +121,8 @@ static unsigned align(unsigned offset, unsigned alignment) return offset; } -static bool determine_jumpsize_pass(const binary_emiter_interface_t *interface) +static bool determine_jumpsize_iteration( + const binary_emiter_interface_t *interface) { unsigned offset = 0; unsigned max_offset = 0; @@ -137,7 +138,7 @@ static bool determine_jumpsize_pass(const binary_emiter_interface_t *interface) max_offset = align(max_offset, alignment); if (offset != fragment->offset) { - changed = true; + changed = true; fragment->offset = offset; } fragment->max_offset = max_offset; @@ -161,9 +162,14 @@ static void determine_offsets(const binary_emiter_interface_t *interface) first_fragment->offset = 0; first_fragment->max_offset = 0; - /* pass1: encode minimum/maximum offsets into fragments */ + /* The algorithm calculates a lower and upper bound for the offset of each + * fragment. With this information we can calculate a lower and upper bound + * for the size of each jump instruction. + * A single iteration updates the offset bounds for all fragments and jump + * sizes for each fragment. We iterate until we had an iteration where + * none of the minimum offsets changed. */ do { - changed = determine_jumpsize_pass(interface); + changed = determine_jumpsize_iteration(interface); /* TODO: we should have an abort mode for the case when the offsets don't converge fast enough. We could simply use a pessimistic solution after a few iterations... */ -- 2.20.1