+class LPObjectCache : public llvm::ObjectCache {
+private:
+ bool has_object;
+ struct lp_cached_code *cache_out;
+public:
+ LPObjectCache(struct lp_cached_code *cache) {
+ cache_out = cache;
+ has_object = false;
+ }
+
+ ~LPObjectCache() {
+ }
+ void notifyObjectCompiled(const llvm::Module *M, llvm::MemoryBufferRef Obj) {
+ const std::string ModuleID = M->getModuleIdentifier();
+ if (has_object)
+ fprintf(stderr, "CACHE ALREADY HAS MODULE OBJECT\n");
+ has_object = true;
+ cache_out->data_size = Obj.getBufferSize();
+ cache_out->data = malloc(cache_out->data_size);
+ memcpy(cache_out->data, Obj.getBufferStart(), cache_out->data_size);
+ }
+
+ virtual std::unique_ptr<llvm::MemoryBuffer> getObject(const llvm::Module *M) {
+ if (cache_out->data_size) {
+ return llvm::MemoryBuffer::getMemBuffer(llvm::StringRef((const char *)cache_out->data, cache_out->data_size));
+ }
+ return NULL;
+ }
+
+};