CVS Repository/ srcgnullvmlibObjectAttic/ ModuleSummaryIndexObjectFile.cpp

Annotated Revision  1.1  Back
1.1
 (patrick  14-Jan-17) 
1
: //===- ModuleSummaryIndexObjectFile.cpp - Summary index file implementation ==//
 
 
2
: //
 
 
3
: //                     The LLVM Compiler Infrastructure
 
 
4
: //
 
 
5
: // This file is distributed under the University of Illinois Open Source
 
 
6
: // License. See LICENSE.TXT for details.
 
 
7
: //
 
 
8
: //===----------------------------------------------------------------------===//
 
 
9
: //
 
 
10
: // Part of the ModuleSummaryIndexObjectFile class implementation.
 
 
11
: //
 
 
12
: //===----------------------------------------------------------------------===//
 
 
13
: 
 
 
14
: #include "llvm/Object/ModuleSummaryIndexObjectFile.h"
 
 
15
: #include "llvm/ADT/STLExtras.h"
 
 
16
: #include "llvm/Bitcode/ReaderWriter.h"
 
 
17
: #include "llvm/IR/ModuleSummaryIndex.h"
 
 
18
: #include "llvm/MC/MCStreamer.h"
 
 
19
: #include "llvm/Object/ObjectFile.h"
 
 
20
: #include "llvm/Support/MemoryBuffer.h"
 
 
21
: #include "llvm/Support/raw_ostream.h"
 
 
22
: using namespace llvm;
 
 
23
: using namespace object;
 
 
24
: 
 
 
25
: ModuleSummaryIndexObjectFile::ModuleSummaryIndexObjectFile(
 
 
26
:     MemoryBufferRef Object, std::unique_ptr<ModuleSummaryIndex> I)
 
 
27
:     : SymbolicFile(Binary::ID_ModuleSummaryIndex, Object), Index(std::move(I)) {
 
 
28
: }
 
 
29
: 
 
 
30
: ModuleSummaryIndexObjectFile::~ModuleSummaryIndexObjectFile() {}
 
 
31
: 
 
 
32
: std::unique_ptr<ModuleSummaryIndex> ModuleSummaryIndexObjectFile::takeIndex() {
 
 
33
:   return std::move(Index);
 
 
34
: }
 
 
35
: 
 
 
36
: ErrorOr<MemoryBufferRef>
 
 
37
: ModuleSummaryIndexObjectFile::findBitcodeInObject(const ObjectFile &Obj) {
 
 
38
:   for (const SectionRef &Sec : Obj.sections()) {
 
 
39
:     if (Sec.isBitcode()) {
 
 
40
:       StringRef SecContents;
 
 
41
:       if (std::error_code EC = Sec.getContents(SecContents))
 
 
42
:         return EC;
 
 
43
:       return MemoryBufferRef(SecContents, Obj.getFileName());
 
 
44
:     }
 
 
45
:   }
 
 
46
: 
 
 
47
:   return object_error::bitcode_section_not_found;
 
 
48
: }
 
 
49
: 
 
 
50
: ErrorOr<MemoryBufferRef>
 
 
51
: ModuleSummaryIndexObjectFile::findBitcodeInMemBuffer(MemoryBufferRef Object) {
 
 
52
:   sys::fs::file_magic Type = sys::fs::identify_magic(Object.getBuffer());
 
 
53
:   switch (Type) {
 
 
54
:   case sys::fs::file_magic::bitcode:
 
 
55
:     return Object;
 
 
56
:   case sys::fs::file_magic::elf_relocatable:
 
 
57
:   case sys::fs::file_magic::macho_object:
 
 
58
:   case sys::fs::file_magic::coff_object: {
 
 
59
:     Expected<std::unique_ptr<ObjectFile>> ObjFile =
 
 
60
:         ObjectFile::createObjectFile(Object, Type);
 
 
61
:     if (!ObjFile)
 
 
62
:       return errorToErrorCode(ObjFile.takeError());
 
 
63
:     return findBitcodeInObject(*ObjFile->get());
 
 
64
:   }
 
 
65
:   default:
 
 
66
:     return object_error::invalid_file_type;
 
 
67
:   }
 
 
68
: }
 
 
69
: 
 
 
70
: // Looks for module summary index in the given memory buffer.
 
 
71
: // returns true if found, else false.
 
 
72
: bool ModuleSummaryIndexObjectFile::hasGlobalValueSummaryInMemBuffer(
 
 
73
:     MemoryBufferRef Object,
 
 
74
:     const DiagnosticHandlerFunction &DiagnosticHandler) {
 
 
75
:   ErrorOr<MemoryBufferRef> BCOrErr = findBitcodeInMemBuffer(Object);
 
 
76
:   if (!BCOrErr)
 
 
77
:     return false;
 
 
78
: 
 
 
79
:   return hasGlobalValueSummary(BCOrErr.get(), DiagnosticHandler);
 
 
80
: }
 
 
81
: 
 
 
82
: // Parse module summary index in the given memory buffer.
 
 
83
: // Return new ModuleSummaryIndexObjectFile instance containing parsed
 
 
84
: // module summary/index.
 
 
85
: ErrorOr<std::unique_ptr<ModuleSummaryIndexObjectFile>>
 
 
86
: ModuleSummaryIndexObjectFile::create(
 
 
87
:     MemoryBufferRef Object,
 
 
88
:     const DiagnosticHandlerFunction &DiagnosticHandler) {
 
 
89
:   std::unique_ptr<ModuleSummaryIndex> Index;
 
 
90
: 
 
 
91
:   ErrorOr<MemoryBufferRef> BCOrErr = findBitcodeInMemBuffer(Object);
 
 
92
:   if (!BCOrErr)
 
 
93
:     return BCOrErr.getError();
 
 
94
: 
 
 
95
:   ErrorOr<std::unique_ptr<ModuleSummaryIndex>> IOrErr =
 
 
96
:       getModuleSummaryIndex(BCOrErr.get(), DiagnosticHandler);
 
 
97
: 
 
 
98
:   if (std::error_code EC = IOrErr.getError())
 
 
99
:     return EC;
 
 
100
: 
 
 
101
:   Index = std::move(IOrErr.get());
 
 
102
: 
 
 
103
:   return llvm::make_unique<ModuleSummaryIndexObjectFile>(Object,
 
 
104
:                                                          std::move(Index));
 
 
105
: }
 
 
106
: 
 
 
107
: // Parse the module summary index out of an IR file and return the summary
 
 
108
: // index object if found, or nullptr if not.
 
 
109
: ErrorOr<std::unique_ptr<ModuleSummaryIndex>> llvm::getModuleSummaryIndexForFile(
 
 
110
:     StringRef Path, const DiagnosticHandlerFunction &DiagnosticHandler) {
 
 
111
:   ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
 
 
112
:       MemoryBuffer::getFileOrSTDIN(Path);
 
 
113
:   std::error_code EC = FileOrErr.getError();
 
 
114
:   if (EC)
 
 
115
:     return EC;
 
 
116
:   MemoryBufferRef BufferRef = (FileOrErr.get())->getMemBufferRef();
 
 
117
:   ErrorOr<std::unique_ptr<object::ModuleSummaryIndexObjectFile>> ObjOrErr =
 
 
118
:       object::ModuleSummaryIndexObjectFile::create(BufferRef,
 
 
119
:                                                    DiagnosticHandler);
 
 
120
:   EC = ObjOrErr.getError();
 
 
121
:   if (EC)
 
 
122
:     return EC;
 
 
123
: 
 
 
124
:   object::ModuleSummaryIndexObjectFile &Obj = **ObjOrErr;
 
 
125
:   return Obj.takeIndex();
 
 
126
: }