diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 | 
| commit | d8e91e46262bc44006913e6796843909f1ac7bcd (patch) | |
| tree | 7d0c143d9b38190e0fa0180805389da22cd834c5 /lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp | |
| parent | b7eb8e35e481a74962664b63dfb09483b200209a (diff) | |
Notes
Diffstat (limited to 'lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp')
| -rw-r--r-- | lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp | 45 | 
1 files changed, 42 insertions, 3 deletions
diff --git a/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp b/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp index f6043bfd7cf94..094216ea800a0 100644 --- a/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp +++ b/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp @@ -11,6 +11,7 @@  #include "llvm/ADT/ArrayRef.h"  #include "llvm/BinaryFormat/COFF.h" +#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"  #include "llvm/DebugInfo/MSF/MSFBuilder.h"  #include "llvm/DebugInfo/MSF/MappedBlockStream.h"  #include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h" @@ -74,10 +75,27 @@ void DbiStreamBuilder::setPublicsStreamIndex(uint32_t Index) {    PublicsStreamIndex = Index;  } +void DbiStreamBuilder::addNewFpoData(const codeview::FrameData &FD) { +  if (!NewFpoData.hasValue()) +    NewFpoData.emplace(false); + +  NewFpoData->addFrameData(FD); +} + +void DbiStreamBuilder::addOldFpoData(const object::FpoData &FD) { +  OldFpoData.push_back(FD); +} +  Error DbiStreamBuilder::addDbgStream(pdb::DbgHeaderType Type,                                       ArrayRef<uint8_t> Data) { +  assert(Type != DbgHeaderType::NewFPO && +         "NewFPO data should be written via addFrameData()!"); +    DbgStreams[(int)Type].emplace(); -  DbgStreams[(int)Type]->Data = Data; +  DbgStreams[(int)Type]->Size = Data.size(); +  DbgStreams[(int)Type]->WriteFn = [Data](BinaryStreamWriter &Writer) { +    return Writer.writeArray(Data); +  };    return Error::success();  } @@ -272,10 +290,30 @@ Error DbiStreamBuilder::finalize() {  }  Error DbiStreamBuilder::finalizeMsfLayout() { +  if (NewFpoData.hasValue()) { +    DbgStreams[(int)DbgHeaderType::NewFPO].emplace(); +    DbgStreams[(int)DbgHeaderType::NewFPO]->Size = +        NewFpoData->calculateSerializedSize(); +    DbgStreams[(int)DbgHeaderType::NewFPO]->WriteFn = +        [this](BinaryStreamWriter &Writer) { +          return NewFpoData->commit(Writer); +        }; +  } + +  if (!OldFpoData.empty()) { +    DbgStreams[(int)DbgHeaderType::FPO].emplace(); +    DbgStreams[(int)DbgHeaderType::FPO]->Size = +        sizeof(object::FpoData) * OldFpoData.size(); +    DbgStreams[(int)DbgHeaderType::FPO]->WriteFn = +        [this](BinaryStreamWriter &Writer) { +          return Writer.writeArray(makeArrayRef(OldFpoData)); +        }; +  } +    for (auto &S : DbgStreams) {      if (!S.hasValue())        continue; -    auto ExpectedIndex = Msf.addStream(S->Data.size()); +    auto ExpectedIndex = Msf.addStream(S->Size);      if (!ExpectedIndex)        return ExpectedIndex.takeError();      S->StreamNumber = *ExpectedIndex; @@ -406,7 +444,8 @@ Error DbiStreamBuilder::commit(const msf::MSFLayout &Layout,      auto WritableStream = WritableMappedBlockStream::createIndexedStream(          Layout, MsfBuffer, Stream->StreamNumber, Allocator);      BinaryStreamWriter DbgStreamWriter(*WritableStream); -    if (auto EC = DbgStreamWriter.writeArray(Stream->Data)) + +    if (auto EC = Stream->WriteFn(DbgStreamWriter))        return EC;    }  | 
