lp_test_printf.c revision d05cb9f0187984e461b41eb1ba6ca2adf0593c74
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" 355fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include "gallivm/lp_bld_printf.h" 365fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 375fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include <llvm-c/Analysis.h> 385fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include <llvm-c/ExecutionEngine.h> 395fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include <llvm-c/Target.h> 405fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include <llvm-c/Transforms/Scalar.h> 415fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 425fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#include "lp_test.h" 435fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 445fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 455fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Listruct printf_test_case { 46966d28cb2e5e090d8f591810f331df0d05b06271Brian Paul int foo; 475fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li}; 485fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 495fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Livoid 505fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Liwrite_tsv_header(FILE *fp) 515fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{ 525fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li fprintf(fp, 535fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li "result\t" 545fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li "format\n"); 555fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 565fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li fflush(fp); 575fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li} 585fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 595fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 605fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 615fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Litypedef void (*test_printf_t)(int i); 625fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 63966d28cb2e5e090d8f591810f331df0d05b06271Brian Paul 645fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Listatic LLVMValueRef 655fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Liadd_printf_test(LLVMModuleRef module) 665fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{ 675fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMTypeRef args[1] = { LLVMIntType(32) }; 685fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMValueRef func = LLVMAddFunction(module, "test_printf", LLVMFunctionType(LLVMVoidType(), args, 1, 0)); 695fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMBuilderRef builder = LLVMCreateBuilder(); 705fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMBasicBlockRef block = LLVMAppendBasicBlock(func, "entry"); 715fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 725fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMSetFunctionCallConv(func, LLVMCCallConv); 735fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 745fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMPositionBuilderAtEnd(builder, block); 755fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li lp_build_printf(builder, "hello, world\n"); 765fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li lp_build_printf(builder, "print 5 6: %d %d\n", LLVMConstInt(LLVMInt32Type(), 5, 0), 775fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMConstInt(LLVMInt32Type(), 6, 0)); 78d05cb9f0187984e461b41eb1ba6ca2adf0593c74Brian Paul 795fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMBuildRetVoid(builder); 805fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMDisposeBuilder(builder); 815fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li return func; 825fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li} 835fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 845fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 855fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris LiPIPE_ALIGN_STACK 865fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Listatic boolean 875fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Litest_printf(unsigned verbose, FILE *fp, const struct printf_test_case *testcase) 885fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{ 895fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMModuleRef module = NULL; 905fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMValueRef test = NULL; 915fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMExecutionEngineRef engine = NULL; 925fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMModuleProviderRef provider = NULL; 935fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMPassManagerRef pass = NULL; 945fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li char *error = NULL; 955fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li test_printf_t test_printf; 965fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li float unpacked[4]; 975fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li unsigned packed; 985fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li boolean success = TRUE; 99966d28cb2e5e090d8f591810f331df0d05b06271Brian Paul void *code; 1005fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1015fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li module = LLVMModuleCreateWithName("test"); 1025fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1035fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li test = add_printf_test(module); 1045fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1055fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li if(LLVMVerifyModule(module, LLVMPrintMessageAction, &error)) { 1065fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMDumpModule(module); 1075fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li abort(); 1085fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li } 1095fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMDisposeMessage(error); 1105fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1115fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li provider = LLVMCreateModuleProviderForExistingModule(module); 112d05cb9f0187984e461b41eb1ba6ca2adf0593c74Brian Paul#if 0 1135fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li if (LLVMCreateJITCompiler(&engine, provider, 1, &error)) { 1145fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li fprintf(stderr, "%s\n", error); 1155fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMDisposeMessage(error); 1165fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li abort(); 1175fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li } 118d05cb9f0187984e461b41eb1ba6ca2adf0593c74Brian Paul#else 119d05cb9f0187984e461b41eb1ba6ca2adf0593c74Brian Paul engine = lp_build_engine; 120d05cb9f0187984e461b41eb1ba6ca2adf0593c74Brian Paul#endif 1215fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1225fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#if 0 1235fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li pass = LLVMCreatePassManager(); 1245fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMAddTargetData(LLVMGetExecutionEngineTargetData(engine), pass); 1255fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li /* These are the passes currently listed in llvm-c/Transforms/Scalar.h, 1265fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li * but there are more on SVN. */ 1275fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMAddConstantPropagationPass(pass); 1285fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMAddInstructionCombiningPass(pass); 1295fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMAddPromoteMemoryToRegisterPass(pass); 1305fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMAddGVNPass(pass); 1315fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMAddCFGSimplificationPass(pass); 1325fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMRunPassManager(pass, module); 1335fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#else 1345fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li (void)pass; 1355fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li#endif 1365fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 137966d28cb2e5e090d8f591810f331df0d05b06271Brian Paul code = LLVMGetPointerToGlobal(engine, test); 138f503b3dd9d6522abdabab1e25d0652c9d3079421José Fonseca test_printf = (test_printf_t)pointer_to_func(code); 1395fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1405fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li memset(unpacked, 0, sizeof unpacked); 1415fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li packed = 0; 1425fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1435fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1445fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li // LLVMDumpModule(module); 1455fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1465fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li test_printf(0); 1475fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1485fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMFreeMachineCodeForFunction(engine, test); 1495fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1505fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMDisposeExecutionEngine(engine); 1515fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li if(pass) 1525fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li LLVMDisposePassManager(pass); 1535fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1545fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li return success; 1555fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li} 1565fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1575fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1585fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Liboolean 1595fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Litest_all(unsigned verbose, FILE *fp) 1605fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{ 161c722029f3a54c2e619b95e3b02005a7d844bca43Brian Paul boolean success = TRUE; 1625fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1635fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li test_printf(verbose, fp, NULL); 1645fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1655fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li return success; 1665fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li} 1675fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1685fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li 1695fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Liboolean 1705fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Litest_some(unsigned verbose, FILE *fp, unsigned long n) 1715fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li{ 1725fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li return test_all(verbose, fp); 1735fa09846618ed702493f054a1d4b0ec2a28fbbd0Chris Li} 1744f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul 1754f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul 1764f067ada47bfeef792e5adbed4f3e215b704212aBrian Paulboolean 1774f067ada47bfeef792e5adbed4f3e215b704212aBrian Paultest_single(unsigned verbose, FILE *fp) 1784f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul{ 1794f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul printf("no test_single()"); 1804f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul return TRUE; 1814f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul} 182