summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary
diff options
context:
space:
mode:
authorJose Fonseca <[email protected]>2016-04-02 14:31:16 +0100
committerJose Fonseca <[email protected]>2016-04-03 09:51:27 +0100
commitbcfb86b09de3bfc9c7cdf6925658b5e529a8fc62 (patch)
tree3609f16a54701d648f10beba4b7b0450300e6f0d /src/gallium/auxiliary
parent6d54096fa6cde0ebc7da29468071fe2c34aec0cf (diff)
gallivm: Use standard LLVMSetAlignment from LLVM 3.4 onwards.
Only provide a fallback for LLVM 3.3. One less dependency on LLVM C++ interface. Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r--src/gallium/auxiliary/draw/draw_llvm.c4
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld.h14
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c2
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_gather.c2
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_init.h8
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_misc.cpp26
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c2
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_struct.c4
8 files changed, 37 insertions, 25 deletions
diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
index b48bdcc779e..9c68d4fbf78 100644
--- a/src/gallium/auxiliary/draw/draw_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_llvm.c
@@ -817,7 +817,7 @@ store_aos(struct gallivm_state *gallivm,
#endif
/* Unaligned store due to the vertex header */
- lp_set_store_alignment(LLVMBuildStore(builder, value, data_ptr), sizeof(float));
+ LLVMSetAlignment(LLVMBuildStore(builder, value, data_ptr), sizeof(float));
}
/**
@@ -1069,7 +1069,7 @@ store_clip(struct gallivm_state *gallivm,
clip_ptr = LLVMBuildPointerCast(builder, clip_ptr, clip_ptr_type, "");
/* Unaligned store */
- lp_set_store_alignment(LLVMBuildStore(builder, aos[j], clip_ptr), sizeof(float));
+ LLVMSetAlignment(LLVMBuildStore(builder, aos[j], clip_ptr), sizeof(float));
}
}
diff --git a/src/gallium/auxiliary/gallivm/lp_bld.h b/src/gallium/auxiliary/gallivm/lp_bld.h
index 7ba925c4803..239c27e3c25 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld.h
@@ -95,4 +95,18 @@ typedef void *LLVMMCJITMemoryManagerRef;
#define LLVMInsertBasicBlock ILLEGAL_LLVM_FUNCTION
#define LLVMCreateBuilder ILLEGAL_LLVM_FUNCTION
+
+/*
+ * Before LLVM 3.4 LLVMSetAlignment only supported GlobalValue, not
+ * LoadInst/StoreInst as we need.
+ */
+#if HAVE_LLVM < 0x0304
+# ifdef __cplusplus
+ extern "C"
+# endif
+ void LLVMSetAlignmentBackport(LLVMValueRef V, unsigned Bytes);
+# define LLVMSetAlignment LLVMSetAlignmentBackport
+#endif
+
+
#endif /* LP_BLD_H */
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c b/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
index ee3ca86c000..8cad3a6fc65 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
@@ -74,7 +74,7 @@ lp_build_fetch_rgba_aos_array(struct gallivm_state *gallivm,
ptr = LLVMBuildGEP(builder, base_ptr, &offset, 1, "");
ptr = LLVMBuildPointerCast(builder, ptr, LLVMPointerType(src_vec_type, 0), "");
res = LLVMBuildLoad(builder, ptr, "");
- lp_set_load_alignment(res, src_type.width / 8);
+ LLVMSetAlignment(res, src_type.width / 8);
/* Truncate doubles to float */
if (src_type.floating && src_type.width == 64) {
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_gather.c b/src/gallium/auxiliary/gallivm/lp_bld_gather.c
index d02602041ce..c641c8bafc1 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_gather.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_gather.c
@@ -112,7 +112,7 @@ lp_build_gather_elem(struct gallivm_state *gallivm,
* gallium could not do anything else except 16 no matter what...
*/
if (!aligned) {
- lp_set_load_alignment(res, 1);
+ LLVMSetAlignment(res, 1);
}
assert(src_width <= dst_width);
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.h b/src/gallium/auxiliary/gallivm/lp_bld_init.h
index ab44661a271..f0155b3a2ef 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_init.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_init.h
@@ -77,14 +77,6 @@ func_pointer
gallivm_jit_function(struct gallivm_state *gallivm,
LLVMValueRef func);
-void
-lp_set_load_alignment(LLVMValueRef Inst,
- unsigned Align);
-
-void
-lp_set_store_alignment(LLVMValueRef Inst,
- unsigned Align);
-
#ifdef __cplusplus
}
#endif
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
index 30ef37c9d22..61a50fa3b2e 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
+++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
@@ -187,22 +187,28 @@ lp_build_load_volatile(LLVMBuilderRef B, LLVMValueRef PointerVal,
}
-extern "C"
-void
-lp_set_load_alignment(LLVMValueRef Inst,
- unsigned Align)
-{
- llvm::unwrap<llvm::LoadInst>(Inst)->setAlignment(Align);
-}
+#if HAVE_LLVM < 0x0304
extern "C"
void
-lp_set_store_alignment(LLVMValueRef Inst,
- unsigned Align)
+LLVMSetAlignmentBackport(LLVMValueRef V,
+ unsigned Bytes)
{
- llvm::unwrap<llvm::StoreInst>(Inst)->setAlignment(Align);
+ switch (LLVMGetInstructionOpcode(V)) {
+ case LLVMLoad:
+ llvm::unwrap<llvm::LoadInst>(V)->setAlignment(Bytes);
+ break;
+ case LLVMStore:
+ llvm::unwrap<llvm::StoreInst>(V)->setAlignment(Bytes);
+ break;
+ default:
+ assert(0);
+ break;
+ }
}
+#endif
+
#if HAVE_LLVM < 0x0306
typedef llvm::JITMemoryManager BaseMemoryManager;
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
index e21933ffc85..937948bbb02 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
@@ -1939,7 +1939,7 @@ lp_build_clamp_border_color(struct lp_build_sample_context *bld,
LLVMPointerType(vec4_bld.vec_type, 0), "");
border_color = LLVMBuildLoad(builder, border_color_ptr, "");
/* we don't have aligned type in the dynamic state unfortunately */
- lp_set_load_alignment(border_color, 4);
+ LLVMSetAlignment(border_color, 4);
/*
* Instead of having some incredibly complex logic which will try to figure out
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_struct.c b/src/gallium/auxiliary/gallivm/lp_bld_struct.c
index cc248d15e97..0df44164d80 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_struct.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_struct.c
@@ -157,7 +157,7 @@ lp_build_pointer_get_unaligned(LLVMBuilderRef builder,
assert(LLVMGetTypeKind(LLVMTypeOf(ptr)) == LLVMPointerTypeKind);
element_ptr = LLVMBuildGEP(builder, ptr, &index, 1, "");
res = LLVMBuildLoad(builder, element_ptr, "");
- lp_set_load_alignment(res, alignment);
+ LLVMSetAlignment(res, alignment);
#ifdef DEBUG
lp_build_name(res, "%s[%s]", LLVMGetValueName(ptr), LLVMGetValueName(index));
#endif
@@ -188,5 +188,5 @@ lp_build_pointer_set_unaligned(LLVMBuilderRef builder,
LLVMValueRef instr;
element_ptr = LLVMBuildGEP(builder, ptr, &index, 1, "");
instr = LLVMBuildStore(builder, value, element_ptr);
- lp_set_store_alignment(instr, alignment);
+ LLVMSetAlignment(instr, alignment);
}