1c56d2e8fSEric Christopher //===- Object.cpp - C bindings to the object file library--------*- C++ -*-===//
2c56d2e8fSEric Christopher //
3c56d2e8fSEric Christopher //                     The LLVM Compiler Infrastructure
4c56d2e8fSEric Christopher //
5c56d2e8fSEric Christopher // This file is distributed under the University of Illinois Open Source
6c56d2e8fSEric Christopher // License. See LICENSE.TXT for details.
7c56d2e8fSEric Christopher //
8c56d2e8fSEric Christopher //===----------------------------------------------------------------------===//
9c56d2e8fSEric Christopher //
10c56d2e8fSEric Christopher // This file defines the C bindings to the file-format-independent object
11c56d2e8fSEric Christopher // library.
12c56d2e8fSEric Christopher //
13c56d2e8fSEric Christopher //===----------------------------------------------------------------------===//
14c56d2e8fSEric Christopher 
15c56d2e8fSEric Christopher #include "llvm/Object/ObjectFile.h"
16c56d2e8fSEric Christopher #include "llvm-c/Object.h"
17c56d2e8fSEric Christopher 
18c56d2e8fSEric Christopher using namespace llvm;
19c56d2e8fSEric Christopher using namespace object;
20c56d2e8fSEric Christopher 
21f239db40SOwen Anderson // ObjectFile creation
22c56d2e8fSEric Christopher LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
23c56d2e8fSEric Christopher   return wrap(ObjectFile::createObjectFile(unwrap(MemBuf)));
24c56d2e8fSEric Christopher }
25c56d2e8fSEric Christopher 
26c56d2e8fSEric Christopher void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) {
27c56d2e8fSEric Christopher   delete unwrap(ObjectFile);
28c56d2e8fSEric Christopher }
29c56d2e8fSEric Christopher 
30f239db40SOwen Anderson // ObjectFile Section iterators
31c56d2e8fSEric Christopher LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile) {
32e5fd0047SMichael J. Spencer   section_iterator SI = unwrap(ObjectFile)->begin_sections();
33e5fd0047SMichael J. Spencer   return wrap(new section_iterator(SI));
34c56d2e8fSEric Christopher }
35c56d2e8fSEric Christopher 
36c56d2e8fSEric Christopher void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI) {
37c56d2e8fSEric Christopher   delete unwrap(SI);
38c56d2e8fSEric Christopher }
39c56d2e8fSEric Christopher 
40c56d2e8fSEric Christopher LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile,
41c56d2e8fSEric Christopher                                 LLVMSectionIteratorRef SI) {
42c56d2e8fSEric Christopher   return (*unwrap(SI) == unwrap(ObjectFile)->end_sections()) ? 1 : 0;
43c56d2e8fSEric Christopher }
44c56d2e8fSEric Christopher 
45c56d2e8fSEric Christopher void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) {
461d6167fdSMichael J. Spencer   error_code ec;
471d6167fdSMichael J. Spencer   unwrap(SI)->increment(ec);
481d6167fdSMichael J. Spencer   if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message());
49c56d2e8fSEric Christopher }
50c56d2e8fSEric Christopher 
51*07bfdbb2SOwen Anderson void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect,
52*07bfdbb2SOwen Anderson                                  LLVMSymbolIteratorRef Sym) {
53*07bfdbb2SOwen Anderson   if (error_code ec = (*unwrap(Sym))->getSection(*unwrap(Sect)))
54*07bfdbb2SOwen Anderson     report_fatal_error(ec.message());
55*07bfdbb2SOwen Anderson }
56*07bfdbb2SOwen Anderson 
57f239db40SOwen Anderson // ObjectFile Symbol iterators
58f239db40SOwen Anderson LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile) {
59f239db40SOwen Anderson   symbol_iterator SI = unwrap(ObjectFile)->begin_symbols();
60f239db40SOwen Anderson   return wrap(new symbol_iterator(SI));
61f239db40SOwen Anderson }
62f239db40SOwen Anderson 
63f239db40SOwen Anderson void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) {
64f239db40SOwen Anderson   delete unwrap(SI);
65f239db40SOwen Anderson }
66f239db40SOwen Anderson 
67f239db40SOwen Anderson LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile,
68f239db40SOwen Anderson                                 LLVMSymbolIteratorRef SI) {
69f239db40SOwen Anderson   return (*unwrap(SI) == unwrap(ObjectFile)->end_symbols()) ? 1 : 0;
70f239db40SOwen Anderson }
71f239db40SOwen Anderson 
72f239db40SOwen Anderson void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) {
73f239db40SOwen Anderson   error_code ec;
74f239db40SOwen Anderson   unwrap(SI)->increment(ec);
75f239db40SOwen Anderson   if (ec) report_fatal_error("LLVMMoveToNextSymbol failed: " + ec.message());
76f239db40SOwen Anderson }
77f239db40SOwen Anderson 
78f239db40SOwen Anderson // SectionRef accessors
79c56d2e8fSEric Christopher const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) {
801d6167fdSMichael J. Spencer   StringRef ret;
811d6167fdSMichael J. Spencer   if (error_code ec = (*unwrap(SI))->getName(ret))
821d6167fdSMichael J. Spencer    report_fatal_error(ec.message());
831d6167fdSMichael J. Spencer   return ret.data();
84c56d2e8fSEric Christopher }
85c56d2e8fSEric Christopher 
86c56d2e8fSEric Christopher uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) {
871d6167fdSMichael J. Spencer   uint64_t ret;
881d6167fdSMichael J. Spencer   if (error_code ec = (*unwrap(SI))->getSize(ret))
891d6167fdSMichael J. Spencer     report_fatal_error(ec.message());
901d6167fdSMichael J. Spencer   return ret;
91c56d2e8fSEric Christopher }
92c56d2e8fSEric Christopher 
93c56d2e8fSEric Christopher const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) {
941d6167fdSMichael J. Spencer   StringRef ret;
951d6167fdSMichael J. Spencer   if (error_code ec = (*unwrap(SI))->getContents(ret))
961d6167fdSMichael J. Spencer     report_fatal_error(ec.message());
971d6167fdSMichael J. Spencer   return ret.data();
98c56d2e8fSEric Christopher }
99f239db40SOwen Anderson 
100f239db40SOwen Anderson uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) {
101f239db40SOwen Anderson   uint64_t ret;
102f239db40SOwen Anderson   if (error_code ec = (*unwrap(SI))->getAddress(ret))
103f239db40SOwen Anderson     report_fatal_error(ec.message());
104f239db40SOwen Anderson   return ret;
105f239db40SOwen Anderson }
106f239db40SOwen Anderson 
107f239db40SOwen Anderson int LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI,
108f239db40SOwen Anderson                                  LLVMSymbolIteratorRef Sym) {
109f239db40SOwen Anderson   bool ret;
110f239db40SOwen Anderson   if (error_code ec = (*unwrap(SI))->containsSymbol(**unwrap(Sym), ret))
111f239db40SOwen Anderson     report_fatal_error(ec.message());
112f239db40SOwen Anderson   return ret;
113f239db40SOwen Anderson }
114f239db40SOwen Anderson 
115f239db40SOwen Anderson // SymbolRef accessors
116f239db40SOwen Anderson const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) {
117f239db40SOwen Anderson   StringRef ret;
118f239db40SOwen Anderson   if (error_code ec = (*unwrap(SI))->getName(ret))
119f239db40SOwen Anderson     report_fatal_error(ec.message());
120f239db40SOwen Anderson   return ret.data();
121f239db40SOwen Anderson }
122f239db40SOwen Anderson 
123f239db40SOwen Anderson uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) {
124f239db40SOwen Anderson   uint64_t ret;
125f239db40SOwen Anderson   if (error_code ec = (*unwrap(SI))->getAddress(ret))
126f239db40SOwen Anderson     report_fatal_error(ec.message());
127f239db40SOwen Anderson   return ret;
128f239db40SOwen Anderson }
129f239db40SOwen Anderson 
130f239db40SOwen Anderson uint64_t LLVMGetSymbolOffset(LLVMSymbolIteratorRef SI) {
131f239db40SOwen Anderson   uint64_t ret;
132f239db40SOwen Anderson   if (error_code ec = (*unwrap(SI))->getOffset(ret))
133f239db40SOwen Anderson     report_fatal_error(ec.message());
134f239db40SOwen Anderson   return ret;
135f239db40SOwen Anderson }
136f239db40SOwen Anderson 
137f239db40SOwen Anderson uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) {
138f239db40SOwen Anderson   uint64_t ret;
139f239db40SOwen Anderson   if (error_code ec = (*unwrap(SI))->getSize(ret))
140f239db40SOwen Anderson     report_fatal_error(ec.message());
141f239db40SOwen Anderson   return ret;
142f239db40SOwen Anderson }
143f239db40SOwen Anderson 
144