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 std::error_code
printSymbolName(raw_ostream
&OS
,
41 DataRefImpl Symb
) const override
;
42 uint32_t getSymbolFlags(DataRefImpl Symb
) const override
;
43 basic_symbol_iterator
symbol_begin() const override
;
44 basic_symbol_iterator
symbol_end() const override
;
46 StringRef
getTargetTriple() const;
48 static bool classof(const Binary
*v
) {
52 using module_iterator
=
53 pointee_iterator
<std::vector
<std::unique_ptr
<Module
>>::const_iterator
,
56 module_iterator
module_begin() const { return module_iterator(Mods
.begin()); }
57 module_iterator
module_end() const { return module_iterator(Mods
.end()); }
59 iterator_range
<module_iterator
> modules() const {
60 return make_range(module_begin(), module_end());
63 /// Finds and returns bitcode embedded in the given object file, or an
64 /// error code if not found.
65 static Expected
<MemoryBufferRef
> findBitcodeInObject(const ObjectFile
&Obj
);
67 /// Finds and returns bitcode in the given memory buffer (which may
68 /// be either a bitcode file or a native object file with embedded bitcode),
69 /// or an error code if not found.
70 static Expected
<MemoryBufferRef
>
71 findBitcodeInMemBuffer(MemoryBufferRef Object
);
73 static Expected
<std::unique_ptr
<IRObjectFile
>> create(MemoryBufferRef Object
,
74 LLVMContext
&Context
);
77 /// The contents of a bitcode file and its irsymtab. Any underlying data
78 /// for the irsymtab are owned by Symtab and Strtab.
80 std::vector
<BitcodeModule
> Mods
;
81 SmallVector
<char, 0> Symtab
, Strtab
;
82 irsymtab::Reader TheReader
;
85 /// Reads a bitcode file, creating its irsymtab if necessary.
86 Expected
<IRSymtabFile
> readIRSymtab(MemoryBufferRef MBRef
);