llvm-project/llvm/lib/DebugInfo/PDB
Zachary Turner 5e3e4bb26b [CodeView] Decouple record deserialization from visitor dispatch.
Until now, our use case for the visitor has been to take a stream of bytes
representing a type stream, deserialize the records in sequence, and do
something with them, where "something" is determined by how the user
implements a particular set of callbacks on an abstract class.

For actually writing PDBs, however, we want to do the reverse. We have
some kind of description of the list of records in their in-memory format,
and we want to process each one. Perhaps by serializing them to a byte
stream, or perhaps by converting them from one description format (Yaml)
to another (in-memory representation).

This was difficult in the current model because deserialization and
invoking the callbacks were tightly coupled.

With this patch we change this so that TypeDeserializer is itself an
implementation of the particular set of callbacks. This decouples
deserialization from the iteration over a list of records and invocation
of the callbacks.  TypeDeserializer is initialized with another
implementation of the callback interface, so that upon deserialization it
can pass the deserialized record through to the next set of callbacks. In
a sense this is like an implementation of the Decorator design pattern,
where the Deserializer is a decorator.

This will be useful for writing Pdbs from yaml, where we have a
description of the type records in Yaml format. In this case, the visitor
implementation would have each visitation callback method implemented in
such a way as to extract the proper set of fields from the Yaml, and it
could maintain state that builds up a list of these records. Finally at
the end we can pass this information through to another set of callbacks
which serializes them into a byte stream.

Reviewed By: majnemer, ruiu, rnk
Differential Revision: https://reviews.llvm.org/D23177

llvm-svn: 277871
2016-08-05 21:45:34 +00:00
..
DIA [codeview] Add support for new type records. 2016-05-24 22:58:46 +00:00
Raw [CodeView] Decouple record deserialization from visitor dispatch. 2016-08-05 21:45:34 +00:00
CMakeLists.txt [msf] Create LLVMDebugInfoMsf 2016-07-22 19:56:05 +00:00
GenericError.cpp Add FIXMEs to all derived classes of std::error_category. 2016-05-24 20:13:46 +00:00
IPDBSourceFile.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
LLVMBuild.txt [msf] Resubmit "Rename Msf -> MSF". 2016-07-29 20:56:36 +00:00
PDB.cpp Add missing include. 2016-05-06 20:59:35 +00:00
PDBContext.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBExtras.cpp [codeview] Add support for new type records. 2016-05-24 22:58:46 +00:00
PDBInterfaceAnchors.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymDumper.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbol.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolAnnotation.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolBlock.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolCompiland.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolCompilandDetails.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolCompilandEnv.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolCustom.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolData.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolExe.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolFunc.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolFuncDebugEnd.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolFuncDebugStart.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolLabel.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolPublicSymbol.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolThunk.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeArray.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeBaseClass.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeBuiltin.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeCustom.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeDimension.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeEnum.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeFriend.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeFunctionArg.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeFunctionSig.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeManaged.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypePointer.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeTypedef.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeUDT.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeVTable.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolTypeVTableShape.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolUnknown.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00
PDBSymbolUsingNamespace.cpp Move pdb code into pdb namespace. 2016-05-04 20:32:13 +00:00