Added EmulateIntruction plug-in manager support.



git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@124644 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Core/PluginManager.cpp b/source/Core/PluginManager.cpp
index e68bafe..198beae 100644
--- a/source/Core/PluginManager.cpp
+++ b/source/Core/PluginManager.cpp
@@ -391,6 +391,128 @@
     return NULL;
 }
 
+#pragma mark EmulateInstruction
+
+
+struct EmulateInstructionInstance
+{
+    EmulateInstructionInstance() :
+    name(),
+    description(),
+    create_callback(NULL)
+    {
+    }
+    
+    std::string name;
+    std::string description;
+    EmulateInstructionCreateInstance create_callback;
+};
+
+typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
+
+static bool
+AccessEmulateInstructionInstances (PluginAction action, EmulateInstructionInstance &instance, uint32_t index)
+{
+    static EmulateInstructionInstances g_plugin_instances;
+    
+    switch (action)
+    {
+        case ePluginRegisterInstance:
+            if (instance.create_callback)
+            {
+                g_plugin_instances.push_back (instance);
+                return true;
+            }
+            break;
+            
+        case ePluginUnregisterInstance:
+            if (instance.create_callback)
+            {
+                EmulateInstructionInstances::iterator pos, end = g_plugin_instances.end();
+                for (pos = g_plugin_instances.begin(); pos != end; ++ pos)
+                {
+                    if (pos->create_callback == instance.create_callback)
+                    {
+                        g_plugin_instances.erase(pos);
+                        return true;
+                    }
+                }
+            }
+            break;
+            
+        case ePluginGetInstanceAtIndex:
+            if (index < g_plugin_instances.size())
+            {
+                instance = g_plugin_instances[index];
+                return true;
+            }
+            break;
+            
+        default:
+            break;
+    }
+    return false;
+}
+
+
+bool
+PluginManager::RegisterPlugin
+(
+ const char *name,
+ const char *description,
+ EmulateInstructionCreateInstance create_callback
+ )
+{
+    if (create_callback)
+    {
+        EmulateInstructionInstance instance;
+        assert (name && name[0]);
+        instance.name = name;
+        if (description && description[0])
+            instance.description = description;
+        instance.create_callback = create_callback;
+        return AccessEmulateInstructionInstances (ePluginRegisterInstance, instance, 0);
+    }
+    return false;
+}
+
+bool
+PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback)
+{
+    if (create_callback)
+    {
+        EmulateInstructionInstance instance;
+        instance.create_callback = create_callback;
+        return AccessEmulateInstructionInstances (ePluginUnregisterInstance, instance, 0);
+    }
+    return false;
+}
+
+EmulateInstructionCreateInstance
+PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx)
+{
+    EmulateInstructionInstance instance;
+    if (AccessEmulateInstructionInstances (ePluginGetInstanceAtIndex, instance, idx))
+        return instance.create_callback;
+    return NULL;
+}
+
+EmulateInstructionCreateInstance
+PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const char *name)
+{
+    if (name && name[0])
+    {
+        EmulateInstructionInstance instance;
+        std::string ss_name(name);
+        for (uint32_t idx = 0; AccessEmulateInstructionInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx)
+        {
+            if (instance.name == ss_name)
+                return instance.create_callback;
+        }
+    }
+    return NULL;
+}
+
 
 #pragma mark LanguageRuntime