lp_bld_misc.cpp revision 61c67eca7dbcef4b7b1398f5a9e0193597f304ed
18ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca/************************************************************************** 28ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * 38ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * Copyright 2010 VMware, Inc. 48ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * All Rights Reserved. 58ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * 68ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 78ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * copy of this software and associated documentation files (the 88ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * "Software"), to deal in the Software without restriction, including 98ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 108ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 118ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * permit persons to whom the Software is furnished to do so, subject to 128ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * the following conditions: 138ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * 148ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 158ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 168ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 178ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 188ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 198ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 208ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * USE OR OTHER DEALINGS IN THE SOFTWARE. 218ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * 228ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * The above copyright notice and this permission notice (including the 238ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * next paragraph) shall be included in all copies or substantial portions 248ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * of the Software. 258ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca * 268ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca **************************************************************************/ 278ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 288ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 298ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#ifndef __STDC_LIMIT_MACROS 308ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#define __STDC_LIMIT_MACROS 318ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#endif 328ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 338ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#ifndef __STDC_CONSTANT_MACROS 348ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#define __STDC_CONSTANT_MACROS 358ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#endif 368ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 3755948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm-c/Core.h> 3855948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm-c/ExecutionEngine.h> 394d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#include <llvm/Target/TargetOptions.h> 4055948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm/ExecutionEngine/ExecutionEngine.h> 4155948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm/ExecutionEngine/JITEventListener.h> 42e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca#include <llvm/Support/CommandLine.h> 43e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca#include <llvm/Support/PrettyStackTrace.h> 448ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 4507d741926b9a061d3d6608186d3cfbc681c386aeJosé Fonseca#include "pipe/p_config.h" 468ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#include "util/u_debug.h" 478ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 488ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 4955948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca/** 5055948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * Register the engine with oprofile. 5155948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * 5255948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * This allows to see the LLVM IR function names in oprofile output. 5355948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * 5455948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * To actually work LLVM needs to be built with the --with-oprofile configure 5555948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * option. 5655948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * 5755948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * Also a oprofile:oprofile user:group is necessary. Which is not created by 5855948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * default on some distributions. 5955948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca */ 6055948247ebd6b37b9ac1869992eb2f765dd62912José Fonsecaextern "C" void 6155948247ebd6b37b9ac1869992eb2f765dd62912José Fonsecalp_register_oprofile_jit_event_listener(LLVMExecutionEngineRef EE) 6255948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca{ 6355948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca llvm::unwrap(EE)->RegisterJITEventListener(llvm::createOProfileJITEventListener()); 6455948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca} 654d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 664d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 674d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonsecaextern "C" void 684d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonsecalp_set_target_options(void) 694d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca{ 704d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if defined(DEBUG) 714d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if HAVE_LLVM >= 0x0207 724d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::JITEmitDebugInfo = true; 734d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 744d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 754d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 7661c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca /* 7761c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * LLVM revision 123367 switched the default stack alignment to 16 bytes on 7861c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * Linux (and several other Unices in later revisions), to match recent gcc 7961c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * versions. 8061c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * 8161c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * However our drivers can be loaded by old binary applications, still 8261c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * maintaining a 4 bytes stack alignment. Therefore we must tell LLVM here 8361c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * to only assume a 4 bytes alignment for backwards compatibility. 8461c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca */ 8561c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca#if defined(PIPE_ARCH_X86) 8661c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca llvm::StackAlignment = 4; 8761c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca#endif 8861c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca 894d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if defined(DEBUG) || defined(PROFILE) 904d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::NoFramePointerElim = true; 914d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 924d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 934d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::NoExcessFPPrecision = false; 944d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 954d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca /* XXX: Investigate this */ 964d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if 0 974d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::UnsafeFPMath = true; 984d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 99e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca 100492afbce18af21ce5bbc89675c797e45a0b72bf5Vinson Lee#if HAVE_LLVM < 0x0209 101e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca /* 102e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * LLVM will generate MMX instructions for vectors <= 64 bits, leading to 103e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * innefficient code, and in 32bit systems, to the corruption of the FPU 104e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * stack given that it expects the user to generate the EMMS instructions. 105e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * 106e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * See also: 107e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * - http://llvm.org/bugs/show_bug.cgi?id=3287 108e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * - http://l4.me.uk/post/2009/06/07/llvm-wrinkle-3-configuration-what-configuration/ 109e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca */ 11037e5f784220248753647801c455eb61e49e16292nobled static boolean first = TRUE; 111e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca if (first) { 112e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca static const char* options[] = { 113e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca "prog", 114e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca "-disable-mmx" 115e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca }; 116e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca llvm::cl::ParseCommandLineOptions(2, const_cast<char**>(options)); 117e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca first = FALSE; 118e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca } 119492afbce18af21ce5bbc89675c797e45a0b72bf5Vinson Lee#endif 120e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca 121e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca /* 122e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca * By default LLVM adds a signal handler to output a pretty stack trace. 123e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca * This signal handler is never removed, causing problems when unloading the 124e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca * shared object where the gallium driver resides. 125e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca */ 126e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca llvm::DisablePrettyStackTrace = true; 1274d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca} 128042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin 129042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin 130042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusinextern "C" void 131042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusinlp_func_delete_body(LLVMValueRef FF) 132042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin{ 133042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin llvm::Function *func = llvm::unwrap<llvm::Function>(FF); 134042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin func->deleteBody(); 135042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin} 136fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul 137fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul 138fb8f3d7711557d34d8a171304c589891d5bda047Brian Paulextern "C" 139fb8f3d7711557d34d8a171304c589891d5bda047Brian PaulLLVMValueRef 140fb8f3d7711557d34d8a171304c589891d5bda047Brian Paullp_build_load_volatile(LLVMBuilderRef B, LLVMValueRef PointerVal, 141fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul const char *Name) 142fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul{ 143fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul return llvm::wrap(llvm::unwrap(B)->CreateLoad(llvm::unwrap(PointerVal), true, Name)); 144fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul} 145fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul 146