MsgHandling.cpp revision affc150dc44fab1911775a49636d0ce85333b634
1//===- MsgHandling.cpp ----------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#include <mcld/LD/DiagnosticEngine.h> 10#include <mcld/LD/DiagnosticLineInfo.h> 11#include <mcld/LD/DiagnosticPrinter.h> 12#include <mcld/LD/MsgHandler.h> 13#include <mcld/Support/MsgHandling.h> 14#include <llvm/Support/ManagedStatic.h> 15#include <llvm/Support/raw_ostream.h> 16 17using namespace mcld; 18 19//===----------------------------------------------------------------------===// 20// DiagnosticInitializer 21class DiagnosticInitializer : public llvm::ManagedStaticBase 22{ 23public: 24 DiagnosticEngine* initialize(const MCLDInfo& pLDInfo, 25 DiagnosticLineInfo* pLineInfo, 26 DiagnosticPrinter* pPrinter) 27 { 28 RegisterManagedStatic(NULL, llvm::object_deleter<DiagnosticEngine>::call); 29 if (llvm::llvm_is_multithreaded()) { 30 llvm::llvm_acquire_global_lock(); 31 void* tmp = NULL; 32 if (NULL != pPrinter) 33 tmp = new DiagnosticEngine(pLDInfo, pLineInfo, pPrinter, false); 34 else 35 tmp = new DiagnosticEngine(pLDInfo, pLineInfo, NULL, false); 36 37 TsanHappensBefore(this); 38 llvm::sys::MemoryFence(); 39 TsanIgnoreWritesBegin(); 40 Ptr = tmp; 41 TsanIgnoreWritesEnd(); 42 llvm::llvm_release_global_lock(); 43 } 44 else { 45 if (NULL != pPrinter) 46 Ptr = new DiagnosticEngine(pLDInfo, pLineInfo, pPrinter, false); 47 else 48 Ptr = new DiagnosticEngine(pLDInfo, pLineInfo, NULL, false); 49 } 50 return static_cast<DiagnosticEngine*>(Ptr); 51 } 52}; 53 54static DiagnosticInitializer g_DiagInitializer; 55static DiagnosticEngine* g_pDiagnosticEngine = NULL; 56 57void mcld::InitializeDiagnosticEngine(const mcld::MCLDInfo& pLDInfo, 58 DiagnosticLineInfo* pLineInfo, 59 DiagnosticPrinter* pPrinter) 60{ 61 if (NULL == g_pDiagnosticEngine) { 62 g_pDiagnosticEngine = g_DiagInitializer.initialize(pLDInfo, 63 pLineInfo, 64 pPrinter); 65 } 66} 67 68DiagnosticEngine& mcld::getDiagnosticEngine() 69{ 70 assert(NULL != g_pDiagnosticEngine && 71 "mcld::InitializeDiagnostics() is not called"); 72 return *g_pDiagnosticEngine; 73} 74 75