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 17a2dd52f0710c214e00c1a13e25116e1af5eec77aJean-Luc Brouillet#include "bcc/Initialization.h" 18a2dd52f0710c214e00c1a13e25116e1af5eec77aJean-Luc Brouillet 19a2dd52f0710c214e00c1a13e25116e1af5eec77aJean-Luc Brouillet#include "Log.h" 20a2dd52f0710c214e00c1a13e25116e1af5eec77aJean-Luc Brouillet#include "bcc/Config.h" 21f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 22f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <cstdlib> 23f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 24c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray#include <llvm/InitializePasses.h> 25c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray#include <llvm/PassRegistry.h> 26f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/Support/ErrorHandling.h> 27f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/Support/TargetSelect.h> 28f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 29f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changnamespace { 30f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 3186e4506416f974d3c717deaca2b17b0792cc2d49Stephen Hinesvoid llvm_error_handler(void *pUserData, const std::string &pMessage, 3286e4506416f974d3c717deaca2b17b0792cc2d49Stephen Hines bool pGenCrashDiag) { 335db508c73e6177eb306bac4725616b7c001587c4Stephen Hines ALOGE("bcc: Internal Error - %s", pMessage.c_str()); 34f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang ::exit(1); 35f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 36f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 37f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} // end anonymous namespace 38f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 39f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changvoid bcc::init::Initialize() { 40f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang static bool is_initialized = false; 41f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 42f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang if (is_initialized) { 43f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return; 44f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang } 45f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 46f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang // Setup error handler for LLVM. 47f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang llvm::remove_fatal_error_handler(); 48900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes llvm::install_fatal_error_handler(llvm_error_handler, nullptr); 49f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 51c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::InitializeAllTargets(); 52c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::InitializeAllTargetMCs(); 53c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::InitializeAllAsmPrinters(); 54e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines 55c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::PassRegistry &Registry = *llvm::PassRegistry::getPassRegistry(); 56c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeCore(Registry); 57c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeScalarOpts(Registry); 58c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeVectorization(Registry); 59c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeIPO(Registry); 60c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeAnalysis(Registry); 61c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeTransformUtils(Registry); 62c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeInstCombine(Registry); 63c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeInstrumentation(Registry); 64c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeTarget(Registry); 65c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeCodeGenPreparePass(Registry); 66c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeAtomicExpandPass(Registry); 67c46a3f5370364ad5698756d5da5b8845be9970d0Tim Murray llvm::initializeRewriteSymbolsPass(Registry); 68c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray 69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang is_initialized = true; 70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang 71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang return; 72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang} 73