2017-10-05 57 views
2

給定一個gcc_jit_type指針有什麼辦法來獲得它的大小?我一直在查看文檔,但我找不到像sizeof運算符那樣的示例。我想寫一種通用的數據結構,它被賦予一個gcc_jit_type並從中編譯。如果我不知道類型的大小,很難做。GCCJIT,獲得一個類型的大小

+1

低容積'JIT @ gcc.gnu.org'郵件列表可能是一個更好的地方,問這樣的問題 –

+0

然後你可以自行答案在這裏:) –

+0

然後將作爲第一場對象/類型的大小。 –

回答

0

我設法解決了一個解決方案,但我覺得它比應該的方式更難。在我看來,肯定應該在API中添加gcc_jit_type_sizeof(...)函數。

我意識到在C代碼sizeof(T) = (size_t)(1 + (T*)0)所以我試圖用gccjit來實現這個。在做這件事時,我意識到沒有真正的方法來給api增加一個指針。我試圖使用加法二進制opp,但這給了我一個錯誤,因爲兩個操作數都需要是相同的類型。將一個int添加到指針在gccjit中是無效的。我嘗試將一個指針分配給零,另一個指向另一個,然後添加那些但給出了奇怪結果的指針。我想這是有道理的,因爲(int*)0 + (int*)1是C.

編譯錯誤,我想接下來的事情是這個等價的C (size_t)&((T*)0)[1] - (size_t)((T*)0)也未能在gccjit becase的編譯,你不能將指針類型爲int無論是。我終於通過將它改爲(char*)&((T*)0)[1] - (char*)((T*)0)來工作,因爲您可以將指針轉換爲另一個指針類型。

gcc_jit_rvalue* jit_sizeof(gcc_jit_context* ctx, gcc_jit_type* t) 
{ 
    const void* NULL_PTR = 0; 

    gcc_jit_type* t_ptr_type = gcc_jit_type_get_pointer(t); 
    gcc_jit_type* size_type = gcc_jit_context_get_type(ctx, GCC_JIT_TYPE_SIZE_T); 
    gcc_jit_type* byte_type_ptr = gcc_jit_type_get_pointer(gcc_jit_context_get_int_type(ctx, 1, 0)); 

    gcc_jit_rvalue* one = gcc_jit_context_new_rvalue_from_int(ctx, size_type, 1); 

    gcc_jit_rvalue* ptr_0 = gcc_jit_context_new_rvalue_from_ptr(ctx, t_ptr_type, &NULL_PTR); 
    gcc_jit_rvalue* ptr_1 = gcc_jit_lvalue_get_address(gcc_jit_context_new_array_access(ctx, NULL, ptr_0, one), NULL); 

    ptr_0 = gcc_jit_context_new_cast(ctx, NULL, ptr_0, byte_type_ptr); 
    ptr_1 = gcc_jit_context_new_cast(ctx, NULL, ptr_1, byte_type_ptr); 

    return gcc_jit_context_new_binary_op(ctx, NULL, GCC_JIT_BINARY_OP_MINUS, size_type, ptr_1, ptr_0); 
} 

編輯: 我只是想出瞭如何將一個指針轉換爲整數類型爲好。你可以按位自行設置結果類型爲size_t。

ptr_0 = gcc_jit_context_new_binary_op(ctx, NULL, GCC_JIT_BINARY_OP_BITWISE_AND, size_type, ptr_0, ptr_0); 
ptr_1 = gcc_jit_context_new_binary_op(ctx, NULL, GCC_JIT_BINARY_OP_BITWISE_AND, size_type, ptr_1, ptr_1); 

return gcc_jit_context_new_binary_op(ctx, NULL, GCC_JIT_BINARY_OP_MINUS, size_type, ptr_1, ptr_0);