1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- Initialization.cpp -------------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include "alone/Support/Initialization.h"
11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <cstdlib>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/Support/ErrorHandling.h>
15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/Support/TargetSelect.h>
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/TargetSelect.h>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/TargetRegistry.h>
19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include "alone/Config/Config.h"
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include "alone/Support/Log.h"
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
23affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace {
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaovoid llvm_error_handler(void *pUserData, const std::string &pMessage) {
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ALOGE("%s", pMessage.c_str());
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ::exit(1);
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // end anonymous namespace
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
32affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid alone::init::Initialize() {
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  static bool is_initialized = false;
34cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (is_initialized) {
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return;
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // Setup error handler for LLVM.
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  llvm::remove_fatal_error_handler();
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  llvm::install_fatal_error_handler(llvm_error_handler, NULL);
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#if defined(PROVIDE_ARM_CODEGEN)
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeARMAsmPrinter();
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao# if USE_DISASSEMBLER
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  LLVMInitializeARMDisassembler();
47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao# endif
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeARMTargetMC();
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeARMTargetInfo();
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeARMTarget();
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeARMLDTargetInfo();
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeARMLDTarget();
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeARMLDBackend();
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeARMDiagnosticLineInfo();
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#if defined(PROVIDE_MIPS_CODEGEN)
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeMipsAsmPrinter();
59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao# if USE_DISASSEMBLER
60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  LLVMInitializeMipsDisassembler();
61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao# endif
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeMipsTargetMC();
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeMipsTargetInfo();
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeMipsTarget();
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeMipsLDTargetInfo();
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeMipsLDTarget();
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeMipsLDBackend();
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeMipsDiagnosticLineInfo();
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#if defined(PROVIDE_X86_CODEGEN)
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeX86AsmPrinter();
73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao# if USE_DISASSEMBLER
74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  LLVMInitializeX86Disassembler();
75cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao# endif
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeX86TargetMC();
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeX86TargetInfo();
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LLVMInitializeX86Target();
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeX86LDTargetInfo();
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeX86LDTarget();
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeX86LDBackend();
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDInitializeX86DiagnosticLineInfo();
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  is_initialized = true;
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return;
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
89