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 3070e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar#if defined (PROVIDE_X86_CODEGEN) && !defined(__HOST__) 3170e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar 3270e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainarnamespace { 3370e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar 3470e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar// Utility function to test for f16c feature. This function is only needed for 3570e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar// on-device bcc for x86 3670e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainarbool HasF16C() { 3770e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar llvm::StringMap<bool> features; 3870e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar if (!llvm::sys::getHostCPUFeatures(features)) 3970e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar return false; 4070e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar 4170e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar if (features.count("f16c") && features["f16c"]) 4270e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar return true; 4370e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar else 4470e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar return false; 4570e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar} 4670e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar 4770e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar} 4870e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar#endif // (PROVIDE_X86_CODEGEN) && !defined(__HOST__) 4970e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar 50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr ChangCompilerConfig::CompilerConfig(const std::string &pTriple) 51900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes : mTriple(pTriple), mFullPrecision(true), mTarget(nullptr) { 52f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 53f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting of target options 54f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 5586e5c863d609de41b03033fd7e81ca41dbb181c8Pirama Arumuga Nainar 5686e5c863d609de41b03033fd7e81ca41dbb181c8Pirama Arumuga Nainar // Use soft-float ABI. This only selects the ABI (and is applicable only to 5786e5c863d609de41b03033fd7e81ca41dbb181c8Pirama Arumuga Nainar // ARM targets). Codegen still uses hardware FPU by default. To use software 5886e5c863d609de41b03033fd7e81ca41dbb181c8Pirama Arumuga Nainar // floating point, add 'soft-float' feature to mFeatureString below. 59f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTargetOpts.FloatABIType = llvm::FloatABI::Soft; 60f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 61f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 62f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for code model 63f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 64f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mCodeModel = llvm::CodeModel::Small; 65f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 66f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 67f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for relocation model 68f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mRelocModel = llvm::Reloc::Default; 70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for optimization level (-O2) 73f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 74f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mOptLevel = llvm::CodeGenOpt::Default; 75f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 76f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 77f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for architecture type 78f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 79f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mArchType = llvm::Triple::UnknownArch; 80f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 81f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang initializeTarget(); 82f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang initializeArch(); 83f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 84f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return; 85f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 86f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 87f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changbool CompilerConfig::initializeTarget() { 88f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang std::string error; 89f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTarget = llvm::TargetRegistry::lookupTarget(mTriple, error); 90900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (mTarget != nullptr) { 91f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return true; 92f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } else { 93f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang ALOGE("Cannot initialize llvm::Target for given triple '%s'! (%s)", 94f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTriple.c_str(), error.c_str()); 95f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return false; 96f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 97f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 98f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 99bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hinesbool CompilerConfig::initializeArch() { 100900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (mTarget != nullptr) { 101f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mArchType = llvm::Triple::getArchTypeForLLVMName(mTarget->getName()); 102f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } else { 103f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mArchType = llvm::Triple::UnknownArch; 104bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines return false; 105f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 106bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 107bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines // Configure each architecture for any necessary additional flags. 1083c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond std::vector<std::string> attributes; 109bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines switch (mArchType) { 110bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(PROVIDE_ARM_CODEGEN) 111bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::arm: { 112bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines llvm::StringMap<bool> features; 113bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines llvm::sys::getHostCPUFeatures(features); 114bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 115bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(__HOST__) || defined(ARCH_ARM_HAVE_VFP) 116bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+vfp3"); 117bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if !defined(__HOST__) && !defined(ARCH_ARM_HAVE_VFP_D32) 118bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+d16"); 119bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // !__HOST__ && !ARCH_ARM_HAVE_VFP_D32 120bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // __HOST__ || ARCH_ARM_HAVE_VFP 121bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 122bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(__HOST__) || defined(ARCH_ARM_HAVE_NEON) 123bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines // Only enable NEON on ARM if we have relaxed precision floats. 124bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (!mFullPrecision) { 125bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+neon"); 126bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } else { 127bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // __HOST__ || ARCH_ARM_HAVE_NEON 128bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("-neon"); 129bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("-neonfp"); 130bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(__HOST__) || defined(ARCH_ARM_HAVE_NEON) 131bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 132bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // __HOST__ || ARCH_ARM_HAVE_NEON 133bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 134bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (!getProperty("debug.rs.arm-no-hwdiv")) { 135bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (features.count("hwdiv-arm") && features["hwdiv-arm"]) 136bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+hwdiv-arm"); 137bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 138bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (features.count("hwdiv") && features["hwdiv"]) 139bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines attributes.push_back("+hwdiv"); 140bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 141bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 14270e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar // Enable fp16 attribute if available in the feature list. This feature 14370e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar // will not be added in the host version of bcc or bcc_compat since 14470e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar // 'features' would correspond to features in an x86 host. 14570e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar if (features.count("fp16") && features["fp16"]) 14670e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar attributes.push_back("+fp16"); 14770e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar 148ae3184b98e2ff4a786979423e59b5c0ae6c16bd5Pirama Arumuga Nainar#if defined(PROVIDE_ARM64_CODEGEN) 149ae3184b98e2ff4a786979423e59b5c0ae6c16bd5Pirama Arumuga Nainar // On AArch64, asimd in /proc/cpuinfo signals the presence of hardware 150ae3184b98e2ff4a786979423e59b5c0ae6c16bd5Pirama Arumuga Nainar // half-precision conversion instructions. getHostCPUFeatures translates 151ae3184b98e2ff4a786979423e59b5c0ae6c16bd5Pirama Arumuga Nainar // this to "neon". If PROVIDE_ARM64_CODEGEN is set, enable "+fp16" for ARM 152ae3184b98e2ff4a786979423e59b5c0ae6c16bd5Pirama Arumuga Nainar // codegen if "neon" is present in features. 153ae3184b98e2ff4a786979423e59b5c0ae6c16bd5Pirama Arumuga Nainar if (features.count("neon") && features["neon"]) 154ae3184b98e2ff4a786979423e59b5c0ae6c16bd5Pirama Arumuga Nainar attributes.push_back("+fp16"); 155ae3184b98e2ff4a786979423e59b5c0ae6c16bd5Pirama Arumuga Nainar#endif // PROVIDE_ARM64_CODEGEN 156bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 157bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(TARGET_BUILD) 158bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (!getProperty("debug.rs.arm-no-tune-for-cpu")) { 1598d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#ifndef FORCE_CPU_VARIANT_32 160d8563169c10620e696106542e517f9fbd65984d2Yong Chen#ifdef DEFAULT_ARM_CODEGEN 161bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines setCPU(llvm::sys::getHostCPUName()); 162d8563169c10620e696106542e517f9fbd65984d2Yong Chen#endif 1638d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#else 1648d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#define XSTR(S) #S 1658d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#define STR(S) XSTR(S) 1668d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray setCPU(STR(FORCE_CPU_VARIANT_32)); 1678d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#undef STR 1688d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#undef XSTR 1698d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#endif 170bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 171bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // TARGET_BUILD 172bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 173bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 174bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 175bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_ARM_CODEGEN 176bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 177bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(PROVIDE_ARM64_CODEGEN) 178bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::aarch64: 179bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined(TARGET_BUILD) 180bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines if (!getProperty("debug.rs.arm-no-tune-for-cpu")) { 1818d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#ifndef FORCE_CPU_VARIANT_64 182d8563169c10620e696106542e517f9fbd65984d2Yong Chen#ifdef DEFAULT_ARM64_CODEGEN 183bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines setCPU(llvm::sys::getHostCPUName()); 184d8563169c10620e696106542e517f9fbd65984d2Yong Chen#endif 1858d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#else 1868d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#define XSTR(S) #S 1878d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#define STR(S) XSTR(S) 1888d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray setCPU(STR(FORCE_CPU_VARIANT_64)); 1898d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#undef STR 1908d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#undef XSTR 1918d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray#endif 1928d254fd40df498a21ca540cb355ee8c6a9250ac0Tim Murray 193bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 194bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // TARGET_BUILD 195bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 196bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_ARM64_CODEGEN 197bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 198bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined (PROVIDE_MIPS_CODEGEN) 199bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::mips: 200bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::mipsel: 201a16a9161fd71ea0316bbb741df2da6f433d68b20Stephen Hines if (getRelocationModel() == llvm::Reloc::Default) { 202a16a9161fd71ea0316bbb741df2da6f433d68b20Stephen Hines setRelocationModel(llvm::Reloc::Static); 203a16a9161fd71ea0316bbb741df2da6f433d68b20Stephen Hines } 204bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 205bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_MIPS_CODEGEN 206bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 20755e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic#if defined (PROVIDE_MIPS64_CODEGEN) 20855e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic case llvm::Triple::mips64: 20955e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic case llvm::Triple::mips64el: 2104171e69c678ee2590f1b8670d5be85e24ab1f635Petar Jovanovic // Default revision for MIPS64 Android is R6. 2114171e69c678ee2590f1b8670d5be85e24ab1f635Petar Jovanovic setCPU("mips64r6"); 21255e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic break; 21355e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic#endif // PROVIDE_MIPS64_CODEGEN 21455e11789bded7217aea270d5c60c0cf32b2a70c2Petar Jovanovic 215bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined (PROVIDE_X86_CODEGEN) 216bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::x86: 217bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines getTargetOptions().UseInitArray = true; 2183c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#if defined (DEFAULT_X86_CODEGEN) && !defined (DEFAULT_X86_64_CODEGEN) 2193c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond setCPU(llvm::sys::getHostCPUName()); 2203c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#else 2213c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond // generic fallback for 32bit x86 targets 2223c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond setCPU("atom"); 2233c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#endif // DEFAULT_X86_CODEGEN && !DEFAULT_X86_64_CODEGEN 22470e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar 22570e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar#ifndef __HOST__ 22670e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar // If not running on the host, and f16c is available, set it in the feature 22770e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar // string 22870e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar if (HasF16C()) 2293c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond attributes.push_back("+f16c"); 2303c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#if defined(__SSE3__) 2313c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond attributes.push_back("+sse3"); 2323c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond attributes.push_back("+ssse3"); 2333c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#endif 2343c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#if defined(__SSE4_1__) 2353c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond attributes.push_back("+sse4.1"); 2363c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#endif 2373c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#if defined(__SSE4_2__) 2383c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond attributes.push_back("+sse4.2"); 2393c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#endif 24070e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar#endif // __HOST__ 241bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 242bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_X86_CODEGEN 243bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 244bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#if defined (PROVIDE_X86_CODEGEN) 2453c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond// PROVIDE_X86_CODEGEN is defined for both x86 and x86_64 246bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines case llvm::Triple::x86_64: 2474e39604f2b7b1371cc0b0da4bf682616143e5bd6Miao Wang#if defined(DEFAULT_X86_64_CODEGEN) && !defined(__HOST__) 2483c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond setCPU(llvm::sys::getHostCPUName()); 2493c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#else 2503c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond // generic fallback for 64bit x86 targets 2513c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond setCPU("core2"); 2523c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond#endif 253166b8d08b66d7feb8262b31bc65fb297070b4700Yong Chen // x86_64 needs small CodeModel if use PIC_ reloc, or else dlopen failed with TEXTREL. 254166b8d08b66d7feb8262b31bc65fb297070b4700Yong Chen if (getRelocationModel() == llvm::Reloc::PIC_) { 255166b8d08b66d7feb8262b31bc65fb297070b4700Yong Chen setCodeModel(llvm::CodeModel::Small); 256166b8d08b66d7feb8262b31bc65fb297070b4700Yong Chen } else { 257166b8d08b66d7feb8262b31bc65fb297070b4700Yong Chen setCodeModel(llvm::CodeModel::Medium); 258166b8d08b66d7feb8262b31bc65fb297070b4700Yong Chen } 259bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines getTargetOptions().UseInitArray = true; 26070e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar 26170e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar#ifndef __HOST__ 26270e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar // If not running on the host, and f16c is available, set it in the feature 26370e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar // string 26470e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar if (HasF16C()) 2653c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond attributes.push_back("+f16c"); 26670e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar#endif // __HOST__ 26770e3dcff9f0450b13f8ccb8db3fba76653993e35Pirama Arumuga Nainar 268bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines break; 269bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines#endif // PROVIDE_X86_CODEGEN 270bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 271bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines default: 272bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines ALOGE("Unsupported architecture type: %s", mTarget->getName()); 273bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines return false; 274bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines } 275bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines 2763c05a9cabc73640febb331e3df1d8f2e565c9e30Luke Drummond setFeatureString(attributes); 277bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines return true; 278f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 279f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 280f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changvoid CompilerConfig::setFeatureString(const std::vector<std::string> &pAttrs) { 281f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang llvm::SubtargetFeatures f; 282f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 283f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang for (std::vector<std::string>::const_iterator attr_iter = pAttrs.begin(), 284f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang attr_end = pAttrs.end(); 285f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang attr_iter != attr_end; attr_iter++) { 286f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang f.AddFeature(*attr_iter); 287f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 288f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 289f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mFeatureString = f.getString(); 290f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return; 291f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 292