====== 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.