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 293469715a8a171512cf9b528702e70393f01c6041José Fonseca/** 303469715a8a171512cf9b528702e70393f01c6041José Fonseca * The purpose of this module is to expose LLVM functionality not available 313469715a8a171512cf9b528702e70393f01c6041José Fonseca * through the C++ bindings. 323469715a8a171512cf9b528702e70393f01c6041José Fonseca */ 333469715a8a171512cf9b528702e70393f01c6041José Fonseca 343469715a8a171512cf9b528702e70393f01c6041José Fonseca 358ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#ifndef __STDC_LIMIT_MACROS 368ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#define __STDC_LIMIT_MACROS 378ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#endif 388ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 398ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#ifndef __STDC_CONSTANT_MACROS 408ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#define __STDC_CONSTANT_MACROS 418ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#endif 428ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 4334930facfe11ef6e322c276295ddf884d36de11cJosé Fonseca#include <stddef.h> 4434930facfe11ef6e322c276295ddf884d36de11cJosé Fonseca 4555948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm-c/Core.h> 4655948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm-c/ExecutionEngine.h> 474d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#include <llvm/Target/TargetOptions.h> 4855948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm/ExecutionEngine/ExecutionEngine.h> 4955948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca#include <llvm/ExecutionEngine/JITEventListener.h> 503469715a8a171512cf9b528702e70393f01c6041José Fonseca#if HAVE_LLVM >= 0x0301 513469715a8a171512cf9b528702e70393f01c6041José Fonseca#include <llvm/ADT/Triple.h> 523469715a8a171512cf9b528702e70393f01c6041José Fonseca#include <llvm/ExecutionEngine/JITMemoryManager.h> 533469715a8a171512cf9b528702e70393f01c6041José Fonseca#endif 54e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca#include <llvm/Support/CommandLine.h> 55e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca#include <llvm/Support/PrettyStackTrace.h> 568ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 573469715a8a171512cf9b528702e70393f01c6041José Fonseca#if HAVE_LLVM >= 0x0300 583469715a8a171512cf9b528702e70393f01c6041José Fonseca#include <llvm/Support/TargetSelect.h> 593469715a8a171512cf9b528702e70393f01c6041José Fonseca#else /* HAVE_LLVM < 0x0300 */ 603469715a8a171512cf9b528702e70393f01c6041José Fonseca#include <llvm/Target/TargetSelect.h> 613469715a8a171512cf9b528702e70393f01c6041José Fonseca#endif /* HAVE_LLVM < 0x0300 */ 623469715a8a171512cf9b528702e70393f01c6041José Fonseca 6307d741926b9a061d3d6608186d3cfbc681c386aeJosé Fonseca#include "pipe/p_config.h" 648ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca#include "util/u_debug.h" 653469715a8a171512cf9b528702e70393f01c6041José Fonseca#include "util/u_cpu_detect.h" 663469715a8a171512cf9b528702e70393f01c6041José Fonseca 673469715a8a171512cf9b528702e70393f01c6041José Fonseca#include "lp_bld_misc.h" 688ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 698ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca 7055948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca/** 7155948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * Register the engine with oprofile. 7255948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * 7355948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * This allows to see the LLVM IR function names in oprofile output. 7455948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * 7555948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * To actually work LLVM needs to be built with the --with-oprofile configure 7655948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * option. 7755948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * 7855948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * Also a oprofile:oprofile user:group is necessary. Which is not created by 7955948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca * default on some distributions. 8055948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca */ 8155948247ebd6b37b9ac1869992eb2f765dd62912José Fonsecaextern "C" void 8255948247ebd6b37b9ac1869992eb2f765dd62912José Fonsecalp_register_oprofile_jit_event_listener(LLVMExecutionEngineRef EE) 8355948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca{ 84fe34006908f1ff99ada34d52c06fd80197e452ecVinson Lee#if HAVE_LLVM >= 0x0301 85fe34006908f1ff99ada34d52c06fd80197e452ecVinson Lee llvm::unwrap(EE)->RegisterJITEventListener(llvm::JITEventListener::createOProfileJITEventListener()); 86fe34006908f1ff99ada34d52c06fd80197e452ecVinson Lee#else 8755948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca llvm::unwrap(EE)->RegisterJITEventListener(llvm::createOProfileJITEventListener()); 88fe34006908f1ff99ada34d52c06fd80197e452ecVinson Lee#endif 8955948247ebd6b37b9ac1869992eb2f765dd62912José Fonseca} 904d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 914d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 924d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonsecaextern "C" void 934d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonsecalp_set_target_options(void) 944d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca{ 9595aa0e5d84a4f46f2f0809b26f5899b8e39f5afcVinson Lee#if HAVE_LLVM <= 0x0300 964d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if defined(DEBUG) 974d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if HAVE_LLVM >= 0x0207 984d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::JITEmitDebugInfo = true; 994d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 1004d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 1014d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 10261c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca /* 10361c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * LLVM revision 123367 switched the default stack alignment to 16 bytes on 10461c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * Linux (and several other Unices in later revisions), to match recent gcc 10561c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * versions. 10661c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * 10761c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * However our drivers can be loaded by old binary applications, still 10861c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * maintaining a 4 bytes stack alignment. Therefore we must tell LLVM here 10961c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca * to only assume a 4 bytes alignment for backwards compatibility. 11061c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca */ 11161c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca#if defined(PIPE_ARCH_X86) 112ad7387fe12c034d32da4bf4e078d494cbaca5288Vinson Lee#if HAVE_LLVM >= 0x0300 113ad7387fe12c034d32da4bf4e078d494cbaca5288Vinson Lee llvm::StackAlignmentOverride = 4; 114ad7387fe12c034d32da4bf4e078d494cbaca5288Vinson Lee#else 11561c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca llvm::StackAlignment = 4; 11661c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca#endif 117ad7387fe12c034d32da4bf4e078d494cbaca5288Vinson Lee#endif 11861c67eca7dbcef4b7b1398f5a9e0193597f304edJosé Fonseca 1194d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if defined(DEBUG) || defined(PROFILE) 1204d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::NoFramePointerElim = true; 1213469715a8a171512cf9b528702e70393f01c6041José Fonseca#if HAVE_LLVM >= 0x0208 1223469715a8a171512cf9b528702e70393f01c6041José Fonseca llvm::NoFramePointerElimNonLeaf = true; 1233469715a8a171512cf9b528702e70393f01c6041José Fonseca#endif 1244d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 1254d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 1264d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::NoExcessFPPrecision = false; 1274d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca 1284d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca /* XXX: Investigate this */ 1294d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#if 0 1304d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca llvm::UnsafeFPMath = true; 1314d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca#endif 13295aa0e5d84a4f46f2f0809b26f5899b8e39f5afcVinson Lee#endif /* HAVE_LLVM <= 0x0300 */ 133e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca 134492afbce18af21ce5bbc89675c797e45a0b72bf5Vinson Lee#if HAVE_LLVM < 0x0209 135e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca /* 136e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * LLVM will generate MMX instructions for vectors <= 64 bits, leading to 137e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * innefficient code, and in 32bit systems, to the corruption of the FPU 138e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * stack given that it expects the user to generate the EMMS instructions. 139e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * 140e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * See also: 141e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * - http://llvm.org/bugs/show_bug.cgi?id=3287 142e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca * - http://l4.me.uk/post/2009/06/07/llvm-wrinkle-3-configuration-what-configuration/ 143a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * 144a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * The -disable-mmx global option can be specified only once since we 145a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * dynamically link against LLVM it will reside in a separate shared object, 146a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * which may or not be delete when this shared object is, so we use the 147a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * llvm::DisablePrettyStackTrace variable (which we set below and should 148a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * reside in the same shared library) to determine whether the -disable-mmx 149a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * option has been set or not. 150a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * 151a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca * Thankfully this ugly hack is not necessary on LLVM 2.9 onwards. 152e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca */ 153a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca if (!llvm::DisablePrettyStackTrace) { 154a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca static boolean first = TRUE; 155e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca static const char* options[] = { 156e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca "prog", 157e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca "-disable-mmx" 158e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca }; 159a436b3b2d4524447c59d8f4003895d626cab309cJosé Fonseca assert(first); 160e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca llvm::cl::ParseCommandLineOptions(2, const_cast<char**>(options)); 161e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca first = FALSE; 162e3d2ebac115f7b7899664fefc2652fb829acfa27José Fonseca } 163492afbce18af21ce5bbc89675c797e45a0b72bf5Vinson Lee#endif 164e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca 165e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca /* 166e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca * By default LLVM adds a signal handler to output a pretty stack trace. 167e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca * This signal handler is never removed, causing problems when unloading the 168e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca * shared object where the gallium driver resides. 169e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca */ 170e4c3e7f9d8eae05c83f6e1fc54dc63ded3c12d12José Fonseca llvm::DisablePrettyStackTrace = true; 1713469715a8a171512cf9b528702e70393f01c6041José Fonseca 1723469715a8a171512cf9b528702e70393f01c6041José Fonseca // If we have a native target, initialize it to ensure it is linked in and 1733469715a8a171512cf9b528702e70393f01c6041José Fonseca // usable by the JIT. 1743469715a8a171512cf9b528702e70393f01c6041José Fonseca llvm::InitializeNativeTarget(); 1753469715a8a171512cf9b528702e70393f01c6041José Fonseca 1763469715a8a171512cf9b528702e70393f01c6041José Fonseca#if HAVE_LLVM >= 0x0208 1773469715a8a171512cf9b528702e70393f01c6041José Fonseca llvm::InitializeNativeTargetAsmPrinter(); 1783469715a8a171512cf9b528702e70393f01c6041José Fonseca#elif defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64) 1793469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMInitializeX86AsmPrinter(); 1803469715a8a171512cf9b528702e70393f01c6041José Fonseca#elif defined(PIPE_ARCH_ARM) 1813469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMInitializeARMAsmPrinter(); 1823469715a8a171512cf9b528702e70393f01c6041José Fonseca#elif defined(PIPE_ARCH_PPC) 1833469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMInitializePowerPCAsmPrinter(); 1843469715a8a171512cf9b528702e70393f01c6041José Fonseca#endif 1853469715a8a171512cf9b528702e70393f01c6041José Fonseca 1863469715a8a171512cf9b528702e70393f01c6041José Fonseca#if HAVE_LLVM >= 0x0207 1873469715a8a171512cf9b528702e70393f01c6041José Fonseca# if HAVE_LLVM >= 0x0301 1883469715a8a171512cf9b528702e70393f01c6041José Fonseca llvm::InitializeNativeTargetDisassembler(); 1893469715a8a171512cf9b528702e70393f01c6041José Fonseca# elif defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64) 1903469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMInitializeX86Disassembler(); 1913469715a8a171512cf9b528702e70393f01c6041José Fonseca# elif defined(PIPE_ARCH_ARM) 1923469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMInitializeARMDisassembler(); 1933469715a8a171512cf9b528702e70393f01c6041José Fonseca# endif 1943469715a8a171512cf9b528702e70393f01c6041José Fonseca#endif 1954d2407699ba043735b5fbd5c20fc5ccbff32c948José Fonseca} 196042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin 197042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin 198042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusinextern "C" void 199042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusinlp_func_delete_body(LLVMValueRef FF) 200042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin{ 201042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin llvm::Function *func = llvm::unwrap<llvm::Function>(FF); 202042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin func->deleteBody(); 203042018a943a403a4d9887b400deb3b3c83ee40c0Zack Rusin} 204fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul 205fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul 206fb8f3d7711557d34d8a171304c589891d5bda047Brian Paulextern "C" 207fb8f3d7711557d34d8a171304c589891d5bda047Brian PaulLLVMValueRef 208fb8f3d7711557d34d8a171304c589891d5bda047Brian Paullp_build_load_volatile(LLVMBuilderRef B, LLVMValueRef PointerVal, 209fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul const char *Name) 210fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul{ 211fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul return llvm::wrap(llvm::unwrap(B)->CreateLoad(llvm::unwrap(PointerVal), true, Name)); 212fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul} 213fb8f3d7711557d34d8a171304c589891d5bda047Brian Paul 2143469715a8a171512cf9b528702e70393f01c6041José Fonseca 21585d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonextern "C" 21685d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonvoid 21785d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonlp_set_load_alignment(LLVMValueRef Inst, 21885d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton unsigned Align) 21985d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton{ 22085d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton llvm::unwrap<llvm::LoadInst>(Inst)->setAlignment(Align); 22185d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton} 22285d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton 22385d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonextern "C" 22485d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonvoid 22585d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Bentonlp_set_store_alignment(LLVMValueRef Inst, 22685d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton unsigned Align) 22785d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton{ 22885d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton llvm::unwrap<llvm::StoreInst>(Inst)->setAlignment(Align); 22985d09d1c61d3e5ab2c2ae6fc74a30ea6a572f25eJames Benton} 2303469715a8a171512cf9b528702e70393f01c6041José Fonseca 2313469715a8a171512cf9b528702e70393f01c6041José Fonseca 2323469715a8a171512cf9b528702e70393f01c6041José Fonseca#if HAVE_LLVM >= 0x301 2333469715a8a171512cf9b528702e70393f01c6041José Fonseca 2343469715a8a171512cf9b528702e70393f01c6041José Fonseca/** 2353469715a8a171512cf9b528702e70393f01c6041José Fonseca * Same as LLVMCreateJITCompilerForModule, but using MCJIT and enabling AVX 2363469715a8a171512cf9b528702e70393f01c6041José Fonseca * feature where available. 2373469715a8a171512cf9b528702e70393f01c6041José Fonseca * 2383469715a8a171512cf9b528702e70393f01c6041José Fonseca * See also: 2393469715a8a171512cf9b528702e70393f01c6041José Fonseca * - llvm/lib/ExecutionEngine/ExecutionEngineBindings.cpp 2403469715a8a171512cf9b528702e70393f01c6041José Fonseca * - llvm/tools/lli/lli.cpp 2413469715a8a171512cf9b528702e70393f01c6041José Fonseca * - http://markmail.org/message/ttkuhvgj4cxxy2on#query:+page:1+mid:aju2dggerju3ivd3+state:results 2423469715a8a171512cf9b528702e70393f01c6041José Fonseca */ 2433469715a8a171512cf9b528702e70393f01c6041José Fonsecaextern "C" 2443469715a8a171512cf9b528702e70393f01c6041José FonsecaLLVMBool 2453469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_build_create_mcjit_compiler_for_module(LLVMExecutionEngineRef *OutJIT, 2463469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMModuleRef M, 2473469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned OptLevel, 2483469715a8a171512cf9b528702e70393f01c6041José Fonseca char **OutError) 2493469715a8a171512cf9b528702e70393f01c6041José Fonseca{ 2503469715a8a171512cf9b528702e70393f01c6041José Fonseca using namespace llvm; 2513469715a8a171512cf9b528702e70393f01c6041José Fonseca 2523469715a8a171512cf9b528702e70393f01c6041José Fonseca std::string Error; 2533469715a8a171512cf9b528702e70393f01c6041José Fonseca EngineBuilder builder(unwrap(M)); 2543469715a8a171512cf9b528702e70393f01c6041José Fonseca builder.setEngineKind(EngineKind::JIT) 2553469715a8a171512cf9b528702e70393f01c6041José Fonseca .setErrorStr(&Error) 2563469715a8a171512cf9b528702e70393f01c6041José Fonseca .setOptLevel((CodeGenOpt::Level)OptLevel); 2573469715a8a171512cf9b528702e70393f01c6041José Fonseca 2583469715a8a171512cf9b528702e70393f01c6041José Fonseca builder.setUseMCJIT(true); 2593469715a8a171512cf9b528702e70393f01c6041José Fonseca 2603469715a8a171512cf9b528702e70393f01c6041José Fonseca llvm::SmallVector<std::string, 1> MAttrs; 2613469715a8a171512cf9b528702e70393f01c6041José Fonseca if (util_cpu_caps.has_avx) { 2623469715a8a171512cf9b528702e70393f01c6041José Fonseca /* 2633469715a8a171512cf9b528702e70393f01c6041José Fonseca * AVX feature is not automatically detected from CPUID by the X86 target 2643469715a8a171512cf9b528702e70393f01c6041José Fonseca * yet, because the old (yet default) JIT engine is not capable of 2653469715a8a171512cf9b528702e70393f01c6041José Fonseca * emitting the opcodes. But as we're using MCJIT here, it is safe to 2663469715a8a171512cf9b528702e70393f01c6041José Fonseca * add set this attribute. 2673469715a8a171512cf9b528702e70393f01c6041José Fonseca */ 2683469715a8a171512cf9b528702e70393f01c6041José Fonseca MAttrs.push_back("+avx"); 2693469715a8a171512cf9b528702e70393f01c6041José Fonseca builder.setMAttrs(MAttrs); 2703469715a8a171512cf9b528702e70393f01c6041José Fonseca } 2713469715a8a171512cf9b528702e70393f01c6041José Fonseca builder.setJITMemoryManager(JITMemoryManager::CreateDefaultMemManager()); 2723469715a8a171512cf9b528702e70393f01c6041José Fonseca 2733469715a8a171512cf9b528702e70393f01c6041José Fonseca ExecutionEngine *JIT; 2743469715a8a171512cf9b528702e70393f01c6041José Fonseca#if 0 2753469715a8a171512cf9b528702e70393f01c6041José Fonseca JIT = builder.create(); 2763469715a8a171512cf9b528702e70393f01c6041José Fonseca#else 2773469715a8a171512cf9b528702e70393f01c6041José Fonseca /* 2783469715a8a171512cf9b528702e70393f01c6041José Fonseca * Workaround http://llvm.org/bugs/show_bug.cgi?id=12833 2793469715a8a171512cf9b528702e70393f01c6041José Fonseca */ 2803469715a8a171512cf9b528702e70393f01c6041José Fonseca StringRef MArch = ""; 2813469715a8a171512cf9b528702e70393f01c6041José Fonseca StringRef MCPU = ""; 2823469715a8a171512cf9b528702e70393f01c6041José Fonseca Triple TT(unwrap(M)->getTargetTriple()); 2833469715a8a171512cf9b528702e70393f01c6041José Fonseca JIT = builder.create(builder.selectTarget(TT, MArch, MCPU, MAttrs)); 2843469715a8a171512cf9b528702e70393f01c6041José Fonseca#endif 2853469715a8a171512cf9b528702e70393f01c6041José Fonseca if (JIT) { 2863469715a8a171512cf9b528702e70393f01c6041José Fonseca *OutJIT = wrap(JIT); 2873469715a8a171512cf9b528702e70393f01c6041José Fonseca return 0; 2883469715a8a171512cf9b528702e70393f01c6041José Fonseca } 2893469715a8a171512cf9b528702e70393f01c6041José Fonseca *OutError = strdup(Error.c_str()); 2903469715a8a171512cf9b528702e70393f01c6041José Fonseca return 1; 2913469715a8a171512cf9b528702e70393f01c6041José Fonseca} 2923469715a8a171512cf9b528702e70393f01c6041José Fonseca 2933469715a8a171512cf9b528702e70393f01c6041José Fonseca#endif /* HAVE_LLVM >= 0x301 */ 294