1c56d2e8fSEric Christopher //===- Object.cpp - C bindings to the object file library--------*- C++ -*-===// 2c56d2e8fSEric Christopher // 3c56d2e8fSEric Christopher // The LLVM Compiler Infrastructure 4c56d2e8fSEric Christopher // 5c56d2e8fSEric Christopher // This file is distributed under the University of Illinois Open Source 6c56d2e8fSEric Christopher // License. See LICENSE.TXT for details. 7c56d2e8fSEric Christopher // 8c56d2e8fSEric Christopher //===----------------------------------------------------------------------===// 9c56d2e8fSEric Christopher // 10c56d2e8fSEric Christopher // This file defines the C bindings to the file-format-independent object 11c56d2e8fSEric Christopher // library. 12c56d2e8fSEric Christopher // 13c56d2e8fSEric Christopher //===----------------------------------------------------------------------===// 14c56d2e8fSEric Christopher 15c56d2e8fSEric Christopher #include "llvm/Object/ObjectFile.h" 16c56d2e8fSEric Christopher #include "llvm-c/Object.h" 17c56d2e8fSEric Christopher 18c56d2e8fSEric Christopher using namespace llvm; 19c56d2e8fSEric Christopher using namespace object; 20c56d2e8fSEric Christopher 21f239db40SOwen Anderson // ObjectFile creation 22c56d2e8fSEric Christopher LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) { 23c56d2e8fSEric Christopher return wrap(ObjectFile::createObjectFile(unwrap(MemBuf))); 24c56d2e8fSEric Christopher } 25c56d2e8fSEric Christopher 26c56d2e8fSEric Christopher void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) { 27c56d2e8fSEric Christopher delete unwrap(ObjectFile); 28c56d2e8fSEric Christopher } 29c56d2e8fSEric Christopher 30f239db40SOwen Anderson // ObjectFile Section iterators 31c56d2e8fSEric Christopher LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile) { 32e5fd0047SMichael J. Spencer section_iterator SI = unwrap(ObjectFile)->begin_sections(); 33e5fd0047SMichael J. Spencer return wrap(new section_iterator(SI)); 34c56d2e8fSEric Christopher } 35c56d2e8fSEric Christopher 36c56d2e8fSEric Christopher void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI) { 37c56d2e8fSEric Christopher delete unwrap(SI); 38c56d2e8fSEric Christopher } 39c56d2e8fSEric Christopher 40c56d2e8fSEric Christopher LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile, 41c56d2e8fSEric Christopher LLVMSectionIteratorRef SI) { 42c56d2e8fSEric Christopher return (*unwrap(SI) == unwrap(ObjectFile)->end_sections()) ? 1 : 0; 43c56d2e8fSEric Christopher } 44c56d2e8fSEric Christopher 45c56d2e8fSEric Christopher void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) { 461d6167fdSMichael J. Spencer error_code ec; 471d6167fdSMichael J. Spencer unwrap(SI)->increment(ec); 481d6167fdSMichael J. Spencer if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message()); 49c56d2e8fSEric Christopher } 50c56d2e8fSEric Christopher 51*07bfdbb2SOwen Anderson void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect, 52*07bfdbb2SOwen Anderson LLVMSymbolIteratorRef Sym) { 53*07bfdbb2SOwen Anderson if (error_code ec = (*unwrap(Sym))->getSection(*unwrap(Sect))) 54*07bfdbb2SOwen Anderson report_fatal_error(ec.message()); 55*07bfdbb2SOwen Anderson } 56*07bfdbb2SOwen Anderson 57f239db40SOwen Anderson // ObjectFile Symbol iterators 58f239db40SOwen Anderson LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile) { 59f239db40SOwen Anderson symbol_iterator SI = unwrap(ObjectFile)->begin_symbols(); 60f239db40SOwen Anderson return wrap(new symbol_iterator(SI)); 61f239db40SOwen Anderson } 62f239db40SOwen Anderson 63f239db40SOwen Anderson void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) { 64f239db40SOwen Anderson delete unwrap(SI); 65f239db40SOwen Anderson } 66f239db40SOwen Anderson 67f239db40SOwen Anderson LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile, 68f239db40SOwen Anderson LLVMSymbolIteratorRef SI) { 69f239db40SOwen Anderson return (*unwrap(SI) == unwrap(ObjectFile)->end_symbols()) ? 1 : 0; 70f239db40SOwen Anderson } 71f239db40SOwen Anderson 72f239db40SOwen Anderson void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) { 73f239db40SOwen Anderson error_code ec; 74f239db40SOwen Anderson unwrap(SI)->increment(ec); 75f239db40SOwen Anderson if (ec) report_fatal_error("LLVMMoveToNextSymbol failed: " + ec.message()); 76f239db40SOwen Anderson } 77f239db40SOwen Anderson 78f239db40SOwen Anderson // SectionRef accessors 79c56d2e8fSEric Christopher const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) { 801d6167fdSMichael J. Spencer StringRef ret; 811d6167fdSMichael J. Spencer if (error_code ec = (*unwrap(SI))->getName(ret)) 821d6167fdSMichael J. Spencer report_fatal_error(ec.message()); 831d6167fdSMichael J. Spencer return ret.data(); 84c56d2e8fSEric Christopher } 85c56d2e8fSEric Christopher 86c56d2e8fSEric Christopher uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) { 871d6167fdSMichael J. Spencer uint64_t ret; 881d6167fdSMichael J. Spencer if (error_code ec = (*unwrap(SI))->getSize(ret)) 891d6167fdSMichael J. Spencer report_fatal_error(ec.message()); 901d6167fdSMichael J. Spencer return ret; 91c56d2e8fSEric Christopher } 92c56d2e8fSEric Christopher 93c56d2e8fSEric Christopher const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) { 941d6167fdSMichael J. Spencer StringRef ret; 951d6167fdSMichael J. Spencer if (error_code ec = (*unwrap(SI))->getContents(ret)) 961d6167fdSMichael J. Spencer report_fatal_error(ec.message()); 971d6167fdSMichael J. Spencer return ret.data(); 98c56d2e8fSEric Christopher } 99f239db40SOwen Anderson 100f239db40SOwen Anderson uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) { 101f239db40SOwen Anderson uint64_t ret; 102f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->getAddress(ret)) 103f239db40SOwen Anderson report_fatal_error(ec.message()); 104f239db40SOwen Anderson return ret; 105f239db40SOwen Anderson } 106f239db40SOwen Anderson 107f239db40SOwen Anderson int LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI, 108f239db40SOwen Anderson LLVMSymbolIteratorRef Sym) { 109f239db40SOwen Anderson bool ret; 110f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->containsSymbol(**unwrap(Sym), ret)) 111f239db40SOwen Anderson report_fatal_error(ec.message()); 112f239db40SOwen Anderson return ret; 113f239db40SOwen Anderson } 114f239db40SOwen Anderson 115f239db40SOwen Anderson // SymbolRef accessors 116f239db40SOwen Anderson const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) { 117f239db40SOwen Anderson StringRef ret; 118f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->getName(ret)) 119f239db40SOwen Anderson report_fatal_error(ec.message()); 120f239db40SOwen Anderson return ret.data(); 121f239db40SOwen Anderson } 122f239db40SOwen Anderson 123f239db40SOwen Anderson uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) { 124f239db40SOwen Anderson uint64_t ret; 125f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->getAddress(ret)) 126f239db40SOwen Anderson report_fatal_error(ec.message()); 127f239db40SOwen Anderson return ret; 128f239db40SOwen Anderson } 129f239db40SOwen Anderson 130f239db40SOwen Anderson uint64_t LLVMGetSymbolOffset(LLVMSymbolIteratorRef SI) { 131f239db40SOwen Anderson uint64_t ret; 132f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->getOffset(ret)) 133f239db40SOwen Anderson report_fatal_error(ec.message()); 134f239db40SOwen Anderson return ret; 135f239db40SOwen Anderson } 136f239db40SOwen Anderson 137f239db40SOwen Anderson uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) { 138f239db40SOwen Anderson uint64_t ret; 139f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->getSize(ret)) 140f239db40SOwen Anderson report_fatal_error(ec.message()); 141f239db40SOwen Anderson return ret; 142f239db40SOwen Anderson } 143f239db40SOwen Anderson 144