diff --git a/include/llvm/Target/TargetRegistry.h b/include/llvm/Target/TargetRegistry.h index 8417fef1864..7d934368e33 100644 --- a/include/llvm/Target/TargetRegistry.h +++ b/include/llvm/Target/TargetRegistry.h @@ -137,7 +137,8 @@ namespace llvm { /// @name Target Registration /// @{ - /// RegisterTarget - Register the given target. + /// RegisterTarget - Register the given target. Attempts to register a + /// target which has already been registered will be ignored. /// /// Clients are responsible for ensuring that registration doesn't occur /// while another thread is attempting to access the registry. Typically diff --git a/lib/Support/TargetRegistry.cpp b/lib/Support/TargetRegistry.cpp index 258d703d16d..77cf2dd72cf 100644 --- a/lib/Support/TargetRegistry.cpp +++ b/lib/Support/TargetRegistry.cpp @@ -111,15 +111,13 @@ void TargetRegistry::RegisterTarget(Target &T, Target::TripleMatchQualityFnTy TQualityFn, Target::ModuleMatchQualityFnTy MQualityFn, Target::JITMatchQualityFnTy JITQualityFn) { - // Note that we don't require the constructor functions already be defined, in - // case a module happens to initialize the optional functionality before the - // target. - assert(!T.Next && !T.Name && !T.ShortDesc && !T.TripleMatchQualityFn && - !T.ModuleMatchQualityFn && !T.JITMatchQualityFn && - "This Target already registered!"); - assert(Name && ShortDesc && TQualityFn && MQualityFn && JITQualityFn && "Missing required target information!"); + + // Check if this target has already been initialized, we allow this as a + // convenience to some clients. + if (T.Name) + return; // Add to the list of targets. T.Next = FirstTarget;