15fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li/**************************************************************************
25fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li *
35fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * Copyright 2010 VMware, Inc.
45fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * All Rights Reserved.
55fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li *
65fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * Permission is hereby granted, free of charge, to any person obtaining a
75fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * copy of this software and associated documentation files (the
85fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * "Software"), to deal in the Software without restriction, including
95fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * without limitation the rights to use, copy, modify, merge, publish,
105fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * distribute, sub license, and/or sell copies of the Software, and to
115fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * permit persons to whom the Software is furnished to do so, subject to
125fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * the following conditions:
135fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li *
145fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * The above copyright notice and this permission notice (including the
155fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * next paragraph) shall be included in all copies or substantial portions
165fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * of the Software.
175fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li *
185fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
225fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
235fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li *
265fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li **************************************************************************/
275fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
285fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
295fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include <stdlib.h>
305fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include <stdio.h>
315fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
32f503b3dd9d6522abdabab1e25d0652c9d3079421José Fonseca#include "util/u_pointer.h"
335fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include "gallivm/lp_bld.h"
34d05cb9f0187984e461b41eb1ba6ca2adf0593c74Brian Paul#include "gallivm/lp_bld_init.h"
35330852b3b33883b8fb22ce8c67efae79e64ce273Brian Paul#include "gallivm/lp_bld_assert.h"
365fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include "gallivm/lp_bld_printf.h"
375fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
385fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include "lp_test.h"
395fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
405fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
415fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Listruct printf_test_case {
42966d28cb2e5e090d8f591810f331df0d05b06271Brian Paul   int foo;
435fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li};
445fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
455fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Livoid
465fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Liwrite_tsv_header(FILE *fp)
475fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{
485fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li   fprintf(fp,
495fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li           "result\t"
505fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li           "format\n");
515fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
525fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li   fflush(fp);
535fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li}
545fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
555fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
565fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
575fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Litypedef void (*test_printf_t)(int i);
585fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
59966d28cb2e5e090d8f591810f331df0d05b06271Brian Paul
605fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Listatic LLVMValueRef
61efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Pauladd_printf_test(struct gallivm_state *gallivm)
625fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{
63efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMModuleRef module = gallivm->module;
64efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMTypeRef args[1] = { LLVMIntTypeInContext(gallivm->context, 32) };
65efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMValueRef func = LLVMAddFunction(module, "test_printf", LLVMFunctionType(LLVMVoidTypeInContext(gallivm->context), args, 1, 0));
66efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMBuilderRef builder = gallivm->builder;
67efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMBasicBlockRef block = LLVMAppendBasicBlockInContext(gallivm->context, func, "entry");
685fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
695fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li   LLVMSetFunctionCallConv(func, LLVMCCallConv);
705fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
715fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li   LLVMPositionBuilderAtEnd(builder, block);
72efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_printf(gallivm, "hello, world\n");
73efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_printf(gallivm, "print 5 6: %d %d\n", LLVMConstInt(LLVMInt32TypeInContext(gallivm->context), 5, 0),
74efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul				LLVMConstInt(LLVMInt32TypeInContext(gallivm->context), 6, 0));
75d05cb9f0187984e461b41eb1ba6ca2adf0593c74Brian Paul
76330852b3b33883b8fb22ce8c67efae79e64ce273Brian Paul   /* Also test lp_build_assert().  This should not fail. */
77efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_assert(gallivm, LLVMConstInt(LLVMInt32TypeInContext(gallivm->context), 1, 0), "assert(1)");
78330852b3b33883b8fb22ce8c67efae79e64ce273Brian Paul
795fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li   LLVMBuildRetVoid(builder);
80efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
813469715a8a171512cf9b528702e70393f01c6041José Fonseca   gallivm_verify_function(gallivm, func);
823469715a8a171512cf9b528702e70393f01c6041José Fonseca
835fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li   return func;
845fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li}
855fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
865fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
875fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris LiPIPE_ALIGN_STACK
885fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Listatic boolean
893469715a8a171512cf9b528702e70393f01c6041José Fonsecatest_printf(unsigned verbose, FILE *fp,
90efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul            const struct printf_test_case *testcase)
915fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{
923469715a8a171512cf9b528702e70393f01c6041José Fonseca   struct gallivm_state *gallivm;
93efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMValueRef test;
94efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   test_printf_t test_printf_func;
955fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li   boolean success = TRUE;
965fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
973469715a8a171512cf9b528702e70393f01c6041José Fonseca   gallivm = gallivm_create();
985fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
993469715a8a171512cf9b528702e70393f01c6041José Fonseca   test = add_printf_test(gallivm);
1005fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1013469715a8a171512cf9b528702e70393f01c6041José Fonseca   gallivm_compile_module(gallivm);
1025fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1033469715a8a171512cf9b528702e70393f01c6041José Fonseca   test_printf_func = (test_printf_t) gallivm_jit_function(gallivm, test);
1045fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
105efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   test_printf_func(0);
1065fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1073469715a8a171512cf9b528702e70393f01c6041José Fonseca   gallivm_free_function(gallivm, test, test_printf_func);
1083469715a8a171512cf9b528702e70393f01c6041José Fonseca
1093469715a8a171512cf9b528702e70393f01c6041José Fonseca   gallivm_destroy(gallivm);
1105fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1115fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li   return success;
1125fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li}
1135fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1145fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1155fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Liboolean
1163469715a8a171512cf9b528702e70393f01c6041José Fonsecatest_all(unsigned verbose, FILE *fp)
1175fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{
118c722029f3a54c2e619b95e3b02005a7d844bca43Brian Paul   boolean success = TRUE;
1195fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1203469715a8a171512cf9b528702e70393f01c6041José Fonseca   test_printf(verbose, fp, NULL);
1215fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1225fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li   return success;
1235fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li}
1245fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1255fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li
1265fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Liboolean
1273469715a8a171512cf9b528702e70393f01c6041José Fonsecatest_some(unsigned verbose, FILE *fp,
128efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul          unsigned long n)
1295fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{
1303469715a8a171512cf9b528702e70393f01c6041José Fonseca   return test_all(verbose, fp);
1315fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li}
1324f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul
1334f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul
1344f067ada47bfeef792e5adbed4f3e215b704212aBrian Paulboolean
1353469715a8a171512cf9b528702e70393f01c6041José Fonsecatest_single(unsigned verbose, FILE *fp)
1364f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul{
1374f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul   printf("no test_single()");
1384f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul   return TRUE;
1394f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul}
140