1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- MsgHandling.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#include <mcld/LD/DiagnosticEngine.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/DiagnosticLineInfo.h> 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/DiagnosticPrinter.h> 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/TextDiagnosticPrinter.h> 13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/MsgHandler.h> 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h> 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/raw_ostream.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/ManagedStatic.h> 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/raw_ostream.h> 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/Signals.h> 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <cstdlib> 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 23affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld; 24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 2667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao// static variables 2767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao//===----------------------------------------------------------------------===// 2867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaostatic llvm::ManagedStatic<DiagnosticEngine> g_pEngine; 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 3067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaomcld::InitializeDiagnosticEngine(const mcld::LinkerConfig& pConfig, 3267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao DiagnosticPrinter* pPrinter) 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_pEngine->reset(pConfig); 3567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao if (NULL != pPrinter) 3667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao g_pEngine->setPrinter(*pPrinter, false); 3767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao else { 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao DiagnosticPrinter* printer = new TextDiagnosticPrinter(mcld::errs(), pConfig); 3967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao g_pEngine->setPrinter(*printer, true); 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 43affc150dc44fab1911775a49636d0ce85333b634Zonr ChangDiagnosticEngine& mcld::getDiagnosticEngine() 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 4567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao return *g_pEngine; 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool mcld::Diagnose() 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (g_pEngine->getPrinter()->getNumErrors() > 0) { 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // If we reached here, we are failing ungracefully. Run the interrupt handlers 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // to make sure any special cleanups get done, in particular that we remove 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // files registered with RemoveFileOnSignal. 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao llvm::sys::RunInterruptHandlers(); 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_pEngine->getPrinter()->finish(); 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid mcld::FinalizeDiagnosticEngine() 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_pEngine->getPrinter()->finish(); 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 66