Mercurial > projects > ldc
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); +}