[llvm] r305857 - [codeview] YAMLize all section offsets and indices in symbol records

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 20 14:19:22 PDT 2017


Author: rnk
Date: Tue Jun 20 16:19:22 2017
New Revision: 305857

URL: http://llvm.org/viewvc/llvm-project?rev=305857&view=rev
Log:
[codeview] YAMLize all section offsets and indices in symbol records

We forgot to serialize these because llvm-readobj didn't dump them. They
are typically all zeros in an object file. The linker fills them in with
relocations before adding them to the PDB. Now we can properly round
trip these symbols through pdb2yaml -> yaml2pdb.

I made these fields optional with a zero default so that we can elide
them from our test cases.

Modified:
    llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
    llvm/trunk/test/DebugInfo/COFF/globals.ll
    llvm/trunk/test/DebugInfo/PDB/pdb-yaml-symbols.test

Modified: llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp?rev=305857&r1=305856&r2=305857&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp Tue Jun 20 16:19:22 2017
@@ -286,16 +286,15 @@ template <> void SymbolRecordImpl<Export
 }
 
 template <> void SymbolRecordImpl<ProcSym>::map(IO &IO) {
-  // TODO: Print the linkage name
-
-  IO.mapRequired("PtrParent", Symbol.Parent);
-  IO.mapRequired("PtrEnd", Symbol.End);
-  IO.mapRequired("PtrNext", Symbol.Next);
+  IO.mapOptional("PtrParent", Symbol.Parent, 0U);
+  IO.mapOptional("PtrEnd", Symbol.End, 0U);
+  IO.mapOptional("PtrNext", Symbol.Next, 0U);
   IO.mapRequired("CodeSize", Symbol.CodeSize);
   IO.mapRequired("DbgStart", Symbol.DbgStart);
   IO.mapRequired("DbgEnd", Symbol.DbgEnd);
   IO.mapRequired("FunctionType", Symbol.FunctionType);
-  IO.mapRequired("Segment", Symbol.Segment);
+  IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
+  IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
   IO.mapRequired("Flags", Symbol.Flags);
   IO.mapRequired("DisplayName", Symbol.Name);
 }
@@ -308,8 +307,8 @@ template <> void SymbolRecordImpl<Regist
 
 template <> void SymbolRecordImpl<PublicSym32>::map(IO &IO) {
   IO.mapRequired("Flags", Symbol.Flags);
-  IO.mapRequired("Seg", Symbol.Segment);
-  IO.mapRequired("Off", Symbol.Offset);
+  IO.mapOptional("Offset", Symbol.Offset, 0U);
+  IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
   IO.mapRequired("Name", Symbol.Name);
 }
 
@@ -325,8 +324,8 @@ template <> void SymbolRecordImpl<EnvBlo
 }
 
 template <> void SymbolRecordImpl<InlineSiteSym>::map(IO &IO) {
-  IO.mapRequired("PtrParent", Symbol.Parent);
-  IO.mapRequired("PtrEnd", Symbol.End);
+  IO.mapOptional("PtrParent", Symbol.Parent, 0U);
+  IO.mapOptional("PtrEnd", Symbol.End, 0U);
   IO.mapRequired("Inlinee", Symbol.Inlinee);
   // TODO: The binary annotations
 }
@@ -368,17 +367,17 @@ template <> void SymbolRecordImpl<DefRan
 }
 
 template <> void SymbolRecordImpl<BlockSym>::map(IO &IO) {
-  // TODO: Print the linkage name
-  IO.mapRequired("PtrParent", Symbol.Parent);
-  IO.mapRequired("PtrEnd", Symbol.End);
+  IO.mapOptional("PtrParent", Symbol.Parent, 0U);
+  IO.mapOptional("PtrEnd", Symbol.End, 0U);
   IO.mapRequired("CodeSize", Symbol.CodeSize);
-  IO.mapRequired("Segment", Symbol.Segment);
+  IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
+  IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
   IO.mapRequired("BlockName", Symbol.Name);
 }
 
 template <> void SymbolRecordImpl<LabelSym>::map(IO &IO) {
-  // TODO: Print the linkage name
-  IO.mapRequired("Segment", Symbol.Segment);
+  IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
+  IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
   IO.mapRequired("Flags", Symbol.Flags);
   IO.mapRequired("Flags", Symbol.Flags);
   IO.mapRequired("DisplayName", Symbol.Name);
@@ -428,8 +427,8 @@ template <> void SymbolRecordImpl<FrameP
 }
 
 template <> void SymbolRecordImpl<CallSiteInfoSym>::map(IO &IO) {
-  // TODO: Map Linkage Name
-  IO.mapRequired("Segment", Symbol.Segment);
+  IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
+  IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
   IO.mapRequired("Type", Symbol.Type);
 }
 
@@ -441,14 +440,13 @@ template <> void SymbolRecordImpl<FileSt
 }
 
 template <> void SymbolRecordImpl<HeapAllocationSiteSym>::map(IO &IO) {
-  // TODO: Map Linkage Name
-  IO.mapRequired("Segment", Symbol.Segment);
+  IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
+  IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
   IO.mapRequired("CallInstructionSize", Symbol.CallInstructionSize);
   IO.mapRequired("Type", Symbol.Type);
 }
 
 template <> void SymbolRecordImpl<FrameCookieSym>::map(IO &IO) {
-  // TODO: Map Linkage Name
   IO.mapRequired("Register", Symbol.Register);
   IO.mapRequired("CookieKind", Symbol.CookieKind);
   IO.mapRequired("Flags", Symbol.Flags);
@@ -487,16 +485,16 @@ template <> void SymbolRecordImpl<Consta
 }
 
 template <> void SymbolRecordImpl<DataSym>::map(IO &IO) {
-  // TODO: Map linkage name
   IO.mapRequired("Type", Symbol.Type);
-  IO.mapOptional("DataOffset", Symbol.DataOffset, 0U);
+  IO.mapOptional("Offset", Symbol.DataOffset, 0U);
   IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
   IO.mapRequired("DisplayName", Symbol.Name);
 }
 
 template <> void SymbolRecordImpl<ThreadLocalDataSym>::map(IO &IO) {
-  // TODO: Map linkage name
   IO.mapRequired("Type", Symbol.Type);
+  IO.mapOptional("Offset", Symbol.DataOffset, 0U);
+  IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
   IO.mapRequired("DisplayName", Symbol.Name);
 }
 }

Modified: llvm/trunk/test/DebugInfo/COFF/globals.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/globals.ll?rev=305857&r1=305856&r2=305857&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/COFF/globals.ll (original)
+++ llvm/trunk/test/DebugInfo/COFF/globals.ll Tue Jun 20 16:19:22 2017
@@ -1,5 +1,6 @@
 ; RUN: llc < %s | FileCheck %s --check-prefix=ASM
 ; RUN: llc < %s -filetype=obj | llvm-readobj - -codeview | FileCheck %s --check-prefix=OBJ
+; RUN: llc < %s -filetype=obj | obj2yaml | FileCheck %s --check-prefix=YAML
 
 ; C++ source to regenerate:
 ; $ cat t.cpp
@@ -109,6 +110,43 @@
 ; OBJ:   ]
 ; OBJ: ]
 
+; YAML-LABEL:  - Name:            '.debug$S'
+; YAML:    Subsections:
+; YAML:      - !Symbols
+; YAML:        Records:
+; YAML:          - Kind:            S_COMPILE3
+; YAML:            Compile3Sym:
+; YAML:      - !Symbols
+; YAML:        Records:
+; YAML:          - Kind:            S_LDATA32
+; YAML:            DataSym:
+; YAML-NOT: Segment
+; YAML:              Type:            116
+; YAML-NOT: Segment
+; YAML:              DisplayName:     first
+; YAML-NOT: Segment
+; YAML:          - Kind:            S_GTHREAD32
+; YAML:            ThreadLocalDataSym:
+; YAML:              Type:            4097
+; YAML:              DisplayName:     middle
+; YAML:          - Kind:            S_GDATA32
+; YAML:            DataSym:
+; YAML-NOT: Segment
+; YAML:              Type:            116
+; YAML-NOT: Offset
+; YAML-NOT: Segment
+; YAML:              DisplayName:     last
+; YAML-NOT: Segment
+
+; The missing offsets are represented as relocations against this section.
+; YAML:    Relocations:
+; YAML:      - VirtualAddress:  92
+; YAML:        SymbolName:      '?first@@3HA'
+; YAML:        Type:            IMAGE_REL_AMD64_SECREL
+; YAML:      - VirtualAddress:  96
+; YAML:        SymbolName:      '?first@@3HA'
+; YAML:        Type:            IMAGE_REL_AMD64_SECTION
+
 ; ModuleID = 't.cpp'
 source_filename = "t.cpp"
 target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"

Modified: llvm/trunk/test/DebugInfo/PDB/pdb-yaml-symbols.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdb-yaml-symbols.test?rev=305857&r1=305856&r2=305857&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/pdb-yaml-symbols.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/pdb-yaml-symbols.test Tue Jun 20 16:19:22 2017
@@ -55,6 +55,7 @@ YAML:               CodeSize:        10
 YAML:               DbgStart:        3
 YAML:               DbgEnd:          8
 YAML:               FunctionType:    4097
+YAML:               Offset:          16
 YAML:               Segment:         1
 YAML:               Flags:           [ HasFP ]
 YAML:               DisplayName:     main
@@ -178,4 +179,4 @@ YAML:               Rva:             204
 YAML:               Length:          8
 YAML:               Characteristics: 1107296320
 YAML:               Name:            .reloc
-YAML: ...
\ No newline at end of file
+YAML: ...




More information about the llvm-commits mailing list