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#ifndef BCC_SUPPORT_TARGET_COMPILER_CONFIGS_H
18c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#define BCC_SUPPORT_TARGET_COMPILER_CONFIGS_H
19f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
20c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Config/Config.h"
21c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Support/CompilerConfig.h"
22f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
23f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changnamespace bcc {
24f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
25f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
26f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang// ARM
27f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
28f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_ARM_CODEGEN)
29f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changclass ARMCompilerConfig : public CompilerConfig {
30f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changprivate:
31f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  bool mEnableNEON;
32f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
33f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  static void GetFeatureVector(std::vector<std::string> &pAttributes,
34f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang                               bool pEnableNEON);
35f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
36f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changpublic:
37f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  ARMCompilerConfig();
38f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
39f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Return true if config has been changed after returning from this function.
40f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  bool enableNEON(bool pEnable = true);
41f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang};
42f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif // defined(PROVIDE_ARM_CODEGEN)
43f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
44f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
45f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang// MIPS
46f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
47f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_MIPS_CODEGEN)
48f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changclass MipsCompilerConfig : public CompilerConfig {
49f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changpublic:
50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  MipsCompilerConfig() : CompilerConfig(DEFAULT_MIPS_TRIPLE_STRING) {}
51f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang};
52f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif // defined(PROVIDE_MIPS_CODEGEN)
53f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
54f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
55f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang// X86 and X86_64
56f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
57f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_X86_CODEGEN)
58f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changclass X86FamilyCompilerConfigBase : public CompilerConfig {
59f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changprotected:
60f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  X86FamilyCompilerConfigBase(const std::string &pTriple)
61f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    : CompilerConfig(pTriple) {
62f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    // Disable frame pointer elimination optimization on x86 family.
63f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    getTargetOptions().NoFramePointerElim = true;
64805a5e2b755a7869621f263e6321d890e06fcf24Shih-wei Liao    getTargetOptions().UseInitArray = true;
65f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    return;
66f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  }
67f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang};
68f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changclass X86_32CompilerConfig : public X86FamilyCompilerConfigBase {
70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changpublic:
71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  X86_32CompilerConfig() :
72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang      X86FamilyCompilerConfigBase(DEFAULT_X86_TRIPLE_STRING) { }
73f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang};
74f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
75f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changclass X86_64CompilerConfig : public X86FamilyCompilerConfigBase {
76f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changpublic:
77f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  X86_64CompilerConfig() :
78f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang      X86FamilyCompilerConfigBase(DEFAULT_X86_64_TRIPLE_STRING) {
79f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    setCodeModel(llvm::CodeModel::Medium);
80f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  }
81f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang};
82f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif // defined(PROVIDE_X86_CODEGEN)
83f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
84f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
85f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang// Default target
86f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
87f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changclass DefaultCompilerConfig : public
88f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(DEFAULT_ARM_CODEGEN)
89f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  ARMCompilerConfig
90f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#elif defined(DEFAULT_MIPS_CODEGEN)
91f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  MipsCompilerConfig
92f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#elif defined(DEFAULT_X86_CODEGEN)
93f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  X86_32CompilerConfig
94f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#elif defined(DEFAULT_X86_64_CODEGEN)
95f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  X86_64CompilerConfig
96f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#else
97f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#  error "Unsupported Default Target!"
98f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
99f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang{ };
100f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
101f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} // end namespace bcc
102f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
103c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_SUPPORT_TARGET_COMPILER_CONFIGS_H
104