[go: nahoru, domu]

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