]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Adapt expression JIT to stdbool.h introduction.
authorAndres Freund <andres@anarazel.de>
Fri, 23 Mar 2018 05:15:51 +0000 (22:15 -0700)
committerAndres Freund <andres@anarazel.de>
Fri, 23 Mar 2018 05:15:51 +0000 (22:15 -0700)
The LLVM JIT provider uses clang to synchronize types between normal C
code and runtime generated code. Clang represents stdbool.h style
booleans in return values & parameters differently from booleans
stored in variables.

Thus the expression compilation code from 2a0faed9d needs to be
adapted to 9a95a77d9. Instead of hardcoding i8 as the type for
booleans (which already was wrong on some edge case platforms!), use
postgres' notion of a boolean as used for storage and for parameters.

Per buildfarm animal xenodermus.

Author: Andres Freund

src/backend/jit/llvm/llvmjit.c
src/backend/jit/llvm/llvmjit_expr.c
src/backend/jit/llvm/llvmjit_types.c
src/include/jit/llvmjit.h
src/include/jit/llvmjit_emit.h

index 21d36605a4884faf4b433bed72de26f459b5c56e..cd3c40c5f1bda3a7407614ee8cba28673ee41c0f 100644 (file)
@@ -46,6 +46,8 @@ typedef struct LLVMJitHandle
 
 /* types & functions commonly needed for JITing */
 LLVMTypeRef TypeSizeT;
+LLVMTypeRef TypeParamBool;
+LLVMTypeRef TypeStorageBool;
 LLVMTypeRef TypePGFunction;
 LLVMTypeRef StructHeapTupleFieldsField3;
 LLVMTypeRef StructHeapTupleFields;
@@ -682,7 +684,7 @@ llvm_shutdown(int code, Datum arg)
        }
 }
 
-/* helper for llvm_create_types */
+/* helper for llvm_create_types, returning a global var's type */
 static LLVMTypeRef
 load_type(LLVMModuleRef mod, const char *name)
 {
@@ -702,6 +704,31 @@ load_type(LLVMModuleRef mod, const char *name)
        return typ;
 }
 
+/* helper for llvm_create_types, returning a function's return type */
+static LLVMTypeRef
+load_return_type(LLVMModuleRef mod, const char *name)
+{
+       LLVMValueRef value;
+       LLVMTypeRef typ;
+
+       /* this'll return a *pointer* to the function */
+       value = LLVMGetNamedFunction(mod, name);
+       if (!value)
+               elog(ERROR, "function %s is unknown", name);
+
+       /* get type of function pointer */
+       typ = LLVMTypeOf(value);
+       Assert(typ != NULL);
+       /* dereference pointer */
+       typ = LLVMGetElementType(typ);
+       Assert(typ != NULL);
+       /* and look at return type */
+       typ = LLVMGetReturnType(typ);
+       Assert(typ != NULL);
+
+       return typ;
+}
+
 /*
  * Load required information, types, function signatures from llvmjit_types.c
  * and make them available in global variables.
@@ -740,6 +767,8 @@ llvm_create_types(void)
        llvm_layout = pstrdup(LLVMGetDataLayoutStr(mod));
 
        TypeSizeT = load_type(mod, "TypeSizeT");
+       TypeParamBool = load_return_type(mod, "FunctionReturningBool");
+       TypeStorageBool = load_type(mod, "TypeStorageBool");
        TypePGFunction = load_type(mod, "TypePGFunction");
        StructExprContext = load_type(mod, "StructExprContext");
        StructExprEvalStep = load_type(mod, "StructExprEvalStep");
index 80638d6d818bfd63015bd236beeb9b30a0521504..667fb01d3be717639fcadeeb80116e6e951128f0 100644 (file)
@@ -152,7 +152,7 @@ llvm_compile_expr(ExprState *state)
 
                param_types[0] = l_ptr(StructExprState);        /* state */
                param_types[1] = l_ptr(StructExprContext);      /* econtext */
-               param_types[2] = l_ptr(LLVMInt8Type()); /* isnull */
+               param_types[2] = l_ptr(TypeParamBool);          /* isnull */
 
                eval_sig = LLVMFunctionType(TypeSizeT,
                                                                        param_types, lengthof(param_types),
@@ -248,7 +248,7 @@ llvm_compile_expr(ExprState *state)
                opcode = ExecEvalStepOp(state, op);
 
                v_resvaluep = l_ptr_const(op->resvalue, l_ptr(TypeSizeT));
-               v_resnullp = l_ptr_const(op->resnull, l_ptr(LLVMInt8Type()));
+               v_resnullp = l_ptr_const(op->resnull, l_ptr(TypeStorageBool));
 
                switch (opcode)
                {
@@ -259,6 +259,8 @@ llvm_compile_expr(ExprState *state)
 
                                        v_tmpvalue = LLVMBuildLoad(b, v_tmpvaluep, "");
                                        v_tmpisnull = LLVMBuildLoad(b, v_tmpisnullp, "");
+                                       v_tmpisnull =
+                                               LLVMBuildTrunc(b, v_tmpisnull, TypeParamBool, "");
 
                                        LLVMBuildStore(b, v_tmpisnull, v_isnullp);
 
@@ -521,7 +523,7 @@ llvm_compile_expr(ExprState *state)
                                        /* check if value is NULL */
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_isnull,
-                                                                                                 l_int8_const(0), ""),
+                                                                                                 l_sbool_const(0), ""),
                                                                        b_notnull, opblocks[i + 1]);
 
                                        /* if value is not null, convert to RO datum */
@@ -545,7 +547,7 @@ llvm_compile_expr(ExprState *state)
                                                                v_constnull;
 
                                        v_constvalue = l_sizet_const(op->d.constval.value);
-                                       v_constnull = l_int8_const(op->d.constval.isnull);
+                                       v_constnull = l_sbool_const(op->d.constval.isnull);
 
                                        LLVMBuildStore(b, v_constvalue, v_resvaluep);
                                        LLVMBuildStore(b, v_constnull, v_resnullp);
@@ -587,7 +589,7 @@ llvm_compile_expr(ExprState *state)
                                         * set resnull to true, if the function is actually
                                         * called, it'll be reset
                                         */
-                                       LLVMBuildStore(b, l_int8_const(1), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(1), v_resnullp);
 
                                        /* create blocks for checking args, one for each */
                                        b_checkargnulls =
@@ -619,7 +621,7 @@ llvm_compile_expr(ExprState *state)
                                                LLVMBuildCondBr(b,
                                                                                LLVMBuildICmp(b, LLVMIntEQ,
                                                                                                          v_argisnull,
-                                                                                                         l_int8_const(1),
+                                                                                                         l_sbool_const(1),
                                                                                                          ""),
                                                                                opblocks[i + 1],
                                                                                b_argnotnull);
@@ -661,8 +663,8 @@ llvm_compile_expr(ExprState *state)
                                        LLVMValueRef v_boolanynullp;
 
                                        v_boolanynullp = l_ptr_const(op->d.boolexpr.anynull,
-                                                                                                l_ptr(LLVMInt8Type()));
-                                       LLVMBuildStore(b, l_int8_const(0), v_boolanynullp);
+                                                                                                l_ptr(TypeStorageBool));
+                                       LLVMBuildStore(b, l_sbool_const(0), v_boolanynullp);
 
                                        /* intentionally fall through */
                                }
@@ -697,7 +699,7 @@ llvm_compile_expr(ExprState *state)
                                                                                           "b.%d.boolcont", i);
 
                                        v_boolanynullp = l_ptr_const(op->d.boolexpr.anynull,
-                                                                                                l_ptr(LLVMInt8Type()));
+                                                                                                l_ptr(TypeStorageBool));
 
                                        v_boolnull = LLVMBuildLoad(b, v_resnullp, "");
                                        v_boolvalue = LLVMBuildLoad(b, v_resvaluep, "");
@@ -710,14 +712,14 @@ llvm_compile_expr(ExprState *state)
                                        /* check if current input is NULL */
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_boolnull,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        b_boolisnull,
                                                                        b_boolcheckfalse);
 
                                        /* build block that sets anynull */
                                        LLVMPositionBuilderAtEnd(b, b_boolisnull);
                                        /* set boolanynull to true */
-                                       LLVMBuildStore(b, l_int8_const(1), v_boolanynullp);
+                                       LLVMBuildStore(b, l_sbool_const(1), v_boolanynullp);
                                        /* and jump to next block */
                                        LLVMBuildBr(b, b_boolcont);
 
@@ -746,12 +748,12 @@ llvm_compile_expr(ExprState *state)
                                        /* set value to NULL if any previous values were NULL */
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_boolanynull,
-                                                                                                 l_int8_const(0), ""),
+                                                                                                 l_sbool_const(0), ""),
                                                                        opblocks[i + 1], b_boolisanynull);
 
                                        LLVMPositionBuilderAtEnd(b, b_boolisanynull);
                                        /* set resnull to true */
-                                       LLVMBuildStore(b, l_int8_const(1), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(1), v_resnullp);
                                        /* reset resvalue */
                                        LLVMBuildStore(b, l_sizet_const(0), v_resvaluep);
 
@@ -763,8 +765,8 @@ llvm_compile_expr(ExprState *state)
                                        LLVMValueRef v_boolanynullp;
 
                                        v_boolanynullp = l_ptr_const(op->d.boolexpr.anynull,
-                                                                                                l_ptr(LLVMInt8Type()));
-                                       LLVMBuildStore(b, l_int8_const(0), v_boolanynullp);
+                                                                                                l_ptr(TypeStorageBool));
+                                       LLVMBuildStore(b, l_sbool_const(0), v_boolanynullp);
 
                                        /* intentionally fall through */
                                }
@@ -800,7 +802,7 @@ llvm_compile_expr(ExprState *state)
                                                                                           "b.%d.boolcont", i);
 
                                        v_boolanynullp = l_ptr_const(op->d.boolexpr.anynull,
-                                                                                                l_ptr(LLVMInt8Type()));
+                                                                                                l_ptr(TypeStorageBool));
 
                                        v_boolnull = LLVMBuildLoad(b, v_resnullp, "");
                                        v_boolvalue = LLVMBuildLoad(b, v_resvaluep, "");
@@ -812,14 +814,14 @@ llvm_compile_expr(ExprState *state)
 
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_boolnull,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        b_boolisnull,
                                                                        b_boolchecktrue);
 
                                        /* build block that sets anynull */
                                        LLVMPositionBuilderAtEnd(b, b_boolisnull);
                                        /* set boolanynull to true */
-                                       LLVMBuildStore(b, l_int8_const(1), v_boolanynullp);
+                                       LLVMBuildStore(b, l_sbool_const(1), v_boolanynullp);
                                        /* and jump to next block */
                                        LLVMBuildBr(b, b_boolcont);
 
@@ -848,12 +850,12 @@ llvm_compile_expr(ExprState *state)
                                        /* set value to NULL if any previous values were NULL */
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_boolanynull,
-                                                                                                 l_int8_const(0), ""),
+                                                                                                 l_sbool_const(0), ""),
                                                                        opblocks[i + 1], b_boolisanynull);
 
                                        LLVMPositionBuilderAtEnd(b, b_boolisanynull);
                                        /* set resnull to true */
-                                       LLVMBuildStore(b, l_int8_const(1), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(1), v_resnullp);
                                        /* reset resvalue */
                                        LLVMBuildStore(b, l_sizet_const(0), v_resvaluep);
 
@@ -901,7 +903,7 @@ llvm_compile_expr(ExprState *state)
                                        v_nullorfalse =
                                                LLVMBuildOr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_resnull,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_resvalue,
                                                                                                  l_sizet_const(0), ""),
                                                                        "");
@@ -914,7 +916,7 @@ llvm_compile_expr(ExprState *state)
                                        /* build block handling NULL or false */
                                        LLVMPositionBuilderAtEnd(b, b_qualfail);
                                        /* set resnull to false */
-                                       LLVMBuildStore(b, l_int8_const(0), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(0), v_resnullp);
                                        /* set resvalue to false */
                                        LLVMBuildStore(b, l_sizet_const(0), v_resvaluep);
                                        /* and jump out */
@@ -938,7 +940,7 @@ llvm_compile_expr(ExprState *state)
 
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_resnull,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        opblocks[op->d.jump.jumpdone],
                                                                        opblocks[i + 1]);
                                        break;
@@ -954,7 +956,7 @@ llvm_compile_expr(ExprState *state)
 
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_resnull,
-                                                                                                 l_int8_const(0), ""),
+                                                                                                 l_sbool_const(0), ""),
                                                                        opblocks[op->d.jump.jumpdone],
                                                                        opblocks[i + 1]);
                                        break;
@@ -975,7 +977,7 @@ llvm_compile_expr(ExprState *state)
                                        v_nullorfalse =
                                                LLVMBuildOr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_resnull,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_resvalue,
                                                                                                  l_sizet_const(0), ""),
                                                                        "");
@@ -995,12 +997,12 @@ llvm_compile_expr(ExprState *state)
                                        v_resvalue =
                                                LLVMBuildSelect(b,
                                                                                LLVMBuildICmp(b, LLVMIntEQ, v_resnull,
-                                                                                                         l_int8_const(1), ""),
+                                                                                                         l_sbool_const(1), ""),
                                                                                l_sizet_const(1),
                                                                                l_sizet_const(0),
                                                                                "");
                                        LLVMBuildStore(b, v_resvalue, v_resvaluep);
-                                       LLVMBuildStore(b, l_int8_const(0), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(0), v_resnullp);
 
                                        LLVMBuildBr(b, opblocks[i + 1]);
                                        break;
@@ -1014,12 +1016,12 @@ llvm_compile_expr(ExprState *state)
                                        v_resvalue =
                                                LLVMBuildSelect(b,
                                                                                LLVMBuildICmp(b, LLVMIntEQ, v_resnull,
-                                                                                                         l_int8_const(1), ""),
+                                                                                                         l_sbool_const(1), ""),
                                                                                l_sizet_const(0),
                                                                                l_sizet_const(1),
                                                                                "");
                                        LLVMBuildStore(b, v_resvalue, v_resvaluep);
-                                       LLVMBuildStore(b, l_int8_const(0), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(0), v_resnullp);
 
                                        LLVMBuildBr(b, opblocks[i + 1]);
                                        break;
@@ -1054,14 +1056,14 @@ llvm_compile_expr(ExprState *state)
                                        /* check if value is NULL */
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_resnull,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        b_isnull, b_notnull);
 
                                        /* if value is NULL, return false */
                                        LLVMPositionBuilderAtEnd(b, b_isnull);
 
                                        /* result is not null */
-                                       LLVMBuildStore(b, l_int8_const(0), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(0), v_resnullp);
 
                                        if (opcode == EEOP_BOOLTEST_IS_TRUE ||
                                                opcode == EEOP_BOOLTEST_IS_FALSE)
@@ -1179,7 +1181,7 @@ llvm_compile_expr(ExprState *state)
                                        v_casevaluep = l_ptr_const(op->d.casetest.value,
                                                                                           l_ptr(TypeSizeT));
                                        v_casenullp = l_ptr_const(op->d.casetest.isnull,
-                                                                                         l_ptr(LLVMInt8Type()));
+                                                                                         l_ptr(TypeStorageBool));
 
                                        v_casevaluenull =
                                                LLVMBuildICmp(b, LLVMIntEQ,
@@ -1225,7 +1227,7 @@ llvm_compile_expr(ExprState *state)
                                                                                          "op.%d.readonly.notnull", i);
 
                                        v_nullp = l_ptr_const(op->d.make_readonly.isnull,
-                                                                                 l_ptr(LLVMInt8Type()));
+                                                                                 l_ptr(TypeStorageBool));
 
                                        v_null = LLVMBuildLoad(b, v_nullp, "");
 
@@ -1235,7 +1237,7 @@ llvm_compile_expr(ExprState *state)
                                        /* check if value is NULL */
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_null,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        opblocks[i + 1], b_notnull);
 
                                        /* if value is not null, convert to RO datum */
@@ -1324,7 +1326,7 @@ llvm_compile_expr(ExprState *state)
                                        v_resnull = LLVMBuildLoad(b, v_resnullp, "");
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_resnull,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        b_skipoutput,
                                                                        b_calloutput);
 
@@ -1340,7 +1342,7 @@ llvm_compile_expr(ExprState *state)
                                                                   v_resvalue,
                                                                   LLVMBuildStructGEP(b, v_out_argp, 0, ""));
                                        LLVMBuildStore(b,
-                                                                  l_int8_const(0),
+                                                                  l_sbool_const(0),
                                                                   LLVMBuildStructGEP(b, v_out_argnullp,
                                                                                                          0, ""));
                                        /* and call output function (can never return NULL) */
@@ -1397,7 +1399,7 @@ llvm_compile_expr(ExprState *state)
                                        /* arg2: typmod: preset in execExpr.c  */
 
                                        /* reset fcinfo_in->isnull */
-                                       LLVMBuildStore(b, l_int8_const(0), v_fcinfo_in_isnullp);
+                                       LLVMBuildStore(b, l_sbool_const(0), v_fcinfo_in_isnullp);
                                        /* and call function */
                                        v_retval = LLVMBuildCall(b, v_fn_addr_in, &v_fcinfo_in, 1,
                                                                                         "funccall_iocoerce_in");
@@ -1448,11 +1450,11 @@ llvm_compile_expr(ExprState *state)
                                        /* load argnull[0|1] for both arguments */
                                        v_argnull0 = l_load_struct_gep(b, v_argnullp, 0, "");
                                        v_argisnull0 = LLVMBuildICmp(b, LLVMIntEQ, v_argnull0,
-                                                                                                l_int8_const(1), "");
+                                                                                                l_sbool_const(1), "");
 
                                        v_argnull1 = l_load_struct_gep(b, v_argnullp, 1, "");
                                        v_argisnull1 = LLVMBuildICmp(b, LLVMIntEQ, v_argnull1,
-                                                                                                l_int8_const(1), "");
+                                                                                                l_sbool_const(1), "");
 
                                        v_anyargisnull = LLVMBuildOr(b, v_argisnull0, v_argisnull1, "");
                                        v_bothargisnull = LLVMBuildAnd(b, v_argisnull0, v_argisnull1, "");
@@ -1475,7 +1477,7 @@ llvm_compile_expr(ExprState *state)
 
                                        /* Both NULL? Then is not distinct... */
                                        LLVMPositionBuilderAtEnd(b, b_bothargnull);
-                                       LLVMBuildStore(b, l_int8_const(0), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(0), v_resnullp);
                                        if (opcode == EEOP_NOT_DISTINCT)
                                                LLVMBuildStore(b, l_sizet_const(1), v_resvaluep);
                                        else
@@ -1485,7 +1487,7 @@ llvm_compile_expr(ExprState *state)
 
                                        /* Only one is NULL? Then is distinct... */
                                        LLVMPositionBuilderAtEnd(b, b_anyargnull);
-                                       LLVMBuildStore(b, l_int8_const(0), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(0), v_resnullp);
                                        if (opcode == EEOP_NOT_DISTINCT)
                                                LLVMBuildStore(b, l_sizet_const(0), v_resvaluep);
                                        else
@@ -1562,9 +1564,9 @@ llvm_compile_expr(ExprState *state)
                                        v_anyargisnull =
                                                LLVMBuildOr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_argnull0,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_argnull1,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        "");
 
                                        LLVMBuildCondBr(b, v_anyargisnull, b_hasnull, b_nonull);
@@ -1589,7 +1591,7 @@ llvm_compile_expr(ExprState *state)
                                        v_argsequal = LLVMBuildAnd(b,
                                                                                           LLVMBuildICmp(b, LLVMIntEQ,
                                                                                                                         v_fcinfo_isnull,
-                                                                                                                        l_int8_const(0),
+                                                                                                                        l_sbool_const(0),
                                                                                                                         ""),
                                                                                           LLVMBuildICmp(b, LLVMIntEQ,
                                                                                                                         v_retval,
@@ -1600,7 +1602,7 @@ llvm_compile_expr(ExprState *state)
 
                                        /* build block setting result to NULL, if args are equal */
                                        LLVMPositionBuilderAtEnd(b, b_argsequal);
-                                       LLVMBuildStore(b, l_int8_const(1), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(1), v_resnullp);
                                        LLVMBuildStore(b, l_sizet_const(0), v_resvaluep);
                                        LLVMBuildStore(b, v_retval, v_resvaluep);
 
@@ -1691,11 +1693,11 @@ llvm_compile_expr(ExprState *state)
                                                                                LLVMBuildICmp(b,
                                                                                                          LLVMIntEQ,
                                                                                                          v_argnull0,
-                                                                                                         l_int8_const(1),
+                                                                                                         l_sbool_const(1),
                                                                                                          ""),
                                                                                LLVMBuildICmp(b, LLVMIntEQ,
                                                                                                          v_argnull1,
-                                                                                                         l_int8_const(1), ""),
+                                                                                                         l_sbool_const(1), ""),
                                                                                "");
 
                                                LLVMBuildCondBr(b, v_anyargisnull, b_null, b_compare);
@@ -1718,7 +1720,7 @@ llvm_compile_expr(ExprState *state)
                                                                        LLVMBuildICmp(b,
                                                                                                  LLVMIntEQ,
                                                                                                  v_fcinfo_isnull,
-                                                                                                 l_int8_const(0),
+                                                                                                 l_sbool_const(0),
                                                                                                  ""),
                                                                        b_compare_result,
                                                                        b_null);
@@ -1740,7 +1742,7 @@ llvm_compile_expr(ExprState *state)
                                         * result.
                                         */
                                        LLVMPositionBuilderAtEnd(b, b_null);
-                                       LLVMBuildStore(b, l_int8_const(1), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(1), v_resnullp);
                                        LLVMBuildBr(b, opblocks[op->d.rowcompare_step.jumpnull]);
 
                                        break;
@@ -1792,7 +1794,7 @@ llvm_compile_expr(ExprState *state)
                                                                                         "");
                                        v_result = LLVMBuildZExt(b, v_result, TypeSizeT, "");
 
-                                       LLVMBuildStore(b, l_int8_const(0), v_resnullp);
+                                       LLVMBuildStore(b, l_sbool_const(0), v_resnullp);
                                        LLVMBuildStore(b, v_result, v_resvaluep);
 
                                        LLVMBuildBr(b, opblocks[i + 1]);
@@ -1836,10 +1838,11 @@ llvm_compile_expr(ExprState *state)
                                        v_params[1] = l_ptr_const(op, l_ptr(StructExprEvalStep));
                                        v_ret = LLVMBuildCall(b, v_fn,
                                                                                  v_params, lengthof(v_params), "");
+                                       v_ret = LLVMBuildZExt(b, v_ret, TypeStorageBool, "");
 
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_ret,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        opblocks[i + 1],
                                                                        opblocks[jumpdone]);
                                        break;
@@ -1863,7 +1866,7 @@ llvm_compile_expr(ExprState *state)
                                        v_casevaluep = l_ptr_const(op->d.casetest.value,
                                                                                           l_ptr(TypeSizeT));
                                        v_casenullp = l_ptr_const(op->d.casetest.isnull,
-                                                                                         l_ptr(LLVMInt8Type()));
+                                                                                         l_ptr(TypeStorageBool));
 
                                        v_casevaluenull =
                                                LLVMBuildICmp(b, LLVMIntEQ,
@@ -2032,7 +2035,7 @@ llvm_compile_expr(ExprState *state)
                                                                        LLVMBuildICmp(b,
                                                                                                  LLVMIntEQ,
                                                                                                  v_argnull0,
-                                                                                                 l_int8_const(1),
+                                                                                                 l_sbool_const(1),
                                                                                                  ""),
                                                                        opblocks[op->d.agg_deserialize.jumpnull],
                                                                        b_deserialize);
@@ -2080,7 +2083,7 @@ llvm_compile_expr(ExprState *state)
                                        LLVMBasicBlockRef *b_checknulls;
 
                                        jumpnull = op->d.agg_strict_input_check.jumpnull;
-                                       v_nullp = l_ptr_const(nulls, l_ptr(LLVMInt8Type()));
+                                       v_nullp = l_ptr_const(nulls, l_ptr(TypeStorageBool));
 
                                        /* create blocks for checking args */
                                        b_checknulls = palloc(sizeof(LLVMBasicBlockRef *) * nargs);
@@ -2114,7 +2117,7 @@ llvm_compile_expr(ExprState *state)
                                                                                LLVMBuildICmp(b,
                                                                                                          LLVMIntEQ,
                                                                                                          v_argisnull,
-                                                                                                         l_int8_const(1), ""),
+                                                                                                         l_sbool_const(1), ""),
                                                                                opblocks[jumpnull],
                                                                                b_argnotnull);
                                        }
@@ -2175,7 +2178,7 @@ llvm_compile_expr(ExprState *state)
 
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_notransvalue,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        b_init,
                                                                        opblocks[i + 1]);
 
@@ -2240,7 +2243,7 @@ llvm_compile_expr(ExprState *state)
 
                                        LLVMBuildCondBr(b,
                                                                        LLVMBuildICmp(b, LLVMIntEQ, v_transnull,
-                                                                                                 l_int8_const(1), ""),
+                                                                                                 l_sbool_const(1), ""),
                                                                        opblocks[jumpnull],
                                                                        opblocks[i + 1]);
 
@@ -2417,9 +2420,11 @@ llvm_compile_expr(ExprState *state)
                                                params[0] = v_aggstatep;
                                                params[1] = v_pertransp;
                                                params[2] = v_retval;
-                                               params[3] = v_fcinfo_isnull;
+                                               params[3] = LLVMBuildTrunc(b, v_fcinfo_isnull,
+                                                                                                  TypeParamBool, "");
                                                params[4] = v_transvalue;
-                                               params[5] = v_transnull;
+                                               params[5] = LLVMBuildTrunc(b, v_transnull,
+                                                                                                  TypeParamBool, "");
 
                                                v_fn = llvm_get_decl(mod, FuncExecAggTransReparent);
                                                v_newval =
@@ -2536,8 +2541,7 @@ BuildV1Call(LLVMJitContext *context, LLVMBuilderRef b,
        v_fcinfo_isnullp = LLVMBuildStructGEP(b, v_fcinfo,
                                                                                  FIELDNO_FUNCTIONCALLINFODATA_ISNULL,
                                                                                  "v_fcinfo_isnull");
-       LLVMBuildStore(b, l_int8_const(0),
-                                  v_fcinfo_isnullp);
+       LLVMBuildStore(b, l_sbool_const(0), v_fcinfo_isnullp);
 
        v_retval = LLVMBuildCall(b, v_fn, &v_fcinfo, 1, "funccall");
 
index e40dff3886323b23216bbe4f8fcc6f7b633cca19..84bc140737396d11a6950dd0747b7e43b3059493 100644 (file)
@@ -45,8 +45,9 @@
  * clang/LLVM will omit them.  As this file will never be linked into
  * anything, that's harmless.
  */
-size_t         TypeSizeT;
 PGFunction     TypePGFunction;
+size_t         TypeSizeT;
+bool           TypeStorageBool;
 
 AggState       StructAggState;
 AggStatePerGroupData StructAggStatePerGroupData;
@@ -73,6 +74,19 @@ AttributeTemplate(PG_FUNCTION_ARGS)
        PG_RETURN_NULL();
 }
 
+/*
+ * Clang represents stdbool.h style booleans that are returned by functions
+ * differently (as i1) than stored ones (as i8). Therefore we do not just need
+ * TypeBool (above), but also a way to determine the width of a returned
+ * integer. This allows us to keep compatible with non-stdbool using
+ * architectures.
+ */
+extern bool FunctionReturningBool(void);
+bool
+FunctionReturningBool(void)
+{
+       return false;
+}
 
 /*
  * To force signatures of functions used during JITing to be present,
index 0c97d231f1d5b2aeef018935e5a60695816d5e1c..cc908477e8e379f0c612eb1fa26f923ffaa280ea 100644 (file)
@@ -56,8 +56,11 @@ typedef struct LLVMJitContext
 
 
 /* type and struct definitions */
-extern LLVMTypeRef TypeSizeT;
+extern LLVMTypeRef TypeParamBool;
 extern LLVMTypeRef TypePGFunction;
+extern LLVMTypeRef TypeSizeT;
+extern LLVMTypeRef TypeStorageBool;
+
 extern LLVMTypeRef StructtupleDesc;
 extern LLVMTypeRef StructHeapTupleData;
 extern LLVMTypeRef StructTupleTableSlot;
index 374c8335ba16501e383389a62e9a226d7d007f10..0d1b246f42ace87b40592c1e7afc16da5e7a8fd7 100644 (file)
@@ -78,6 +78,24 @@ l_sizet_const(size_t i)
        return LLVMConstInt(TypeSizeT, i, false);
 }
 
+/*
+ * Emit constant boolean, as used for storage (e.g. global vars, structs).
+ */
+static inline LLVMValueRef
+l_sbool_const(bool i)
+{
+       return LLVMConstInt(TypeStorageBool, (int) i, false);
+}
+
+/*
+ * Emit constant boolean, as used for parameters (e.g. function parameters).
+ */
+static inline LLVMValueRef
+l_pbool_const(bool i)
+{
+       return LLVMConstInt(TypeParamBool, (int) i, false);
+}
+
 /*
  * Load a pointer member idx from a struct.
  */