From ced3e5fd1809e38986e769384f13c2b689cd5333 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Tue, 10 Mar 2026 17:35:17 +1300
Subject: [PATCH v2 10/19] Use stack_buffer in LLVM code.

---
 src/backend/jit/llvm/llvmjit.c      | 21 ++++++++++++++-------
 src/backend/jit/llvm/llvmjit_expr.c |  7 +++++--
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index 2e8aa4749db..957241c64b5 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -41,6 +41,7 @@
 #include "storage/ipc.h"
 #include "utils/memutils.h"
 #include "utils/resowner.h"
+#include "utils/stack_buffer.h"
 
 #define LLVMJIT_LLVM_CONTEXT_REUSE_MAX 100
 
@@ -495,18 +496,20 @@ llvm_copy_attributes_at_index(LLVMValueRef v_from, LLVMValueRef v_to, uint32 ind
 	int			num_attributes;
 	LLVMAttributeRef *attrs;
 
+	DECLARE_STACK_BUFFER();
+
 	num_attributes = LLVMGetAttributeCountAtIndex(v_from, index);
 
 	if (num_attributes == 0)
 		return;
 
-	attrs = palloc_array(LLVMAttributeRef, num_attributes);
+	attrs = stack_buffer_alloc_array(LLVMAttributeRef, num_attributes);
 	LLVMGetAttributesAtIndex(v_from, index, attrs);
 
 	for (int attno = 0; attno < num_attributes; attno++)
 		LLVMAddAttributeAtIndex(v_to, index, attrs[attno]);
 
-	pfree(attrs);
+	stack_buffer_free(attrs);
 }
 
 /*
@@ -1126,13 +1129,17 @@ llvm_resolve_symbols(LLVMOrcDefinitionGeneratorRef GeneratorObj, void *Ctx,
 					 LLVMOrcJITDylibRef JD, LLVMOrcJITDylibLookupFlags JDLookupFlags,
 					 LLVMOrcCLookupSet LookupSet, size_t LookupSetSize)
 {
+	LLVMErrorRef error;
+	LLVMOrcMaterializationUnitRef mu;
+	LLVMOrcCSymbolMapPairs symbols;
+
+	DECLARE_STACK_BUFFER();
+
 #if LLVM_VERSION_MAJOR > 14
-	LLVMOrcCSymbolMapPairs symbols = palloc0_array(LLVMOrcCSymbolMapPair, LookupSetSize);
+	symbols = stack_buffer_alloc0_array(LLVMOrcCSymbolMapPair, LookupSetSize);
 #else
-	LLVMOrcCSymbolMapPairs symbols = palloc0_array(LLVMJITCSymbolMapPair, LookupSetSize);
+	symbols = stack_buffer_alloc0_array(LLVMJITCSymbolMapPair, LookupSetSize);
 #endif
-	LLVMErrorRef error;
-	LLVMOrcMaterializationUnitRef mu;
 
 	for (int i = 0; i < LookupSetSize; i++)
 	{
@@ -1149,7 +1156,7 @@ llvm_resolve_symbols(LLVMOrcDefinitionGeneratorRef GeneratorObj, void *Ctx,
 	if (error != LLVMErrorSuccess)
 		LLVMOrcDisposeMaterializationUnit(mu);
 
-	pfree(symbols);
+	stack_buffer_free(symbols);
 
 	return error;
 }
diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c
index 650f1d42a93..411e4746ee9 100644
--- a/src/backend/jit/llvm/llvmjit_expr.c
+++ b/src/backend/jit/llvm/llvmjit_expr.c
@@ -41,6 +41,7 @@
 #include "utils/fmgrtab.h"
 #include "utils/lsyscache.h"
 #include "utils/memutils.h"
+#include "utils/stack_buffer.h"
 #include "utils/timestamp.h"
 #include "utils/typcache.h"
 #include "utils/xml.h"
@@ -3063,12 +3064,14 @@ build_EvalXFuncInt(LLVMBuilderRef b, LLVMModuleRef mod, const char *funcname,
 	int			argno = 0;
 	LLVMValueRef v_ret;
 
+	DECLARE_STACK_BUFFER();
+
 	/* cheap pre-check as llvm just asserts out */
 	if (LLVMCountParams(v_fn) != (nargs + 2))
 		elog(ERROR, "parameter mismatch: %s expects %d passed %d",
 			 funcname, LLVMCountParams(v_fn), nargs + 2);
 
-	params = palloc_array(LLVMValueRef, (2 + nargs));
+	params = stack_buffer_alloc_array(LLVMValueRef, (2 + nargs));
 
 	params[argno++] = v_state;
 	params[argno++] = l_ptr_const(op, l_ptr(StructExprEvalStep));
@@ -3078,7 +3081,7 @@ build_EvalXFuncInt(LLVMBuilderRef b, LLVMModuleRef mod, const char *funcname,
 
 	v_ret = l_call(b, LLVMGetFunctionType(v_fn), v_fn, params, argno, "");
 
-	pfree(params);
+	stack_buffer_free(params);
 
 	return v_ret;
 }
-- 
2.53.0

