C++ llvm能发出跳转到函数中给定地址的代码吗?

C++ llvm能发出跳转到函数中给定地址的代码吗?,c++,c,llvm,C++,C,Llvm,接下来的问题是,llvm是否有可能生成可以跳转到同一地址空间中函数内任意地址的代码? i、 e void func1(){ ... ... } void func2(){ ... 地址2: ... } 是,否,是,否,(是)-这取决于您所看到的级别以及您对可能的含义: 是的,因为llvm后端将生成特定于目标的汇编程序 指令和那些汇编程序指令允许设置 将程序计数器设置为任意值 不,因为——据我所知——llvm ir(类似于clang的前端编译c代码的中间表示)没有任何允许在(llvm ir)函

接下来的问题是,llvm是否有可能生成可以跳转到同一地址空间中函数内任意地址的代码? i、 e

void func1(){
...
<跳转到addr2的代码>
...
}
void func2(){
...
地址2:
...
}
是,否,是,否,(是)-这取决于您所看到的级别以及您对
可能的含义:

  • 是的,因为llvm后端将生成特定于目标的汇编程序 指令和那些汇编程序指令允许设置 将程序计数器设置为任意值
  • 不,因为——据我所知——llvm ir(类似于clang的前端编译c代码的中间表示)没有任何允许在(llvm ir)函数之间进行任意跳跃的指令
  • 是的,因为前端肯定可以生成模拟这种行为的代码(将func2分解为多个单独的函数)
  • 不,因为C和C++不允许这样的跳跃到任意位置,因此CLAN将不会编译任何试图执行该程序的程序(例如,通过<代码> Goto < /Cord>)
  • (是)c
    longjmp
    宏跳回您已经访问过的控制流中的某个位置(您在该位置调用了
    setjmp
    ),但也恢复(大部分)系统状态编辑:但是,如果func2不在当前调用堆栈中您跳转的位置,则这是UB

这被认为是不好的做法,因为它可能导致“意大利面代码”()。编写一个新函数func3,从func1和func2@Brainless:“意大利面代码”对可维护性是一种风险。因为生成的代码不需要维护(而是维护生成它的源代码),所以不管它有多垃圾化。@MSalters问题更多的是关于发出这种代码的可能性,而不是实际编写它。
      void func1() {
       ...
       <code that jumps to addr2>
       ...
       }

       void func2() {
       ...
addr2:
       <some code in func2()>
       ...
       }