diff options
author | Thomas Munro <tmunro@postgresql.org> | 2021-07-22 14:11:17 +1200 |
---|---|---|
committer | Thomas Munro <tmunro@postgresql.org> | 2021-07-22 15:07:29 +1200 |
commit | b2f759e35f7598ee36d68283a9fd8e9219e11441 (patch) | |
tree | 5fab62692b168210a00187c65e338c64e5cc250a /src | |
parent | 4b39d5c69a67caebe648ce4c32083f162bd239e1 (diff) | |
download | postgresql-b2f759e35f7598ee36d68283a9fd8e9219e11441.tar.gz postgresql-b2f759e35f7598ee36d68283a9fd8e9219e11441.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/jit/llvm/llvmjit_inline.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp index 9c60d58696b..1be56cc8a27 100644 --- a/src/backend/jit/llvm/llvmjit_inline.cpp +++ b/src/backend/jit/llvm/llvmjit_inline.cpp @@ -609,6 +609,17 @@ function_inlinable(llvm::Function &F, 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. */ |