Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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