MCLinker upstream commit e764452.

Change-Id: I5c9ec467ec96a0143e1e67c59365f3b6303e7348
diff --git a/lib/Support/MsgHandling.cpp b/lib/Support/MsgHandling.cpp
new file mode 100644
index 0000000..5b45289
--- /dev/null
+++ b/lib/Support/MsgHandling.cpp
@@ -0,0 +1,74 @@
+//===- MsgHandling.cpp ----------------------------------------------------===//
+//
+//                     The MCLinker Project
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <mcld/LD/DiagnosticEngine.h>
+#include <mcld/LD/DiagnosticLineInfo.h>
+#include <mcld/LD/DiagnosticPrinter.h>
+#include <mcld/LD/MsgHandler.h>
+#include <mcld/Support/MsgHandling.h>
+#include <llvm/Support/ManagedStatic.h>
+#include <llvm/Support/raw_ostream.h>
+
+using namespace mcld;
+
+//===----------------------------------------------------------------------===//
+// DiagnosticInitializer
+class DiagnosticInitializer : public llvm::ManagedStaticBase
+{
+public:
+  DiagnosticEngine* initialize(const MCLDInfo& pLDInfo,
+                               DiagnosticLineInfo* pLineInfo,
+                               DiagnosticPrinter* pPrinter)
+  {
+    RegisterManagedStatic(NULL, llvm::object_deleter<DiagnosticEngine>::call);
+    if (llvm::llvm_is_multithreaded()) {
+      llvm::llvm_acquire_global_lock();
+      void* tmp = NULL;
+      if (NULL != pPrinter)
+        tmp = new DiagnosticEngine(pLDInfo, pLineInfo, pPrinter, false);
+      else
+        tmp = new DiagnosticEngine(pLDInfo, pLineInfo, NULL, false);
+
+      TsanHappensBefore(this);
+      llvm::sys::MemoryFence();
+      TsanIgnoreWritesBegin();
+      Ptr = tmp;
+      TsanIgnoreWritesEnd();
+      llvm::llvm_release_global_lock();
+    }
+    else {
+      if (NULL != pPrinter)
+        Ptr = new DiagnosticEngine(pLDInfo, pLineInfo, pPrinter, false);
+      else
+        Ptr = new DiagnosticEngine(pLDInfo, pLineInfo, NULL, false);
+    }
+    return static_cast<DiagnosticEngine*>(Ptr);
+  }
+};
+
+static DiagnosticInitializer g_DiagInitializer;
+static DiagnosticEngine* g_pDiagnosticEngine = NULL;
+
+void mcld::InitializeDiagnosticEngine(const mcld::MCLDInfo& pLDInfo,
+                                DiagnosticLineInfo* pLineInfo,
+                                DiagnosticPrinter* pPrinter)
+{
+  if (NULL == g_pDiagnosticEngine) {
+    g_pDiagnosticEngine = g_DiagInitializer.initialize(pLDInfo,
+                                                       pLineInfo,
+                                                       pPrinter);
+  }
+}
+
+DiagnosticEngine& mcld::getDiagnosticEngine()
+{
+  assert(NULL != g_pDiagnosticEngine &&
+         "mcld::InitializeDiagnostics() is not called");
+  return *g_pDiagnosticEngine;
+}
+