CompilerConfig.cpp revision ef73a242762bcd8113b9b65ceccbe7d909b5acbc
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"
18f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
19f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/CodeGen/SchedulerRegistry.h>
20f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/MC/SubtargetFeature.h>
21f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/Support/TargetRegistry.h>
22f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
23ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h"
24c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Support/TargetCompilerConfigs.h"
25f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
26f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changusing namespace bcc;
27f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
28f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr ChangCompilerConfig::CompilerConfig(const std::string &pTriple)
29f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  : mTriple(pTriple), mTarget(NULL) {
30f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
31f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Default setting of register sheduler
32f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
33f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  llvm::RegisterScheduler::setDefault(llvm::createDefaultScheduler);
34f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
35f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
36f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Default setting of target options
37f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
38f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Use hardfloat ABI by default.
39f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //
40f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // TODO(all): Need to detect the CPU capability and decide whether to use
41f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // softfp. To use softfp, change the following 2 lines to
42f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //
43f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // options.FloatABIType = llvm::FloatABI::Soft;
44f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // options.UseSoftFloat = true;
45f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mTargetOpts.FloatABIType = llvm::FloatABI::Soft;
46f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mTargetOpts.UseSoftFloat = false;
47f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
48f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Enable frame pointer elimination optimization by default.
49f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mTargetOpts.NoFramePointerElim = false;
50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
51f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
52f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Default setting for code model
53f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
54f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mCodeModel = llvm::CodeModel::Small;
55f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
56f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
57f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Default setting for relocation model
58f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
59f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mRelocModel = llvm::Reloc::Default;
60f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
61f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
62f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Default setting for optimization level (-O2)
63f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
64f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mOptLevel = llvm::CodeGenOpt::Default;
65f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
66f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
67f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Default setting for architecture type
68f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mArchType = llvm::Triple::UnknownArch;
70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  initializeTarget();
72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  initializeArch();
73f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
74f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return;
75f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
76f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
77f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changbool CompilerConfig::initializeTarget() {
78f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  std::string error;
79f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mTarget = llvm::TargetRegistry::lookupTarget(mTriple, error);
80f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  if (mTarget != NULL) {
81f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    return true;
82f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  } else {
83f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    ALOGE("Cannot initialize llvm::Target for given triple '%s'! (%s)",
84f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang          mTriple.c_str(), error.c_str());
85f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    return false;
86f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  }
87f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
88f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
89f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changvoid CompilerConfig::initializeArch() {
90f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  if (mTarget != NULL) {
91f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    mArchType = llvm::Triple::getArchTypeForLLVMName(mTarget->getName());
92f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  } else {
93f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    mArchType = llvm::Triple::UnknownArch;
94f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  }
95f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return;
96f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
97f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
98f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changvoid CompilerConfig::setFeatureString(const std::vector<std::string> &pAttrs) {
99f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  llvm::SubtargetFeatures f;
100f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
101f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  for (std::vector<std::string>::const_iterator attr_iter = pAttrs.begin(),
102f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang           attr_end = pAttrs.end();
103f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang       attr_iter != attr_end; attr_iter++) {
104f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    f.AddFeature(*attr_iter);
105f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  }
106f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
107f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mFeatureString = f.getString();
108f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return;
109f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
110