postgres.git / summary / log / commit / refs
commit b1c1b7af573bbc9fe9039c82ffb7d3a3c378fe4a
Author: Thomas Munro <tmunro@postgresql.org>
Date: Thu Jul 22 02:11:17 2021 +0000
jit: Don't inline functions that access thread-locals.
Code inlined by LLVM can crash or fail with "Relocation type not
implemented yet!" if it tries to access thread local variables. Don't
inline such code.
Back-patch to 11, where LLVM arrived. Bug #16696.
Author: Dmitry Marakasov <amdmi3@amdmi3.ru>
Reviewed-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/16696-29d944a33801fbfe@postgresql.org
src/backend/jit/llvm/llvmjit_inline.cpp | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp
index ea90fd5b24f..6f03595db5a 100644
--- a/src/backend/jit/llvm/llvmjit_inline.cpp
+++ b/src/backend/jit/llvm/llvmjit_inline.cpp
@@ -608,6 +608,17 @@ function_inlinable(llvm::Function &F,
if (rv->materialize())
elog(FATAL, "failed to materialize metadata");
+ /*
+ * Don't inline functions that access thread local variables. That
+ * doesn't work on current LLVM releases (but might in future).
+ */
+ if (rv->isThreadLocal())
+ {
+ ilog(DEBUG1, "cannot inline %s due to thread-local variable %s",
+ F.getName().data(), rv->getName().data());
+ return false;
+ }
+
/*
* Never want to inline externally visible vars, cheap enough to
* reference.
[parent: 227c4e57d6a7]