| /* | |
| * Copyright 2012, The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef BCC_SUPPORT_COMPILER_CONFIG_H | |
| #define BCC_SUPPORT_COMPILER_CONFIG_H | |
| #include <string> | |
| #include <vector> | |
| #include <llvm/ADT/Optional.h> | |
| #include <llvm/ADT/Triple.h> | |
| #include <llvm/Support/CodeGen.h> | |
| #include <llvm/Target/TargetOptions.h> | |
| namespace llvm { | |
| class Target; | |
| } // end namespace llvm | |
| namespace bcc { | |
| class CompilerConfig { | |
| private: | |
| //===--------------------------------------------------------------------===// | |
| // Available Configurations | |
| //===--------------------------------------------------------------------===// | |
| std::string mTriple; | |
| // Optional. If given, the name of the target CPU to generate code for. | |
| std::string mCPU; | |
| llvm::TargetOptions mTargetOpts; | |
| llvm::CodeModel::Model mCodeModel; | |
| llvm::CodeGenOpt::Level mOptLevel; | |
| llvm::Optional<llvm::Reloc::Model> mRelocModel; | |
| // Are we set up to compile for full precision or something reduced? | |
| bool mFullPrecision; | |
| // The list of target specific features to enable or disable -- this should | |
| // be a list of strings starting with '+' (enable) or '-' (disable). | |
| std::string mFeatureString; | |
| //===--------------------------------------------------------------------===// | |
| // These are generated by CompilerConfig during initialize(). | |
| //===--------------------------------------------------------------------===// | |
| const llvm::Target *mTarget; | |
| bool initializeTarget(); | |
| llvm::Triple::ArchType mArchType; | |
| bool initializeArch(); | |
| public: | |
| //===--------------------------------------------------------------------===// | |
| // Getters | |
| //===--------------------------------------------------------------------===// | |
| inline const std::string &getTriple() const | |
| { return mTriple; } | |
| inline const std::string &getCPU() const | |
| { return mCPU; } | |
| inline void setCPU(const std::string &pCPU) | |
| { mCPU = pCPU; } | |
| inline const llvm::TargetOptions &getTargetOptions() const | |
| { return mTargetOpts; } | |
| inline llvm::TargetOptions &getTargetOptions() | |
| { return mTargetOpts; } | |
| inline llvm::CodeModel::Model getCodeModel() const | |
| { return mCodeModel; } | |
| inline void setCodeModel(llvm::CodeModel::Model pCodeMode) | |
| { mCodeModel = pCodeMode; } | |
| inline llvm::CodeGenOpt::Level getOptimizationLevel() const | |
| { return mOptLevel; } | |
| inline void setOptimizationLevel(llvm::CodeGenOpt::Level pOptLvl) | |
| { mOptLevel = pOptLvl; } | |
| inline llvm::Optional<llvm::Reloc::Model> getRelocationModel() const | |
| { return mRelocModel; } | |
| inline void setRelocationModel(llvm::Reloc::Model pRelocModel) | |
| { mRelocModel = pRelocModel; } | |
| inline const llvm::Target *getTarget() const | |
| { return mTarget; } | |
| inline llvm::Triple::ArchType getArchType() const | |
| { return mArchType; } | |
| inline bool getFullPrecision() const | |
| { return mFullPrecision; } | |
| inline void setFullPrecision(bool pFullPrecision) { | |
| mFullPrecision = pFullPrecision; | |
| // Note that we have to reinitialize here to ensure that mFeatureString | |
| // is up to date. | |
| initializeArch(); | |
| } | |
| inline const std::string &getFeatureString() const | |
| { return mFeatureString; } | |
| void setFeatureString(const std::vector<std::string> &pAttrs); | |
| explicit CompilerConfig(const std::string &pTriple); | |
| virtual ~CompilerConfig() { } | |
| }; | |
| } // end namespace bcc | |
| #endif // BCC_SUPPORT_COMPILER_CONFIG_H |