====== Known bugs and limitations ======
===== C compiler (gcc-ia16) =====
* In general, if you run into a compiler error or miscompilation, try annotating the function with ''%%__attribute__((noinline, optimize("-O0"))) %%'' as a workaround.
* gcc-ia16's handling of far pointers is considered experimental. Caveat emptor.
* gcc-ia16's handling of DS != SS (wwitch target) is considered experimental. It does work for simple code, but complex pointer operations may lead to bugs. As above, caveat emptor.
* The optimization levels ''%%-O0%%'', ''%%-O2%%'' and ''%%-Os%%'' are most stable (roughly in that order).
==== Miscompilations involving far function pointers ====
In some cases, when calling pointers from arrays of far function pointers in optimization modes >= -O1, the code will be miscompiled. This is a [[https://codeberg.org/tkchia/gcc-ia16/issues/6|known issue]], with no ETA for a fix.
One can work around this by annotating the affected function to be compiled without optimizations. In particular, one can create a separate function that //only// acts as a wrapper for the function call:
__attribute__((noinline, optimize("-O0"))) // https://github.com/tkchia/gcc-ia16/issues/120
void call_to_my_function_table(uint8_t index) {
my_function_table[index]();
}
==== Far pointers to near variables ====
struct a { void __far *ptr; };
struct b { int value; };
struct b instance_b;
// This doesn't work - compiler limitation
const struct a var_ptr = { &instance_b };
// ... but this does
const struct a var_ptr_fixed = { __builtin_ia16_static_far_cast(&instance_b) };
// This doesn't work - __builtin_ia16_static_far_cast only works on variable definitions
const struct a field_ptr = { __builtin_ia16_static_far_cast(&instance_b.value) };
// ... but this does
const struct a field_ptr_fixed = { &(((struct b __far *)__builtin_ia16_static_far_cast(&instance_b))->value) };
==== wswan/bootfriend: defining interrupt handlers ====
The wswan/bootfriend target does not support relocation; as such, far functions (which interrupt handlers have to be) cannot be created in sections other than the default text section. This can be achieved by either:
* using ''%%__attribute__(section(".text"))%%'' on the function,
* building with ''%%-fno-function-sections%%'' in CFLAGS; however, this disables per-function garbage collection and may increase file size as a result.
The wwitch target also prohibits defining far functions outside of the default text section, but this only becomes an issue if the FreyaBIOS system APIs (''%%sys_interrupt_set_hook%%'', ''%%sys_interrupt_reset_hook%%'') are not used, as those wrap regular C functions.