Fix another case of indirectly casting away const.

Like 8f1791c61, this fixes a case of implicitly casting away
const by not treating the result of strrchr() on a const pointer
as const.  This was missed at the time because the machines
reporting those warnings weren't building with --with-llvm.

While here, clean up another infelicity: in the probably-
impossible case that the input string contains only one dot,
this function would call pnstrdup() with a length of -1
and thereby emit a module name equal to the function name.
It seems to me we should emit modname = NULL instead.

Also remove a useless Assert and two redundant assignments.

Back-patch, as 8f1791c61 was, so that users of back branches
don't see this warning when building with late-model gcc.

Reported-by: hubert depesz lubaczewski <depesz@depesz.com>
Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/aiGNJ89PBqvq2Yyz@depesz.com
Backpatch-through: 14
master
Tom Lane 2 days ago
parent 4dce650cc1
commit c35f85ac02
  1. 24
      src/backend/jit/llvm/llvmjit.c

@ -1050,9 +1050,6 @@ llvm_create_types(void)
void
llvm_split_symbol_name(const char *name, char **modname, char **funcname)
{
*modname = NULL;
*funcname = NULL;
/*
* Module function names are pgextern.$module.$funcname
*/
@ -1062,14 +1059,21 @@ llvm_split_symbol_name(const char *name, char **modname, char **funcname)
* Symbol names cannot contain a ., therefore we can split based on
* first and last occurrence of one.
*/
*funcname = strrchr(name, '.');
(*funcname)++; /* jump over . */
*modname = pnstrdup(name + strlen("pgextern."),
*funcname - name - strlen("pgextern.") - 1);
Assert(funcname);
const char *lastdot;
*funcname = pstrdup(*funcname);
name += strlen("pgextern.");
lastdot = strrchr(name, '.');
if (lastdot)
{
*modname = pnstrdup(name, lastdot - name);
*funcname = pstrdup(lastdot + 1);
}
else
{
/* hmm, no second dot? */
*modname = NULL;
*funcname = pstrdup(name);
}
}
else
{

Loading…
Cancel
Save