2012-02-17 18 views
4

我想從GENERIC表示中獲取它所聲明的字段的名稱。我有一個BIT_FIELD_REF樹,它的DECL_NAME爲零。例如,如何獲取BIT_FIELD_REF引用的位域的名稱?

struct { 
    int a; 
    unsigned b:1; 
} s; 

... 
if (s.b) 
    ... 

對於S.B我會得到一個BIT_FIELD_REF並沒有明顯的方式來獲得「B」,這是該領域的原始名稱。怎麼做?

回答

1

嘗試從GDB嘗試call debug_c_tree (tree_var)call debug_tree (tree_var),看看是否知道這個名字。如果是這樣,則反向設計漂亮的打印機。

+0

感謝您的建議,但它不知道名稱。 任何其他方式來做到這一點? – 2012-02-24 12:27:38

+0

對不起,如果可以知道,我希望漂亮的打印機打印它。它會在以後的轉儲文件中重新出現嗎?樹-SSA通行證可能?我想是這樣,他們需要從某個地方得到它。 – ams 2012-02-24 12:33:04

+0

問題是,他們確實知道並打印了__some__位字段的轉儲名稱(並非全部,以及我最初感興趣的特定情況最初沒有輸出它的名稱) 我想我會嘗試確定它在哪裏得到名稱當它發生時,但我不確定它打印出來的位置。 – 2012-02-28 15:03:13

0

我到底做了什麼:調查tree-dump.c中的內容我最終了解到,他們所知的位域的名稱來自struct的DIE,並且很難追蹤。

然後我決定從BIT_FIELD_REF參數0(參考結構)類型獲取名稱,它是RECORD_TYPE,它存儲所有字段的大小和偏移量。

問題是要明白,BIT_FIELD_REF不引用位本身:它使用像BIT_FIELD_REF & INTEGER_CST,其中常數像掩碼行爲。在瞭解了這些之後,我很快計算了偏移量並從類型中獲得了名稱。