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 
27 namespace llvm {
28 
29 class Target;
30 
31 } // end namespace llvm
32 
33 namespace bcc {
34 
35 class CompilerConfig {
36 private:
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 
69 public:
70   //===--------------------------------------------------------------------===//
71   // Getters
72   //===--------------------------------------------------------------------===//
getTriple()73   inline const std::string &getTriple() const
74   { return mTriple; }
75 
getCPU()76   inline const std::string &getCPU() const
77   { return mCPU; }
setCPU(const std::string & pCPU)78   inline void setCPU(const std::string &pCPU)
79   { mCPU = pCPU; }
80 
getTargetOptions()81   inline const llvm::TargetOptions &getTargetOptions() const
82   { return mTargetOpts; }
getTargetOptions()83   inline llvm::TargetOptions &getTargetOptions()
84   { return mTargetOpts; }
85 
getCodeModel()86   inline llvm::CodeModel::Model getCodeModel() const
87   { return mCodeModel; }
setCodeModel(llvm::CodeModel::Model pCodeMode)88   inline void setCodeModel(llvm::CodeModel::Model pCodeMode)
89   { mCodeModel = pCodeMode; }
90 
getOptimizationLevel()91   inline llvm::CodeGenOpt::Level getOptimizationLevel() const
92   { return mOptLevel; }
setOptimizationLevel(llvm::CodeGenOpt::Level pOptLvl)93   inline void setOptimizationLevel(llvm::CodeGenOpt::Level pOptLvl)
94   { mOptLevel = pOptLvl; }
95 
getRelocationModel()96   inline llvm::Reloc::Model getRelocationModel() const
97   { return mRelocModel; }
setRelocationModel(llvm::Reloc::Model pRelocModel)98   inline void setRelocationModel(llvm::Reloc::Model pRelocModel)
99   { mRelocModel = pRelocModel; }
100 
getTarget()101   inline const llvm::Target *getTarget() const
102   { return mTarget; }
103 
getArchType()104   inline llvm::Triple::ArchType getArchType() const
105   { return mArchType; }
106 
getFullPrecision()107   inline bool getFullPrecision() const
108   { return mFullPrecision; }
setFullPrecision(bool pFullPrecision)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 
getFeatureString()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 
~CompilerConfig()122   virtual ~CompilerConfig() { }
123 };
124 
125 } // end namespace bcc
126 
127 #endif  // BCC_SUPPORT_COMPILER_CONFIG_H
128