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