Expand the coverage of the libObject C bindings to include more SectionRef accessors as well as Symbol iterators.
llvm-svn: 142661
This commit is contained in:
parent
5e00bb5feb
commit
f239db40d5
|
@ -28,23 +28,42 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Opaque type wrappers
|
||||||
typedef struct LLVMOpaqueObjectFile *LLVMObjectFileRef;
|
typedef struct LLVMOpaqueObjectFile *LLVMObjectFileRef;
|
||||||
|
|
||||||
typedef struct LLVMOpaqueSectionIterator *LLVMSectionIteratorRef;
|
typedef struct LLVMOpaqueSectionIterator *LLVMSectionIteratorRef;
|
||||||
|
typedef struct LLVMOpauqeSymbolIterator *LLVMSymbolIteratorRef;
|
||||||
|
|
||||||
|
// ObjectFile creation
|
||||||
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf);
|
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf);
|
||||||
void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile);
|
void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile);
|
||||||
|
|
||||||
|
// ObjectFile Section iterators
|
||||||
LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile);
|
LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile);
|
||||||
void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI);
|
void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI);
|
||||||
LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile,
|
LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile,
|
||||||
LLVMSectionIteratorRef SI);
|
LLVMSectionIteratorRef SI);
|
||||||
void LLVMMoveToNextSection(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);
|
const char *LLVMGetSectionName(LLVMSectionIteratorRef SI);
|
||||||
uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI);
|
uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI);
|
||||||
const char *LLVMGetSectionContents(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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -68,6 +87,16 @@ namespace llvm {
|
||||||
return reinterpret_cast<LLVMSectionIteratorRef>
|
return reinterpret_cast<LLVMSectionIteratorRef>
|
||||||
(const_cast<section_iterator*>(SI));
|
(const_cast<section_iterator*>(SI));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline symbol_iterator *unwrap(LLVMSymbolIteratorRef SI) {
|
||||||
|
return reinterpret_cast<symbol_iterator*>(SI);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline LLVMSymbolIteratorRef
|
||||||
|
wrap(const symbol_iterator *SI) {
|
||||||
|
return reinterpret_cast<LLVMSymbolIteratorRef>
|
||||||
|
(const_cast<symbol_iterator*>(SI));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
using namespace object;
|
using namespace object;
|
||||||
|
|
||||||
|
// ObjectFile creation
|
||||||
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
|
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
|
||||||
return wrap(ObjectFile::createObjectFile(unwrap(MemBuf)));
|
return wrap(ObjectFile::createObjectFile(unwrap(MemBuf)));
|
||||||
}
|
}
|
||||||
|
@ -26,6 +27,7 @@ void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) {
|
||||||
delete unwrap(ObjectFile);
|
delete unwrap(ObjectFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ObjectFile Section iterators
|
||||||
LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile) {
|
LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile) {
|
||||||
section_iterator SI = unwrap(ObjectFile)->begin_sections();
|
section_iterator SI = unwrap(ObjectFile)->begin_sections();
|
||||||
return wrap(new section_iterator(SI));
|
return wrap(new section_iterator(SI));
|
||||||
|
@ -46,6 +48,28 @@ void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) {
|
||||||
if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message());
|
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) {
|
const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) {
|
||||||
StringRef ret;
|
StringRef ret;
|
||||||
if (error_code ec = (*unwrap(SI))->getName(ret))
|
if (error_code ec = (*unwrap(SI))->getName(ret))
|
||||||
|
@ -66,3 +90,48 @@ const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) {
|
||||||
report_fatal_error(ec.message());
|
report_fatal_error(ec.message());
|
||||||
return ret.data();
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue