2015-04-01 53 views
2

跟進this問題,是否有可能讓llvm生成可能跳轉到同一地址空間中的函數中的任意地址的代碼? 即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 2015-04-01 09:19:03

+2

@Brainless:「意大利麪代碼」是一種可維護性的風險。由於生成的代碼不需要維護(取而代之,您維護生成代碼的源代碼),因此它是如何表面化的並不重要。 – MSalters 2015-04-01 10:07:49

+0

@MSalters問題更多的是關於發佈這種代碼的可能性,而不是實際編寫代碼。 – Sebi 2015-04-01 10:31:50

回答

2

是,否,是,否,(是) - 這取決於你看,你的意思與possible水平:

  • 是的,作爲LLVM後端將產生目標指定的彙編程序 指令和那些彙編程序指令允許將 程序計數器設置爲abitrary值。
  • 不,因爲 - 據我所知 - llvm ir(像clang這樣的前端編譯你的c代碼的中間表示)沒有任何允許(llvm-ir)函數之間跳躍的指令。
  • 是的,因爲前端COULD肯定會產生代碼,可以模擬這種行爲(將func2分解爲多個單獨的函數)。
  • 沒有,因爲C和C++不允許這種跳轉到任意位置,因此鐺不會編譯試圖做到這一點(例如經由goto
  • (是)的C longjmp宏觀跳回到任何程序放置在您已經訪問過的控制流中(您調用setjmp的地方),但也恢復(大部分)系統狀態。
相關問題