gallivm: Helper functions for pointer indirection.
This commit is contained in:
parent
225530f1f2
commit
c0d41d0404
|
@ -49,6 +49,8 @@ lp_build_struct_get_ptr(LLVMBuilderRef builder,
|
||||||
{
|
{
|
||||||
LLVMValueRef indices[2];
|
LLVMValueRef indices[2];
|
||||||
LLVMValueRef member_ptr;
|
LLVMValueRef member_ptr;
|
||||||
|
assert(LLVMGetTypeKind(LLVMTypeOf(ptr)) == LLVMPointerTypeKind);
|
||||||
|
assert(LLVMGetTypeKind(LLVMGetElementType(LLVMTypeOf(ptr))) == LLVMStructTypeKind);
|
||||||
indices[0] = LLVMConstInt(LLVMInt32Type(), 0, 0);
|
indices[0] = LLVMConstInt(LLVMInt32Type(), 0, 0);
|
||||||
indices[1] = LLVMConstInt(LLVMInt32Type(), member, 0);
|
indices[1] = LLVMConstInt(LLVMInt32Type(), member, 0);
|
||||||
member_ptr = LLVMBuildGEP(builder, ptr, indices, Elements(indices), "");
|
member_ptr = LLVMBuildGEP(builder, ptr, indices, Elements(indices), "");
|
||||||
|
@ -65,6 +67,8 @@ lp_build_struct_get(LLVMBuilderRef builder,
|
||||||
{
|
{
|
||||||
LLVMValueRef member_ptr;
|
LLVMValueRef member_ptr;
|
||||||
LLVMValueRef res;
|
LLVMValueRef res;
|
||||||
|
assert(LLVMGetTypeKind(LLVMTypeOf(ptr)) == LLVMPointerTypeKind);
|
||||||
|
assert(LLVMGetTypeKind(LLVMGetElementType(LLVMTypeOf(ptr))) == LLVMStructTypeKind);
|
||||||
member_ptr = lp_build_struct_get_ptr(builder, ptr, member, name);
|
member_ptr = lp_build_struct_get_ptr(builder, ptr, member, name);
|
||||||
res = LLVMBuildLoad(builder, member_ptr, "");
|
res = LLVMBuildLoad(builder, member_ptr, "");
|
||||||
lp_build_name(res, "%s.%s", LLVMGetValueName(ptr), name);
|
lp_build_name(res, "%s.%s", LLVMGetValueName(ptr), name);
|
||||||
|
@ -79,6 +83,8 @@ lp_build_array_get_ptr(LLVMBuilderRef builder,
|
||||||
{
|
{
|
||||||
LLVMValueRef indices[2];
|
LLVMValueRef indices[2];
|
||||||
LLVMValueRef element_ptr;
|
LLVMValueRef element_ptr;
|
||||||
|
assert(LLVMGetTypeKind(LLVMTypeOf(ptr)) == LLVMPointerTypeKind);
|
||||||
|
assert(LLVMGetTypeKind(LLVMGetElementType(LLVMTypeOf(ptr))) == LLVMArrayTypeKind);
|
||||||
indices[0] = LLVMConstInt(LLVMInt32Type(), 0, 0);
|
indices[0] = LLVMConstInt(LLVMInt32Type(), 0, 0);
|
||||||
indices[1] = index;
|
indices[1] = index;
|
||||||
element_ptr = LLVMBuildGEP(builder, ptr, indices, Elements(indices), "");
|
element_ptr = LLVMBuildGEP(builder, ptr, indices, Elements(indices), "");
|
||||||
|
@ -97,6 +103,8 @@ lp_build_array_get(LLVMBuilderRef builder,
|
||||||
{
|
{
|
||||||
LLVMValueRef element_ptr;
|
LLVMValueRef element_ptr;
|
||||||
LLVMValueRef res;
|
LLVMValueRef res;
|
||||||
|
assert(LLVMGetTypeKind(LLVMTypeOf(ptr)) == LLVMPointerTypeKind);
|
||||||
|
assert(LLVMGetTypeKind(LLVMGetElementType(LLVMTypeOf(ptr))) == LLVMArrayTypeKind);
|
||||||
element_ptr = lp_build_array_get_ptr(builder, ptr, index);
|
element_ptr = lp_build_array_get_ptr(builder, ptr, index);
|
||||||
res = LLVMBuildLoad(builder, element_ptr, "");
|
res = LLVMBuildLoad(builder, element_ptr, "");
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -113,6 +121,37 @@ lp_build_array_set(LLVMBuilderRef builder,
|
||||||
LLVMValueRef value)
|
LLVMValueRef value)
|
||||||
{
|
{
|
||||||
LLVMValueRef element_ptr;
|
LLVMValueRef element_ptr;
|
||||||
|
assert(LLVMGetTypeKind(LLVMTypeOf(ptr)) == LLVMPointerTypeKind);
|
||||||
|
assert(LLVMGetTypeKind(LLVMGetElementType(LLVMTypeOf(ptr))) == LLVMArrayTypeKind);
|
||||||
element_ptr = lp_build_array_get_ptr(builder, ptr, index);
|
element_ptr = lp_build_array_get_ptr(builder, ptr, index);
|
||||||
LLVMBuildStore(builder, value, element_ptr);
|
LLVMBuildStore(builder, value, element_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LLVMValueRef
|
||||||
|
lp_build_pointer_get(LLVMBuilderRef builder,
|
||||||
|
LLVMValueRef ptr,
|
||||||
|
LLVMValueRef index)
|
||||||
|
{
|
||||||
|
LLVMValueRef element_ptr;
|
||||||
|
LLVMValueRef res;
|
||||||
|
assert(LLVMGetTypeKind(LLVMTypeOf(ptr)) == LLVMPointerTypeKind);
|
||||||
|
element_ptr = LLVMBuildGEP(builder, ptr, &index, 1, "");
|
||||||
|
res = LLVMBuildLoad(builder, element_ptr, "");
|
||||||
|
#ifdef DEBUG
|
||||||
|
lp_build_name(res, "%s[%s]", LLVMGetValueName(ptr), LLVMGetValueName(index));
|
||||||
|
#endif
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
lp_build_pointer_set(LLVMBuilderRef builder,
|
||||||
|
LLVMValueRef ptr,
|
||||||
|
LLVMValueRef index,
|
||||||
|
LLVMValueRef value)
|
||||||
|
{
|
||||||
|
LLVMValueRef element_ptr;
|
||||||
|
element_ptr = LLVMBuildGEP(builder, ptr, &index, 1, "");
|
||||||
|
LLVMBuildStore(builder, value, element_ptr);
|
||||||
|
}
|
||||||
|
|
|
@ -96,4 +96,21 @@ lp_build_array_set(LLVMBuilderRef builder,
|
||||||
LLVMValueRef index,
|
LLVMValueRef index,
|
||||||
LLVMValueRef value);
|
LLVMValueRef value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of an array element.
|
||||||
|
*/
|
||||||
|
LLVMValueRef
|
||||||
|
lp_build_pointer_get(LLVMBuilderRef builder,
|
||||||
|
LLVMValueRef ptr,
|
||||||
|
LLVMValueRef index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value of an array element.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
lp_build_pointer_set(LLVMBuilderRef builder,
|
||||||
|
LLVMValueRef ptr,
|
||||||
|
LLVMValueRef index,
|
||||||
|
LLVMValueRef value);
|
||||||
|
|
||||||
#endif /* !LP_BLD_STRUCT_H */
|
#endif /* !LP_BLD_STRUCT_H */
|
||||||
|
|
Loading…
Reference in New Issue