annotate llvm/lib/Object/Object.cpp @ 181:df311c476dd5

CreateIdentifierInfo in ParseCbC (not yet worked)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 31 May 2020 12:30:11 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- Object.cpp - C bindings to the object file library--------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file defines the C bindings to the file-format-independent object
anatofuz
parents:
diff changeset
10 // library.
anatofuz
parents:
diff changeset
11 //
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 #include "llvm-c/Object.h"
anatofuz
parents:
diff changeset
15 #include "llvm/ADT/SmallVector.h"
anatofuz
parents:
diff changeset
16 #include "llvm/IR/LLVMContext.h"
anatofuz
parents:
diff changeset
17 #include "llvm/Object/ObjectFile.h"
anatofuz
parents:
diff changeset
18 #include "llvm/Object/MachOUniversal.h"
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 using namespace llvm;
anatofuz
parents:
diff changeset
21 using namespace object;
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 inline OwningBinary<ObjectFile> *unwrap(LLVMObjectFileRef OF) {
anatofuz
parents:
diff changeset
24 return reinterpret_cast<OwningBinary<ObjectFile> *>(OF);
anatofuz
parents:
diff changeset
25 }
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 inline LLVMObjectFileRef wrap(const OwningBinary<ObjectFile> *OF) {
anatofuz
parents:
diff changeset
28 return reinterpret_cast<LLVMObjectFileRef>(
anatofuz
parents:
diff changeset
29 const_cast<OwningBinary<ObjectFile> *>(OF));
anatofuz
parents:
diff changeset
30 }
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 inline section_iterator *unwrap(LLVMSectionIteratorRef SI) {
anatofuz
parents:
diff changeset
33 return reinterpret_cast<section_iterator*>(SI);
anatofuz
parents:
diff changeset
34 }
anatofuz
parents:
diff changeset
35
anatofuz
parents:
diff changeset
36 inline LLVMSectionIteratorRef
anatofuz
parents:
diff changeset
37 wrap(const section_iterator *SI) {
anatofuz
parents:
diff changeset
38 return reinterpret_cast<LLVMSectionIteratorRef>
anatofuz
parents:
diff changeset
39 (const_cast<section_iterator*>(SI));
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 inline symbol_iterator *unwrap(LLVMSymbolIteratorRef SI) {
anatofuz
parents:
diff changeset
43 return reinterpret_cast<symbol_iterator*>(SI);
anatofuz
parents:
diff changeset
44 }
anatofuz
parents:
diff changeset
45
anatofuz
parents:
diff changeset
46 inline LLVMSymbolIteratorRef
anatofuz
parents:
diff changeset
47 wrap(const symbol_iterator *SI) {
anatofuz
parents:
diff changeset
48 return reinterpret_cast<LLVMSymbolIteratorRef>
anatofuz
parents:
diff changeset
49 (const_cast<symbol_iterator*>(SI));
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 inline relocation_iterator *unwrap(LLVMRelocationIteratorRef SI) {
anatofuz
parents:
diff changeset
53 return reinterpret_cast<relocation_iterator*>(SI);
anatofuz
parents:
diff changeset
54 }
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 inline LLVMRelocationIteratorRef
anatofuz
parents:
diff changeset
57 wrap(const relocation_iterator *SI) {
anatofuz
parents:
diff changeset
58 return reinterpret_cast<LLVMRelocationIteratorRef>
anatofuz
parents:
diff changeset
59 (const_cast<relocation_iterator*>(SI));
anatofuz
parents:
diff changeset
60 }
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 /*--.. Operations on binary files ..........................................--*/
anatofuz
parents:
diff changeset
63
anatofuz
parents:
diff changeset
64 LLVMBinaryRef LLVMCreateBinary(LLVMMemoryBufferRef MemBuf,
anatofuz
parents:
diff changeset
65 LLVMContextRef Context,
anatofuz
parents:
diff changeset
66 char **ErrorMessage) {
anatofuz
parents:
diff changeset
67 auto maybeContext = Context ? unwrap(Context) : nullptr;
anatofuz
parents:
diff changeset
68 Expected<std::unique_ptr<Binary>> ObjOrErr(
anatofuz
parents:
diff changeset
69 createBinary(unwrap(MemBuf)->getMemBufferRef(), maybeContext));
anatofuz
parents:
diff changeset
70 if (!ObjOrErr) {
anatofuz
parents:
diff changeset
71 *ErrorMessage = strdup(toString(ObjOrErr.takeError()).c_str());
anatofuz
parents:
diff changeset
72 return nullptr;
anatofuz
parents:
diff changeset
73 }
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 return wrap(ObjOrErr.get().release());
anatofuz
parents:
diff changeset
76 }
anatofuz
parents:
diff changeset
77
anatofuz
parents:
diff changeset
78 LLVMMemoryBufferRef LLVMBinaryCopyMemoryBuffer(LLVMBinaryRef BR) {
anatofuz
parents:
diff changeset
79 auto Buf = unwrap(BR)->getMemoryBufferRef();
anatofuz
parents:
diff changeset
80 return wrap(llvm::MemoryBuffer::getMemBuffer(
anatofuz
parents:
diff changeset
81 Buf.getBuffer(), Buf.getBufferIdentifier(),
anatofuz
parents:
diff changeset
82 /*RequiresNullTerminator*/false).release());
anatofuz
parents:
diff changeset
83 }
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 void LLVMDisposeBinary(LLVMBinaryRef BR) {
anatofuz
parents:
diff changeset
86 delete unwrap(BR);
anatofuz
parents:
diff changeset
87 }
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 LLVMBinaryType LLVMBinaryGetType(LLVMBinaryRef BR) {
anatofuz
parents:
diff changeset
90 class BinaryTypeMapper final : public Binary {
anatofuz
parents:
diff changeset
91 public:
anatofuz
parents:
diff changeset
92 static LLVMBinaryType mapBinaryTypeToLLVMBinaryType(unsigned Kind) {
anatofuz
parents:
diff changeset
93 switch (Kind) {
anatofuz
parents:
diff changeset
94 case ID_Archive:
anatofuz
parents:
diff changeset
95 return LLVMBinaryTypeArchive;
anatofuz
parents:
diff changeset
96 case ID_MachOUniversalBinary:
anatofuz
parents:
diff changeset
97 return LLVMBinaryTypeMachOUniversalBinary;
anatofuz
parents:
diff changeset
98 case ID_COFFImportFile:
anatofuz
parents:
diff changeset
99 return LLVMBinaryTypeCOFFImportFile;
anatofuz
parents:
diff changeset
100 case ID_IR:
anatofuz
parents:
diff changeset
101 return LLVMBinaryTypeIR;
anatofuz
parents:
diff changeset
102 case ID_WinRes:
anatofuz
parents:
diff changeset
103 return LLVMBinaryTypeWinRes;
anatofuz
parents:
diff changeset
104 case ID_COFF:
anatofuz
parents:
diff changeset
105 return LLVMBinaryTypeCOFF;
anatofuz
parents:
diff changeset
106 case ID_ELF32L:
anatofuz
parents:
diff changeset
107 return LLVMBinaryTypeELF32L;
anatofuz
parents:
diff changeset
108 case ID_ELF32B:
anatofuz
parents:
diff changeset
109 return LLVMBinaryTypeELF32B;
anatofuz
parents:
diff changeset
110 case ID_ELF64L:
anatofuz
parents:
diff changeset
111 return LLVMBinaryTypeELF64L;
anatofuz
parents:
diff changeset
112 case ID_ELF64B:
anatofuz
parents:
diff changeset
113 return LLVMBinaryTypeELF64B;
anatofuz
parents:
diff changeset
114 case ID_MachO32L:
anatofuz
parents:
diff changeset
115 return LLVMBinaryTypeMachO32L;
anatofuz
parents:
diff changeset
116 case ID_MachO32B:
anatofuz
parents:
diff changeset
117 return LLVMBinaryTypeMachO32B;
anatofuz
parents:
diff changeset
118 case ID_MachO64L:
anatofuz
parents:
diff changeset
119 return LLVMBinaryTypeMachO64L;
anatofuz
parents:
diff changeset
120 case ID_MachO64B:
anatofuz
parents:
diff changeset
121 return LLVMBinaryTypeMachO64B;
anatofuz
parents:
diff changeset
122 case ID_Wasm:
anatofuz
parents:
diff changeset
123 return LLVMBinaryTypeWasm;
anatofuz
parents:
diff changeset
124 case ID_StartObjects:
anatofuz
parents:
diff changeset
125 case ID_EndObjects:
anatofuz
parents:
diff changeset
126 llvm_unreachable("Marker types are not valid binary kinds!");
anatofuz
parents:
diff changeset
127 default:
anatofuz
parents:
diff changeset
128 llvm_unreachable("Unknown binary kind!");
anatofuz
parents:
diff changeset
129 }
anatofuz
parents:
diff changeset
130 }
anatofuz
parents:
diff changeset
131 };
anatofuz
parents:
diff changeset
132 return BinaryTypeMapper::mapBinaryTypeToLLVMBinaryType(unwrap(BR)->getType());
anatofuz
parents:
diff changeset
133 }
anatofuz
parents:
diff changeset
134
anatofuz
parents:
diff changeset
135 LLVMBinaryRef LLVMMachOUniversalBinaryCopyObjectForArch(LLVMBinaryRef BR,
anatofuz
parents:
diff changeset
136 const char *Arch,
anatofuz
parents:
diff changeset
137 size_t ArchLen,
anatofuz
parents:
diff changeset
138 char **ErrorMessage) {
anatofuz
parents:
diff changeset
139 auto universal = cast<MachOUniversalBinary>(unwrap(BR));
anatofuz
parents:
diff changeset
140 Expected<std::unique_ptr<ObjectFile>> ObjOrErr(
anatofuz
parents:
diff changeset
141 universal->getMachOObjectForArch({Arch, ArchLen}));
anatofuz
parents:
diff changeset
142 if (!ObjOrErr) {
anatofuz
parents:
diff changeset
143 *ErrorMessage = strdup(toString(ObjOrErr.takeError()).c_str());
anatofuz
parents:
diff changeset
144 return nullptr;
anatofuz
parents:
diff changeset
145 }
anatofuz
parents:
diff changeset
146 return wrap(ObjOrErr.get().release());
anatofuz
parents:
diff changeset
147 }
anatofuz
parents:
diff changeset
148
anatofuz
parents:
diff changeset
149 LLVMSectionIteratorRef LLVMObjectFileCopySectionIterator(LLVMBinaryRef BR) {
anatofuz
parents:
diff changeset
150 auto OF = cast<ObjectFile>(unwrap(BR));
anatofuz
parents:
diff changeset
151 auto sections = OF->sections();
anatofuz
parents:
diff changeset
152 if (sections.begin() == sections.end())
anatofuz
parents:
diff changeset
153 return nullptr;
anatofuz
parents:
diff changeset
154 return wrap(new section_iterator(sections.begin()));
anatofuz
parents:
diff changeset
155 }
anatofuz
parents:
diff changeset
156
anatofuz
parents:
diff changeset
157 LLVMBool LLVMObjectFileIsSectionIteratorAtEnd(LLVMBinaryRef BR,
anatofuz
parents:
diff changeset
158 LLVMSectionIteratorRef SI) {
anatofuz
parents:
diff changeset
159 auto OF = cast<ObjectFile>(unwrap(BR));
anatofuz
parents:
diff changeset
160 return (*unwrap(SI) == OF->section_end()) ? 1 : 0;
anatofuz
parents:
diff changeset
161 }
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 LLVMSymbolIteratorRef LLVMObjectFileCopySymbolIterator(LLVMBinaryRef BR) {
anatofuz
parents:
diff changeset
164 auto OF = cast<ObjectFile>(unwrap(BR));
anatofuz
parents:
diff changeset
165 auto symbols = OF->symbols();
anatofuz
parents:
diff changeset
166 if (symbols.begin() == symbols.end())
anatofuz
parents:
diff changeset
167 return nullptr;
anatofuz
parents:
diff changeset
168 return wrap(new symbol_iterator(symbols.begin()));
anatofuz
parents:
diff changeset
169 }
anatofuz
parents:
diff changeset
170
anatofuz
parents:
diff changeset
171 LLVMBool LLVMObjectFileIsSymbolIteratorAtEnd(LLVMBinaryRef BR,
anatofuz
parents:
diff changeset
172 LLVMSymbolIteratorRef SI) {
anatofuz
parents:
diff changeset
173 auto OF = cast<ObjectFile>(unwrap(BR));
anatofuz
parents:
diff changeset
174 return (*unwrap(SI) == OF->symbol_end()) ? 1 : 0;
anatofuz
parents:
diff changeset
175 }
anatofuz
parents:
diff changeset
176
anatofuz
parents:
diff changeset
177 // ObjectFile creation
anatofuz
parents:
diff changeset
178 LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
anatofuz
parents:
diff changeset
179 std::unique_ptr<MemoryBuffer> Buf(unwrap(MemBuf));
anatofuz
parents:
diff changeset
180 Expected<std::unique_ptr<ObjectFile>> ObjOrErr(
anatofuz
parents:
diff changeset
181 ObjectFile::createObjectFile(Buf->getMemBufferRef()));
anatofuz
parents:
diff changeset
182 std::unique_ptr<ObjectFile> Obj;
anatofuz
parents:
diff changeset
183 if (!ObjOrErr) {
anatofuz
parents:
diff changeset
184 // TODO: Actually report errors helpfully.
anatofuz
parents:
diff changeset
185 consumeError(ObjOrErr.takeError());
anatofuz
parents:
diff changeset
186 return nullptr;
anatofuz
parents:
diff changeset
187 }
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 auto *Ret = new OwningBinary<ObjectFile>(std::move(ObjOrErr.get()), std::move(Buf));
anatofuz
parents:
diff changeset
190 return wrap(Ret);
anatofuz
parents:
diff changeset
191 }
anatofuz
parents:
diff changeset
192
anatofuz
parents:
diff changeset
193 void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) {
anatofuz
parents:
diff changeset
194 delete unwrap(ObjectFile);
anatofuz
parents:
diff changeset
195 }
anatofuz
parents:
diff changeset
196
anatofuz
parents:
diff changeset
197 // ObjectFile Section iterators
anatofuz
parents:
diff changeset
198 LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef OF) {
anatofuz
parents:
diff changeset
199 OwningBinary<ObjectFile> *OB = unwrap(OF);
anatofuz
parents:
diff changeset
200 section_iterator SI = OB->getBinary()->section_begin();
anatofuz
parents:
diff changeset
201 return wrap(new section_iterator(SI));
anatofuz
parents:
diff changeset
202 }
anatofuz
parents:
diff changeset
203
anatofuz
parents:
diff changeset
204 void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI) {
anatofuz
parents:
diff changeset
205 delete unwrap(SI);
anatofuz
parents:
diff changeset
206 }
anatofuz
parents:
diff changeset
207
anatofuz
parents:
diff changeset
208 LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef OF,
anatofuz
parents:
diff changeset
209 LLVMSectionIteratorRef SI) {
anatofuz
parents:
diff changeset
210 OwningBinary<ObjectFile> *OB = unwrap(OF);
anatofuz
parents:
diff changeset
211 return (*unwrap(SI) == OB->getBinary()->section_end()) ? 1 : 0;
anatofuz
parents:
diff changeset
212 }
anatofuz
parents:
diff changeset
213
anatofuz
parents:
diff changeset
214 void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) {
anatofuz
parents:
diff changeset
215 ++(*unwrap(SI));
anatofuz
parents:
diff changeset
216 }
anatofuz
parents:
diff changeset
217
anatofuz
parents:
diff changeset
218 void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect,
anatofuz
parents:
diff changeset
219 LLVMSymbolIteratorRef Sym) {
anatofuz
parents:
diff changeset
220 Expected<section_iterator> SecOrErr = (*unwrap(Sym))->getSection();
anatofuz
parents:
diff changeset
221 if (!SecOrErr) {
anatofuz
parents:
diff changeset
222 std::string Buf;
anatofuz
parents:
diff changeset
223 raw_string_ostream OS(Buf);
anatofuz
parents:
diff changeset
224 logAllUnhandledErrors(SecOrErr.takeError(), OS);
anatofuz
parents:
diff changeset
225 OS.flush();
anatofuz
parents:
diff changeset
226 report_fatal_error(Buf);
anatofuz
parents:
diff changeset
227 }
anatofuz
parents:
diff changeset
228 *unwrap(Sect) = *SecOrErr;
anatofuz
parents:
diff changeset
229 }
anatofuz
parents:
diff changeset
230
anatofuz
parents:
diff changeset
231 // ObjectFile Symbol iterators
anatofuz
parents:
diff changeset
232 LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef OF) {
anatofuz
parents:
diff changeset
233 OwningBinary<ObjectFile> *OB = unwrap(OF);
anatofuz
parents:
diff changeset
234 symbol_iterator SI = OB->getBinary()->symbol_begin();
anatofuz
parents:
diff changeset
235 return wrap(new symbol_iterator(SI));
anatofuz
parents:
diff changeset
236 }
anatofuz
parents:
diff changeset
237
anatofuz
parents:
diff changeset
238 void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) {
anatofuz
parents:
diff changeset
239 delete unwrap(SI);
anatofuz
parents:
diff changeset
240 }
anatofuz
parents:
diff changeset
241
anatofuz
parents:
diff changeset
242 LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef OF,
anatofuz
parents:
diff changeset
243 LLVMSymbolIteratorRef SI) {
anatofuz
parents:
diff changeset
244 OwningBinary<ObjectFile> *OB = unwrap(OF);
anatofuz
parents:
diff changeset
245 return (*unwrap(SI) == OB->getBinary()->symbol_end()) ? 1 : 0;
anatofuz
parents:
diff changeset
246 }
anatofuz
parents:
diff changeset
247
anatofuz
parents:
diff changeset
248 void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) {
anatofuz
parents:
diff changeset
249 ++(*unwrap(SI));
anatofuz
parents:
diff changeset
250 }
anatofuz
parents:
diff changeset
251
anatofuz
parents:
diff changeset
252 // SectionRef accessors
anatofuz
parents:
diff changeset
253 const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) {
anatofuz
parents:
diff changeset
254 auto NameOrErr = (*unwrap(SI))->getName();
anatofuz
parents:
diff changeset
255 if (!NameOrErr)
anatofuz
parents:
diff changeset
256 report_fatal_error(NameOrErr.takeError());
anatofuz
parents:
diff changeset
257 return NameOrErr->data();
anatofuz
parents:
diff changeset
258 }
anatofuz
parents:
diff changeset
259
anatofuz
parents:
diff changeset
260 uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) {
anatofuz
parents:
diff changeset
261 return (*unwrap(SI))->getSize();
anatofuz
parents:
diff changeset
262 }
anatofuz
parents:
diff changeset
263
anatofuz
parents:
diff changeset
264 const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) {
anatofuz
parents:
diff changeset
265 if (Expected<StringRef> E = (*unwrap(SI))->getContents())
anatofuz
parents:
diff changeset
266 return E->data();
anatofuz
parents:
diff changeset
267 else
anatofuz
parents:
diff changeset
268 report_fatal_error(E.takeError());
anatofuz
parents:
diff changeset
269 }
anatofuz
parents:
diff changeset
270
anatofuz
parents:
diff changeset
271 uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) {
anatofuz
parents:
diff changeset
272 return (*unwrap(SI))->getAddress();
anatofuz
parents:
diff changeset
273 }
anatofuz
parents:
diff changeset
274
anatofuz
parents:
diff changeset
275 LLVMBool LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI,
anatofuz
parents:
diff changeset
276 LLVMSymbolIteratorRef Sym) {
anatofuz
parents:
diff changeset
277 return (*unwrap(SI))->containsSymbol(**unwrap(Sym));
anatofuz
parents:
diff changeset
278 }
anatofuz
parents:
diff changeset
279
anatofuz
parents:
diff changeset
280 // Section Relocation iterators
anatofuz
parents:
diff changeset
281 LLVMRelocationIteratorRef LLVMGetRelocations(LLVMSectionIteratorRef Section) {
anatofuz
parents:
diff changeset
282 relocation_iterator SI = (*unwrap(Section))->relocation_begin();
anatofuz
parents:
diff changeset
283 return wrap(new relocation_iterator(SI));
anatofuz
parents:
diff changeset
284 }
anatofuz
parents:
diff changeset
285
anatofuz
parents:
diff changeset
286 void LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef SI) {
anatofuz
parents:
diff changeset
287 delete unwrap(SI);
anatofuz
parents:
diff changeset
288 }
anatofuz
parents:
diff changeset
289
anatofuz
parents:
diff changeset
290 LLVMBool LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section,
anatofuz
parents:
diff changeset
291 LLVMRelocationIteratorRef SI) {
anatofuz
parents:
diff changeset
292 return (*unwrap(SI) == (*unwrap(Section))->relocation_end()) ? 1 : 0;
anatofuz
parents:
diff changeset
293 }
anatofuz
parents:
diff changeset
294
anatofuz
parents:
diff changeset
295 void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI) {
anatofuz
parents:
diff changeset
296 ++(*unwrap(SI));
anatofuz
parents:
diff changeset
297 }
anatofuz
parents:
diff changeset
298
anatofuz
parents:
diff changeset
299
anatofuz
parents:
diff changeset
300 // SymbolRef accessors
anatofuz
parents:
diff changeset
301 const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) {
anatofuz
parents:
diff changeset
302 Expected<StringRef> Ret = (*unwrap(SI))->getName();
anatofuz
parents:
diff changeset
303 if (!Ret) {
anatofuz
parents:
diff changeset
304 std::string Buf;
anatofuz
parents:
diff changeset
305 raw_string_ostream OS(Buf);
anatofuz
parents:
diff changeset
306 logAllUnhandledErrors(Ret.takeError(), OS);
anatofuz
parents:
diff changeset
307 OS.flush();
anatofuz
parents:
diff changeset
308 report_fatal_error(Buf);
anatofuz
parents:
diff changeset
309 }
anatofuz
parents:
diff changeset
310 return Ret->data();
anatofuz
parents:
diff changeset
311 }
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313 uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) {
anatofuz
parents:
diff changeset
314 Expected<uint64_t> Ret = (*unwrap(SI))->getAddress();
anatofuz
parents:
diff changeset
315 if (!Ret) {
anatofuz
parents:
diff changeset
316 std::string Buf;
anatofuz
parents:
diff changeset
317 raw_string_ostream OS(Buf);
anatofuz
parents:
diff changeset
318 logAllUnhandledErrors(Ret.takeError(), OS);
anatofuz
parents:
diff changeset
319 OS.flush();
anatofuz
parents:
diff changeset
320 report_fatal_error(Buf);
anatofuz
parents:
diff changeset
321 }
anatofuz
parents:
diff changeset
322 return *Ret;
anatofuz
parents:
diff changeset
323 }
anatofuz
parents:
diff changeset
324
anatofuz
parents:
diff changeset
325 uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) {
anatofuz
parents:
diff changeset
326 return (*unwrap(SI))->getCommonSize();
anatofuz
parents:
diff changeset
327 }
anatofuz
parents:
diff changeset
328
anatofuz
parents:
diff changeset
329 // RelocationRef accessors
anatofuz
parents:
diff changeset
330 uint64_t LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI) {
anatofuz
parents:
diff changeset
331 return (*unwrap(RI))->getOffset();
anatofuz
parents:
diff changeset
332 }
anatofuz
parents:
diff changeset
333
anatofuz
parents:
diff changeset
334 LLVMSymbolIteratorRef LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI) {
anatofuz
parents:
diff changeset
335 symbol_iterator ret = (*unwrap(RI))->getSymbol();
anatofuz
parents:
diff changeset
336 return wrap(new symbol_iterator(ret));
anatofuz
parents:
diff changeset
337 }
anatofuz
parents:
diff changeset
338
anatofuz
parents:
diff changeset
339 uint64_t LLVMGetRelocationType(LLVMRelocationIteratorRef RI) {
anatofuz
parents:
diff changeset
340 return (*unwrap(RI))->getType();
anatofuz
parents:
diff changeset
341 }
anatofuz
parents:
diff changeset
342
anatofuz
parents:
diff changeset
343 // NOTE: Caller takes ownership of returned string.
anatofuz
parents:
diff changeset
344 const char *LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI) {
anatofuz
parents:
diff changeset
345 SmallVector<char, 0> ret;
anatofuz
parents:
diff changeset
346 (*unwrap(RI))->getTypeName(ret);
anatofuz
parents:
diff changeset
347 char *str = static_cast<char*>(safe_malloc(ret.size()));
anatofuz
parents:
diff changeset
348 llvm::copy(ret, str);
anatofuz
parents:
diff changeset
349 return str;
anatofuz
parents:
diff changeset
350 }
anatofuz
parents:
diff changeset
351
anatofuz
parents:
diff changeset
352 // NOTE: Caller takes ownership of returned string.
anatofuz
parents:
diff changeset
353 const char *LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI) {
anatofuz
parents:
diff changeset
354 return strdup("");
anatofuz
parents:
diff changeset
355 }
anatofuz
parents:
diff changeset
356