LLVM是否能够生成跳转到函数内指定地址的代码?

3

关于这个问题的后续,LLVM是否可以生成代码,在同一地址空间的函数内跳转到任意地址?

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

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

1
这被认为是一种不好的做法,因为它可能会导致“意大利面条式代码”(http://en.wikipedia.org/wiki/Spaghetti_code)。相反,编写一个新的函数func3,你可以从func1和func2中调用。 - Brainless
2
@Brainless:“意大利面条式代码”是可维护性的风险。由于生成的代码不需要维护(相反,您需要维护生成它的源代码),因此它的复杂程度并不重要。 - MSalters
@MSalters 这个问题更多地涉及能否发出这样的代码,而不是实际编写它。 - Sebi
1个回答

3
是的,不是,是的,不是,(是的)-这取决于您所关注的级别和您对“可能性”的理解:
- 是的,因为 LLVM 后端将生成目标特定的汇编指令,并且这些汇编指令允许将程序计数器设置为任意值。 - 不是,因为就我所知,LLVM IR(前端(如 clang)将您的 C 代码编译成其中间表示形式的 IR)没有任何指令允许在(llvm-ir)函数之间进行任意跳转。 - 是的,因为前端可以肯定地生成模拟该行为的代码(将 func2 分解成多个单独的函数)。 - 不是,因为 C 和 C++ 不允许跳转到任意位置,所以 clang 不会编译任何试图通过 goto 进行跳转的程序。 - (是的)C 的 longjmp 宏跳回到您已经访问过的控制流中的一个位置(即您调用 setjmp 的位置),但也恢复了(大部分)系统状态。编辑:但是,如果 func2 不在从您跳转的当前调用堆栈中的某个位置,则此操作是未定义的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接