CompilerConfig.cpp revision ef73a242762bcd8113b9b65ceccbe7d909b5acbc
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#include "bcc/Support/CompilerConfig.h" 18f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 19f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/CodeGen/SchedulerRegistry.h> 20f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/MC/SubtargetFeature.h> 21f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/Support/TargetRegistry.h> 22f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 23ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h" 24c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Support/TargetCompilerConfigs.h" 25f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 26f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changusing namespace bcc; 27f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 28f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr ChangCompilerConfig::CompilerConfig(const std::string &pTriple) 29f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang : mTriple(pTriple), mTarget(NULL) { 30f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 31f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting of register sheduler 32f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 33f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang llvm::RegisterScheduler::setDefault(llvm::createDefaultScheduler); 34f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 35f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 36f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting of target options 37f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 38f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Use hardfloat ABI by default. 39f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // 40f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // TODO(all): Need to detect the CPU capability and decide whether to use 41f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // softfp. To use softfp, change the following 2 lines to 42f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // 43f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // options.FloatABIType = llvm::FloatABI::Soft; 44f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // options.UseSoftFloat = true; 45f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTargetOpts.FloatABIType = llvm::FloatABI::Soft; 46f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTargetOpts.UseSoftFloat = false; 47f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 48f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Enable frame pointer elimination optimization by default. 49f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTargetOpts.NoFramePointerElim = false; 50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 51f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 52f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for code model 53f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 54f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mCodeModel = llvm::CodeModel::Small; 55f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 56f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 57f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for relocation model 58f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 59f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mRelocModel = llvm::Reloc::Default; 60f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 61f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 62f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for optimization level (-O2) 63f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 64f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mOptLevel = llvm::CodeGenOpt::Default; 65f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 66f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 67f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Default setting for architecture type 68f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang //===--------------------------------------------------------------------===// 69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mArchType = llvm::Triple::UnknownArch; 70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang initializeTarget(); 72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang initializeArch(); 73f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 74f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return; 75f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 76f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 77f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changbool CompilerConfig::initializeTarget() { 78f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang std::string error; 79f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTarget = llvm::TargetRegistry::lookupTarget(mTriple, error); 80f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang if (mTarget != NULL) { 81f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return true; 82f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } else { 83f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang ALOGE("Cannot initialize llvm::Target for given triple '%s'! (%s)", 84f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mTriple.c_str(), error.c_str()); 85f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return false; 86f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 87f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 88f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 89f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changvoid CompilerConfig::initializeArch() { 90f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang if (mTarget != NULL) { 91f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mArchType = llvm::Triple::getArchTypeForLLVMName(mTarget->getName()); 92f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } else { 93f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mArchType = llvm::Triple::UnknownArch; 94f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 95f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return; 96f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 97f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 98f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changvoid CompilerConfig::setFeatureString(const std::vector<std::string> &pAttrs) { 99f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang llvm::SubtargetFeatures f; 100f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 101f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang for (std::vector<std::string>::const_iterator attr_iter = pAttrs.begin(), 102f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang attr_end = pAttrs.end(); 103f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang attr_iter != attr_end; attr_iter++) { 104f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang f.AddFeature(*attr_iter); 105f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 106f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 107f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang mFeatureString = f.getString(); 108f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return; 109f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 110