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 15dec20e43SFilip Pizlo #include "llvm/ADT/SmallVector.h" 16c56d2e8fSEric Christopher #include "llvm-c/Object.h" 17*8a8cd2baSChandler Carruth #include "llvm/Object/ObjectFile.h" 18c56d2e8fSEric Christopher 19c56d2e8fSEric Christopher using namespace llvm; 20c56d2e8fSEric Christopher using namespace object; 21c56d2e8fSEric Christopher 2204d4e931SEric Christopher inline ObjectFile *unwrap(LLVMObjectFileRef OF) { 2304d4e931SEric Christopher return reinterpret_cast<ObjectFile*>(OF); 2404d4e931SEric Christopher } 2504d4e931SEric Christopher 2604d4e931SEric Christopher inline LLVMObjectFileRef wrap(const ObjectFile *OF) { 2704d4e931SEric Christopher return reinterpret_cast<LLVMObjectFileRef>(const_cast<ObjectFile*>(OF)); 2804d4e931SEric Christopher } 2904d4e931SEric Christopher 3004d4e931SEric Christopher inline section_iterator *unwrap(LLVMSectionIteratorRef SI) { 3104d4e931SEric Christopher return reinterpret_cast<section_iterator*>(SI); 3204d4e931SEric Christopher } 3304d4e931SEric Christopher 3404d4e931SEric Christopher inline LLVMSectionIteratorRef 3504d4e931SEric Christopher wrap(const section_iterator *SI) { 3604d4e931SEric Christopher return reinterpret_cast<LLVMSectionIteratorRef> 3704d4e931SEric Christopher (const_cast<section_iterator*>(SI)); 3804d4e931SEric Christopher } 3904d4e931SEric Christopher 4004d4e931SEric Christopher inline symbol_iterator *unwrap(LLVMSymbolIteratorRef SI) { 4104d4e931SEric Christopher return reinterpret_cast<symbol_iterator*>(SI); 4204d4e931SEric Christopher } 4304d4e931SEric Christopher 4404d4e931SEric Christopher inline LLVMSymbolIteratorRef 4504d4e931SEric Christopher wrap(const symbol_iterator *SI) { 4604d4e931SEric Christopher return reinterpret_cast<LLVMSymbolIteratorRef> 4704d4e931SEric Christopher (const_cast<symbol_iterator*>(SI)); 4804d4e931SEric Christopher } 4904d4e931SEric Christopher 5004d4e931SEric Christopher inline relocation_iterator *unwrap(LLVMRelocationIteratorRef SI) { 5104d4e931SEric Christopher return reinterpret_cast<relocation_iterator*>(SI); 5204d4e931SEric Christopher } 5304d4e931SEric Christopher 5404d4e931SEric Christopher inline LLVMRelocationIteratorRef 5504d4e931SEric Christopher wrap(const relocation_iterator *SI) { 5604d4e931SEric Christopher return reinterpret_cast<LLVMRelocationIteratorRef> 5704d4e931SEric Christopher (const_cast<relocation_iterator*>(SI)); 5804d4e931SEric Christopher } 5904d4e931SEric Christopher 60f239db40SOwen Anderson // ObjectFile creation 61c56d2e8fSEric Christopher LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) { 62c56d2e8fSEric Christopher return wrap(ObjectFile::createObjectFile(unwrap(MemBuf))); 63c56d2e8fSEric Christopher } 64c56d2e8fSEric Christopher 65c56d2e8fSEric Christopher void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) { 66c56d2e8fSEric Christopher delete unwrap(ObjectFile); 67c56d2e8fSEric Christopher } 68c56d2e8fSEric Christopher 69f239db40SOwen Anderson // ObjectFile Section iterators 70c56d2e8fSEric Christopher LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile) { 71e5fd0047SMichael J. Spencer section_iterator SI = unwrap(ObjectFile)->begin_sections(); 72e5fd0047SMichael J. Spencer return wrap(new section_iterator(SI)); 73c56d2e8fSEric Christopher } 74c56d2e8fSEric Christopher 75c56d2e8fSEric Christopher void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI) { 76c56d2e8fSEric Christopher delete unwrap(SI); 77c56d2e8fSEric Christopher } 78c56d2e8fSEric Christopher 79c56d2e8fSEric Christopher LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile, 80c56d2e8fSEric Christopher LLVMSectionIteratorRef SI) { 81c56d2e8fSEric Christopher return (*unwrap(SI) == unwrap(ObjectFile)->end_sections()) ? 1 : 0; 82c56d2e8fSEric Christopher } 83c56d2e8fSEric Christopher 84c56d2e8fSEric Christopher void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) { 851d6167fdSMichael J. Spencer error_code ec; 861d6167fdSMichael J. Spencer unwrap(SI)->increment(ec); 871d6167fdSMichael J. Spencer if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message()); 88c56d2e8fSEric Christopher } 89c56d2e8fSEric Christopher 9007bfdbb2SOwen Anderson void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect, 9107bfdbb2SOwen Anderson LLVMSymbolIteratorRef Sym) { 9207bfdbb2SOwen Anderson if (error_code ec = (*unwrap(Sym))->getSection(*unwrap(Sect))) 9307bfdbb2SOwen Anderson report_fatal_error(ec.message()); 9407bfdbb2SOwen Anderson } 9507bfdbb2SOwen Anderson 96f239db40SOwen Anderson // ObjectFile Symbol iterators 97f239db40SOwen Anderson LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile) { 98f239db40SOwen Anderson symbol_iterator SI = unwrap(ObjectFile)->begin_symbols(); 99f239db40SOwen Anderson return wrap(new symbol_iterator(SI)); 100f239db40SOwen Anderson } 101f239db40SOwen Anderson 102f239db40SOwen Anderson void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) { 103f239db40SOwen Anderson delete unwrap(SI); 104f239db40SOwen Anderson } 105f239db40SOwen Anderson 106f239db40SOwen Anderson LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile, 107f239db40SOwen Anderson LLVMSymbolIteratorRef SI) { 108f239db40SOwen Anderson return (*unwrap(SI) == unwrap(ObjectFile)->end_symbols()) ? 1 : 0; 109f239db40SOwen Anderson } 110f239db40SOwen Anderson 111f239db40SOwen Anderson void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) { 112f239db40SOwen Anderson error_code ec; 113f239db40SOwen Anderson unwrap(SI)->increment(ec); 114f239db40SOwen Anderson if (ec) report_fatal_error("LLVMMoveToNextSymbol failed: " + ec.message()); 115f239db40SOwen Anderson } 116f239db40SOwen Anderson 117f239db40SOwen Anderson // SectionRef accessors 118c56d2e8fSEric Christopher const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) { 1191d6167fdSMichael J. Spencer StringRef ret; 1201d6167fdSMichael J. Spencer if (error_code ec = (*unwrap(SI))->getName(ret)) 1211d6167fdSMichael J. Spencer report_fatal_error(ec.message()); 1221d6167fdSMichael J. Spencer return ret.data(); 123c56d2e8fSEric Christopher } 124c56d2e8fSEric Christopher 125c56d2e8fSEric Christopher uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) { 1261d6167fdSMichael J. Spencer uint64_t ret; 1271d6167fdSMichael J. Spencer if (error_code ec = (*unwrap(SI))->getSize(ret)) 1281d6167fdSMichael J. Spencer report_fatal_error(ec.message()); 1291d6167fdSMichael J. Spencer return ret; 130c56d2e8fSEric Christopher } 131c56d2e8fSEric Christopher 132c56d2e8fSEric Christopher const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) { 1331d6167fdSMichael J. Spencer StringRef ret; 1341d6167fdSMichael J. Spencer if (error_code ec = (*unwrap(SI))->getContents(ret)) 1351d6167fdSMichael J. Spencer report_fatal_error(ec.message()); 1361d6167fdSMichael J. Spencer return ret.data(); 137c56d2e8fSEric Christopher } 138f239db40SOwen Anderson 139f239db40SOwen Anderson uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) { 140f239db40SOwen Anderson uint64_t ret; 141f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->getAddress(ret)) 142f239db40SOwen Anderson report_fatal_error(ec.message()); 143f239db40SOwen Anderson return ret; 144f239db40SOwen Anderson } 145f239db40SOwen Anderson 146500ebeb8SOwen Anderson LLVMBool LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI, 147f239db40SOwen Anderson LLVMSymbolIteratorRef Sym) { 148f239db40SOwen Anderson bool ret; 149f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->containsSymbol(**unwrap(Sym), ret)) 150f239db40SOwen Anderson report_fatal_error(ec.message()); 151f239db40SOwen Anderson return ret; 152f239db40SOwen Anderson } 153f239db40SOwen Anderson 154e245af65SOwen Anderson // Section Relocation iterators 155e245af65SOwen Anderson LLVMRelocationIteratorRef LLVMGetRelocations(LLVMSectionIteratorRef Section) { 156e245af65SOwen Anderson relocation_iterator SI = (*unwrap(Section))->begin_relocations(); 157e245af65SOwen Anderson return wrap(new relocation_iterator(SI)); 158e245af65SOwen Anderson } 159e245af65SOwen Anderson 160e245af65SOwen Anderson void LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef SI) { 161e245af65SOwen Anderson delete unwrap(SI); 162e245af65SOwen Anderson } 163e245af65SOwen Anderson 164e245af65SOwen Anderson LLVMBool LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section, 165e245af65SOwen Anderson LLVMRelocationIteratorRef SI) { 166e245af65SOwen Anderson return (*unwrap(SI) == (*unwrap(Section))->end_relocations()) ? 1 : 0; 167e245af65SOwen Anderson } 168e245af65SOwen Anderson 169e245af65SOwen Anderson void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI) { 170e245af65SOwen Anderson error_code ec; 171e245af65SOwen Anderson unwrap(SI)->increment(ec); 172e245af65SOwen Anderson if (ec) report_fatal_error("LLVMMoveToNextRelocation failed: " + 173e245af65SOwen Anderson ec.message()); 174e245af65SOwen Anderson } 175e245af65SOwen Anderson 176e245af65SOwen Anderson 177f239db40SOwen Anderson // SymbolRef accessors 178f239db40SOwen Anderson const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) { 179f239db40SOwen Anderson StringRef ret; 180f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->getName(ret)) 181f239db40SOwen Anderson report_fatal_error(ec.message()); 182f239db40SOwen Anderson return ret.data(); 183f239db40SOwen Anderson } 184f239db40SOwen Anderson 185f239db40SOwen Anderson uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) { 186f239db40SOwen Anderson uint64_t ret; 187f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->getAddress(ret)) 188f239db40SOwen Anderson report_fatal_error(ec.message()); 189f239db40SOwen Anderson return ret; 190f239db40SOwen Anderson } 191f239db40SOwen Anderson 192cbe72fc9SDanil Malyshev uint64_t LLVMGetSymbolFileOffset(LLVMSymbolIteratorRef SI) { 193f239db40SOwen Anderson uint64_t ret; 194cbe72fc9SDanil Malyshev if (error_code ec = (*unwrap(SI))->getFileOffset(ret)) 195f239db40SOwen Anderson report_fatal_error(ec.message()); 196f239db40SOwen Anderson return ret; 197f239db40SOwen Anderson } 198f239db40SOwen Anderson 199f239db40SOwen Anderson uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) { 200f239db40SOwen Anderson uint64_t ret; 201f239db40SOwen Anderson if (error_code ec = (*unwrap(SI))->getSize(ret)) 202f239db40SOwen Anderson report_fatal_error(ec.message()); 203f239db40SOwen Anderson return ret; 204f239db40SOwen Anderson } 205f239db40SOwen Anderson 206f7a89d06SOwen Anderson // RelocationRef accessors 207f7a89d06SOwen Anderson uint64_t LLVMGetRelocationAddress(LLVMRelocationIteratorRef RI) { 208f7a89d06SOwen Anderson uint64_t ret; 209f7a89d06SOwen Anderson if (error_code ec = (*unwrap(RI))->getAddress(ret)) 210f7a89d06SOwen Anderson report_fatal_error(ec.message()); 211f7a89d06SOwen Anderson return ret; 212f7a89d06SOwen Anderson } 213f7a89d06SOwen Anderson 214cbe72fc9SDanil Malyshev uint64_t LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI) { 215cbe72fc9SDanil Malyshev uint64_t ret; 216cbe72fc9SDanil Malyshev if (error_code ec = (*unwrap(RI))->getOffset(ret)) 217cbe72fc9SDanil Malyshev report_fatal_error(ec.message()); 218cbe72fc9SDanil Malyshev return ret; 219cbe72fc9SDanil Malyshev } 220cbe72fc9SDanil Malyshev 221f7a89d06SOwen Anderson LLVMSymbolIteratorRef LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI) { 222806f0064SRafael Espindola symbol_iterator ret = (*unwrap(RI))->getSymbol(); 223f7a89d06SOwen Anderson return wrap(new symbol_iterator(ret)); 224f7a89d06SOwen Anderson } 225f7a89d06SOwen Anderson 226f7a89d06SOwen Anderson uint64_t LLVMGetRelocationType(LLVMRelocationIteratorRef RI) { 227f7a89d06SOwen Anderson uint64_t ret; 228f7a89d06SOwen Anderson if (error_code ec = (*unwrap(RI))->getType(ret)) 229f7a89d06SOwen Anderson report_fatal_error(ec.message()); 230f7a89d06SOwen Anderson return ret; 231f7a89d06SOwen Anderson } 232f7a89d06SOwen Anderson 233f7a89d06SOwen Anderson // NOTE: Caller takes ownership of returned string. 234f7a89d06SOwen Anderson const char *LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI) { 235f7a89d06SOwen Anderson SmallVector<char, 0> ret; 236f7a89d06SOwen Anderson if (error_code ec = (*unwrap(RI))->getTypeName(ret)) 237f7a89d06SOwen Anderson report_fatal_error(ec.message()); 238f7a89d06SOwen Anderson 239f7a89d06SOwen Anderson char *str = static_cast<char*>(malloc(ret.size())); 240f7a89d06SOwen Anderson std::copy(ret.begin(), ret.end(), str); 241f7a89d06SOwen Anderson return str; 242f7a89d06SOwen Anderson } 243f7a89d06SOwen Anderson 244f7a89d06SOwen Anderson // NOTE: Caller takes ownership of returned string. 245f7a89d06SOwen Anderson const char *LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI) { 246f7a89d06SOwen Anderson SmallVector<char, 0> ret; 247f7a89d06SOwen Anderson if (error_code ec = (*unwrap(RI))->getValueString(ret)) 248f7a89d06SOwen Anderson report_fatal_error(ec.message()); 249f7a89d06SOwen Anderson 250f7a89d06SOwen Anderson char *str = static_cast<char*>(malloc(ret.size())); 251f7a89d06SOwen Anderson std::copy(ret.begin(), ret.end(), str); 252f7a89d06SOwen Anderson return str; 253f7a89d06SOwen Anderson } 254f7a89d06SOwen Anderson 255