1c56d2e8fSEric Christopher //===- Object.cpp - C bindings to the object file library--------*- C++ -*-===//
2c56d2e8fSEric Christopher //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c56d2e8fSEric Christopher //
7c56d2e8fSEric Christopher //===----------------------------------------------------------------------===//
8c56d2e8fSEric Christopher //
9c56d2e8fSEric Christopher // This file defines the C bindings to the file-format-independent object
10c56d2e8fSEric Christopher // library.
11c56d2e8fSEric Christopher //
12c56d2e8fSEric Christopher //===----------------------------------------------------------------------===//
13c56d2e8fSEric Christopher
14c56d2e8fSEric Christopher #include "llvm-c/Object.h"
156bda14b3SChandler Carruth #include "llvm/ADT/SmallVector.h"
16c76b6215SRobert Widmann #include "llvm/IR/LLVMContext.h"
178a8cd2baSChandler Carruth #include "llvm/Object/ObjectFile.h"
18b0fd12b6SRobert Widmann #include "llvm/Object/MachOUniversal.h"
1975e164f6Sserge-sans-paille #include "llvm/Support/MemAlloc.h"
20c56d2e8fSEric Christopher
21c56d2e8fSEric Christopher using namespace llvm;
22c56d2e8fSEric Christopher using namespace object;
23c56d2e8fSEric Christopher
unwrap(LLVMObjectFileRef OF)2448af1c2aSRafael Espindola inline OwningBinary<ObjectFile> *unwrap(LLVMObjectFileRef OF) {
2548af1c2aSRafael Espindola return reinterpret_cast<OwningBinary<ObjectFile> *>(OF);
2604d4e931SEric Christopher }
2704d4e931SEric Christopher
wrap(const OwningBinary<ObjectFile> * OF)2848af1c2aSRafael Espindola inline LLVMObjectFileRef wrap(const OwningBinary<ObjectFile> *OF) {
2948af1c2aSRafael Espindola return reinterpret_cast<LLVMObjectFileRef>(
3048af1c2aSRafael Espindola const_cast<OwningBinary<ObjectFile> *>(OF));
3104d4e931SEric Christopher }
3204d4e931SEric Christopher
unwrap(LLVMSectionIteratorRef SI)3304d4e931SEric Christopher inline section_iterator *unwrap(LLVMSectionIteratorRef SI) {
3404d4e931SEric Christopher return reinterpret_cast<section_iterator*>(SI);
3504d4e931SEric Christopher }
3604d4e931SEric Christopher
3704d4e931SEric Christopher inline LLVMSectionIteratorRef
wrap(const section_iterator * SI)3804d4e931SEric Christopher wrap(const section_iterator *SI) {
3904d4e931SEric Christopher return reinterpret_cast<LLVMSectionIteratorRef>
4004d4e931SEric Christopher (const_cast<section_iterator*>(SI));
4104d4e931SEric Christopher }
4204d4e931SEric Christopher
unwrap(LLVMSymbolIteratorRef SI)4304d4e931SEric Christopher inline symbol_iterator *unwrap(LLVMSymbolIteratorRef SI) {
4404d4e931SEric Christopher return reinterpret_cast<symbol_iterator*>(SI);
4504d4e931SEric Christopher }
4604d4e931SEric Christopher
4704d4e931SEric Christopher inline LLVMSymbolIteratorRef
wrap(const symbol_iterator * SI)4804d4e931SEric Christopher wrap(const symbol_iterator *SI) {
4904d4e931SEric Christopher return reinterpret_cast<LLVMSymbolIteratorRef>
5004d4e931SEric Christopher (const_cast<symbol_iterator*>(SI));
5104d4e931SEric Christopher }
5204d4e931SEric Christopher
unwrap(LLVMRelocationIteratorRef SI)5304d4e931SEric Christopher inline relocation_iterator *unwrap(LLVMRelocationIteratorRef SI) {
5404d4e931SEric Christopher return reinterpret_cast<relocation_iterator*>(SI);
5504d4e931SEric Christopher }
5604d4e931SEric Christopher
5704d4e931SEric Christopher inline LLVMRelocationIteratorRef
wrap(const relocation_iterator * SI)5804d4e931SEric Christopher wrap(const relocation_iterator *SI) {
5904d4e931SEric Christopher return reinterpret_cast<LLVMRelocationIteratorRef>
6004d4e931SEric Christopher (const_cast<relocation_iterator*>(SI));
6104d4e931SEric Christopher }
6204d4e931SEric Christopher
63c76b6215SRobert Widmann /*--.. Operations on binary files ..........................................--*/
64c76b6215SRobert Widmann
LLVMCreateBinary(LLVMMemoryBufferRef MemBuf,LLVMContextRef Context,char ** ErrorMessage)65c76b6215SRobert Widmann LLVMBinaryRef LLVMCreateBinary(LLVMMemoryBufferRef MemBuf,
66c76b6215SRobert Widmann LLVMContextRef Context,
67c76b6215SRobert Widmann char **ErrorMessage) {
68c76b6215SRobert Widmann auto maybeContext = Context ? unwrap(Context) : nullptr;
69c76b6215SRobert Widmann Expected<std::unique_ptr<Binary>> ObjOrErr(
70c76b6215SRobert Widmann createBinary(unwrap(MemBuf)->getMemBufferRef(), maybeContext));
71c76b6215SRobert Widmann if (!ObjOrErr) {
72c76b6215SRobert Widmann *ErrorMessage = strdup(toString(ObjOrErr.takeError()).c_str());
73c76b6215SRobert Widmann return nullptr;
74c76b6215SRobert Widmann }
75c76b6215SRobert Widmann
76c76b6215SRobert Widmann return wrap(ObjOrErr.get().release());
77c76b6215SRobert Widmann }
78c76b6215SRobert Widmann
LLVMBinaryCopyMemoryBuffer(LLVMBinaryRef BR)79c76b6215SRobert Widmann LLVMMemoryBufferRef LLVMBinaryCopyMemoryBuffer(LLVMBinaryRef BR) {
80c76b6215SRobert Widmann auto Buf = unwrap(BR)->getMemoryBufferRef();
81c76b6215SRobert Widmann return wrap(llvm::MemoryBuffer::getMemBuffer(
82c76b6215SRobert Widmann Buf.getBuffer(), Buf.getBufferIdentifier(),
83c76b6215SRobert Widmann /*RequiresNullTerminator*/false).release());
84c76b6215SRobert Widmann }
85c76b6215SRobert Widmann
LLVMDisposeBinary(LLVMBinaryRef BR)86c76b6215SRobert Widmann void LLVMDisposeBinary(LLVMBinaryRef BR) {
87c76b6215SRobert Widmann delete unwrap(BR);
88c76b6215SRobert Widmann }
89c76b6215SRobert Widmann
LLVMBinaryGetType(LLVMBinaryRef BR)90a51883cfSRobert Widmann LLVMBinaryType LLVMBinaryGetType(LLVMBinaryRef BR) {
91a51883cfSRobert Widmann class BinaryTypeMapper final : public Binary {
92a51883cfSRobert Widmann public:
93a51883cfSRobert Widmann static LLVMBinaryType mapBinaryTypeToLLVMBinaryType(unsigned Kind) {
94a51883cfSRobert Widmann switch (Kind) {
95a51883cfSRobert Widmann case ID_Archive:
96a51883cfSRobert Widmann return LLVMBinaryTypeArchive;
97a51883cfSRobert Widmann case ID_MachOUniversalBinary:
98a51883cfSRobert Widmann return LLVMBinaryTypeMachOUniversalBinary;
99a51883cfSRobert Widmann case ID_COFFImportFile:
100a51883cfSRobert Widmann return LLVMBinaryTypeCOFFImportFile;
101a51883cfSRobert Widmann case ID_IR:
102a51883cfSRobert Widmann return LLVMBinaryTypeIR;
103a51883cfSRobert Widmann case ID_WinRes:
104a51883cfSRobert Widmann return LLVMBinaryTypeWinRes;
105a51883cfSRobert Widmann case ID_COFF:
106a51883cfSRobert Widmann return LLVMBinaryTypeCOFF;
107a51883cfSRobert Widmann case ID_ELF32L:
108a51883cfSRobert Widmann return LLVMBinaryTypeELF32L;
109a51883cfSRobert Widmann case ID_ELF32B:
110a51883cfSRobert Widmann return LLVMBinaryTypeELF32B;
111a51883cfSRobert Widmann case ID_ELF64L:
112a51883cfSRobert Widmann return LLVMBinaryTypeELF64L;
113a51883cfSRobert Widmann case ID_ELF64B:
114a51883cfSRobert Widmann return LLVMBinaryTypeELF64B;
115a51883cfSRobert Widmann case ID_MachO32L:
116a51883cfSRobert Widmann return LLVMBinaryTypeMachO32L;
117a51883cfSRobert Widmann case ID_MachO32B:
118a51883cfSRobert Widmann return LLVMBinaryTypeMachO32B;
119a51883cfSRobert Widmann case ID_MachO64L:
120a51883cfSRobert Widmann return LLVMBinaryTypeMachO64L;
121a51883cfSRobert Widmann case ID_MachO64B:
122a51883cfSRobert Widmann return LLVMBinaryTypeMachO64B;
123*afd2f7e9SJoseph Huber case ID_Offload:
124*afd2f7e9SJoseph Huber return LLVMBinaryTypeOffload;
125a51883cfSRobert Widmann case ID_Wasm:
126a51883cfSRobert Widmann return LLVMBinaryTypeWasm;
127a51883cfSRobert Widmann case ID_StartObjects:
128a51883cfSRobert Widmann case ID_EndObjects:
129a51883cfSRobert Widmann llvm_unreachable("Marker types are not valid binary kinds!");
130a51883cfSRobert Widmann default:
131a51883cfSRobert Widmann llvm_unreachable("Unknown binary kind!");
132a51883cfSRobert Widmann }
133a51883cfSRobert Widmann }
134a51883cfSRobert Widmann };
135a51883cfSRobert Widmann return BinaryTypeMapper::mapBinaryTypeToLLVMBinaryType(unwrap(BR)->getType());
136a51883cfSRobert Widmann }
137a51883cfSRobert Widmann
LLVMMachOUniversalBinaryCopyObjectForArch(LLVMBinaryRef BR,const char * Arch,size_t ArchLen,char ** ErrorMessage)138b0fd12b6SRobert Widmann LLVMBinaryRef LLVMMachOUniversalBinaryCopyObjectForArch(LLVMBinaryRef BR,
139b0fd12b6SRobert Widmann const char *Arch,
140b0fd12b6SRobert Widmann size_t ArchLen,
141b0fd12b6SRobert Widmann char **ErrorMessage) {
142b0fd12b6SRobert Widmann auto universal = cast<MachOUniversalBinary>(unwrap(BR));
143b0fd12b6SRobert Widmann Expected<std::unique_ptr<ObjectFile>> ObjOrErr(
1444fd11c1eSAlexander Shaposhnikov universal->getMachOObjectForArch({Arch, ArchLen}));
145b0fd12b6SRobert Widmann if (!ObjOrErr) {
146b0fd12b6SRobert Widmann *ErrorMessage = strdup(toString(ObjOrErr.takeError()).c_str());
147b0fd12b6SRobert Widmann return nullptr;
148b0fd12b6SRobert Widmann }
149b0fd12b6SRobert Widmann return wrap(ObjOrErr.get().release());
150b0fd12b6SRobert Widmann }
151b0fd12b6SRobert Widmann
LLVMObjectFileCopySectionIterator(LLVMBinaryRef BR)152d1ba3b13SRobert Widmann LLVMSectionIteratorRef LLVMObjectFileCopySectionIterator(LLVMBinaryRef BR) {
153d1ba3b13SRobert Widmann auto OF = cast<ObjectFile>(unwrap(BR));
154d1ba3b13SRobert Widmann auto sections = OF->sections();
155d1ba3b13SRobert Widmann if (sections.begin() == sections.end())
156d1ba3b13SRobert Widmann return nullptr;
157d1ba3b13SRobert Widmann return wrap(new section_iterator(sections.begin()));
158d1ba3b13SRobert Widmann }
159d1ba3b13SRobert Widmann
LLVMObjectFileIsSectionIteratorAtEnd(LLVMBinaryRef BR,LLVMSectionIteratorRef SI)160d1ba3b13SRobert Widmann LLVMBool LLVMObjectFileIsSectionIteratorAtEnd(LLVMBinaryRef BR,
161d1ba3b13SRobert Widmann LLVMSectionIteratorRef SI) {
162d1ba3b13SRobert Widmann auto OF = cast<ObjectFile>(unwrap(BR));
163d1ba3b13SRobert Widmann return (*unwrap(SI) == OF->section_end()) ? 1 : 0;
164d1ba3b13SRobert Widmann }
165d1ba3b13SRobert Widmann
LLVMObjectFileCopySymbolIterator(LLVMBinaryRef BR)166d1ba3b13SRobert Widmann LLVMSymbolIteratorRef LLVMObjectFileCopySymbolIterator(LLVMBinaryRef BR) {
167d1ba3b13SRobert Widmann auto OF = cast<ObjectFile>(unwrap(BR));
168d1ba3b13SRobert Widmann auto symbols = OF->symbols();
169d1ba3b13SRobert Widmann if (symbols.begin() == symbols.end())
170d1ba3b13SRobert Widmann return nullptr;
171d1ba3b13SRobert Widmann return wrap(new symbol_iterator(symbols.begin()));
172d1ba3b13SRobert Widmann }
173d1ba3b13SRobert Widmann
LLVMObjectFileIsSymbolIteratorAtEnd(LLVMBinaryRef BR,LLVMSymbolIteratorRef SI)174d1ba3b13SRobert Widmann LLVMBool LLVMObjectFileIsSymbolIteratorAtEnd(LLVMBinaryRef BR,
175d1ba3b13SRobert Widmann LLVMSymbolIteratorRef SI) {
176d1ba3b13SRobert Widmann auto OF = cast<ObjectFile>(unwrap(BR));
177d1ba3b13SRobert Widmann return (*unwrap(SI) == OF->symbol_end()) ? 1 : 0;
178d1ba3b13SRobert Widmann }
179d1ba3b13SRobert Widmann
180f239db40SOwen Anderson // ObjectFile creation
LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf)181c56d2e8fSEric Christopher LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
1826304e941SRafael Espindola std::unique_ptr<MemoryBuffer> Buf(unwrap(MemBuf));
1833fcdf6aeSKevin Enderby Expected<std::unique_ptr<ObjectFile>> ObjOrErr(
18448af1c2aSRafael Espindola ObjectFile::createObjectFile(Buf->getMemBufferRef()));
18548af1c2aSRafael Espindola std::unique_ptr<ObjectFile> Obj;
1863fcdf6aeSKevin Enderby if (!ObjOrErr) {
1873fcdf6aeSKevin Enderby // TODO: Actually report errors helpfully.
1883fcdf6aeSKevin Enderby consumeError(ObjOrErr.takeError());
1895a121b2eSBjorn Steinbrink return nullptr;
1903fcdf6aeSKevin Enderby }
1915a121b2eSBjorn Steinbrink
1925a121b2eSBjorn Steinbrink auto *Ret = new OwningBinary<ObjectFile>(std::move(ObjOrErr.get()), std::move(Buf));
19348af1c2aSRafael Espindola return wrap(Ret);
194c56d2e8fSEric Christopher }
195c56d2e8fSEric Christopher
LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile)196c56d2e8fSEric Christopher void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) {
197c56d2e8fSEric Christopher delete unwrap(ObjectFile);
198c56d2e8fSEric Christopher }
199c56d2e8fSEric Christopher
200f239db40SOwen Anderson // ObjectFile Section iterators
LLVMGetSections(LLVMObjectFileRef OF)20148af1c2aSRafael Espindola LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef OF) {
20248af1c2aSRafael Espindola OwningBinary<ObjectFile> *OB = unwrap(OF);
20348af1c2aSRafael Espindola section_iterator SI = OB->getBinary()->section_begin();
204e5fd0047SMichael J. Spencer return wrap(new section_iterator(SI));
205c56d2e8fSEric Christopher }
206c56d2e8fSEric Christopher
LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI)207c56d2e8fSEric Christopher void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI) {
208c56d2e8fSEric Christopher delete unwrap(SI);
209c56d2e8fSEric Christopher }
210c56d2e8fSEric Christopher
LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef OF,LLVMSectionIteratorRef SI)21148af1c2aSRafael Espindola LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef OF,
212c56d2e8fSEric Christopher LLVMSectionIteratorRef SI) {
21348af1c2aSRafael Espindola OwningBinary<ObjectFile> *OB = unwrap(OF);
21448af1c2aSRafael Espindola return (*unwrap(SI) == OB->getBinary()->section_end()) ? 1 : 0;
215c56d2e8fSEric Christopher }
216c56d2e8fSEric Christopher
LLVMMoveToNextSection(LLVMSectionIteratorRef SI)217c56d2e8fSEric Christopher void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) {
2185e812afaSRafael Espindola ++(*unwrap(SI));
219c56d2e8fSEric Christopher }
220c56d2e8fSEric Christopher
LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect,LLVMSymbolIteratorRef Sym)22107bfdbb2SOwen Anderson void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect,
22207bfdbb2SOwen Anderson LLVMSymbolIteratorRef Sym) {
2237bd8d994SKevin Enderby Expected<section_iterator> SecOrErr = (*unwrap(Sym))->getSection();
2247bd8d994SKevin Enderby if (!SecOrErr) {
2257bd8d994SKevin Enderby std::string Buf;
2267bd8d994SKevin Enderby raw_string_ostream OS(Buf);
22745eb84f3SJonas Devlieghere logAllUnhandledErrors(SecOrErr.takeError(), OS);
2282e5daac2SSimon Pilgrim report_fatal_error(Twine(OS.str()));
2297bd8d994SKevin Enderby }
2308bab889bSRafael Espindola *unwrap(Sect) = *SecOrErr;
23107bfdbb2SOwen Anderson }
23207bfdbb2SOwen Anderson
233f239db40SOwen Anderson // ObjectFile Symbol iterators
LLVMGetSymbols(LLVMObjectFileRef OF)23448af1c2aSRafael Espindola LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef OF) {
23548af1c2aSRafael Espindola OwningBinary<ObjectFile> *OB = unwrap(OF);
23648af1c2aSRafael Espindola symbol_iterator SI = OB->getBinary()->symbol_begin();
237f239db40SOwen Anderson return wrap(new symbol_iterator(SI));
238f239db40SOwen Anderson }
239f239db40SOwen Anderson
LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI)240f239db40SOwen Anderson void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) {
241f239db40SOwen Anderson delete unwrap(SI);
242f239db40SOwen Anderson }
243f239db40SOwen Anderson
LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef OF,LLVMSymbolIteratorRef SI)24448af1c2aSRafael Espindola LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef OF,
245f239db40SOwen Anderson LLVMSymbolIteratorRef SI) {
24648af1c2aSRafael Espindola OwningBinary<ObjectFile> *OB = unwrap(OF);
24748af1c2aSRafael Espindola return (*unwrap(SI) == OB->getBinary()->symbol_end()) ? 1 : 0;
248f239db40SOwen Anderson }
249f239db40SOwen Anderson
LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI)250f239db40SOwen Anderson void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) {
2515e812afaSRafael Espindola ++(*unwrap(SI));
252f239db40SOwen Anderson }
253f239db40SOwen Anderson
254f239db40SOwen Anderson // SectionRef accessors
LLVMGetSectionName(LLVMSectionIteratorRef SI)255c56d2e8fSEric Christopher const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) {
256bcc00e1aSGeorge Rimar auto NameOrErr = (*unwrap(SI))->getName();
257bcc00e1aSGeorge Rimar if (!NameOrErr)
258bcc00e1aSGeorge Rimar report_fatal_error(NameOrErr.takeError());
259bcc00e1aSGeorge Rimar return NameOrErr->data();
260c56d2e8fSEric Christopher }
261c56d2e8fSEric Christopher
LLVMGetSectionSize(LLVMSectionIteratorRef SI)262c56d2e8fSEric Christopher uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) {
26380291274SRafael Espindola return (*unwrap(SI))->getSize();
264c56d2e8fSEric Christopher }
265c56d2e8fSEric Christopher
LLVMGetSectionContents(LLVMSectionIteratorRef SI)266c56d2e8fSEric Christopher const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) {
267e183340cSFangrui Song if (Expected<StringRef> E = (*unwrap(SI))->getContents())
268e183340cSFangrui Song return E->data();
269e183340cSFangrui Song else
270e183340cSFangrui Song report_fatal_error(E.takeError());
271c56d2e8fSEric Christopher }
272f239db40SOwen Anderson
LLVMGetSectionAddress(LLVMSectionIteratorRef SI)273f239db40SOwen Anderson uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) {
27480291274SRafael Espindola return (*unwrap(SI))->getAddress();
275f239db40SOwen Anderson }
276f239db40SOwen Anderson
LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI,LLVMSymbolIteratorRef Sym)277500ebeb8SOwen Anderson LLVMBool LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI,
278f239db40SOwen Anderson LLVMSymbolIteratorRef Sym) {
27980291274SRafael Espindola return (*unwrap(SI))->containsSymbol(**unwrap(Sym));
280f239db40SOwen Anderson }
281f239db40SOwen Anderson
282e245af65SOwen Anderson // Section Relocation iterators
LLVMGetRelocations(LLVMSectionIteratorRef Section)283e245af65SOwen Anderson LLVMRelocationIteratorRef LLVMGetRelocations(LLVMSectionIteratorRef Section) {
284b5155a57SRafael Espindola relocation_iterator SI = (*unwrap(Section))->relocation_begin();
285e245af65SOwen Anderson return wrap(new relocation_iterator(SI));
286e245af65SOwen Anderson }
287e245af65SOwen Anderson
LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef SI)288e245af65SOwen Anderson void LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef SI) {
289e245af65SOwen Anderson delete unwrap(SI);
290e245af65SOwen Anderson }
291e245af65SOwen Anderson
LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section,LLVMRelocationIteratorRef SI)292e245af65SOwen Anderson LLVMBool LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section,
293e245af65SOwen Anderson LLVMRelocationIteratorRef SI) {
294b5155a57SRafael Espindola return (*unwrap(SI) == (*unwrap(Section))->relocation_end()) ? 1 : 0;
295e245af65SOwen Anderson }
296e245af65SOwen Anderson
LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI)297e245af65SOwen Anderson void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI) {
2985e812afaSRafael Espindola ++(*unwrap(SI));
299e245af65SOwen Anderson }
300e245af65SOwen Anderson
301e245af65SOwen Anderson
302f239db40SOwen Anderson // SymbolRef accessors
LLVMGetSymbolName(LLVMSymbolIteratorRef SI)303f239db40SOwen Anderson const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) {
30481e8b7d9SKevin Enderby Expected<StringRef> Ret = (*unwrap(SI))->getName();
30581e8b7d9SKevin Enderby if (!Ret) {
30681e8b7d9SKevin Enderby std::string Buf;
30781e8b7d9SKevin Enderby raw_string_ostream OS(Buf);
30845eb84f3SJonas Devlieghere logAllUnhandledErrors(Ret.takeError(), OS);
3092e5daac2SSimon Pilgrim report_fatal_error(Twine(OS.str()));
31081e8b7d9SKevin Enderby }
3115d0c2ffaSRafael Espindola return Ret->data();
312f239db40SOwen Anderson }
313f239db40SOwen Anderson
LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI)314f239db40SOwen Anderson uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) {
315931cb65dSKevin Enderby Expected<uint64_t> Ret = (*unwrap(SI))->getAddress();
316931cb65dSKevin Enderby if (!Ret) {
317931cb65dSKevin Enderby std::string Buf;
318931cb65dSKevin Enderby raw_string_ostream OS(Buf);
31945eb84f3SJonas Devlieghere logAllUnhandledErrors(Ret.takeError(), OS);
3202e5daac2SSimon Pilgrim report_fatal_error(Twine(OS.str()));
321931cb65dSKevin Enderby }
322ed067c45SRafael Espindola return *Ret;
323f239db40SOwen Anderson }
324f239db40SOwen Anderson
LLVMGetSymbolSize(LLVMSymbolIteratorRef SI)325f239db40SOwen Anderson uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) {
326d7a32ea4SRafael Espindola return (*unwrap(SI))->getCommonSize();
327f239db40SOwen Anderson }
328f239db40SOwen Anderson
329f7a89d06SOwen Anderson // RelocationRef accessors
LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI)330cbe72fc9SDanil Malyshev uint64_t LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI) {
33196d071cdSRafael Espindola return (*unwrap(RI))->getOffset();
332cbe72fc9SDanil Malyshev }
333cbe72fc9SDanil Malyshev
LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI)334f7a89d06SOwen Anderson LLVMSymbolIteratorRef LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI) {
335806f0064SRafael Espindola symbol_iterator ret = (*unwrap(RI))->getSymbol();
336f7a89d06SOwen Anderson return wrap(new symbol_iterator(ret));
337f7a89d06SOwen Anderson }
338f7a89d06SOwen Anderson
LLVMGetRelocationType(LLVMRelocationIteratorRef RI)339f7a89d06SOwen Anderson uint64_t LLVMGetRelocationType(LLVMRelocationIteratorRef RI) {
34099c041b7SRafael Espindola return (*unwrap(RI))->getType();
341f7a89d06SOwen Anderson }
342f7a89d06SOwen Anderson
343f7a89d06SOwen Anderson // NOTE: Caller takes ownership of returned string.
LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI)344f7a89d06SOwen Anderson const char *LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI) {
345f7a89d06SOwen Anderson SmallVector<char, 0> ret;
34641bb4325SRafael Espindola (*unwrap(RI))->getTypeName(ret);
34776d8cceeSSerge Pavlov char *str = static_cast<char*>(safe_malloc(ret.size()));
34875709329SFangrui Song llvm::copy(ret, str);
349f7a89d06SOwen Anderson return str;
350f7a89d06SOwen Anderson }
351f7a89d06SOwen Anderson
352f7a89d06SOwen Anderson // NOTE: Caller takes ownership of returned string.
LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI)353f7a89d06SOwen Anderson const char *LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI) {
35437070a5aSRafael Espindola return strdup("");
355f7a89d06SOwen Anderson }
356f7a89d06SOwen Anderson
357