Shu-Chun Weng <s...@google.com> writes:
> With clang at HEAD, linking fails with "undefined symbol: > qemu_build_not_reached". It's because `store_helper` and > `helper_ret_stb_mmu` are mutually recursive and clang inlined latter > inside the former, making `store_helper` a recursive function and no > longer fully inlineable preventing constant propogation. > > Signed-off-by: Shu-Chun Weng <s...@google.com> > --- > accel/tcg/cputlb.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c > index e3b5750c3b..a7c812ed72 100644 > --- a/accel/tcg/cputlb.c > +++ b/accel/tcg/cputlb.c > @@ -2050,6 +2050,7 @@ store_helper(CPUArchState *env, target_ulong addr, > uint64_t val, > store_memop(haddr, val, op); > } > > +__attribute__((noinline)) > void helper_ret_stb_mmu(CPUArchState *env, target_ulong addr, uint8_t val, > TCGMemOpIdx oi, uintptr_t retaddr) Hmm I wonder if the correct fix is for store_helper to callL store_memop(addr + i, val8, MO_UB); direct in the fallback case - although the page crossing may be tricky to get right. Perhaps we should out of line all the unaligned stuff? -- Alex Bennée