2017-09-20 81 views
0

我目前正在使用LLVM編寫通行證,並且有幾個關於變量/參數/參數名稱的問題。在LLVM IR中提取名稱

  1. 說我有這樣的結構:

    struct Kid { 
        char name[30]; 
        int age; 
        char hobby[30]; 
    }; 
    

我運行一個模塊通,發現Kid的模塊中的相應StructType。我想使用Kid的成員的名字,但我不知道如何訪問它們。我嘗試使用element_iterator,但它只返回成員Type。我如何訪問結構的數據成員的名稱?

編輯:這樣做的目的是讓我能夠確定,我目前正在處理類型「字符」的成員是否爲「名」或「業餘愛好」,這樣我就可以執行各自不同的動作案件。例如:

case "name" do something; 
    case "hobby" do something else; 

是否有另一種方法來區分同一類型的成員?

  1. 說我有一個功能foo(int a, int b)。 如何獲取函數參數的名稱? 我試着在foo的電話上運行一個arg_iterator來找到 的參數,但是當我在一個參數上調用getName()時,它返回一個空的StringRef

將不勝感激任何幫助。

回答

1

LLVM IR中沒有「字段名稱」。事實上,類型的名稱只能用於調試目的,所以你不應該依賴它們。用於表示參數的值的名稱相同 - 可以很容易地將其刪除。

如果您需要源名稱,那麼您需要依賴調試信息。

+0

好的,謝謝。我將編輯該問題以更具體地說明我想要做什麼。 第二個問題呢? – baronzo1

+0

我相信我也回答了第二個問題。所有的「名稱」都是源代碼級別的功能,所以你在IR中沒有它們。這是有原因的,例如否則你將無法處理C/C++聯合或位域。因此,如果您需要使用源代碼級別的東西,那麼您需要在前端內部執行所有操作。或者使用其他方式來恢復必要的信息,例如調試信息。 –

+0

是的,我想編輯該評論,直到某個時刻我才注意到。 謝謝! – baronzo1