// layer2Stress.c - Layer 2 ptr32 deref miscompile reproducer.
//
// Verifies that *_StackRelIndY uses (the Layer 2 deref pseudo) survive
// W65816StackRelToImg's hot-slot promotion.  Each helper writes its
// result to a known address; runInMame.sh --check verifies all four.

#include <stdint.h>


__attribute__((noinline)) uint16_t indexedRead(const uint16_t *arr, uint16_t i) {
    return arr[i];
}


__attribute__((noinline)) uint16_t strLen(const char *p) {
    uint16_t n = 0;
    while (*p) {
        p++;
        n++;
    }
    return n;
}


__attribute__((noinline)) uint16_t sumByteToZero(const uint8_t *p) {
    uint16_t s = 0;
    while (*p) {
        s += *p;
        p++;
    }
    return s;
}


static const uint16_t gArr[]    = { 100, 200, 300, 400, 500 };
static const uint8_t  gBytes[]  = { 10, 20, 30, 40, 50, 0 };
static const char     gString[] = "Hello, world!";


int main(void) {
    *(volatile uint16_t *)0x70 = strLen(gString);
    *(volatile uint16_t *)0x72 = sumByteToZero(gBytes);
    *(volatile uint16_t *)0x74 = indexedRead(gArr, 3);
    *(volatile uint16_t *)0x76 = 0xBEEF;
    for (volatile uint32_t s = 0; s < 200000UL; s++) {
    }
    return 0;
}
