Initialization.cpp revision d793ca93d75fe8f1d29ceab8f9bf0432f0f63565
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/Initialization.h"
18f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
19f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <cstdlib>
20f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
21f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/Support/ErrorHandling.h>
22f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#include <llvm/Support/TargetSelect.h>
23f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
2493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/Support/TargetSelect.h>
2593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/Support/TargetRegistry.h>
2693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
27c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Config/Config.h"
28ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h"
29f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
30f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changnamespace {
31f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
32f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changvoid llvm_error_handler(void *pUserData, const std::string &pMessage) {
33f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  ALOGE("%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();
48f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  llvm::install_fatal_error_handler(llvm_error_handler, NULL);
49f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_ARM_CODEGEN)
51f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeARMAsmPrinter();
52d793ca93d75fe8f1d29ceab8f9bf0432f0f63565Stephen Hines  LLVMInitializeARMAsmParser();
53388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# if USE_DISASSEMBLER
54388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao  LLVMInitializeARMDisassembler();
55388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# endif
56f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeARMTargetMC();
57f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeARMTargetInfo();
58f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeARMTarget();
5952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeARMLDTargetInfo();
6052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeARMLDTarget();
6152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeARMLDBackend();
6252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeARMDiagnosticLineInfo();
63f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
64f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
65f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_MIPS_CODEGEN)
66f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeMipsAsmPrinter();
67d793ca93d75fe8f1d29ceab8f9bf0432f0f63565Stephen Hines  LLVMInitializeMipsAsmParser();
68388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# if USE_DISASSEMBLER
69388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao  LLVMInitializeMipsDisassembler();
70388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# endif
71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeMipsTargetMC();
72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeMipsTargetInfo();
73f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeMipsTarget();
7452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeMipsLDTargetInfo();
7552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeMipsLDTarget();
7652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeMipsLDBackend();
7752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeMipsDiagnosticLineInfo();
78f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
79f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
80f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_X86_CODEGEN)
81f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeX86AsmPrinter();
82d793ca93d75fe8f1d29ceab8f9bf0432f0f63565Stephen Hines  LLVMInitializeX86AsmParser();
83388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# if USE_DISASSEMBLER
84388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao  LLVMInitializeX86Disassembler();
85388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# endif
86f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeX86TargetMC();
87f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeX86TargetInfo();
88f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeX86Target();
8952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeX86LDTargetInfo();
9052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeX86LDTarget();
9152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeX86LDBackend();
9252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  MCLDInitializeX86DiagnosticLineInfo();
93f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
94f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
95f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  is_initialized = true;
96f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
97f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return;
98f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
99