LLVM: lib/Object/Object.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
20
21using namespace llvm;
22using namespace object;
23
27
32
36
42
46
52
56
62
63
64
67 char **ErrorMessage) {
68 auto maybeContext = Context ? unwrap(Context) : nullptr;
71 if (!ObjOrErr) {
73 return nullptr;
74 }
75
76 return wrap(ObjOrErr.get().release());
77}
78
80 auto Buf = unwrap(BR)->getMemoryBufferRef();
82 Buf.getBuffer(), Buf.getBufferIdentifier(),
83 false).release());
84}
85
89
91 class BinaryTypeMapper final : public Binary {
92 public:
94 switch (Kind) {
95 case ID_Archive:
97 case ID_MachOUniversalBinary:
99 case ID_COFFImportFile:
101 case ID_IR:
103 case ID_WinRes:
105 case ID_COFF:
107 case ID_ELF32L:
109 case ID_ELF32B:
111 case ID_ELF64L:
113 case ID_ELF64B:
115 case ID_MachO32L:
117 case ID_MachO32B:
119 case ID_MachO64L:
121 case ID_MachO64B:
123 case ID_Offload:
125 case ID_Wasm:
127 case ID_DXContainer:
129 case ID_StartObjects:
130 case ID_EndObjects:
131 llvm_unreachable("Marker types are not valid binary kinds!");
132 default:
134 }
135 }
136 };
137 return BinaryTypeMapper::mapBinaryTypeToLLVMBinaryType(unwrap(BR)->getType());
138}
139
141 const char *Arch,
142 size_t ArchLen,
143 char **ErrorMessage) {
146 universal->getMachOObjectForArch({Arch, ArchLen}));
147 if (!ObjOrErr) {
149 return nullptr;
150 }
151 return wrap(ObjOrErr.get().release());
152}
153
156 auto sections = OF->sections();
158 return nullptr;
160}
161
165 return (*unwrap(SI) == OF->section_end()) ? 1 : 0;
166}
167
170 auto symbols = OF->symbols();
171 if (symbols.begin() == symbols.end())
172 return nullptr;
174}
175
179 return (*unwrap(SI) == OF->symbol_end()) ? 1 : 0;
180}
181
182
184 std::unique_ptr Buf(unwrap(MemBuf));
187 if (!ObjOrErr) {
188
190 return nullptr;
191 }
192
194 return wrap(Ret);
195}
196
200
201
207
211
215 return (*unwrap(SI) == OB->getBinary()->section_end()) ? 1 : 0;
216}
217
221
225 if (!SecOrErr) {
226 std::string Buf;
230 }
231 *unwrap(Sect) = *SecOrErr;
232}
233
234
240
244
248 return (*unwrap(SI) == OB->getBinary()->symbol_end()) ? 1 : 0;
249}
250
254
255
258 if (!NameOrErr)
260 return NameOrErr->data();
261}
262
264 return (*unwrap(SI))->getSize();
265}
266
269 return E->data();
270 else
272}
273
275 return (*unwrap(SI))->getAddress();
276}
277
282
283
288
292
295 return (*unwrap(SI) == (*unwrap(Section))->relocation_end()) ? 1 : 0;
296}
297
301
302
303
306 if (!Ret) {
307 std::string Buf;
311 }
312 return Ret->data();
313}
314
317 if (!Ret) {
318 std::string Buf;
322 }
323 return *Ret;
324}
325
327 return (*unwrap(SI))->getCommonSize();
328}
329
330
332 return (*unwrap(RI))->getOffset();
333}
334
339
341 return (*unwrap(RI))->getType();
342}
343
344
352
353
355 return strdup("");
356}
357
bbsections Prepares for basic block sections
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines counterparts of C library allocation functions defined in the namespace 'std'.
static StringRef getName(Value *V)
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
static std::unique_ptr< MemoryBuffer > getMemBuffer(StringRef InputData, StringRef BufferName="", bool RequiresNullTerminator=true)
Open the specified memory range as a MemoryBuffer.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
This class is the base class for all object file types.
static Expected< OwningBinary< ObjectFile > > createObjectFile(StringRef ObjectPath)
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI)
Definition Object.cpp:298
void LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI)
Definition Object.cpp:208
uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI)
Definition Object.cpp:326
LLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef OF)
Deprecated: Use LLVMObjectFileCopySymbolIterator instead.
Definition Object.cpp:235
uint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI)
Definition Object.cpp:274
LLVMBool LLVMObjectFileIsSymbolIteratorAtEnd(LLVMBinaryRef BR, LLVMSymbolIteratorRef SI)
Returns whether the given symbol iterator is at the end.
Definition Object.cpp:176
struct LLVMOpaqueSymbolIterator * LLVMSymbolIteratorRef
LLVMBinaryRef LLVMMachOUniversalBinaryCopyObjectForArch(LLVMBinaryRef BR, const char *Arch, size_t ArchLen, char **ErrorMessage)
Definition Object.cpp:140
uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI)
Definition Object.cpp:315
uint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI)
Definition Object.cpp:263
LLVMSymbolIteratorRef LLVMObjectFileCopySymbolIterator(LLVMBinaryRef BR)
Retrieve a copy of the symbol iterator for this object file.
Definition Object.cpp:168
uint64_t LLVMGetRelocationType(LLVMRelocationIteratorRef RI)
Definition Object.cpp:340
const char * LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI)
Definition Object.cpp:354
void LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect, LLVMSymbolIteratorRef Sym)
Definition Object.cpp:222
void LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI)
Definition Object.cpp:241
LLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef OF, LLVMSectionIteratorRef SI)
Deprecated: Use LLVMObjectFileIsSectionIteratorAtEnd instead.
Definition Object.cpp:212
void LLVMMoveToNextSection(LLVMSectionIteratorRef SI)
Definition Object.cpp:218
LLVMSymbolIteratorRef LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI)
Definition Object.cpp:335
const char * LLVMGetSymbolName(LLVMSymbolIteratorRef SI)
Definition Object.cpp:304
uint64_t LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI)
Definition Object.cpp:331
void LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef SI)
Definition Object.cpp:289
LLVMSectionIteratorRef LLVMObjectFileCopySectionIterator(LLVMBinaryRef BR)
Retrieve a copy of the section iterator for this object file.
Definition Object.cpp:154
LLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef OF)
Deprecated: Use LLVMObjectFileCopySectionIterator instead.
Definition Object.cpp:202
LLVMBinaryType LLVMBinaryGetType(LLVMBinaryRef BR)
Retrieve the specific type of a binary.
Definition Object.cpp:90
LLVMRelocationIteratorRef LLVMGetRelocations(LLVMSectionIteratorRef Section)
Definition Object.cpp:284
void LLVMDisposeBinary(LLVMBinaryRef BR)
Dispose of a binary file.
Definition Object.cpp:86
struct LLVMOpaqueSectionIterator * LLVMSectionIteratorRef
const char * LLVMGetSectionName(LLVMSectionIteratorRef SI)
Definition Object.cpp:256
LLVMBool LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section, LLVMRelocationIteratorRef SI)
Definition Object.cpp:293
LLVMMemoryBufferRef LLVMBinaryCopyMemoryBuffer(LLVMBinaryRef BR)
Retrieves a copy of the memory buffer associated with this object file.
Definition Object.cpp:79
struct LLVMOpaqueRelocationIterator * LLVMRelocationIteratorRef
const char * LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI)
Definition Object.cpp:345
struct LLVMOpaqueObjectFile * LLVMObjectFileRef
Deprecated: Use LLVMBinaryRef instead.
LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef OF, LLVMSymbolIteratorRef SI)
Deprecated: Use LLVMObjectFileIsSymbolIteratorAtEnd instead.
Definition Object.cpp:245
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf)
Deprecated: Use LLVMCreateBinary instead.
Definition Object.cpp:183
LLVMBool LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI, LLVMSymbolIteratorRef Sym)
Definition Object.cpp:278
void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile)
Deprecated: Use LLVMDisposeBinary instead.
Definition Object.cpp:197
const char * LLVMGetSectionContents(LLVMSectionIteratorRef SI)
Definition Object.cpp:267
LLVMBinaryRef LLVMCreateBinary(LLVMMemoryBufferRef MemBuf, LLVMContextRef Context, char **ErrorMessage)
Create a binary file from the given memory buffer.
Definition Object.cpp:65
void LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI)
Definition Object.cpp:251
LLVMBool LLVMObjectFileIsSectionIteratorAtEnd(LLVMBinaryRef BR, LLVMSectionIteratorRef SI)
Returns whether the given section iterator is at the end.
Definition Object.cpp:162
@ LLVMBinaryTypeIR
LLVM IR.
@ LLVMBinaryTypeDXcontainer
DirectX Binary Container.
@ LLVMBinaryTypeELF64B
ELF 64-bit, big endian.
@ LLVMBinaryTypeArchive
Archive file.
@ LLVMBinaryTypeMachO32B
MachO 32-bit, big endian.
@ LLVMBinaryTypeWasm
Web Assembly.
@ LLVMBinaryTypeELF64L
ELF 64-bit, little endian.
@ LLVMBinaryTypeWinRes
Windows resource (.res) file.
@ LLVMBinaryTypeMachOUniversalBinary
Mach-O Universal Binary file.
@ LLVMBinaryTypeMachO64B
MachO 64-bit, big endian.
@ LLVMBinaryTypeCOFF
COFF Object file.
@ LLVMBinaryTypeCOFFImportFile
COFF Import file.
@ LLVMBinaryTypeELF32B
ELF 32-bit, big endian.
@ LLVMBinaryTypeELF32L
ELF 32-bit, little endian.
@ LLVMBinaryTypeMachO32L
MachO 32-bit, little endian.
@ LLVMBinaryTypeMachO64L
MachO 64-bit, little endian.
@ LLVMBinaryTypeOffload
Offloading fatbinary.
struct LLVMOpaqueBinary * LLVMBinaryRef
struct LLVMOpaqueMemoryBuffer * LLVMMemoryBufferRef
LLVM uses a polymorphic type hierarchy which C cannot represent, therefore parameters must be passed ...
struct LLVMOpaqueContext * LLVMContextRef
The top-level container for all LLVM global data.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Expected< const typename ELFT::Shdr * > getSection(typename ELFT::ShdrRange Sections, uint32_t Index)
content_iterator< SectionRef > section_iterator
content_iterator< RelocationRef > relocation_iterator
LLVM_ABI Expected< std::unique_ptr< Binary > > createBinary(MemoryBufferRef Source, LLVMContext *Context=nullptr, bool InitContent=true)
Create a Binary from Source, autodetecting the file type.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner={})
Log all errors (if any) in E to OS.
LLVM_GET_TYPE_NAME_CONSTEXPR StringRef getTypeName()
We provide a function which tries to compute the (demangled) name of a type statically.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
LLVM_ATTRIBUTE_RETURNS_NONNULL void * safe_malloc(size_t Sz)
Attribute unwrap(LLVMAttributeRef Attr)
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
OutputIt copy(R &&Range, OutputIt Out)
decltype(auto) cast(const From &Val)
cast - Return the argument parameter cast to the specified type.
LLVMAttributeRef wrap(Attribute Attr)
void consumeError(Error Err)
Consume a Error without doing anything.