diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-06-10 13:44:06 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-06-10 13:44:06 +0000 | 
| commit | 7ab83427af0f77b59941ceba41d509d7d097b065 (patch) | |
| tree | cc41c05b1db454e3d802f34df75e636ee922ad87 /lib/Object/IRObjectFile.cpp | |
| parent | d288ef4c1788d3a951a7558c68312c2d320612b1 (diff) | |
Notes
Diffstat (limited to 'lib/Object/IRObjectFile.cpp')
| -rw-r--r-- | lib/Object/IRObjectFile.cpp | 33 | 
1 files changed, 28 insertions, 5 deletions
| diff --git a/lib/Object/IRObjectFile.cpp b/lib/Object/IRObjectFile.cpp index adbf0de6d1bc..e7807b038335 100644 --- a/lib/Object/IRObjectFile.cpp +++ b/lib/Object/IRObjectFile.cpp @@ -14,6 +14,7 @@  #include "llvm/Object/IRObjectFile.h"  #include "RecordStreamer.h"  #include "llvm/ADT/STLExtras.h" +#include "llvm/BinaryFormat/Magic.h"  #include "llvm/Bitcode/BitcodeReader.h"  #include "llvm/IR/GVMaterializer.h"  #include "llvm/IR/LLVMContext.h" @@ -95,13 +96,13 @@ ErrorOr<MemoryBufferRef> IRObjectFile::findBitcodeInObject(const ObjectFile &Obj  }  ErrorOr<MemoryBufferRef> IRObjectFile::findBitcodeInMemBuffer(MemoryBufferRef Object) { -  sys::fs::file_magic Type = sys::fs::identify_magic(Object.getBuffer()); +  file_magic Type = identify_magic(Object.getBuffer());    switch (Type) { -  case sys::fs::file_magic::bitcode: +  case 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: { +  case file_magic::elf_relocatable: +  case file_magic::macho_object: +  case file_magic::coff_object: {      Expected<std::unique_ptr<ObjectFile>> ObjFile =          ObjectFile::createObjectFile(Object, Type);      if (!ObjFile) @@ -138,3 +139,25 @@ IRObjectFile::create(MemoryBufferRef Object, LLVMContext &Context) {    return std::unique_ptr<IRObjectFile>(        new IRObjectFile(*BCOrErr, std::move(Mods)));  } + +Expected<IRSymtabFile> object::readIRSymtab(MemoryBufferRef MBRef) { +  IRSymtabFile F; +  ErrorOr<MemoryBufferRef> BCOrErr = +      IRObjectFile::findBitcodeInMemBuffer(MBRef); +  if (!BCOrErr) +    return errorCodeToError(BCOrErr.getError()); + +  Expected<BitcodeFileContents> BFCOrErr = getBitcodeFileContents(*BCOrErr); +  if (!BFCOrErr) +    return BFCOrErr.takeError(); + +  Expected<irsymtab::FileContents> FCOrErr = irsymtab::readBitcode(*BFCOrErr); +  if (!FCOrErr) +    return FCOrErr.takeError(); + +  F.Mods = std::move(BFCOrErr->Mods); +  F.Symtab = std::move(FCOrErr->Symtab); +  F.Strtab = std::move(FCOrErr->Strtab); +  F.TheReader = std::move(FCOrErr->TheReader); +  return std::move(F); +} | 
