LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Object.cpp
Go to the documentation of this file.
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/ADT/SmallVector.h"
16 #include "llvm/Object/ObjectFile.h"
17 #include "llvm-c/Object.h"
18 
19 using namespace llvm;
20 using namespace object;
21 
23  return reinterpret_cast<ObjectFile*>(OF);
24 }
25 
26 inline LLVMObjectFileRef wrap(const ObjectFile *OF) {
27  return reinterpret_cast<LLVMObjectFileRef>(const_cast<ObjectFile*>(OF));
28 }
29 
31  return reinterpret_cast<section_iterator*>(SI);
32 }
33 
35 wrap(const section_iterator *SI) {
36  return reinterpret_cast<LLVMSectionIteratorRef>
37  (const_cast<section_iterator*>(SI));
38 }
39 
41  return reinterpret_cast<symbol_iterator*>(SI);
42 }
43 
45 wrap(const symbol_iterator *SI) {
46  return reinterpret_cast<LLVMSymbolIteratorRef>
47  (const_cast<symbol_iterator*>(SI));
48 }
49 
51  return reinterpret_cast<relocation_iterator*>(SI);
52 }
53 
56  return reinterpret_cast<LLVMRelocationIteratorRef>
57  (const_cast<relocation_iterator*>(SI));
58 }
59 
60 // ObjectFile creation
62  return wrap(ObjectFile::createObjectFile(unwrap(MemBuf)));
63 }
64 
66  delete unwrap(ObjectFile);
67 }
68 
69 // ObjectFile Section iterators
71  section_iterator SI = unwrap(ObjectFile)->begin_sections();
72  return wrap(new section_iterator(SI));
73 }
74 
76  delete unwrap(SI);
77 }
78 
81  return (*unwrap(SI) == unwrap(ObjectFile)->end_sections()) ? 1 : 0;
82 }
83 
85  error_code ec;
86  unwrap(SI)->increment(ec);
87  if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message());
88 }
89 
92  if (error_code ec = (*unwrap(Sym))->getSection(*unwrap(Sect)))
93  report_fatal_error(ec.message());
94 }
95 
96 // ObjectFile Symbol iterators
98  symbol_iterator SI = unwrap(ObjectFile)->begin_symbols();
99  return wrap(new symbol_iterator(SI));
100 }
101 
103  delete unwrap(SI);
104 }
105 
108  return (*unwrap(SI) == unwrap(ObjectFile)->end_symbols()) ? 1 : 0;
109 }
110 
112  error_code ec;
113  unwrap(SI)->increment(ec);
114  if (ec) report_fatal_error("LLVMMoveToNextSymbol failed: " + ec.message());
115 }
116 
117 // SectionRef accessors
119  StringRef ret;
120  if (error_code ec = (*unwrap(SI))->getName(ret))
121  report_fatal_error(ec.message());
122  return ret.data();
123 }
124 
126  uint64_t ret;
127  if (error_code ec = (*unwrap(SI))->getSize(ret))
128  report_fatal_error(ec.message());
129  return ret;
130 }
131 
133  StringRef ret;
134  if (error_code ec = (*unwrap(SI))->getContents(ret))
135  report_fatal_error(ec.message());
136  return ret.data();
137 }
138 
140  uint64_t ret;
141  if (error_code ec = (*unwrap(SI))->getAddress(ret))
142  report_fatal_error(ec.message());
143  return ret;
144 }
145 
147  LLVMSymbolIteratorRef Sym) {
148  bool ret;
149  if (error_code ec = (*unwrap(SI))->containsSymbol(**unwrap(Sym), ret))
150  report_fatal_error(ec.message());
151  return ret;
152 }
153 
154 // Section Relocation iterators
156  relocation_iterator SI = (*unwrap(Section))->begin_relocations();
157  return wrap(new relocation_iterator(SI));
158 }
159 
161  delete unwrap(SI);
162 }
163 
166  return (*unwrap(SI) == (*unwrap(Section))->end_relocations()) ? 1 : 0;
167 }
168 
170  error_code ec;
171  unwrap(SI)->increment(ec);
172  if (ec) report_fatal_error("LLVMMoveToNextRelocation failed: " +
173  ec.message());
174 }
175 
176 
177 // SymbolRef accessors
179  StringRef ret;
180  if (error_code ec = (*unwrap(SI))->getName(ret))
181  report_fatal_error(ec.message());
182  return ret.data();
183 }
184 
186  uint64_t ret;
187  if (error_code ec = (*unwrap(SI))->getAddress(ret))
188  report_fatal_error(ec.message());
189  return ret;
190 }
191 
193  uint64_t ret;
194  if (error_code ec = (*unwrap(SI))->getFileOffset(ret))
195  report_fatal_error(ec.message());
196  return ret;
197 }
198 
200  uint64_t ret;
201  if (error_code ec = (*unwrap(SI))->getSize(ret))
202  report_fatal_error(ec.message());
203  return ret;
204 }
205 
206 // RelocationRef accessors
208  uint64_t ret;
209  if (error_code ec = (*unwrap(RI))->getAddress(ret))
210  report_fatal_error(ec.message());
211  return ret;
212 }
213 
215  uint64_t ret;
216  if (error_code ec = (*unwrap(RI))->getOffset(ret))
217  report_fatal_error(ec.message());
218  return ret;
219 }
220 
222  symbol_iterator ret = (*unwrap(RI))->getSymbol();
223  return wrap(new symbol_iterator(ret));
224 }
225 
227  uint64_t ret;
228  if (error_code ec = (*unwrap(RI))->getType(ret))
229  report_fatal_error(ec.message());
230  return ret;
231 }
232 
233 // NOTE: Caller takes ownership of returned string.
236  if (error_code ec = (*unwrap(RI))->getTypeName(ret))
237  report_fatal_error(ec.message());
238 
239  char *str = static_cast<char*>(malloc(ret.size()));
240  std::copy(ret.begin(), ret.end(), str);
241  return str;
242 }
243 
244 // NOTE: Caller takes ownership of returned string.
247  if (error_code ec = (*unwrap(RI))->getValueString(ret))
248  report_fatal_error(ec.message());
249 
250  char *str = static_cast<char*>(malloc(ret.size()));
251  std::copy(ret.begin(), ret.end(), str);
252  return str;
253 }
254 
uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI)
Definition: Object.cpp:139
LLVMBool LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI, LLVMSymbolIteratorRef Sym)
Definition: Object.cpp:146
int LLVMBool
Definition: Core.h:65
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf)
Definition: Object.cpp:61
LLVMContext ** unwrap(LLVMContextRef *Tys)
Definition: LLVMContext.h:119
FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > Tys=None)
Definition: Function.cpp:657
const char * LLVMGetSectionContents(LLVMSectionIteratorRef SI)
Definition: Object.cpp:132
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
LLVMBool LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section, LLVMRelocationIteratorRef SI)
Definition: Object.cpp:164
static ObjectFile * createObjectFile(StringRef ObjectPath)
Create ObjectFile from path.
Definition: ObjectFile.cpp:79
struct LLVMOpaqueMemoryBuffer * LLVMMemoryBufferRef
Definition: Core.h:122
void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI)
Definition: Object.cpp:102
void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect, LLVMSymbolIteratorRef Sym)
Definition: Object.cpp:90
struct LLVMOpaqueSectionIterator * LLVMSectionIteratorRef
Definition: Object.h:38
const char * data() const
Definition: StringRef.h:107
void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI)
Definition: Object.cpp:75
void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI)
Definition: Object.cpp:169
content_iterator< SectionRef > section_iterator
Definition: ObjectFile.h:133
LLVMSymbolIteratorRef LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI)
Definition: Object.cpp:221
uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI)
Definition: Object.cpp:125
content_iterator< SymbolRef > symbol_iterator
Definition: ObjectFile.h:87
struct LLVMOpaqueSymbolIterator * LLVMSymbolIteratorRef
Definition: Object.h:39
struct LLVMOpaqueObjectFile * LLVMObjectFileRef
Definition: Object.h:37
LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile, LLVMSectionIteratorRef SI)
Definition: Object.cpp:79
content_iterator< RelocationRef > relocation_iterator
Definition: ObjectFile.h:129
LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile)
Definition: Object.cpp:97
LLVMRelocationIteratorRef LLVMGetRelocations(LLVMSectionIteratorRef Section)
Definition: Object.cpp:155
const char * LLVMGetSectionName(LLVMSectionIteratorRef SI)
Definition: Object.cpp:118
const char * LLVMGetSymbolName(LLVMSymbolIteratorRef SI)
Definition: Object.cpp:178
LLVMContextRef * wrap(const LLVMContext **Tys)
Definition: LLVMContext.h:123
void LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef SI)
Definition: Object.cpp:160
LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile)
Definition: Object.cpp:70
std::string message() const
void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI)
Definition: Object.cpp:111
uint64_t LLVMGetRelocationAddress(LLVMRelocationIteratorRef RI)
Definition: Object.cpp:207
std::string getName(ID id, ArrayRef< Type * > Tys=None)
Definition: Function.cpp:400
void *malloc(size_t size);
uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI)
Definition: Object.cpp:185
const char * LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI)
Definition: Object.cpp:234
struct LLVMOpaqueRelocationIterator * LLVMRelocationIteratorRef
Definition: Object.h:40
uint64_t LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI)
Definition: Object.cpp:214
uint64_t LLVMGetRelocationType(LLVMRelocationIteratorRef RI)
Definition: Object.cpp:226
void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile)
Definition: Object.cpp:65
LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile, LLVMSymbolIteratorRef SI)
Definition: Object.cpp:106
uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI)
Definition: Object.cpp:199
const char * LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI)
Definition: Object.cpp:245
void LLVMMoveToNextSection(LLVMSectionIteratorRef SI)
Definition: Object.cpp:84
uint64_t LLVMGetSymbolFileOffset(LLVMSymbolIteratorRef SI)
Definition: Object.cpp:192