GCCJIT,获取类型的大小

GCCJIT,获取类型的大小,c,gcc,libgccjit,C,Gcc,Libgccjit,给定一个gcc_jit_类型的指针,有没有办法得到它的大小?我一直在查看文档,但找不到类似sizeof操作符的示例。我想写一种通用的数据结构,它被赋予一个gcc_jit_类型,并根据它进行编译。如果我不知道类型的大小,就有点难做。我设法拼凑出一个解决方案,但我觉得这比应该的要难得多。在我看来,api中肯定应该添加类似于gcc\u jit\u type\u sizeof(…)的函数 我意识到在C代码中,sizeof(T)=(size_T)(1+(T*)0)所以我尝试用gccjit实现这一点。在这样

给定一个gcc_jit_类型的指针,有没有办法得到它的大小?我一直在查看文档,但找不到类似sizeof操作符的示例。我想写一种通用的数据结构,它被赋予一个gcc_jit_类型,并根据它进行编译。如果我不知道类型的大小,就有点难做。

我设法拼凑出一个解决方案,但我觉得这比应该的要难得多。在我看来,api中肯定应该添加类似于
gcc\u jit\u type\u 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中,您也不能将指针类型强制转换为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);
}
编辑: 我刚刚想出了如何将指针强制转换为整数类型。您可以将其自身按位和,并将结果类型设置为大小

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);

低音量<代码>jit@gcc.gnu.orgmaillist可能是问这样一个问题的更好地方,然后你可以在这里自我回答:)然后将对象/类型的大小作为第一个字段。“给定一个gcc\u jit\u类型指针,有没有办法获得它的大小?”好奇的是,
sizeof(gcc\u jit\u类型)为什么
没有给你指针的大小吗?是的,这确实给了我c程序中指针的大小。我所说的是获取我正在JIT编译的程序中类型的大小。