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_COMPILER_CONFIG_H
18c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#define BCC_SUPPORT_COMPILER_CONFIG_H
19f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
20f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <string>
21f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <vector>
22f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
23f5b49a0ca149b09c8306b86db9f3aca703c4acd5Pirama Arumuga Nainar#include <llvm/ADT/Optional.h>
24f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/ADT/Triple.h>
25f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/Support/CodeGen.h>
26f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/Target/TargetOptions.h>
27f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
28f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changnamespace llvm {
29f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
30f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changclass Target;
31f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
32f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} // end namespace llvm
33f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
34f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changnamespace bcc {
35f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
36f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changclass CompilerConfig {
37f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changprivate:
38f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
39f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Available Configurations
40f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
41f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  std::string mTriple;
42f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
43f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Optional. If given, the name of the target CPU to generate code for.
44f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  std::string mCPU;
45f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
46f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  llvm::TargetOptions mTargetOpts;
47f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
48f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  llvm::CodeModel::Model mCodeModel;
49f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  llvm::CodeGenOpt::Level mOptLevel;
51f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
52f5b49a0ca149b09c8306b86db9f3aca703c4acd5Pirama Arumuga Nainar  llvm::Optional<llvm::Reloc::Model> mRelocModel;
53f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
54bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines  // Are we set up to compile for full precision or something reduced?
55bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines  bool mFullPrecision;
56bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines
57f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // The list of target specific features to enable or disable -- this should
58f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // be a list of strings starting with '+' (enable) or '-' (disable).
59f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  std::string mFeatureString;
60f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
61f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
62f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // These are generated by CompilerConfig during initialize().
63f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
64f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  const llvm::Target *mTarget;
65f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  bool initializeTarget();
66f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
67f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  llvm::Triple::ArchType mArchType;
68bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines  bool initializeArch();
69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changpublic:
71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Getters
73f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  //===--------------------------------------------------------------------===//
74f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline const std::string &getTriple() const
75f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mTriple; }
76f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
77f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline const std::string &getCPU() const
78f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mCPU; }
79f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline void setCPU(const std::string &pCPU)
80f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { mCPU = pCPU; }
81f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
82f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline const llvm::TargetOptions &getTargetOptions() const
83f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mTargetOpts; }
84f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline llvm::TargetOptions &getTargetOptions()
85f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mTargetOpts; }
86f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
87f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline llvm::CodeModel::Model getCodeModel() const
88f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mCodeModel; }
89f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline void setCodeModel(llvm::CodeModel::Model pCodeMode)
90f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { mCodeModel = pCodeMode; }
91f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
92f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline llvm::CodeGenOpt::Level getOptimizationLevel() const
93f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mOptLevel; }
94f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline void setOptimizationLevel(llvm::CodeGenOpt::Level pOptLvl)
95f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { mOptLevel = pOptLvl; }
96f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
97f5b49a0ca149b09c8306b86db9f3aca703c4acd5Pirama Arumuga Nainar  inline llvm::Optional<llvm::Reloc::Model> getRelocationModel() const
98f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mRelocModel; }
99f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline void setRelocationModel(llvm::Reloc::Model pRelocModel)
100f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { mRelocModel = pRelocModel; }
101f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
102f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline const llvm::Target *getTarget() const
103f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mTarget; }
104f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
105f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline llvm::Triple::ArchType getArchType() const
106f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mArchType; }
107f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
108bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines  inline bool getFullPrecision() const
109bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines  { return mFullPrecision; }
110bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines  inline void setFullPrecision(bool pFullPrecision) {
111bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines    mFullPrecision = pFullPrecision;
112bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines    // Note that we have to reinitialize here to ensure that mFeatureString
113bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines    // is up to date.
114bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines    initializeArch();
115bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines  }
116bde1a2599780d6eaebbc284976ceb690492f6abdStephen Hines
117f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  inline const std::string &getFeatureString() const
118f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  { return mFeatureString; }
119f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  void setFeatureString(const std::vector<std::string> &pAttrs);
120f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
1218a019dd0040bedf5078e4d18e06a244a675b80e8Chih-Hung Hsieh  explicit CompilerConfig(const std::string &pTriple);
122f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
123f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  virtual ~CompilerConfig() { }
124f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang};
125f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
126f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} // end namespace bcc
127f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
128c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif  // BCC_SUPPORT_COMPILER_CONFIG_H
129