From 3cb056797b17785cfd2429ce8232143d5aeb5e42 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Fri, 21 Oct 2011 17:50:59 +0000 Subject: [PATCH] Expand the coverage of the libObject C bindings to include more SectionRef accessors as well as Symbol iterators. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142661 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm-c/Object.h | 33 ++++++++++++++++++-- lib/Object/Object.cpp | 69 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/include/llvm-c/Object.h b/include/llvm-c/Object.h index 7b1cf717f77..3e6e1e3ffce 100644 --- a/include/llvm-c/Object.h +++ b/include/llvm-c/Object.h @@ -28,23 +28,42 @@ extern "C" { #endif - +// Opaque type wrappers typedef struct LLVMOpaqueObjectFile *LLVMObjectFileRef; - typedef struct LLVMOpaqueSectionIterator *LLVMSectionIteratorRef; +typedef struct LLVMOpauqeSymbolIterator *LLVMSymbolIteratorRef; +// ObjectFile creation LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf); void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile); +// ObjectFile Section iterators LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile); void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI); LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile, LLVMSectionIteratorRef SI); void LLVMMoveToNextSection(LLVMSectionIteratorRef SI); + +// ObjectFile Symbol iterators +LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile); +void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI); +LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile, + LLVMSymbolIteratorRef SI); +void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI); + +// SectionRef accessors const char *LLVMGetSectionName(LLVMSectionIteratorRef SI); uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI); const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI); +uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI); +int LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI, + LLVMSymbolIteratorRef Sym); +// SymbolRef accessors +const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI); +uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI); +uint64_t LLVMGetSymbolOffset(LLVMSymbolIteratorRef SI); +uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI); #ifdef __cplusplus } @@ -68,6 +87,16 @@ namespace llvm { return reinterpret_cast (const_cast(SI)); } + + inline symbol_iterator *unwrap(LLVMSymbolIteratorRef SI) { + return reinterpret_cast(SI); + } + + inline LLVMSymbolIteratorRef + wrap(const symbol_iterator *SI) { + return reinterpret_cast + (const_cast(SI)); + } } } diff --git a/lib/Object/Object.cpp b/lib/Object/Object.cpp index 2ea8db97867..2ce98d7f9ca 100644 --- a/lib/Object/Object.cpp +++ b/lib/Object/Object.cpp @@ -18,6 +18,7 @@ using namespace llvm; using namespace object; +// ObjectFile creation LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) { return wrap(ObjectFile::createObjectFile(unwrap(MemBuf))); } @@ -26,6 +27,7 @@ void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) { delete unwrap(ObjectFile); } +// ObjectFile Section iterators LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile) { section_iterator SI = unwrap(ObjectFile)->begin_sections(); return wrap(new section_iterator(SI)); @@ -46,6 +48,28 @@ void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) { if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message()); } +// ObjectFile Symbol iterators +LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile) { + symbol_iterator SI = unwrap(ObjectFile)->begin_symbols(); + return wrap(new symbol_iterator(SI)); +} + +void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) { + delete unwrap(SI); +} + +LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile, + LLVMSymbolIteratorRef SI) { + return (*unwrap(SI) == unwrap(ObjectFile)->end_symbols()) ? 1 : 0; +} + +void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) { + error_code ec; + unwrap(SI)->increment(ec); + if (ec) report_fatal_error("LLVMMoveToNextSymbol failed: " + ec.message()); +} + +// SectionRef accessors const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) { StringRef ret; if (error_code ec = (*unwrap(SI))->getName(ret)) @@ -66,3 +90,48 @@ const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) { report_fatal_error(ec.message()); return ret.data(); } + +uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) { + uint64_t ret; + if (error_code ec = (*unwrap(SI))->getAddress(ret)) + report_fatal_error(ec.message()); + return ret; +} + +int LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI, + LLVMSymbolIteratorRef Sym) { + bool ret; + if (error_code ec = (*unwrap(SI))->containsSymbol(**unwrap(Sym), ret)) + report_fatal_error(ec.message()); + return ret; +} + +// SymbolRef accessors +const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) { + StringRef ret; + if (error_code ec = (*unwrap(SI))->getName(ret)) + report_fatal_error(ec.message()); + return ret.data(); +} + +uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) { + uint64_t ret; + if (error_code ec = (*unwrap(SI))->getAddress(ret)) + report_fatal_error(ec.message()); + return ret; +} + +uint64_t LLVMGetSymbolOffset(LLVMSymbolIteratorRef SI) { + uint64_t ret; + if (error_code ec = (*unwrap(SI))->getOffset(ret)) + report_fatal_error(ec.message()); + return ret; +} + +uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) { + uint64_t ret; + if (error_code ec = (*unwrap(SI))->getSize(ret)) + report_fatal_error(ec.message()); + return ret; +} + -- 2.34.1