GCCJIT,得到一个类型的大小

时间:2017-10-05 10:30:32

标签: c gcc libgccjit

鉴于gcc_jit_type指针有什么方法可以获得它的大小?我一直在查看文档,我真的找不到像sizeof运算符这样的例子。我想写一种通用数据结构,给出一个gcc_jit_type并从中编译。如果我不知道类型的大小,那很难做到。

1 个答案:

答案 0 :(得分:0)

我设法破解了一个解决方案,但我觉得它比它应该更难。在我看来,绝对应该在api中加入gcc_jit_type_sizeof(...)函数。

我意识到在C代码sizeof(T) = (size_t)(1 + (T*)0)中,所以我尝试用gccjit实现它。在做的事情中,我意识到没有真正的方法来增加给定api的指针。我试图使用额外的二元对手,但这给了我一个错误,因为两个操作数需要是相同的类型。在gccjit中向int添加int是无效的。我尝试将一个指针指向零,另一个指向一个并添加那些指针,但这会产生奇怪的结果。我想这是有道理的,因为(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);
}

编辑: 我只是弄清楚如何将指针转换为整数类型。你可以按位和它自己,并将结果类型设置为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);