1/*
2 * Copyright 2012, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef BCC_SUPPORT_COMPILER_CONFIG_H
18#define BCC_SUPPORT_COMPILER_CONFIG_H
19
20#include <string>
21#include <vector>
22
23#include <llvm/ADT/Triple.h>
24#include <llvm/Support/CodeGen.h>
25#include <llvm/Target/TargetOptions.h>
26
27namespace llvm {
28
29class Target;
30
31} // end namespace llvm
32
33namespace bcc {
34
35class CompilerConfig {
36private:
37  //===--------------------------------------------------------------------===//
38  // Available Configurations
39  //===--------------------------------------------------------------------===//
40  std::string mTriple;
41
42  // Optional. If given, the name of the target CPU to generate code for.
43  std::string mCPU;
44
45  llvm::TargetOptions mTargetOpts;
46
47  llvm::CodeModel::Model mCodeModel;
48
49  llvm::CodeGenOpt::Level mOptLevel;
50
51  llvm::Reloc::Model mRelocModel;
52
53  // Are we set up to compile for full precision or something reduced?
54  bool mFullPrecision;
55
56  // The list of target specific features to enable or disable -- this should
57  // be a list of strings starting with '+' (enable) or '-' (disable).
58  std::string mFeatureString;
59
60  //===--------------------------------------------------------------------===//
61  // These are generated by CompilerConfig during initialize().
62  //===--------------------------------------------------------------------===//
63  const llvm::Target *mTarget;
64  bool initializeTarget();
65
66  llvm::Triple::ArchType mArchType;
67  bool initializeArch();
68
69public:
70  //===--------------------------------------------------------------------===//
71  // Getters
72  //===--------------------------------------------------------------------===//
73  inline const std::string &getTriple() const
74  { return mTriple; }
75
76  inline const std::string &getCPU() const
77  { return mCPU; }
78  inline void setCPU(const std::string &pCPU)
79  { mCPU = pCPU; }
80
81  inline const llvm::TargetOptions &getTargetOptions() const
82  { return mTargetOpts; }
83  inline llvm::TargetOptions &getTargetOptions()
84  { return mTargetOpts; }
85
86  inline llvm::CodeModel::Model getCodeModel() const
87  { return mCodeModel; }
88  inline void setCodeModel(llvm::CodeModel::Model pCodeMode)
89  { mCodeModel = pCodeMode; }
90
91  inline llvm::CodeGenOpt::Level getOptimizationLevel() const
92  { return mOptLevel; }
93  inline void setOptimizationLevel(llvm::CodeGenOpt::Level pOptLvl)
94  { mOptLevel = pOptLvl; }
95
96  inline llvm::Reloc::Model getRelocationModel() const
97  { return mRelocModel; }
98  inline void setRelocationModel(llvm::Reloc::Model pRelocModel)
99  { mRelocModel = pRelocModel; }
100
101  inline const llvm::Target *getTarget() const
102  { return mTarget; }
103
104  inline llvm::Triple::ArchType getArchType() const
105  { return mArchType; }
106
107  inline bool getFullPrecision() const
108  { return mFullPrecision; }
109  inline void setFullPrecision(bool pFullPrecision) {
110    mFullPrecision = pFullPrecision;
111    // Note that we have to reinitialize here to ensure that mFeatureString
112    // is up to date.
113    initializeArch();
114  }
115
116  inline const std::string &getFeatureString() const
117  { return mFeatureString; }
118  void setFeatureString(const std::vector<std::string> &pAttrs);
119
120  CompilerConfig(const std::string &pTriple);
121
122  virtual ~CompilerConfig() { }
123};
124
125} // end namespace bcc
126
127#endif  // BCC_SUPPORT_COMPILER_CONFIG_H
128