lp_bld_misc.cpp revision 85d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25e
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 3734930facfe11ef6e322c276295ddf884d36de11cJosé Fonseca#include <stddef.h> 3834930facfe11ef6e322c276295ddf884d36de11cJosé Fonseca 3955948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm-c/Core.h> 4055948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm-c/ExecutionEngine.h> 414d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#include <llvm/Target/TargetOptions.h> 4255948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm/ExecutionEngine/ExecutionEngine.h> 4355948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm/ExecutionEngine/JITEventListener.h> 44e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca#include <llvm/Support/CommandLine.h> 45e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca#include <llvm/Support/PrettyStackTrace.h> 468ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 4707d741926b9a061d3d6608186d3cfbc681c386aeJosé Fonseca#include "pipe/p_config.h" 488ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#include "util/u_debug.h" 498ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 508ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 5155948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca/** 5255948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * Register the engine with oprofile. 5355948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * 5455948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * This allows to see the LLVM IR function names in oprofile output. 5555948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * 5655948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * To actually work LLVM needs to be built with the --with-oprofile configure 5755948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * option. 5855948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * 5955948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * Also a oprofile:oprofile user:group is necessary. Which is not created by 6055948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * default on some distributions. 6155948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca */ 6255948247ebd6b37b9ac1869992eb2f765dd62912José Fonsecaextern "C" void 6355948247ebd6b37b9ac1869992eb2f765dd62912José Fonsecalp_register_oprofile_jit_event_listener(LLVMExecutionEngineRef EE) 6455948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca{ 65fe34006908f1ff99ada34d52c06fd80197e452ecVinson Lee#if HAVE_LLVM >= 0x0301 66fe34006908f1ff99ada34d52c06fd80197e452ecVinson Lee llvm::unwrap(EE)->RegisterJITEventListener(llvm::JITEventListener::createOProfileJITEventListener()); 67fe34006908f1ff99ada34d52c06fd80197e452ecVinson Lee#else 6855948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca llvm::unwrap(EE)->RegisterJITEventListener(llvm::createOProfileJITEventListener()); 69fe34006908f1ff99ada34d52c06fd80197e452ecVinson Lee#endif 7055948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca} 714d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 724d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 734d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonsecaextern "C" void 744d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonsecalp_set_target_options(void) 754d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca{ 7695aa0e5d84a4f46f2f0809b26f5899b8e39f5afcVinson Lee#if HAVE_LLVM <= 0x0300 774d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if defined(DEBUG) 784d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if HAVE_LLVM >= 0x0207 794d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::JITEmitDebugInfo = true; 804d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 814d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 824d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 8361c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca /* 8461c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * LLVM revision 123367 switched the default stack alignment to 16 bytes on 8561c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * Linux (and several other Unices in later revisions), to match recent gcc 8661c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * versions. 8761c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * 8861c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * However our drivers can be loaded by old binary applications, still 8961c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * maintaining a 4 bytes stack alignment. Therefore we must tell LLVM here 9061c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * to only assume a 4 bytes alignment for backwards compatibility. 9161c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca */ 9261c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca#if defined(PIPE_ARCH_X86) 93ad7387fe12c034d32da4bf4e078d494cbaca5288Vinson Lee#if HAVE_LLVM >= 0x0300 94ad7387fe12c034d32da4bf4e078d494cbaca5288Vinson Lee llvm::StackAlignmentOverride = 4; 95ad7387fe12c034d32da4bf4e078d494cbaca5288Vinson Lee#else 9661c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca llvm::StackAlignment = 4; 9761c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca#endif 98ad7387fe12c034d32da4bf4e078d494cbaca5288Vinson Lee#endif 9961c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca 1004d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if defined(DEBUG) || defined(PROFILE) 1014d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::NoFramePointerElim = true; 1024d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 1034d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 1044d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::NoExcessFPPrecision = false; 1054d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 1064d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca /* XXX: Investigate this */ 1074d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if 0 1084d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::UnsafeFPMath = true; 1094d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 11095aa0e5d84a4f46f2f0809b26f5899b8e39f5afcVinson Lee#endif /* HAVE_LLVM <= 0x0300 */ 111e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca 112492afbce18af21ce5bbc89675c797e45a0b72bf5Vinson Lee#if HAVE_LLVM < 0x0209 113e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca /* 114e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * LLVM will generate MMX instructions for vectors <= 64 bits, leading to 115e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * innefficient code, and in 32bit systems, to the corruption of the FPU 116e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * stack given that it expects the user to generate the EMMS instructions. 117e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * 118e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * See also: 119e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * - http://llvm.org/bugs/show_bug.cgi?id=3287 120e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * - http://l4.me.uk/post/2009/06/07/llvm-wrinkle-3-configuration-what-configuration/ 121a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * 122a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * The -disable-mmx global option can be specified only once since we 123a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * dynamically link against LLVM it will reside in a separate shared object, 124a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * which may or not be delete when this shared object is, so we use the 125a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * llvm::DisablePrettyStackTrace variable (which we set below and should 126a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * reside in the same shared library) to determine whether the -disable-mmx 127a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * option has been set or not. 128a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * 129a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * Thankfully this ugly hack is not necessary on LLVM 2.9 onwards. 130e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca */ 131a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca if (!llvm::DisablePrettyStackTrace) { 132a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca static boolean first = TRUE; 133e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca static const char* options[] = { 134e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca "prog", 135e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca "-disable-mmx" 136e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca }; 137a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca assert(first); 138e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca llvm::cl::ParseCommandLineOptions(2, const_cast<char**>(options)); 139e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca first = FALSE; 140e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca } 141492afbce18af21ce5bbc89675c797e45a0b72bf5Vinson Lee#endif 142e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca 143e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca /* 144e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca * By default LLVM adds a signal handler to output a pretty stack trace. 145e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca * This signal handler is never removed, causing problems when unloading the 146e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca * shared object where the gallium driver resides. 147e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca */ 148e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca llvm::DisablePrettyStackTrace = true; 1494d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca} 150042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin 151042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin 152042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusinextern "C" void 153042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusinlp_func_delete_body(LLVMValueRef FF) 154042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin{ 155042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin llvm::Function *func = llvm::unwrap<llvm::Function>(FF); 156042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin func->deleteBody(); 157042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin} 158fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul 159fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul 160fb8f3d7711557d34d8a171304c589891d5bda047Brian Paulextern "C" 161fb8f3d7711557d34d8a171304c589891d5bda047Brian PaulLLVMValueRef 162fb8f3d7711557d34d8a171304c589891d5bda047Brian Paullp_build_load_volatile(LLVMBuilderRef B, LLVMValueRef PointerVal, 163fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul const char *Name) 164fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul{ 165fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul return llvm::wrap(llvm::unwrap(B)->CreateLoad(llvm::unwrap(PointerVal), true, Name)); 166fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul} 167fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul 16885d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonextern "C" 16985d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonvoid 17085d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonlp_set_load_alignment(LLVMValueRef Inst, 17185d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton unsigned Align) 17285d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton{ 17385d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton llvm::unwrap<llvm::LoadInst>(Inst)->setAlignment(Align); 17485d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton} 17585d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton 17685d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonextern "C" 17785d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonvoid 17885d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonlp_set_store_alignment(LLVMValueRef Inst, 17985d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton unsigned Align) 18085d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton{ 18185d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton llvm::unwrap<llvm::StoreInst>(Inst)->setAlignment(Align); 18285d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton} 183