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