diff tools/binding/llvm-typemonitor.cpp @ 1273:1ba61de8796b

Committing LLVM binding for D as it currently exists in the SVN repository.
author Frits van Bommel <fvbommel wxs.nl>
date Mon, 27 Apr 2009 22:33:17 +0200
parents
children 4ff9ab0d472c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/binding/llvm-typemonitor.cpp	Mon Apr 27 22:33:17 2009 +0200
@@ -0,0 +1,45 @@
+/// Support for callbacks when an abstract type becomes more concrete.
+
+#include "llvm/Type.h"
+#include "llvm-c/Core.h"
+
+using namespace llvm;
+
+extern "C" typedef int (*RefineCallback)(void *handle, LLVMTypeRef newT);
+
+class TypeMonitor : AbstractTypeUser {
+    void *handle_;
+    RefineCallback callback_;
+    
+    void onRefineType(const Type* oldT, const Type* newT) {
+        callback_(handle_, wrap(newT));
+        oldT->removeAbstractTypeUser(this);
+        delete this;
+    }
+    
+    public:
+    
+    TypeMonitor(Type* T, void *handle, RefineCallback callback)
+    : handle_(handle), callback_(callback) {
+        T->addAbstractTypeUser(this);
+    }
+    
+    virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy) {
+        onRefineType(OldTy, NewTy);
+    }
+    
+    virtual void typeBecameConcrete(const DerivedType *AbsTy) {
+        onRefineType(AbsTy, AbsTy);
+    }
+    
+    virtual void dump() const {
+        cerr << "<TypeMonitor>";
+    }
+};
+
+extern "C" void LLVMRegisterAbstractTypeCallback(LLVMTypeRef T,
+                                                 void *handle,
+                                                 RefineCallback callback)
+{
+    new TypeMonitor(unwrap(T), handle, callback);
+}