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