1 //===- Object.cpp - C bindings to the object file library--------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the C bindings to the file-format-independent object 11 // library. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/Object/ObjectFile.h" 16 #include "llvm-c/Object.h" 17 18 using namespace llvm; 19 using namespace object; 20 21 // ObjectFile creation 22 LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) { 23 return wrap(ObjectFile::createObjectFile(unwrap(MemBuf))); 24 } 25 26 void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) { 27 delete unwrap(ObjectFile); 28 } 29 30 // ObjectFile Section iterators 31 LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile) { 32 section_iterator SI = unwrap(ObjectFile)->begin_sections(); 33 return wrap(new section_iterator(SI)); 34 } 35 36 void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI) { 37 delete unwrap(SI); 38 } 39 40 LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile, 41 LLVMSectionIteratorRef SI) { 42 return (*unwrap(SI) == unwrap(ObjectFile)->end_sections()) ? 1 : 0; 43 } 44 45 void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) { 46 error_code ec; 47 unwrap(SI)->increment(ec); 48 if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message()); 49 } 50 51 void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect, 52 LLVMSymbolIteratorRef Sym) { 53 if (error_code ec = (*unwrap(Sym))->getSection(*unwrap(Sect))) 54 report_fatal_error(ec.message()); 55 } 56 57 // ObjectFile Symbol iterators 58 LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile) { 59 symbol_iterator SI = unwrap(ObjectFile)->begin_symbols(); 60 return wrap(new symbol_iterator(SI)); 61 } 62 63 void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) { 64 delete unwrap(SI); 65 } 66 67 LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile, 68 LLVMSymbolIteratorRef SI) { 69 return (*unwrap(SI) == unwrap(ObjectFile)->end_symbols()) ? 1 : 0; 70 } 71 72 void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) { 73 error_code ec; 74 unwrap(SI)->increment(ec); 75 if (ec) report_fatal_error("LLVMMoveToNextSymbol failed: " + ec.message()); 76 } 77 78 // SectionRef accessors 79 const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) { 80 StringRef ret; 81 if (error_code ec = (*unwrap(SI))->getName(ret)) 82 report_fatal_error(ec.message()); 83 return ret.data(); 84 } 85 86 uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) { 87 uint64_t ret; 88 if (error_code ec = (*unwrap(SI))->getSize(ret)) 89 report_fatal_error(ec.message()); 90 return ret; 91 } 92 93 const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) { 94 StringRef ret; 95 if (error_code ec = (*unwrap(SI))->getContents(ret)) 96 report_fatal_error(ec.message()); 97 return ret.data(); 98 } 99 100 uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) { 101 uint64_t ret; 102 if (error_code ec = (*unwrap(SI))->getAddress(ret)) 103 report_fatal_error(ec.message()); 104 return ret; 105 } 106 107 LLVMBool LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI, 108 LLVMSymbolIteratorRef Sym) { 109 bool ret; 110 if (error_code ec = (*unwrap(SI))->containsSymbol(**unwrap(Sym), ret)) 111 report_fatal_error(ec.message()); 112 return ret; 113 } 114 115 // Section Relocation iterators 116 LLVMRelocationIteratorRef LLVMGetRelocations(LLVMSectionIteratorRef Section) { 117 relocation_iterator SI = (*unwrap(Section))->begin_relocations(); 118 return wrap(new relocation_iterator(SI)); 119 } 120 121 void LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef SI) { 122 delete unwrap(SI); 123 } 124 125 LLVMBool LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section, 126 LLVMRelocationIteratorRef SI) { 127 return (*unwrap(SI) == (*unwrap(Section))->end_relocations()) ? 1 : 0; 128 } 129 130 void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI) { 131 error_code ec; 132 unwrap(SI)->increment(ec); 133 if (ec) report_fatal_error("LLVMMoveToNextRelocation failed: " + 134 ec.message()); 135 } 136 137 138 // SymbolRef accessors 139 const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) { 140 StringRef ret; 141 if (error_code ec = (*unwrap(SI))->getName(ret)) 142 report_fatal_error(ec.message()); 143 return ret.data(); 144 } 145 146 uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) { 147 uint64_t ret; 148 if (error_code ec = (*unwrap(SI))->getAddress(ret)) 149 report_fatal_error(ec.message()); 150 return ret; 151 } 152 153 uint64_t LLVMGetSymbolFileOffset(LLVMSymbolIteratorRef SI) { 154 uint64_t ret; 155 if (error_code ec = (*unwrap(SI))->getFileOffset(ret)) 156 report_fatal_error(ec.message()); 157 return ret; 158 } 159 160 uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) { 161 uint64_t ret; 162 if (error_code ec = (*unwrap(SI))->getSize(ret)) 163 report_fatal_error(ec.message()); 164 return ret; 165 } 166 167 // RelocationRef accessors 168 uint64_t LLVMGetRelocationAddress(LLVMRelocationIteratorRef RI) { 169 uint64_t ret; 170 if (error_code ec = (*unwrap(RI))->getAddress(ret)) 171 report_fatal_error(ec.message()); 172 return ret; 173 } 174 175 uint64_t LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI) { 176 uint64_t ret; 177 if (error_code ec = (*unwrap(RI))->getOffset(ret)) 178 report_fatal_error(ec.message()); 179 return ret; 180 } 181 182 LLVMSymbolIteratorRef LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI) { 183 SymbolRef ret; 184 if (error_code ec = (*unwrap(RI))->getSymbol(ret)) 185 report_fatal_error(ec.message()); 186 187 return wrap(new symbol_iterator(ret)); 188 } 189 190 uint64_t LLVMGetRelocationType(LLVMRelocationIteratorRef RI) { 191 uint64_t ret; 192 if (error_code ec = (*unwrap(RI))->getType(ret)) 193 report_fatal_error(ec.message()); 194 return ret; 195 } 196 197 // NOTE: Caller takes ownership of returned string. 198 const char *LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI) { 199 SmallVector<char, 0> ret; 200 if (error_code ec = (*unwrap(RI))->getTypeName(ret)) 201 report_fatal_error(ec.message()); 202 203 char *str = static_cast<char*>(malloc(ret.size())); 204 std::copy(ret.begin(), ret.end(), str); 205 return str; 206 } 207 208 // NOTE: Caller takes ownership of returned string. 209 const char *LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI) { 210 SmallVector<char, 0> ret; 211 if (error_code ec = (*unwrap(RI))->getValueString(ret)) 212 report_fatal_error(ec.message()); 213 214 char *str = static_cast<char*>(malloc(ret.size())); 215 std::copy(ret.begin(), ret.end(), str); 216 return str; 217 } 218 219