Address some review comments on TargetRegistry.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75753 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Target/TargetRegistry.h b/include/llvm/Target/TargetRegistry.h
index ce1b281..cad49d3 100644
--- a/include/llvm/Target/TargetRegistry.h
+++ b/include/llvm/Target/TargetRegistry.h
@@ -32,7 +32,11 @@
   ///
   /// For registration purposes, this is a POD type so that targets can be
   /// registered without the use of static constructors.
-  struct Target {
+  ///
+  /// Targets should implement a single global instance of this class (which
+  /// will be zero initialized), and pass that instance to the TargetRegistry as
+  /// part of their initialization.
+  class Target {
   private:
     typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT);
     typedef unsigned (*ModuleMatchQualityFnTy)(const Module &M);
@@ -44,7 +48,7 @@
                                               TargetMachine &,
                                               bool);
 
-    friend class TargetRegistry;
+    friend struct TargetRegistry;
 
     /// Next - The next registered target in the linked list, maintained by the
     /// TargetRegistry.
@@ -132,6 +136,10 @@
     /// @{
 
     /// RegisterTarget - Register the given target.
+    /// 
+    /// Clients are responsible for ensuring that registration doesn't occur
+    /// while another thread is attempting to access the registry. Typically
+    /// this is done by initializing all targets at program startup.
     ///
     /// @param T - The target being registered.
     /// @param Name - The target name. This should be a static string.
@@ -153,6 +161,10 @@
     /// RegisterTargetMachine - Register a TargetMachine implementation for the
     /// given target.
     /// 
+    /// Clients are responsible for ensuring that registration doesn't occur
+    /// while another thread is attempting to access the registry. Typically
+    /// this is done by initializing all targets at program startup.
+    /// 
     /// @param T - The target being registered.
     /// @param Fn - A function to construct a TargetMachine for the target.
     static void RegisterTargetMachine(Target &T, 
@@ -164,6 +176,10 @@
     /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given
     /// target.
     /// 
+    /// Clients are responsible for ensuring that registration doesn't occur
+    /// while another thread is attempting to access the registry. Typically
+    /// this is done by initializing all targets at program startup.
+    ///
     /// @param T - The target being registered.
     /// @param Fn - A function to construct an AsmPrinter for the target.
     static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
diff --git a/lib/Support/TargetRegistry.cpp b/lib/Support/TargetRegistry.cpp
index 24f87ce..258431a 100644
--- a/lib/Support/TargetRegistry.cpp
+++ b/lib/Support/TargetRegistry.cpp
@@ -11,9 +11,7 @@
 #include <cassert>
 using namespace llvm;
 
-// FIXME: Worry about locking? In general everything should be registered at
-// startup.
-
+// Clients are responsible for avoid race conditions in registration.
 static Target *FirstTarget = 0;
 
 const Target *