1 /*===-- llvm-c/Object.h - Object Lib C Iface --------------------*- C++ -*-===*/
2 /*                                                                            */
3 /* Part of the LLVM Project, under the Apache License v2.0 with LLVM          */
4 /* Exceptions.                                                                */
5 /* See https://llvm.org/LICENSE.txt for license information.                  */
6 /* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    */
7 /*                                                                            */
8 /*===----------------------------------------------------------------------===*/
9 /*                                                                            */
10 /* This header declares the C interface to libLLVMObject.a, which             */
11 /* implements object file reading and writing.                                */
12 /*                                                                            */
13 /* Many exotic languages can interoperate with C code but have a harder time  */
14 /* with C++ due to name mangling. So in addition to C, this interface enables */
15 /* tools written in such languages.                                           */
16 /*                                                                            */
17 /*===----------------------------------------------------------------------===*/
18 
19 #ifndef LLVM_C_OBJECT_H
20 #define LLVM_C_OBJECT_H
21 
22 #include "llvm-c/ExternC.h"
23 #include "llvm-c/Types.h"
24 #include "llvm/Config/llvm-config.h"
25 
26 LLVM_C_EXTERN_C_BEGIN
27 
28 /**
29  * @defgroup LLVMCObject Object file reading and writing
30  * @ingroup LLVMC
31  *
32  * @{
33  */
34 
35 // Opaque type wrappers
36 typedef struct LLVMOpaqueSectionIterator *LLVMSectionIteratorRef;
37 typedef struct LLVMOpaqueSymbolIterator *LLVMSymbolIteratorRef;
38 typedef struct LLVMOpaqueRelocationIterator *LLVMRelocationIteratorRef;
39 
40 typedef enum {
41   LLVMBinaryTypeArchive,              /**< Archive file. */
42   LLVMBinaryTypeMachOUniversalBinary, /**< Mach-O Universal Binary file. */
43   LLVMBinaryTypeCOFFImportFile,       /**< COFF Import file. */
44   LLVMBinaryTypeIR,                   /**< LLVM IR. */
45   LLVMBinaryTypeWinRes,               /**< Windows resource (.res) file. */
46   LLVMBinaryTypeCOFF,                 /**< COFF Object file. */
47   LLVMBinaryTypeELF32L,               /**< ELF 32-bit, little endian. */
48   LLVMBinaryTypeELF32B,               /**< ELF 32-bit, big endian. */
49   LLVMBinaryTypeELF64L,               /**< ELF 64-bit, little endian. */
50   LLVMBinaryTypeELF64B,               /**< ELF 64-bit, big endian. */
51   LLVMBinaryTypeMachO32L,             /**< MachO 32-bit, little endian. */
52   LLVMBinaryTypeMachO32B,             /**< MachO 32-bit, big endian. */
53   LLVMBinaryTypeMachO64L,             /**< MachO 64-bit, little endian. */
54   LLVMBinaryTypeMachO64B,             /**< MachO 64-bit, big endian. */
55   LLVMBinaryTypeWasm,                 /**< Web Assembly. */
56   LLVMBinaryTypeOffload,              /**< Offloading fatbinary. */
57 
58 } LLVMBinaryType;
59 
60 /**
61  * Create a binary file from the given memory buffer.
62  *
63  * The exact type of the binary file will be inferred automatically, and the
64  * appropriate implementation selected.  The context may be NULL except if
65  * the resulting file is an LLVM IR file.
66  *
67  * The memory buffer is not consumed by this function.  It is the responsibilty
68  * of the caller to free it with \c LLVMDisposeMemoryBuffer.
69  *
70  * If NULL is returned, the \p ErrorMessage parameter is populated with the
71  * error's description.  It is then the caller's responsibility to free this
72  * message by calling \c LLVMDisposeMessage.
73  *
74  * @see llvm::object::createBinary
75  */
76 LLVMBinaryRef LLVMCreateBinary(LLVMMemoryBufferRef MemBuf,
77                                LLVMContextRef Context,
78                                char **ErrorMessage);
79 
80 /**
81  * Dispose of a binary file.
82  *
83  * The binary file does not own its backing buffer.  It is the responsibilty
84  * of the caller to free it with \c LLVMDisposeMemoryBuffer.
85  */
86 void LLVMDisposeBinary(LLVMBinaryRef BR);
87 
88 /**
89  * Retrieves a copy of the memory buffer associated with this object file.
90  *
91  * The returned buffer is merely a shallow copy and does not own the actual
92  * backing buffer of the binary. Nevertheless, it is the responsibility of the
93  * caller to free it with \c LLVMDisposeMemoryBuffer.
94  *
95  * @see llvm::object::getMemoryBufferRef
96  */
97 LLVMMemoryBufferRef LLVMBinaryCopyMemoryBuffer(LLVMBinaryRef BR);
98 
99 /**
100  * Retrieve the specific type of a binary.
101  *
102  * @see llvm::object::Binary::getType
103  */
104 LLVMBinaryType LLVMBinaryGetType(LLVMBinaryRef BR);
105 
106 /*
107  * For a Mach-O universal binary file, retrieves the object file corresponding
108  * to the given architecture if it is present as a slice.
109  *
110  * If NULL is returned, the \p ErrorMessage parameter is populated with the
111  * error's description.  It is then the caller's responsibility to free this
112  * message by calling \c LLVMDisposeMessage.
113  *
114  * It is the responsiblity of the caller to free the returned object file by
115  * calling \c LLVMDisposeBinary.
116  */
117 LLVMBinaryRef LLVMMachOUniversalBinaryCopyObjectForArch(LLVMBinaryRef BR,
118                                                         const char *Arch,
119                                                         size_t ArchLen,
120                                                         char **ErrorMessage);
121 
122 /**
123  * Retrieve a copy of the section iterator for this object file.
124  *
125  * If there are no sections, the result is NULL.
126  *
127  * The returned iterator is merely a shallow copy. Nevertheless, it is
128  * the responsibility of the caller to free it with
129  * \c LLVMDisposeSectionIterator.
130  *
131  * @see llvm::object::sections()
132  */
133 LLVMSectionIteratorRef LLVMObjectFileCopySectionIterator(LLVMBinaryRef BR);
134 
135 /**
136  * Returns whether the given section iterator is at the end.
137  *
138  * @see llvm::object::section_end
139  */
140 LLVMBool LLVMObjectFileIsSectionIteratorAtEnd(LLVMBinaryRef BR,
141                                               LLVMSectionIteratorRef SI);
142 
143 /**
144  * Retrieve a copy of the symbol iterator for this object file.
145  *
146  * If there are no symbols, the result is NULL.
147  *
148  * The returned iterator is merely a shallow copy. Nevertheless, it is
149  * the responsibility of the caller to free it with
150  * \c LLVMDisposeSymbolIterator.
151  *
152  * @see llvm::object::symbols()
153  */
154 LLVMSymbolIteratorRef LLVMObjectFileCopySymbolIterator(LLVMBinaryRef BR);
155 
156 /**
157  * Returns whether the given symbol iterator is at the end.
158  *
159  * @see llvm::object::symbol_end
160  */
161 LLVMBool LLVMObjectFileIsSymbolIteratorAtEnd(LLVMBinaryRef BR,
162                                              LLVMSymbolIteratorRef SI);
163 
164 void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI);
165 
166 void LLVMMoveToNextSection(LLVMSectionIteratorRef SI);
167 void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect,
168                                  LLVMSymbolIteratorRef Sym);
169 
170 // ObjectFile Symbol iterators
171 void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI);
172 void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI);
173 
174 // SectionRef accessors
175 const char *LLVMGetSectionName(LLVMSectionIteratorRef SI);
176 uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI);
177 const char *LLVMGetSectionContents(LLVMSectionIteratorRef SI);
178 uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI);
179 LLVMBool LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI,
180                                  LLVMSymbolIteratorRef Sym);
181 
182 // Section Relocation iterators
183 LLVMRelocationIteratorRef LLVMGetRelocations(LLVMSectionIteratorRef Section);
184 void LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef RI);
185 LLVMBool LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section,
186                                        LLVMRelocationIteratorRef RI);
187 void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef RI);
188 
189 
190 // SymbolRef accessors
191 const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI);
192 uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI);
193 uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI);
194 
195 // RelocationRef accessors
196 uint64_t LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI);
197 LLVMSymbolIteratorRef LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI);
198 uint64_t LLVMGetRelocationType(LLVMRelocationIteratorRef RI);
199 // NOTE: Caller takes ownership of returned string of the two
200 // following functions.
201 const char *LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI);
202 const char *LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI);
203 
204 /** Deprecated: Use LLVMBinaryRef instead. */
205 typedef struct LLVMOpaqueObjectFile *LLVMObjectFileRef;
206 
207 /** Deprecated: Use LLVMCreateBinary instead. */
208 LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf);
209 
210 /** Deprecated: Use LLVMDisposeBinary instead. */
211 void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile);
212 
213 /** Deprecated: Use LLVMObjectFileCopySectionIterator instead. */
214 LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile);
215 
216 /** Deprecated: Use LLVMObjectFileIsSectionIteratorAtEnd instead. */
217 LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile,
218                                     LLVMSectionIteratorRef SI);
219 
220 /** Deprecated: Use LLVMObjectFileCopySymbolIterator instead. */
221 LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile);
222 
223 /** Deprecated: Use LLVMObjectFileIsSymbolIteratorAtEnd instead. */
224 LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile,
225                                    LLVMSymbolIteratorRef SI);
226 /**
227  * @}
228  */
229 
230 LLVM_C_EXTERN_C_END
231 
232 #endif
233