2015-11-11 78 views
0

我想通過所有階段來檢查DAG,以確定指令選擇出錯的位置。但是我不確定如何解釋輸出DAG中的某些符號。閱讀LLVM DAG

首先,LLVM-IR的功能:

define i32 @get_data() #0 { 
entry: 
    %0 = load i32* @data, align 4 
    ret i32 %0 
} 

我跑LLC與-debug,我看到最初的選擇DAG爲我感興趣的功能是:

=== get_data 
Initial selection DAG: BB#0 'get_data:entry' 
SelectionDAG has 8 nodes: 
0x38d60f0: ch = EntryToken 

    0x3902cf0: i64 = Constant<0> 

    0x3903020: i32 = Register %R1 

    0x38d60f0: <multiple use> 
    0x3903020: <multiple use> 
     0x38d60f0: <multiple use> 
     0x3902be0: i64 = GlobalAddress<i32* @data> 0 [ORD=2] 

     0x3902e00: i64 = undef 

    0x3902f10: i32,ch = load 0x38d60f0, 0x3902be0, 0x3902e00<LD4[@data]> [ORD=2] 

    0x3903130: ch,glue = CopyToReg 0x38d60f0, 0x3903020, 0x3902f10 [ORD=3] 

    0x3903130: <multiple use> 
    0x3903020: <multiple use> 
    0x3903130: <multiple use> 

我想知道上面的加載指令,特別是第三個操作數:

0x3902e00<LD4[@data]> 

我可以告訴從在節點0x3902e00之上是未定義的,但我應該如何讀取'<'和'>'之間的部分?這個結構是什麼意思?

回答

2

所有內存操作節點還捕獲受操作影響的內存引用。此引用通過MachineMemOperand類進行描述,您可以使用getMemOperand()調用將其從節點中取出。你在裏面看到的是MachineMemOperand的內容。這裏基本上說它是IR值@base的大小4的負載。

有關更多信息,請參見MachineMemOperand :: print()。它可能還包括其他一些東西,包括偏移量,地址空間,AA信息,加載/存儲是否是非時間的等等。