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