1 //===- IRObjectFile.h - LLVM IR object file implementation ------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file declares the IRObjectFile template class.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_OBJECT_IROBJECTFILE_H
14 #define LLVM_OBJECT_IROBJECTFILE_H
16 #include "llvm/ADT/PointerUnion.h"
17 #include "llvm/Object/IRSymtab.h"
18 #include "llvm/Object/ModuleSymbolTable.h"
19 #include "llvm/Object/SymbolicFile.h"
31 class IRObjectFile
: public SymbolicFile
{
32 std::vector
<std::unique_ptr
<Module
>> Mods
;
33 ModuleSymbolTable SymTab
;
34 IRObjectFile(MemoryBufferRef Object
,
35 std::vector
<std::unique_ptr
<Module
>> Mods
);
38 ~IRObjectFile() override
;
39 void moveSymbolNext(DataRefImpl
&Symb
) const override
;
40 Error
printSymbolName(raw_ostream
&OS
, DataRefImpl Symb
) const override
;
41 uint32_t getSymbolFlags(DataRefImpl Symb
) const override
;
42 basic_symbol_iterator
symbol_begin() const override
;
43 basic_symbol_iterator
symbol_end() const override
;
45 StringRef
getTargetTriple() const;
47 static bool classof(const Binary
*v
) {
51 using module_iterator
=
52 pointee_iterator
<std::vector
<std::unique_ptr
<Module
>>::const_iterator
,
55 module_iterator
module_begin() const { return module_iterator(Mods
.begin()); }
56 module_iterator
module_end() const { return module_iterator(Mods
.end()); }
58 iterator_range
<module_iterator
> modules() const {
59 return make_range(module_begin(), module_end());
62 /// Finds and returns bitcode embedded in the given object file, or an
63 /// error code if not found.
64 static Expected
<MemoryBufferRef
> findBitcodeInObject(const ObjectFile
&Obj
);
66 /// Finds and returns bitcode in the given memory buffer (which may
67 /// be either a bitcode file or a native object file with embedded bitcode),
68 /// or an error code if not found.
69 static Expected
<MemoryBufferRef
>
70 findBitcodeInMemBuffer(MemoryBufferRef Object
);
72 static Expected
<std::unique_ptr
<IRObjectFile
>> create(MemoryBufferRef Object
,
73 LLVMContext
&Context
);
76 /// The contents of a bitcode file and its irsymtab. Any underlying data
77 /// for the irsymtab are owned by Symtab and Strtab.
79 std::vector
<BitcodeModule
> Mods
;
80 SmallVector
<char, 0> Symtab
, Strtab
;
81 irsymtab::Reader TheReader
;
84 /// Reads a bitcode file, creating its irsymtab if necessary.
85 Expected
<IRSymtabFile
> readIRSymtab(MemoryBufferRef MBRef
);