1f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang/* 2f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * Copyright 2012, The Android Open Source Project 3f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * 4f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * you may not use this file except in compliance with the License. 6f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * You may obtain a copy of the License at 7f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * 8f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * 10f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * Unless required by applicable law or agreed to in writing, software 11f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * See the License for the specific language governing permissions and 14f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * limitations under the License. 15f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang */ 16f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Support/CompilerConfig.h" 18060bd2d6771e781ddbf5424c50af149fd0d80432Stephen Hines#include "bcc/Config/Config.h" 19bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#include "bcc/Support/Properties.h" 20f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 21f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/CodeGen/SchedulerRegistry.h> 22f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/MC/SubtargetFeature.h> 23bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#include <llvm/Support/Host.h> 24f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/Support/TargetRegistry.h> 25f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 26ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h" 27f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 28f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changusing namespace bcc; 29f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 308e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar#if defined (PROVIDE_X86_CODEGEN) && !defined(__HOST__) 318e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 328e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainarnamespace { 338e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 348e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar// Utility function to test for f16c feature. This function is only needed for 358e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar// on-device bcc for x86 368e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainarbool HasF16C() { 378e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar llvm::StringMap<bool> features; 388e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar if (!llvm::sys::getHostCPUFeatures(features)) 398e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar return false; 408e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 418e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar if (features.count("f16c") && features["f16c"]) 428e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar return true; 438e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar else 448e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar return false; 458e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar} 468e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 478e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar} 488e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar#endif // (PROVIDE_X86_CODEGEN) && !defined(__HOST__) 498e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr ChangCompilerConfig::CompilerConfig(const std::string &pTriple) 51900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes : mTriple(pTriple), mFullPrecision(true), mTarget(nullptr) { 52f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 53f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting of register sheduler 54f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 55f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang llvm::RegisterScheduler::setDefault(llvm::createDefaultScheduler); 56f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 57f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 58f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting of target options 59f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 60f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Use hardfloat ABI by default. 61f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // 62f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // TODO(all): Need to detect the CPU capability and decide whether to use 63f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // softfp. To use softfp, change the following 2 lines to 64f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // 65f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // options.FloatABIType = llvm::FloatABI::Soft; 66f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // options.UseSoftFloat = true; 67f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTargetOpts.FloatABIType = llvm::FloatABI::Soft; 68f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTargetOpts.UseSoftFloat = false; 69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Enable frame pointer elimination optimization by default. 71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTargetOpts.NoFramePointerElim = false; 72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 73f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 74f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for code model 75f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 76f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mCodeModel = llvm::CodeModel::Small; 77f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 78f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 79f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for relocation model 80f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 81f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mRelocModel = llvm::Reloc::Default; 82f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 83f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 84f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for optimization level (-O2) 85f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 86f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mOptLevel = llvm::CodeGenOpt::Default; 87f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 88f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 89f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for architecture type 90f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 91f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mArchType = llvm::Triple::UnknownArch; 92f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 93f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang initializeTarget(); 94f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang initializeArch(); 95f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 96f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return; 97f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 98f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 99f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changbool CompilerConfig::initializeTarget() { 100f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang std::string error; 101f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTarget = llvm::TargetRegistry::lookupTarget(mTriple, error); 102900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (mTarget != nullptr) { 103f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return true; 104f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } else { 105f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang ALOGE("Cannot initialize llvm::Target for given triple '%s'! (%s)", 106f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTriple.c_str(), error.c_str()); 107f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return false; 108f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 109f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 110f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 111bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hinesbool CompilerConfig::initializeArch() { 112900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (mTarget != nullptr) { 113f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mArchType = llvm::Triple::getArchTypeForLLVMName(mTarget->getName()); 114f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } else { 115f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mArchType = llvm::Triple::UnknownArch; 116bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines return false; 117f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 118bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 119bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines // Configure each architecture for any necessary additional flags. 120bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines switch (mArchType) { 121bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(PROVIDE_ARM_CODEGEN) 122bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::arm: { 123bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines llvm::StringMap<bool> features; 124bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines llvm::sys::getHostCPUFeatures(features); 125bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines std::vector<std::string> attributes; 126bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 127bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(__HOST__) || defined(ARCH_ARM_HAVE_VFP) 128bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+vfp3"); 129bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if !defined(__HOST__) && !defined(ARCH_ARM_HAVE_VFP_D32) 130bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+d16"); 131bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // !__HOST__ && !ARCH_ARM_HAVE_VFP_D32 132bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // __HOST__ || ARCH_ARM_HAVE_VFP 133bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 134bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(__HOST__) || defined(ARCH_ARM_HAVE_NEON) 135bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines // Only enable NEON on ARM if we have relaxed precision floats. 136bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (!mFullPrecision) { 137bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+neon"); 138bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } else { 139bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // __HOST__ || ARCH_ARM_HAVE_NEON 140bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("-neon"); 141bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("-neonfp"); 142bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(__HOST__) || defined(ARCH_ARM_HAVE_NEON) 143bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 144bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // __HOST__ || ARCH_ARM_HAVE_NEON 145bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 146bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (!getProperty("debug.rs.arm-no-hwdiv")) { 147bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (features.count("hwdiv-arm") && features["hwdiv-arm"]) 148bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+hwdiv-arm"); 149bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 150bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (features.count("hwdiv") && features["hwdiv"]) 151bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+hwdiv"); 152bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 153bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 1548e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar // Enable fp16 attribute if available in the feature list. This feature 1558e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar // will not be added in the host version of bcc or bcc_compat since 1568e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar // 'features' would correspond to features in an x86 host. 1578e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar if (features.count("fp16") && features["fp16"]) 1588e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar attributes.push_back("+fp16"); 1598e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 160bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines setFeatureString(attributes); 161bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 162bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(TARGET_BUILD) 163bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (!getProperty("debug.rs.arm-no-tune-for-cpu")) { 1648d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#ifndef FORCE_CPU_VARIANT_32 165bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines setCPU(llvm::sys::getHostCPUName()); 1668d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#else 1678d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#define XSTR(S) #S 1688d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#define STR(S) XSTR(S) 1698d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray setCPU(STR(FORCE_CPU_VARIANT_32)); 1708d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#undef STR 1718d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#undef XSTR 1728d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#endif 173bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 174bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // TARGET_BUILD 175bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 176bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 177bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 178bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_ARM_CODEGEN 179bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 180bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(PROVIDE_ARM64_CODEGEN) 181bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::aarch64: 182bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(TARGET_BUILD) 183bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (!getProperty("debug.rs.arm-no-tune-for-cpu")) { 1848d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#ifndef FORCE_CPU_VARIANT_64 185bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines setCPU(llvm::sys::getHostCPUName()); 1868d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#else 1878d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#define XSTR(S) #S 1888d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#define STR(S) XSTR(S) 1898d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray setCPU(STR(FORCE_CPU_VARIANT_64)); 1908d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#undef STR 1918d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#undef XSTR 1928d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#endif 1938d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray 194bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 195bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // TARGET_BUILD 196bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 197bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_ARM64_CODEGEN 198bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 199bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined (PROVIDE_MIPS_CODEGEN) 200bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::mips: 201bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::mipsel: 202a16a9161fd71ea0316bbb741df2da6f433d68b20Stephen Hines if (getRelocationModel() == llvm::Reloc::Default) { 203a16a9161fd71ea0316bbb741df2da6f433d68b20Stephen Hines setRelocationModel(llvm::Reloc::Static); 204a16a9161fd71ea0316bbb741df2da6f433d68b20Stephen Hines } 205bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 206bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_MIPS_CODEGEN 207bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 20855e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic#if defined (PROVIDE_MIPS64_CODEGEN) 20955e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic case llvm::Triple::mips64: 21055e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic case llvm::Triple::mips64el: 2114171e69c678ee2590f1b8670d5be85e24ab1f635Petar Jovanovic // Default revision for MIPS64 Android is R6. 2124171e69c678ee2590f1b8670d5be85e24ab1f635Petar Jovanovic setCPU("mips64r6"); 21355e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic break; 21455e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic#endif // PROVIDE_MIPS64_CODEGEN 21555e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic 216bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined (PROVIDE_X86_CODEGEN) 217bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::x86: 218bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines // Disable frame pointer elimination optimization on x86 family. 219bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines getTargetOptions().NoFramePointerElim = true; 220bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines getTargetOptions().UseInitArray = true; 2218e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 2228e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar#ifndef __HOST__ 2238e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar // If not running on the host, and f16c is available, set it in the feature 2248e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar // string 2258e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar if (HasF16C()) 2268e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar mFeatureString = "+f16c"; 2278e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar#endif // __HOST__ 2288e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 229bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 230bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_X86_CODEGEN 231bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 232bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined (PROVIDE_X86_CODEGEN) 233bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::x86_64: 2346b43a636cf9918ae15ce0d1003148cc6c3f032eeYong Chen // x86_64 needs small CodeModel if use PIC_ reloc, or else dlopen failed with TEXTREL. 2356b43a636cf9918ae15ce0d1003148cc6c3f032eeYong Chen if (getRelocationModel() == llvm::Reloc::PIC_) { 2366b43a636cf9918ae15ce0d1003148cc6c3f032eeYong Chen setCodeModel(llvm::CodeModel::Small); 2376b43a636cf9918ae15ce0d1003148cc6c3f032eeYong Chen } else { 2386b43a636cf9918ae15ce0d1003148cc6c3f032eeYong Chen setCodeModel(llvm::CodeModel::Medium); 2396b43a636cf9918ae15ce0d1003148cc6c3f032eeYong Chen } 240bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines // Disable frame pointer elimination optimization on x86 family. 241bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines getTargetOptions().NoFramePointerElim = true; 242bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines getTargetOptions().UseInitArray = true; 2438e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 2448e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar#ifndef __HOST__ 2458e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar // If not running on the host, and f16c is available, set it in the feature 2468e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar // string 2478e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar if (HasF16C()) 2488e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar mFeatureString = "+f16c"; 2498e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar#endif // __HOST__ 2508e3b7f32515684b2eb872acb8a716f87d8504884Pirama Arumuga Nainar 251bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 252bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_X86_CODEGEN 253bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 254bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines default: 255bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines ALOGE("Unsupported architecture type: %s", mTarget->getName()); 256bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines return false; 257bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 258bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 259bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines return true; 260f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 261f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 262f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changvoid CompilerConfig::setFeatureString(const std::vector<std::string> &pAttrs) { 263f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang llvm::SubtargetFeatures f; 264f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 265f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang for (std::vector<std::string>::const_iterator attr_iter = pAttrs.begin(), 266f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang attr_end = pAttrs.end(); 267f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang attr_iter != attr_end; attr_iter++) { 268f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang f.AddFeature(*attr_iter); 269f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 270f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 271f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mFeatureString = f.getString(); 272f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return; 273f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 274