annotate lib/Object/IRObjectFile.cpp @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===- IRObjectFile.cpp - IR object file implementation ---------*- C++ -*-===//
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 //
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 // Part of the IRObjectFile class implementation.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 //
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 #include "llvm/Object/IRObjectFile.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
14 #include "llvm/ADT/STLExtras.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
15 #include "llvm/BinaryFormat/Magic.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
16 #include "llvm/Bitcode/BitcodeReader.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
17 #include "llvm/IR/GVMaterializer.h"
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 #include "llvm/IR/LLVMContext.h"
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 #include "llvm/IR/Mangler.h"
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 #include "llvm/IR/Module.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
21 #include "llvm/Object/ObjectFile.h"
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "llvm/Support/MemoryBuffer.h"
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "llvm/Support/TargetRegistry.h"
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "llvm/Support/raw_ostream.h"
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 using namespace llvm;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 using namespace object;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
28 IRObjectFile::IRObjectFile(MemoryBufferRef Object,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
29 std::vector<std::unique_ptr<Module>> Mods)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
30 : SymbolicFile(Binary::ID_IR, Object), Mods(std::move(Mods)) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
31 for (auto &M : this->Mods)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
32 SymTab.addModule(M.get());
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
35 IRObjectFile::~IRObjectFile() {}
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
37 static ModuleSymbolTable::Symbol getSym(DataRefImpl &Symb) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
38 return *reinterpret_cast<ModuleSymbolTable::Symbol *>(Symb.p);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
39 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
40
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 void IRObjectFile::moveSymbolNext(DataRefImpl &Symb) const {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
42 Symb.p += sizeof(ModuleSymbolTable::Symbol);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
45 Error IRObjectFile::printSymbolName(raw_ostream &OS, DataRefImpl Symb) const {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
46 SymTab.printSymbolName(OS, getSym(Symb));
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
47 return Error::success();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 uint32_t IRObjectFile::getSymbolFlags(DataRefImpl Symb) const {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
51 return SymTab.getSymbolFlags(getSym(Symb));
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
54 basic_symbol_iterator IRObjectFile::symbol_begin() const {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 DataRefImpl Ret;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
56 Ret.p = reinterpret_cast<uintptr_t>(SymTab.symbols().data());
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 return basic_symbol_iterator(BasicSymbolRef(Ret, this));
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
60 basic_symbol_iterator IRObjectFile::symbol_end() const {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 DataRefImpl Ret;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
62 Ret.p = reinterpret_cast<uintptr_t>(SymTab.symbols().data() +
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
63 SymTab.symbols().size());
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 return basic_symbol_iterator(BasicSymbolRef(Ret, this));
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
67 StringRef IRObjectFile::getTargetTriple() const {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
68 // Each module must have the same target triple, so we arbitrarily access the
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
69 // first one.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
70 return Mods[0]->getTargetTriple();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
71 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
72
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
73 Expected<MemoryBufferRef>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
74 IRObjectFile::findBitcodeInObject(const ObjectFile &Obj) {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
75 for (const SectionRef &Sec : Obj.sections()) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
76 if (Sec.isBitcode()) {
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
77 Expected<StringRef> Contents = Sec.getContents();
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
78 if (!Contents)
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
79 return Contents.takeError();
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
80 if (Contents->size() <= 1)
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
81 return errorCodeToError(object_error::bitcode_section_not_found);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
82 return MemoryBufferRef(*Contents, Obj.getFileName());
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
83 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
84 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
85
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
86 return errorCodeToError(object_error::bitcode_section_not_found);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
87 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
88
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
89 Expected<MemoryBufferRef>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
90 IRObjectFile::findBitcodeInMemBuffer(MemoryBufferRef Object) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
91 file_magic Type = identify_magic(Object.getBuffer());
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
92 switch (Type) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
93 case file_magic::bitcode:
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
94 return Object;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
95 case file_magic::elf_relocatable:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
96 case file_magic::macho_object:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
97 case file_magic::coff_object: {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
98 Expected<std::unique_ptr<ObjectFile>> ObjFile =
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
99 ObjectFile::createObjectFile(Object, Type);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
100 if (!ObjFile)
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
101 return ObjFile.takeError();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
102 return findBitcodeInObject(*ObjFile->get());
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
103 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
104 default:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
105 return errorCodeToError(object_error::invalid_file_type);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
106 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
107 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
108
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
109 Expected<std::unique_ptr<IRObjectFile>>
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
110 IRObjectFile::create(MemoryBufferRef Object, LLVMContext &Context) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
111 Expected<MemoryBufferRef> BCOrErr = findBitcodeInMemBuffer(Object);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
112 if (!BCOrErr)
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
113 return BCOrErr.takeError();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
114
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
115 Expected<std::vector<BitcodeModule>> BMsOrErr =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
116 getBitcodeModuleList(*BCOrErr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
117 if (!BMsOrErr)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
118 return BMsOrErr.takeError();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
119
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
120 std::vector<std::unique_ptr<Module>> Mods;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
121 for (auto BM : *BMsOrErr) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
122 Expected<std::unique_ptr<Module>> MOrErr =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
123 BM.getLazyModule(Context, /*ShouldLazyLoadMetadata*/ true,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
124 /*IsImporting*/ false);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
125 if (!MOrErr)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
126 return MOrErr.takeError();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
127
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
128 Mods.push_back(std::move(*MOrErr));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
129 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
131 return std::unique_ptr<IRObjectFile>(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
132 new IRObjectFile(*BCOrErr, std::move(Mods)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
133 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
134
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
135 Expected<IRSymtabFile> object::readIRSymtab(MemoryBufferRef MBRef) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
136 IRSymtabFile F;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
137 Expected<MemoryBufferRef> BCOrErr =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
138 IRObjectFile::findBitcodeInMemBuffer(MBRef);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
139 if (!BCOrErr)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
140 return BCOrErr.takeError();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
142 Expected<BitcodeFileContents> BFCOrErr = getBitcodeFileContents(*BCOrErr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
143 if (!BFCOrErr)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
144 return BFCOrErr.takeError();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
145
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
146 Expected<irsymtab::FileContents> FCOrErr = irsymtab::readBitcode(*BFCOrErr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
147 if (!FCOrErr)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
148 return FCOrErr.takeError();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
149
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
150 F.Mods = std::move(BFCOrErr->Mods);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
151 F.Symtab = std::move(FCOrErr->Symtab);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
152 F.Strtab = std::move(FCOrErr->Strtab);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
153 F.TheReader = std::move(FCOrErr->TheReader);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
154 return std::move(F);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 }