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