Initialization.cpp revision 388fec12e6bbf5798281d266cac63630bcaba333
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();
52388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# if USE_DISASSEMBLER
53388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao  LLVMInitializeARMDisassembler();
54388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# endif
55f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeARMTargetMC();
56f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeARMTargetInfo();
57f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeARMTarget();
5893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeARMLDTargetInfo();
5993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeARMLDTarget();
6093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeARMLDBackend();
6193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeARMDiagnosticLineInfo();
62f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
63f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
64f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_MIPS_CODEGEN)
65f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeMipsAsmPrinter();
66388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# if USE_DISASSEMBLER
67388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao  LLVMInitializeMipsDisassembler();
68388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# endif
69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeMipsTargetMC();
70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeMipsTargetInfo();
71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeMipsTarget();
7293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeMipsLDTargetInfo();
7393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeMipsLDTarget();
7493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeMipsLDBackend();
7593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeMipsDiagnosticLineInfo();
76f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
77f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
78f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_X86_CODEGEN)
79f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeX86AsmPrinter();
80388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# if USE_DISASSEMBLER
81388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao  LLVMInitializeX86Disassembler();
82388fec12e6bbf5798281d266cac63630bcaba333Shih-wei Liao# endif
83f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeX86TargetMC();
84f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeX86TargetInfo();
85f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  LLVMInitializeX86Target();
8693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeX86LDTargetInfo();
8793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeX86LDTarget();
8893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeX86LDBackend();
8993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  LLVMInitializeX86DiagnosticLineInfo();
90f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
91f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
92f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  is_initialized = true;
93f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
94f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return;
95f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
96