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