Bind libObject API for obtaining the section containing a Symbol.
[oota-llvm.git] / lib / Object / Object.cpp
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/Object/ObjectFile.h"
16 #include "llvm-c/Object.h"
17
18 using namespace llvm;
19 using namespace object;
20
21 // ObjectFile creation
22 LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
23   return wrap(ObjectFile::createObjectFile(unwrap(MemBuf)));
24 }
25
26 void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) {
27   delete unwrap(ObjectFile);
28 }
29
30 // ObjectFile Section iterators
31 LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile) {
32   section_iterator SI = unwrap(ObjectFile)->begin_sections();
33   return wrap(new section_iterator(SI));
34 }
35
36 void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI) {
37   delete unwrap(SI);
38 }
39
40 LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile,
41                                 LLVMSectionIteratorRef SI) {
42   return (*unwrap(SI) == unwrap(ObjectFile)->end_sections()) ? 1 : 0;
43 }
44
45 void LLVMMoveToNextSection(LLVMSectionIteratorRef SI) {
46   error_code ec;
47   unwrap(SI)->increment(ec);
48   if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message());
49 }
50
51 void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect,
52                                  LLVMSymbolIteratorRef Sym) {
53   if (error_code ec = (*unwrap(Sym))->getSection(*unwrap(Sect)))
54     report_fatal_error(ec.message());
55 }
56
57 // ObjectFile Symbol iterators
58 LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile) {
59   symbol_iterator SI = unwrap(ObjectFile)->begin_symbols();
60   return wrap(new symbol_iterator(SI));
61 }
62
63 void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) {
64   delete unwrap(SI);
65 }
66
67 LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile,
68                                 LLVMSymbolIteratorRef SI) {
69   return (*unwrap(SI) == unwrap(ObjectFile)->end_symbols()) ? 1 : 0;
70 }
71
72 void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) {
73   error_code ec;
74   unwrap(SI)->increment(ec);
75   if (ec) report_fatal_error("LLVMMoveToNextSymbol failed: " + ec.message());
76 }
77
78 // SectionRef accessors
79 const char *LLVMGetSectionName(LLVMSectionIteratorRef SI) {
80   StringRef ret;
81   if (error_code ec = (*unwrap(SI))->getName(ret))
82    report_fatal_error(ec.message());
83   return ret.data();
84 }
85
86 uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) {
87   uint64_t ret;
88   if (error_code ec = (*unwrap(SI))->getSize(ret))
89     report_fatal_error(ec.message());
90   return ret;
91 }
92
93 const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) {
94   StringRef ret;
95   if (error_code ec = (*unwrap(SI))->getContents(ret))
96     report_fatal_error(ec.message());
97   return ret.data();
98 }
99
100 uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) {
101   uint64_t ret;
102   if (error_code ec = (*unwrap(SI))->getAddress(ret))
103     report_fatal_error(ec.message());
104   return ret;
105 }
106
107 int LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI,
108                                  LLVMSymbolIteratorRef Sym) {
109   bool ret;
110   if (error_code ec = (*unwrap(SI))->containsSymbol(**unwrap(Sym), ret))
111     report_fatal_error(ec.message());
112   return ret;
113 }
114
115 // SymbolRef accessors
116 const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) {
117   StringRef ret;
118   if (error_code ec = (*unwrap(SI))->getName(ret))
119     report_fatal_error(ec.message());
120   return ret.data();
121 }
122
123 uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) {
124   uint64_t ret;
125   if (error_code ec = (*unwrap(SI))->getAddress(ret))
126     report_fatal_error(ec.message());
127   return ret;
128 }
129
130 uint64_t LLVMGetSymbolOffset(LLVMSymbolIteratorRef SI) {
131   uint64_t ret;
132   if (error_code ec = (*unwrap(SI))->getOffset(ret))
133     report_fatal_error(ec.message());
134   return ret;
135 }
136
137 uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) {
138   uint64_t ret;
139   if (error_code ec = (*unwrap(SI))->getSize(ret))
140     report_fatal_error(ec.message());
141   return ret;
142 }
143