From 4905743e0a5bf9ab50ba1d0fdbeba370ccc649c4 Mon Sep 17 00:00:00 2001 From: anthony cantor Date: Sun, 11 Aug 2013 00:41:28 -0600 Subject: [PATCH] add BytesMemoryObject to extra.h and a binding for it in llvmpy/src --- llvmpy/include/llvm_binding/extra.h | 26 ++++++++++++++++++++++++++ llvmpy/src/BytesMemoryObject.py | 17 +++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 llvmpy/src/BytesMemoryObject.py diff --git a/llvmpy/include/llvm_binding/extra.h b/llvmpy/include/llvm_binding/extra.h index 161c52e..d4578af 100644 --- a/llvmpy/include/llvm_binding/extra.h +++ b/llvmpy/include/llvm_binding/extra.h @@ -29,11 +29,36 @@ #include #include #include +#include #include // to make MCJIT working #include "auto_pyobject.h" +namespace llvm { + +class BytesMemoryObject : public MemoryObject { +private: + StringRef m_bytes; + +public: + BytesMemoryObject(StringRef bytes) { + m_bytes = bytes; + } + + uint64_t getBase() const { return 0; } + uint64_t getExtent() const { return (uint64_t) m_bytes.size(); } + + int readByte(uint64_t addr, uint8_t *byte) const { + if (addr >= getExtent()) + return -1; + *byte = (uint8_t) m_bytes[(size_t) addr]; + return 0; + } +}; + +} + namespace extra{ using namespace llvm; @@ -984,3 +1009,4 @@ PyObject* llvm_sys_isBigEndianHost() Py_RETURN_FALSE; } #endif + diff --git a/llvmpy/src/BytesMemoryObject.py b/llvmpy/src/BytesMemoryObject.py new file mode 100644 index 0000000..051425e --- /dev/null +++ b/llvmpy/src/BytesMemoryObject.py @@ -0,0 +1,17 @@ +from binding import * +from .namespace import llvm +from .ADT.StringRef import StringRef + +MemoryObject = llvm.Class() +BytesMemoryObject = llvm.Class(MemoryObject) + +@MemoryObject +class MemoryObject: + pass + +@BytesMemoryObject +class BytesMemoryObject: + new = Constructor(cast(bytes, StringRef)) + + getBase = Method(cast(Uint64, int)) + getExtent = Method(cast(Uint64, int))