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