llvm可以发出跳转到函数内给定地址的代码吗?

时间:2015-04-01 08:50:53

标签: c++ c llvm

关注this问题,llvm是否可以生成可能跳转到同一地址空间中函数内任意地址的代码? 即。

      void func1() {
       ...
       <code that jumps to addr2>
       ...
       }

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

1 个答案:

答案 0 :(得分:3)

是,否,是,否,(是) - 这取决于您查看的级别以及possible的含义:

  • 是的,因为llvm后端将生成目标特定的汇编程序 指令和那些汇编程序指令允许设置 程序反对一个abitrary价值。
  • 不,因为 - 据我所知 - llvm ir(像clang这样的前端编译你的c代码的中间表示)没有任何允许在(llvm-ir)函数之间进行abitrary跳转的指令。 / LI>
  • 是的,因为前端COULD肯定会生成代码,模拟该行为(将func2分解为多个独立的函数)。
  • 不,因为C和C ++不允许这样的跳转到ARBITRARY位置,所以clang不会编译任何尝试这样做的程序(例如通过goto
  • (是)c longjmp宏跳回到您已访问过的控制流中的某个位置(您调用setjmp的位置),但也恢复(大部分)系统状态。 编辑:但是,如果func2不在你跳转的当前callstack的某个地方,那么这就是UB。