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