1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 VMware, Inc. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The purpose of this module is to expose LLVM functionality not available 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * through the C++ bindings. 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef __STDC_LIMIT_MACROS 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __STDC_LIMIT_MACROS 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef __STDC_CONSTANT_MACROS 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __STDC_CONSTANT_MACROS 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stddef.h> 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm-c/Core.h> 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm-c/ExecutionEngine.h> 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/Target/TargetOptions.h> 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/ExecutionEngine/ExecutionEngine.h> 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/ExecutionEngine/JITEventListener.h> 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM >= 0x0301 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/ADT/Triple.h> 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/ExecutionEngine/JITMemoryManager.h> 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/Support/CommandLine.h> 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/Support/PrettyStackTrace.h> 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM >= 0x0300 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/Support/TargetSelect.h> 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else /* HAVE_LLVM < 0x0300 */ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/Target/TargetSelect.h> 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* HAVE_LLVM < 0x0300 */ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_config.h" 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_cpu_detect.h" 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_misc.h" 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Register the engine with oprofile. 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This allows to see the LLVM IR function names in oprofile output. 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * To actually work LLVM needs to be built with the --with-oprofile configure 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * option. 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Also a oprofile:oprofile user:group is necessary. Which is not created by 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * default on some distributions. 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" void 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_register_oprofile_jit_event_listener(LLVMExecutionEngineRef EE) 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM >= 0x0301 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::unwrap(EE)->RegisterJITEventListener(llvm::JITEventListener::createOProfileJITEventListener()); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::unwrap(EE)->RegisterJITEventListener(llvm::createOProfileJITEventListener()); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" void 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_set_target_options(void) 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM <= 0x0300 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(DEBUG) 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM >= 0x0207 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::JITEmitDebugInfo = true; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LLVM revision 123367 switched the default stack alignment to 16 bytes on 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Linux (and several other Unices in later revisions), to match recent gcc 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * versions. 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * However our drivers can be loaded by old binary applications, still 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * maintaining a 4 bytes stack alignment. Therefore we must tell LLVM here 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to only assume a 4 bytes alignment for backwards compatibility. 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(PIPE_ARCH_X86) 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM >= 0x0300 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::StackAlignmentOverride = 4; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::StackAlignment = 4; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(DEBUG) || defined(PROFILE) 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::NoFramePointerElim = true; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM >= 0x0208 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::NoFramePointerElimNonLeaf = true; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::NoExcessFPPrecision = false; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: Investigate this */ 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::UnsafeFPMath = true; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* HAVE_LLVM <= 0x0300 */ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM < 0x0209 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LLVM will generate MMX instructions for vectors <= 64 bits, leading to 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * innefficient code, and in 32bit systems, to the corruption of the FPU 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stack given that it expects the user to generate the EMMS instructions. 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See also: 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - http://llvm.org/bugs/show_bug.cgi?id=3287 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - http://l4.me.uk/post/2009/06/07/llvm-wrinkle-3-configuration-what-configuration/ 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The -disable-mmx global option can be specified only once since we 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dynamically link against LLVM it will reside in a separate shared object, 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * which may or not be delete when this shared object is, so we use the 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * llvm::DisablePrettyStackTrace variable (which we set below and should 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reside in the same shared library) to determine whether the -disable-mmx 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * option has been set or not. 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Thankfully this ugly hack is not necessary on LLVM 2.9 onwards. 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!llvm::DisablePrettyStackTrace) { 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static boolean first = TRUE; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const char* options[] = { 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "prog", 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "-disable-mmx" 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(first); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::cl::ParseCommandLineOptions(2, const_cast<char**>(options)); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first = FALSE; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * By default LLVM adds a signal handler to output a pretty stack trace. 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This signal handler is never removed, causing problems when unloading the 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * shared object where the gallium driver resides. 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::DisablePrettyStackTrace = true; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // If we have a native target, initialize it to ensure it is linked in and 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // usable by the JIT. 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::InitializeNativeTarget(); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM >= 0x0208 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::InitializeNativeTargetAsmPrinter(); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMInitializeX86AsmPrinter(); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(PIPE_ARCH_ARM) 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMInitializeARMAsmPrinter(); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(PIPE_ARCH_PPC) 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMInitializePowerPCAsmPrinter(); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM >= 0x0207 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if HAVE_LLVM >= 0x0301 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::InitializeNativeTargetDisassembler(); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64) 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMInitializeX86Disassembler(); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif defined(PIPE_ARCH_ARM) 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMInitializeARMDisassembler(); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" void 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_func_delete_body(LLVMValueRef FF) 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::Function *func = llvm::unwrap<llvm::Function>(FF); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func->deleteBody(); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLLVMValueRef 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_load_volatile(LLVMBuilderRef B, LLVMValueRef PointerVal, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *Name) 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return llvm::wrap(llvm::unwrap(B)->CreateLoad(llvm::unwrap(PointerVal), true, Name)); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_set_load_alignment(LLVMValueRef Inst, 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned Align) 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::unwrap<llvm::LoadInst>(Inst)->setAlignment(Align); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_set_store_alignment(LLVMValueRef Inst, 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned Align) 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::unwrap<llvm::StoreInst>(Inst)->setAlignment(Align); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM >= 0x301 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Same as LLVMCreateJITCompilerForModule, but using MCJIT and enabling AVX 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * feature where available. 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See also: 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - llvm/lib/ExecutionEngine/ExecutionEngineBindings.cpp 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - llvm/tools/lli/lli.cpp 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - http://markmail.org/message/ttkuhvgj4cxxy2on#query:+page:1+mid:aju2dggerju3ivd3+state:results 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLLVMBool 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_create_mcjit_compiler_for_module(LLVMExecutionEngineRef *OutJIT, 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMModuleRef M, 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned OptLevel, 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char **OutError) 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org using namespace llvm; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string Error; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EngineBuilder builder(unwrap(M)); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org builder.setEngineKind(EngineKind::JIT) 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .setErrorStr(&Error) 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .setOptLevel((CodeGenOpt::Level)OptLevel); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org builder.setUseMCJIT(true); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm::SmallVector<std::string, 1> MAttrs; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_cpu_caps.has_avx) { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AVX feature is not automatically detected from CPUID by the X86 target 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * yet, because the old (yet default) JIT engine is not capable of 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * emitting the opcodes. But as we're using MCJIT here, it is safe to 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * add set this attribute. 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAttrs.push_back("+avx"); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org builder.setMAttrs(MAttrs); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org builder.setJITMemoryManager(JITMemoryManager::CreateDefaultMemManager()); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ExecutionEngine *JIT; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org JIT = builder.create(); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Workaround http://llvm.org/bugs/show_bug.cgi?id=12833 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org StringRef MArch = ""; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org StringRef MCPU = ""; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Triple TT(unwrap(M)->getTargetTriple()); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org JIT = builder.create(builder.selectTarget(TT, MArch, MCPU, MAttrs)); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (JIT) { 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *OutJIT = wrap(JIT); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *OutError = strdup(Error.c_str()); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* HAVE_LLVM >= 0x301 */ 294