Index: llvm/trunk/include/llvm/Support/Registry.h =================================================================== --- llvm/trunk/include/llvm/Support/Registry.h +++ llvm/trunk/include/llvm/Support/Registry.h @@ -116,14 +116,15 @@ }; }; - - // Since these are defined in a header file, plugins must be sure to export - // these symbols. - template - typename Registry::node *Registry::Head; - - template - typename Registry::node *Registry::Tail; + // Use this macro to stamp out definitions for required static symbols in an + // appropriate source file. This is required to avoid getting multiple + // definitions of the Registry's fields in different translation or linkage + // units. +#define DEFINE_REGISTRY(T) \ + template <> \ + typename Registry::node *Registry::Head = nullptr; \ + template <> \ + typename Registry::node *Registry::Tail = nullptr; } // end namespace llvm #endif // LLVM_SUPPORT_REGISTRY_H Index: llvm/trunk/lib/CodeGen/GCMetadataPrinter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/GCMetadataPrinter.cpp +++ llvm/trunk/lib/CodeGen/GCMetadataPrinter.cpp @@ -17,3 +17,7 @@ GCMetadataPrinter::GCMetadataPrinter() {} GCMetadataPrinter::~GCMetadataPrinter() {} + +// Stamp out the registry of GCMetadataPrinter objects so that pulgins can load +// new Strategies. +DEFINE_REGISTRY(GCMetadataPrinter) Index: llvm/trunk/lib/CodeGen/GCStrategy.cpp =================================================================== --- llvm/trunk/lib/CodeGen/GCStrategy.cpp +++ llvm/trunk/lib/CodeGen/GCStrategy.cpp @@ -20,3 +20,7 @@ : UseStatepoints(false), NeededSafePoints(0), CustomReadBarriers(false), CustomWriteBarriers(false), CustomRoots(false), InitRoots(true), UsesMetadata(false) {} + +// Stamp out the registry of GCStrategy objects so that pulgins can load new +// Strategies. +DEFINE_REGISTRY(GCStrategy)