mirror of
https://github.com/RPCSX/llvm.git
synced 2025-05-13 19:06:05 +00:00

Summary: Split ReaderWriter.h which contains the APIs into both the BitReader and BitWriter libraries into BitcodeReader.h and BitcodeWriter.h. This is to address Chandler's concern about sharing the same API header between multiple libraries (BitReader and BitWriter). That concern is why we create a single bitcode library in our downstream build of clang, which led to r286297 being reverted as it added a dependency that created a cycle only when there is a single bitcode library (not two as in upstream). Reviewers: mehdi_amini Subscribers: dlj, mehdi_amini, llvm-commits Differential Revision: https://reviews.llvm.org/D26502 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286566 91177308-0d34-0410-b5e6-96231b3b80d8
127 lines
4.4 KiB
C++
127 lines
4.4 KiB
C++
//===- ModuleSummaryIndexObjectFile.cpp - Summary index file implementation ==//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the ModuleSummaryIndexObjectFile class implementation.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Object/ModuleSummaryIndexObjectFile.h"
|
|
#include "llvm/ADT/STLExtras.h"
|
|
#include "llvm/Bitcode/BitcodeReader.h"
|
|
#include "llvm/IR/ModuleSummaryIndex.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
#include "llvm/Object/ObjectFile.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
using namespace llvm;
|
|
using namespace object;
|
|
|
|
ModuleSummaryIndexObjectFile::ModuleSummaryIndexObjectFile(
|
|
MemoryBufferRef Object, std::unique_ptr<ModuleSummaryIndex> I)
|
|
: SymbolicFile(Binary::ID_ModuleSummaryIndex, Object), Index(std::move(I)) {
|
|
}
|
|
|
|
ModuleSummaryIndexObjectFile::~ModuleSummaryIndexObjectFile() {}
|
|
|
|
std::unique_ptr<ModuleSummaryIndex> ModuleSummaryIndexObjectFile::takeIndex() {
|
|
return std::move(Index);
|
|
}
|
|
|
|
ErrorOr<MemoryBufferRef>
|
|
ModuleSummaryIndexObjectFile::findBitcodeInObject(const ObjectFile &Obj) {
|
|
for (const SectionRef &Sec : Obj.sections()) {
|
|
if (Sec.isBitcode()) {
|
|
StringRef SecContents;
|
|
if (std::error_code EC = Sec.getContents(SecContents))
|
|
return EC;
|
|
return MemoryBufferRef(SecContents, Obj.getFileName());
|
|
}
|
|
}
|
|
|
|
return object_error::bitcode_section_not_found;
|
|
}
|
|
|
|
ErrorOr<MemoryBufferRef>
|
|
ModuleSummaryIndexObjectFile::findBitcodeInMemBuffer(MemoryBufferRef Object) {
|
|
sys::fs::file_magic Type = sys::fs::identify_magic(Object.getBuffer());
|
|
switch (Type) {
|
|
case sys::fs::file_magic::bitcode:
|
|
return Object;
|
|
case sys::fs::file_magic::elf_relocatable:
|
|
case sys::fs::file_magic::macho_object:
|
|
case sys::fs::file_magic::coff_object: {
|
|
Expected<std::unique_ptr<ObjectFile>> ObjFile =
|
|
ObjectFile::createObjectFile(Object, Type);
|
|
if (!ObjFile)
|
|
return errorToErrorCode(ObjFile.takeError());
|
|
return findBitcodeInObject(*ObjFile->get());
|
|
}
|
|
default:
|
|
return object_error::invalid_file_type;
|
|
}
|
|
}
|
|
|
|
// Looks for module summary index in the given memory buffer.
|
|
// returns true if found, else false.
|
|
bool ModuleSummaryIndexObjectFile::hasGlobalValueSummaryInMemBuffer(
|
|
MemoryBufferRef Object,
|
|
const DiagnosticHandlerFunction &DiagnosticHandler) {
|
|
ErrorOr<MemoryBufferRef> BCOrErr = findBitcodeInMemBuffer(Object);
|
|
if (!BCOrErr)
|
|
return false;
|
|
|
|
return hasGlobalValueSummary(BCOrErr.get(), DiagnosticHandler);
|
|
}
|
|
|
|
// Parse module summary index in the given memory buffer.
|
|
// Return new ModuleSummaryIndexObjectFile instance containing parsed
|
|
// module summary/index.
|
|
ErrorOr<std::unique_ptr<ModuleSummaryIndexObjectFile>>
|
|
ModuleSummaryIndexObjectFile::create(
|
|
MemoryBufferRef Object,
|
|
const DiagnosticHandlerFunction &DiagnosticHandler) {
|
|
std::unique_ptr<ModuleSummaryIndex> Index;
|
|
|
|
ErrorOr<MemoryBufferRef> BCOrErr = findBitcodeInMemBuffer(Object);
|
|
if (!BCOrErr)
|
|
return BCOrErr.getError();
|
|
|
|
ErrorOr<std::unique_ptr<ModuleSummaryIndex>> IOrErr =
|
|
getModuleSummaryIndex(BCOrErr.get(), DiagnosticHandler);
|
|
|
|
if (std::error_code EC = IOrErr.getError())
|
|
return EC;
|
|
|
|
Index = std::move(IOrErr.get());
|
|
|
|
return llvm::make_unique<ModuleSummaryIndexObjectFile>(Object,
|
|
std::move(Index));
|
|
}
|
|
|
|
// Parse the module summary index out of an IR file and return the summary
|
|
// index object if found, or nullptr if not.
|
|
ErrorOr<std::unique_ptr<ModuleSummaryIndex>> llvm::getModuleSummaryIndexForFile(
|
|
StringRef Path, const DiagnosticHandlerFunction &DiagnosticHandler) {
|
|
ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
|
|
MemoryBuffer::getFileOrSTDIN(Path);
|
|
std::error_code EC = FileOrErr.getError();
|
|
if (EC)
|
|
return EC;
|
|
MemoryBufferRef BufferRef = (FileOrErr.get())->getMemBufferRef();
|
|
ErrorOr<std::unique_ptr<object::ModuleSummaryIndexObjectFile>> ObjOrErr =
|
|
object::ModuleSummaryIndexObjectFile::create(BufferRef,
|
|
DiagnosticHandler);
|
|
EC = ObjOrErr.getError();
|
|
if (EC)
|
|
return EC;
|
|
|
|
object::ModuleSummaryIndexObjectFile &Obj = **ObjOrErr;
|
|
return Obj.takeIndex();
|
|
}
|