From: Dmitry Marakasov <amdmi3@amdmi3.ru>
To: Andres Freund <andres@anarazel.de>
Cc: pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #16696: Backend crash in llvmjit
Date: Mon, 16 Nov 2020 03:45:29 +0300
Message-ID: <20201116004529.GC5149@hades.panopticon> (raw)
In-Reply-To: <20201110054802.bjmjkfv4gzj3nkbe@alap3.anarazel.de>
References: <16696-29d944a33801fbfe@postgresql.org>
<20201102214509.GV30304@hades.panopticon>
<7463da2f-80f2-43c4-81d4-c3bab1f040b4@www.fastmail.com>
<20201104212015.GA30304@hades.panopticon>
<20201110054802.bjmjkfv4gzj3nkbe@alap3.anarazel.de>
* Andres Freund (andres@anarazel.de) wrote:
> > The problem happens when boolin() function is inlined by LLVM.
> > The named function calls isspace() internally, which on FreeBSD is
> > locale-specific and involves caching some locale parameters in
> > thread-local variable defined as
> >
> > extern _Thread_local const _RuneLocale *_ThreadRuneLocale;
> >
> > The execution crashes on trying to access the named thread-local varible,
> > probably because something related to TLS is not set up properly in/for
> > LLVM.
> >
> > I've confirmed this hypothesis by disabling isspace() calls in boolin()
> > which has also fixed the problem.
>
> Nice digging. I suspect your approach of disabling inlining for TLS
> might be the most reasonable one for now.
>
> Any chance you're interested in extending your patch with a testcase
> that crashes reliably without it? Best on multiple platforms, including
> linux? Easiest way would probably be to add a function referencing a
> thread local variable in regress.c and set jit_above_cost = 0,
> jit_inline_above_cost=0 for a query using that function.
Can try. Here's what I could come with so far:
https://github.com/postgres/postgres/compare/master...AMDmi3:llvm-jit-regress.patch
Unfortunately it doesn't crash with the dedicated function, likely
because there's no llvm bitcode generation performed for regress.c.
It does however reliably crash on
SELECT (jsonb_array_elements('[true]'::jsonb)->>0)::boolean;
or
SELECT (case when random() >= 0.5 then 'true' else 'false' end)::boolean;
but it would likely not reproduce on Linux due to different isspace
implementation. Notably, it does not crash on simple 'true'::boolean,
I guess because it may be evaluated at compile time.
--
Dmitry Marakasov . 55B5 0596 FF1E 8D84 5F56 9510 D35A 80DD F9D2 F77D
amdmi3@amdmi3.ru ..: https://github.com/AMDmi3
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: amdmi3@amdmi3.ru, andres@anarazel.de, pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #16696: Backend crash in llvmjit
In-Reply-To: <20201116004529.GC5149@hades.panopticon>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox