Dragonegg stack variables reorderings

I have noticed that dragonegg sometimes allocates stack objects in a different
order than they were declared in the source file.

I experienced this behavior when compiling RIPE
(https://github.com/johnwilander/RIPE) in the function perform_attack.
Unfortunately, I haven't been able to reproduce this in a minimal example.

(Note that when compiling RIPE with GCC, the order of stack variables is
preserved)

So, I have two questions about this behavior:
1) When exactly does dragonegg reorder stack variables?
2) Is there a way to always keep the variables in declared order?

Kind regards,
Job Noorman

Hi Job,

I have noticed that dragonegg sometimes allocates stack objects in a different
order than they were declared in the source file.

I experienced this behavior when compiling RIPE
(https://github.com/johnwilander/RIPE) in the function perform_attack.
Unfortunately, I haven't been able to reproduce this in a minimal example.

(Note that when compiling RIPE with GCC, the order of stack variables is
preserved)

as far as I know reordering stack variables or placing arbitrary padding
between them is perfectly conformant with the C standard. The LLVM optimizers
know this, so if you compile with optimization then code that relies on a
particular stack layout is liable to break even if the front-end outputs
everything in textual order.

So, I have two questions about this behavior:
  1) When exactly does dragonegg reorder stack variables?

I think this is probably due to stack variables being output lazily, i.e. when
first used. For example, if you declare variables A and B but use B first then
probably B will get output to the LLVM IR first.

  2) Is there a way to always keep the variables in declared order?

I guess I could arrange for them all to be output in one fell swoop at the start
of the function. Why do you need this?

Ciao, Duncan.