blob: 4d3478bc14f097baf5688b8805244b44cc029d57 [file] [log] [blame]
Eric Christopher9f08a3b2011-04-03 22:34:07 +00001//===- 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
Filip Pizlodec20e42013-05-01 20:59:00 +000015#include "llvm/ADT/SmallVector.h"
Eric Christopher9f08a3b2011-04-03 22:34:07 +000016#include "llvm-c/Object.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000017#include "llvm/Object/ObjectFile.h"
Eric Christopher9f08a3b2011-04-03 22:34:07 +000018
19using namespace llvm;
20using namespace object;
21
Rafael Espindola48af1c22014-08-19 18:44:46 +000022inline OwningBinary<ObjectFile> *unwrap(LLVMObjectFileRef OF) {
23 return reinterpret_cast<OwningBinary<ObjectFile> *>(OF);
Eric Christopher04d4e932013-04-22 22:47:22 +000024}
25
Rafael Espindola48af1c22014-08-19 18:44:46 +000026inline LLVMObjectFileRef wrap(const OwningBinary<ObjectFile> *OF) {
27 return reinterpret_cast<LLVMObjectFileRef>(
28 const_cast<OwningBinary<ObjectFile> *>(OF));
Eric Christopher04d4e932013-04-22 22:47:22 +000029}
30
31inline section_iterator *unwrap(LLVMSectionIteratorRef SI) {
32 return reinterpret_cast<section_iterator*>(SI);
33}
34
35inline LLVMSectionIteratorRef
36wrap(const section_iterator *SI) {
37 return reinterpret_cast<LLVMSectionIteratorRef>
38 (const_cast<section_iterator*>(SI));
39}
40
41inline symbol_iterator *unwrap(LLVMSymbolIteratorRef SI) {
42 return reinterpret_cast<symbol_iterator*>(SI);
43}
44
45inline LLVMSymbolIteratorRef
46wrap(const symbol_iterator *SI) {
47 return reinterpret_cast<LLVMSymbolIteratorRef>
48 (const_cast<symbol_iterator*>(SI));
49}
50
51inline relocation_iterator *unwrap(LLVMRelocationIteratorRef SI) {
52 return reinterpret_cast<relocation_iterator*>(SI);
53}
54
55inline LLVMRelocationIteratorRef
56wrap(const relocation_iterator *SI) {
57 return reinterpret_cast<LLVMRelocationIteratorRef>
58 (const_cast<relocation_iterator*>(SI));
59}
60
Owen Andersonf239db42011-10-21 17:50:59 +000061// ObjectFile creation
Eric Christopher9f08a3b2011-04-03 22:34:07 +000062LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
Rafael Espindola6304e942014-06-23 22:00:37 +000063 std::unique_ptr<MemoryBuffer> Buf(unwrap(MemBuf));
Rafael Espindola437b0d52014-07-31 03:12:45 +000064 ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr(
Rafael Espindola48af1c22014-08-19 18:44:46 +000065 ObjectFile::createObjectFile(Buf->getMemBufferRef()));
66 std::unique_ptr<ObjectFile> Obj;
67 if (ObjOrErr)
68 Obj = std::move(ObjOrErr.get());
69 auto *Ret = new OwningBinary<ObjectFile>(std::move(Obj), std::move(Buf));
70 return wrap(Ret);
Eric Christopher9f08a3b2011-04-03 22:34:07 +000071}
72
73void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) {
74 delete unwrap(ObjectFile);
75}
76
Owen Andersonf239db42011-10-21 17:50:59 +000077// ObjectFile Section iterators
Rafael Espindola48af1c22014-08-19 18:44:46 +000078LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef OF) {
79 OwningBinary<ObjectFile> *OB = unwrap(OF);
80 section_iterator SI = OB->getBinary()->section_begin();
Michael J. Spencere5fd0042011-10-07 19:25:32 +000081 return wrap(new section_iterator(SI));
Eric Christopher9f08a3b2011-04-03 22:34:07 +000082}
83
84void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI) {
85 delete unwrap(SI);
86}
87
Rafael Espindola48af1c22014-08-19 18:44:46 +000088LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef OF,
89 LLVMSectionIteratorRef SI) {
90 OwningBinary<ObjectFile> *OB = unwrap(OF);
91 return (*unwrap(SI) == OB->getBinary()->section_end()) ? 1 : 0;
Eric Christopher9f08a3b2011-04-03 22:34:07 +000092}
93
94void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) {
Rafael Espindola5e812af2014-01-30 02:49:50 +000095 ++(*unwrap(SI));
Eric Christopher9f08a3b2011-04-03 22:34:07 +000096}
97
Owen Anderson07bfdbb2011-10-21 18:21:22 +000098void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect,
99 LLVMSymbolIteratorRef Sym) {
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000100 if (std::error_code ec = (*unwrap(Sym))->getSection(*unwrap(Sect)))
Owen Anderson07bfdbb2011-10-21 18:21:22 +0000101 report_fatal_error(ec.message());
102}
103
Owen Andersonf239db42011-10-21 17:50:59 +0000104// ObjectFile Symbol iterators
Rafael Espindola48af1c22014-08-19 18:44:46 +0000105LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef OF) {
106 OwningBinary<ObjectFile> *OB = unwrap(OF);
107 symbol_iterator SI = OB->getBinary()->symbol_begin();
Owen Andersonf239db42011-10-21 17:50:59 +0000108 return wrap(new symbol_iterator(SI));
109}
110
111void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) {
112 delete unwrap(SI);
113}
114
Rafael Espindola48af1c22014-08-19 18:44:46 +0000115LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef OF,
116 LLVMSymbolIteratorRef SI) {
117 OwningBinary<ObjectFile> *OB = unwrap(OF);
118 return (*unwrap(SI) == OB->getBinary()->symbol_end()) ? 1 : 0;
Owen Andersonf239db42011-10-21 17:50:59 +0000119}
120
121void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) {
Rafael Espindola5e812af2014-01-30 02:49:50 +0000122 ++(*unwrap(SI));
Owen Andersonf239db42011-10-21 17:50:59 +0000123}
124
125// SectionRef accessors
Eric Christopher9f08a3b2011-04-03 22:34:07 +0000126const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) {
Michael J. Spencer1d6167f2011-06-25 17:55:23 +0000127 StringRef ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000128 if (std::error_code ec = (*unwrap(SI))->getName(ret))
Michael J. Spencer1d6167f2011-06-25 17:55:23 +0000129 report_fatal_error(ec.message());
130 return ret.data();
Eric Christopher9f08a3b2011-04-03 22:34:07 +0000131}
132
133uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) {
Michael J. Spencer1d6167f2011-06-25 17:55:23 +0000134 uint64_t ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000135 if (std::error_code ec = (*unwrap(SI))->getSize(ret))
Michael J. Spencer1d6167f2011-06-25 17:55:23 +0000136 report_fatal_error(ec.message());
137 return ret;
Eric Christopher9f08a3b2011-04-03 22:34:07 +0000138}
139
140const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) {
Michael J. Spencer1d6167f2011-06-25 17:55:23 +0000141 StringRef ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000142 if (std::error_code ec = (*unwrap(SI))->getContents(ret))
Michael J. Spencer1d6167f2011-06-25 17:55:23 +0000143 report_fatal_error(ec.message());
144 return ret.data();
Eric Christopher9f08a3b2011-04-03 22:34:07 +0000145}
Owen Andersonf239db42011-10-21 17:50:59 +0000146
147uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) {
148 uint64_t ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000149 if (std::error_code ec = (*unwrap(SI))->getAddress(ret))
Owen Andersonf239db42011-10-21 17:50:59 +0000150 report_fatal_error(ec.message());
151 return ret;
152}
153
Owen Anderson500ebeb2011-10-21 20:35:58 +0000154LLVMBool LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI,
Owen Andersonf239db42011-10-21 17:50:59 +0000155 LLVMSymbolIteratorRef Sym) {
156 bool ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000157 if (std::error_code ec = (*unwrap(SI))->containsSymbol(**unwrap(Sym), ret))
Owen Andersonf239db42011-10-21 17:50:59 +0000158 report_fatal_error(ec.message());
159 return ret;
160}
161
Owen Andersone245af62011-10-27 17:15:47 +0000162// Section Relocation iterators
163LLVMRelocationIteratorRef LLVMGetRelocations(LLVMSectionIteratorRef Section) {
Rafael Espindolab5155a52014-02-10 20:24:04 +0000164 relocation_iterator SI = (*unwrap(Section))->relocation_begin();
Owen Andersone245af62011-10-27 17:15:47 +0000165 return wrap(new relocation_iterator(SI));
166}
167
168void LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef SI) {
169 delete unwrap(SI);
170}
171
172LLVMBool LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section,
173 LLVMRelocationIteratorRef SI) {
Rafael Espindolab5155a52014-02-10 20:24:04 +0000174 return (*unwrap(SI) == (*unwrap(Section))->relocation_end()) ? 1 : 0;
Owen Andersone245af62011-10-27 17:15:47 +0000175}
176
177void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI) {
Rafael Espindola5e812af2014-01-30 02:49:50 +0000178 ++(*unwrap(SI));
Owen Andersone245af62011-10-27 17:15:47 +0000179}
180
181
Owen Andersonf239db42011-10-21 17:50:59 +0000182// SymbolRef accessors
183const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) {
184 StringRef ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000185 if (std::error_code ec = (*unwrap(SI))->getName(ret))
Owen Andersonf239db42011-10-21 17:50:59 +0000186 report_fatal_error(ec.message());
187 return ret.data();
188}
189
190uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) {
191 uint64_t ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000192 if (std::error_code ec = (*unwrap(SI))->getAddress(ret))
Owen Andersonf239db42011-10-21 17:50:59 +0000193 report_fatal_error(ec.message());
194 return ret;
195}
196
Owen Andersonf239db42011-10-21 17:50:59 +0000197uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) {
198 uint64_t ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000199 if (std::error_code ec = (*unwrap(SI))->getSize(ret))
Owen Andersonf239db42011-10-21 17:50:59 +0000200 report_fatal_error(ec.message());
201 return ret;
202}
203
Owen Andersonf7a89d02011-10-27 17:32:36 +0000204// RelocationRef accessors
205uint64_t LLVMGetRelocationAddress(LLVMRelocationIteratorRef RI) {
206 uint64_t ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000207 if (std::error_code ec = (*unwrap(RI))->getAddress(ret))
Owen Andersonf7a89d02011-10-27 17:32:36 +0000208 report_fatal_error(ec.message());
209 return ret;
210}
211
Danil Malyshevcbe72fc2011-11-29 17:40:10 +0000212uint64_t LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI) {
213 uint64_t ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000214 if (std::error_code ec = (*unwrap(RI))->getOffset(ret))
Danil Malyshevcbe72fc2011-11-29 17:40:10 +0000215 report_fatal_error(ec.message());
216 return ret;
217}
218
Owen Andersonf7a89d02011-10-27 17:32:36 +0000219LLVMSymbolIteratorRef LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI) {
Rafael Espindola806f0062013-06-05 01:33:53 +0000220 symbol_iterator ret = (*unwrap(RI))->getSymbol();
Owen Andersonf7a89d02011-10-27 17:32:36 +0000221 return wrap(new symbol_iterator(ret));
222}
223
224uint64_t LLVMGetRelocationType(LLVMRelocationIteratorRef RI) {
225 uint64_t ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000226 if (std::error_code ec = (*unwrap(RI))->getType(ret))
Owen Andersonf7a89d02011-10-27 17:32:36 +0000227 report_fatal_error(ec.message());
228 return ret;
229}
230
231// NOTE: Caller takes ownership of returned string.
232const char *LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI) {
233 SmallVector<char, 0> ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000234 if (std::error_code ec = (*unwrap(RI))->getTypeName(ret))
Owen Andersonf7a89d02011-10-27 17:32:36 +0000235 report_fatal_error(ec.message());
236
237 char *str = static_cast<char*>(malloc(ret.size()));
238 std::copy(ret.begin(), ret.end(), str);
239 return str;
240}
241
242// NOTE: Caller takes ownership of returned string.
243const char *LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI) {
244 SmallVector<char, 0> ret;
Rafael Espindoladb4ed0b2014-06-13 02:24:39 +0000245 if (std::error_code ec = (*unwrap(RI))->getValueString(ret))
Owen Andersonf7a89d02011-10-27 17:32:36 +0000246 report_fatal_error(ec.message());
247
248 char *str = static_cast<char*>(malloc(ret.size()));
249 std::copy(ret.begin(), ret.end(), str);
250 return str;
251}
252