gpt4 book ai didi

c - 在对目标架构的了解有限的情况下进行 JITtting

转载 作者:行者123 更新时间:2023-12-02 05:29:41 25 4
gpt4 key购买 nike

我已经使用计算的 goto(see here 如果不熟悉的话)实现了一个小的字节码解释器。

似乎可以通过复制标签之间的内存来进行简单的 JITting,从而优化跳转。例如,假设我的解释器中有以下内容:

op_inc: val++; DISPATCH();

我会把它改成:

op_inc: val++;
op_inc_end:

在进行 JIT 时,我会将标签之间的内存附加到我的输出中:

memcpy(jit_code+offset, &&op_inc, &&op_inc_end - &&op_inc);

(jit_code 使用 mmap 标记为可执行)

最后,我将使用计算的 goto 跳转到复制的机器代码的开头:

goto *(void*)jit_code

这行得通吗?我的机器代码心智模型中是否缺少某些东西会阻碍这个想法?

让我们假设代码和数据共享相同的地址空间。我们还假设 PIC。

更新

查看 linked article 中的示例,在删除 DISPATCH 之后,我们有:

        do_inc:
val++;
do_dec:
val--;
do_mul2:
val *= 2;
do_div2:
val /= 2;
do_add7:
val += 7;
do_neg:
val = -val;
do_halt:
return val;

do_inc(未优化)的生成代码很简单:

Ltmp0:                                  ## Block address taken
## %bb.1:
movl -20(%rbp), %eax
addl $1, %eax
movl %eax, -20(%rbp)

(紧随其后的是 do_dec)。看起来这个小片段可以剪掉。

最佳答案

这是在一种架构上不起作用的另一个原因:

ARM Thumb 代码使用具有 PC 相对寻址的外联立即值。像这样的操作

a += 12345;

可以编译为:

ldr  r3, [pc, #<offset to constant>]
adds r0, r4, r3

… other unrelated code …

bx lr ; end of the function
.word 12345 ; oh, and here's the constant

复制此函数的一个片段会使对常量的引用无法解析;它最终会使用内存中其他地方的意外值。

关于c - 在对目标架构的了解有限的情况下进行 JITtting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56875298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com