On 11/05/2015 12:18, Andreas Färber wrote: >> > + int (*cpu_mmu_index)(CPUState *cpu); >> > + void (*cpu_get_tb_cpu_state)(CPUState *cpu, >> > + void *pc, /* target_long * */ >> > + void *cs_base, /* target_long */ >> > + int *flags); >> > + void (*gen_intermediate_code)(void *env, struct TranslationBlock *tb); >> > + void (*gen_intermediate_code_pc)(void *env, struct TranslationBlock >> > *tb); >> > + void (*restore_state_to_opc)(void *env, struct TranslationBlock *tb, >> > + int pc_pos); >> > + void (*tlb_fill)(CPUState *cs, uint64_t addr, int is_write, int >> > mmu_idx, >> > + uintptr_t retaddr); >> > } CPUClass; >> > >> > #ifdef HOST_WORDS_BIGENDIAN > [snip] > > Paolo had objected to this when I tried it. The counter-suggestion was > something about reworking how the cputlb code is built per target - > please check the archives.
Right. My point was that these functions are not polymorphic. Each call to these should know exactly which function to call. cputlb.c, cpu-exec.c and parts of translate-all.c should be the moral equivalent of C++ templates. I wouldn't mind switching to C++, but if we want to make them polymorphic we should do it at compile time through multiple compilation and/or inclusion from target-*. Paolo