2017-10-05 59 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);