summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/jit/llvm/llvmjit.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index 43bed78a52..7965b61165 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -324,26 +324,46 @@ llvm_pg_func(LLVMModuleRef mod, const char *funcname)
}
/*
- * Copy attributes from one function to another.
+ * Copy attributes from one function to another, for a specific index (an
+ * index can reference return value, function and parameter attributes).
*/
-void
-llvm_copy_attributes(LLVMValueRef v_from, LLVMValueRef v_to)
+static void
+llvm_copy_attributes_at_index(LLVMValueRef v_from, LLVMValueRef v_to, uint32 index)
{
int num_attributes;
- int attno;
LLVMAttributeRef *attrs;
- num_attributes =
- LLVMGetAttributeCountAtIndex(v_from, LLVMAttributeFunctionIndex);
+ num_attributes = LLVMGetAttributeCountAtIndex(v_from, index);
attrs = palloc(sizeof(LLVMAttributeRef) * num_attributes);
- LLVMGetAttributesAtIndex(v_from, LLVMAttributeFunctionIndex, attrs);
+ LLVMGetAttributesAtIndex(v_from, index, attrs);
- for (attno = 0; attno < num_attributes; attno++)
- {
- LLVMAddAttributeAtIndex(v_to, LLVMAttributeFunctionIndex,
- attrs[attno]);
- }
+ for (int attno = 0; attno < num_attributes; attno++)
+ LLVMAddAttributeAtIndex(v_to, index, attrs[attno]);
+
+ pfree(attrs);
+}
+
+/*
+ * Copy all attributes from one function to another. I.e. function, return and
+ * parameters will be copied.
+ */
+void
+llvm_copy_attributes(LLVMValueRef v_from, LLVMValueRef v_to)
+{
+ uint32 param_count;
+
+ /* copy function attributes */
+ llvm_copy_attributes_at_index(v_from, v_to, LLVMAttributeFunctionIndex);
+
+ /* and the return value attributes */
+ llvm_copy_attributes_at_index(v_from, v_to, LLVMAttributeReturnIndex);
+
+ /* and each function parameter's attribute */
+ param_count = LLVMCountParams(v_from);
+
+ for (int paramidx = 1; paramidx <= param_count; paramidx++)
+ llvm_copy_attributes_at_index(v_from, v_to, paramidx);
}
/*