https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120559
--- Comment #3 from Sam James <sjames at gcc dot gnu.org> --- __attribute__((noinline)) void write_to_hw(uint32_t channel, uint32_t * ptr) { while (1) { hw_low_level_write(channel, (*ptr | (channel & 3))); if (!hw_low_level_overflow(channel, 7)) { break; // Exit loop if the hardware is ready } } } __attribute__((noinline)) void send_buffer(uint32_t channel, void *ptr, uint32_t size) { struct tx_buffer_entry *entry; /* ... */ entry = get_buffer(); entry->data = ptr; entry->size = size; entry->state = 1; // Mark as used /* ... */ write_to_hw(channel, (void *)(&entry)); } and ... #ifndef SET_REG_WORD #define SET_REG_WORD(a, x) ((void)(*(volatile uint32_t *)(((uintptr_t)(a))) = (uint32_t)(x))) #endif __attribute__((noinline)) void hw_low_level_write(uint32_t channel, uint32_t value) { SET_REG_WORD(REG_LOC, value); // Write the value to the specified hardware channel // This is a placeholder implementation // Actual implementation would depend on the specific hardware // and might involve memory-mapped I/O or other mechanisms. } uint32_t* vs tx_buffer_entry*