![](/img/trans.png)
[英]Translation of machinecode into LLVM IR (disassembly / reassembly of X86_64. X86. ARM into LLVM bitcode)
[英]Understanding llvm-ir to assembly for x86_64-unknown-linux-gnu
我轉換以下llvm-IR
; Function Attrs: noinline norecurse nounwind uwtable
define i32 @main() #0{
entry:
%sub = sub nsw i32 5, 3
%cmp = icmp slt i32 %sub, 3
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
%mul = mul nsw i32 %sub, 2
br label %if.end
if.else: ; preds = %entry
%sub1 = sub nsw i32 %sub, 3
br label %if.end
if.end: ; preds = %if.else,
%if.then
%y.0 = phi i32 [ %mul, %if.then ], [ %sub1, %if.else ]
%sub2 = sub nsw i32 %sub, %y.0
%add = add nsw i32 %sub, %y.0
ret i32 0
}
使用llc sample.ll
生成x86_64-unknown-linux-gnu
匯編代碼,生成匯編代碼:
.text
.file "phi.cpp"
.globl main # -- Begin function main
.p2align 4, 0x90
.type main,@function
main: # @main
.cfi_startproc
# BB#0: # %entry
pushq %rbp
.Lcfi0:
.cfi_def_cfa_offset 16
.Lcfi1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
.Lcfi2:
.cfi_def_cfa_register %rbp
xorl %eax, %eax
testb %al, %al
xorl %eax, %eax
popq %rbp
retq
.Lfunc_end0:
.size main, .Lfunc_end0-main
.cfi_endproc
# -- End function
上面代碼中的寄存器: %rbp
是基指針,它指向當前堆棧幀的底部, %rsp
是堆棧指針,它指向當前堆棧幀的頂部,並且操作數存儲在%eax
和%al
用於算術運算,但是在%eax
和%al
寄存器中找不到要加載值的指令,我也想知道
lli
默認值為-O2
,您的代碼以一個常量表達式sub nsw i32 5, 3
。 因此,您的函數基本上什么也沒有做,並且LLVM唯一應保留的是使EAX無效。
如果您運行lli -O0 your.ll
,則會得到很多冗長的代碼,這些代碼會在堆棧上溢出並注冊負載。
順便說一句,有一對稱為mem2reg
和reg2mem
的傳遞,可以將代碼從SSA格式來回轉換。 具體來說,這些過程會將phi
節點轉換為分支,並在IR中引入顯式存儲和負載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.