lvgl / lv_binding_rust

LVGL bindings for Rust. A powerful and easy-to-use embedded GUI with many widgets, advanced visual effects (opacity, antialiasing, animations) and low memory requirements (16K RAM, 64K Flash).
MIT License
668 stars 69 forks source link

Compiling with GCC causes enum alignment issues #163

Open FloatyJellyfish opened 6 months ago

FloatyJellyfish commented 6 months ago

By default, GCC targeting embedded platform enables the -fshort-enums flag which dynamically sizes enums based on the greatest value the enum contains. This results in enums being represented by 1/2/3 bytes rather than the platforms default of 4 bytes.

However, bindgen uses clang which doesn't use -fshort-enums by default and so always generates bindings to enums with a size of 4 bytes.

As a result, when structures containing enums are passed between Rust and C they are miss aligned as Rust expects 4 bytes for each enum but it could be represented in a smaller number of bytes from the C side of things.

There are a couple of solutions:

  1. Don't use GCC as your default compiler and use the ARM Clang compiler instead
  2. Add cfg.flag("-fno-short-enums"); to cc Build in lvgl-sys/build.rs script when using GCC which stops the default behaviour of shrinking enums when lvgl-sys is built
  3. Add .clang_arg("-fshort-enums") to bindings Builder also in lvgl-sys/build.rs to make Clang in the bindgen to shrink enums in the same way

I'm not sure if any actions need to be taken off these findings, but I just wanted to put this here in case anyone else has a similar prolem.