]> granicus.if.org Git - llvm/commitdiff
[CodeView] Raise the source to ID map out of the TypeStreamMerger.
authorZachary Turner <zturner@google.com>
Thu, 18 May 2017 23:04:08 +0000 (23:04 +0000)
committerZachary Turner <zturner@google.com>
Thu, 18 May 2017 23:04:08 +0000 (23:04 +0000)
This map will be needed to rewrite symbol streams after re-writing
the corresponding type streams.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303390 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
lib/DebugInfo/CodeView/TypeStreamMerger.cpp
tools/llvm-pdbdump/llvm-pdbdump.cpp
tools/llvm-readobj/COFFDumper.cpp

index 2246f197e78436382c469be03bf7ffb962e64783..65bcf9812e6879a3ea7873244929c01868c1379e 100644 (file)
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/SmallVector.h"
-#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
 #include "llvm/Support/Error.h"
 
 namespace llvm {
 namespace codeview {
 
+class TypeIndex;
 class TypeServerHandler;
+class TypeTableBuilder;
 
 /// Merges one type stream into another. Returns true on success.
 Error mergeTypeStreams(TypeTableBuilder &DestIdStream,
                        TypeTableBuilder &DestTypeStream,
+                       SmallVectorImpl<TypeIndex> &SourceToDest,
                        TypeServerHandler *Handler, const CVTypeArray &Types);
 
 } // end namespace codeview
index da83d1c1c46015b14f98b79f92e01ee94409b44e..46747f8eab993d30e0574ebe28315b8a357f757d 100644 (file)
@@ -58,9 +58,12 @@ namespace {
 class TypeStreamMerger : public TypeVisitorCallbacks {
 public:
   TypeStreamMerger(TypeTableBuilder &DestIdStream,
-                   TypeTableBuilder &DestTypeStream, TypeServerHandler *Handler)
+                   TypeTableBuilder &DestTypeStream,
+                   SmallVectorImpl<TypeIndex> &SourceToDest,
+                   TypeServerHandler *Handler)
       : DestIdStream(DestIdStream), DestTypeStream(DestTypeStream),
-        FieldListBuilder(DestTypeStream), Handler(Handler) {}
+        FieldListBuilder(DestTypeStream), Handler(Handler),
+        IndexMap(SourceToDest) {}
 
   static const TypeIndex Untranslated;
 
@@ -141,7 +144,7 @@ private:
 
   /// Map from source type index to destination type index. Indexed by source
   /// type index minus 0x1000.
-  SmallVector<TypeIndex, 0> IndexMap;
+  SmallVectorImpl<TypeIndex> &IndexMap;
 };
 
 } // end anonymous namespace
@@ -475,8 +478,9 @@ Error TypeStreamMerger::mergeStream(const CVTypeArray &Types) {
 
 Error llvm::codeview::mergeTypeStreams(TypeTableBuilder &DestIdStream,
                                        TypeTableBuilder &DestTypeStream,
+                                       SmallVectorImpl<TypeIndex> &SourceToDest,
                                        TypeServerHandler *Handler,
                                        const CVTypeArray &Types) {
-  return TypeStreamMerger(DestIdStream, DestTypeStream, Handler)
+  return TypeStreamMerger(DestIdStream, DestTypeStream, SourceToDest, Handler)
       .mergeStream(Types);
 }
index d3c6a799ac4222eb601271cb0de943e78e7c766c..d9004f78a0eb70ab9badeeafa96078a24330b6dc 100644 (file)
@@ -36,6 +36,7 @@
 #include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
 #include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
 #include "llvm/DebugInfo/CodeView/TypeStreamMerger.h"
+#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h"
 #include "llvm/DebugInfo/MSF/MSFBuilder.h"
 #include "llvm/DebugInfo/PDB/GenericError.h"
 #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
@@ -851,15 +852,18 @@ static void mergePdbs() {
   for (const auto &Path : opts::merge::InputFilenames) {
     std::unique_ptr<IPDBSession> Session;
     auto &File = loadPDB(Path, Session);
+    SmallVector<TypeIndex, 128> SourceToDest;
     if (File.hasPDBTpiStream()) {
+      SourceToDest.clear();
       auto &Tpi = ExitOnErr(File.getPDBTpiStream());
-      ExitOnErr(codeview::mergeTypeStreams(MergedIpi, MergedTpi, nullptr,
-                                           Tpi.typeArray()));
+      ExitOnErr(codeview::mergeTypeStreams(MergedIpi, MergedTpi, SourceToDest,
+                                           nullptr, Tpi.typeArray()));
     }
     if (File.hasPDBIpiStream()) {
+      SourceToDest.clear();
       auto &Ipi = ExitOnErr(File.getPDBIpiStream());
-      ExitOnErr(codeview::mergeTypeStreams(MergedIpi, MergedTpi, nullptr,
-                                           Ipi.typeArray()));
+      ExitOnErr(codeview::mergeTypeStreams(MergedIpi, MergedTpi, SourceToDest,
+                                           nullptr, Ipi.typeArray()));
     }
   }
 
index 0cf964a49cdcb3b08ad8bcd5cadf8e6c7adc2960..78bfa558e4a38aeec66c8ce312faf81ff3cfd11c 100644 (file)
@@ -1072,8 +1072,9 @@ void COFFDumper::mergeCodeViewTypes(TypeTableBuilder &CVIDs,
         W.flush();
         error(object_error::parse_failed);
       }
-
-      if (auto EC = mergeTypeStreams(CVIDs, CVTypes, nullptr, Types))
+      SmallVector<TypeIndex, 128> SourceToDest;
+      if (auto EC =
+              mergeTypeStreams(CVIDs, CVTypes, SourceToDest, nullptr, Types))
         return error(std::move(EC));
     }
   }