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