From 09ff5f277b141d91cc09664fc8cbc23019d221d9 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Tue, 20 Jun 2017 21:19:22 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305857 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ObjectYAML/CodeViewYAMLSymbols.cpp | 46 +++++++++++++++----------------- test/DebugInfo/COFF/globals.ll | 38 ++++++++++++++++++++++++++ test/DebugInfo/PDB/pdb-yaml-symbols.test | 3 ++- 3 files changed, 62 insertions(+), 25 deletions(-) diff --git a/lib/ObjectYAML/CodeViewYAMLSymbols.cpp b/lib/ObjectYAML/CodeViewYAMLSymbols.cpp index edabe415fd0..83f3d55b8e5 100644 --- a/lib/ObjectYAML/CodeViewYAMLSymbols.cpp +++ b/lib/ObjectYAML/CodeViewYAMLSymbols.cpp @@ -286,16 +286,15 @@ template <> void SymbolRecordImpl::map(IO &IO) { } template <> void SymbolRecordImpl::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::map(IO &IO) { template <> void SymbolRecordImpl::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::map(IO &IO) { } template <> void SymbolRecordImpl::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::map(IO &IO) { } template <> void SymbolRecordImpl::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::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::map(IO &IO) { } template <> void SymbolRecordImpl::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::map(IO &IO) { } template <> void SymbolRecordImpl::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::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::map(IO &IO) { } template <> void SymbolRecordImpl::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::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); } } diff --git a/test/DebugInfo/COFF/globals.ll b/test/DebugInfo/COFF/globals.ll index aadf6ab557f..0d1b9413e3d 100644 --- a/test/DebugInfo/COFF/globals.ll +++ b/test/DebugInfo/COFF/globals.ll @@ -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" diff --git a/test/DebugInfo/PDB/pdb-yaml-symbols.test b/test/DebugInfo/PDB/pdb-yaml-symbols.test index 574065176b5..7afa1c3b2a7 100644 --- a/test/DebugInfo/PDB/pdb-yaml-symbols.test +++ b/test/DebugInfo/PDB/pdb-yaml-symbols.test @@ -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: 20480 YAML: Length: 8 YAML: Characteristics: 1107296320 YAML: Name: .reloc -YAML: ... \ No newline at end of file +YAML: ... -- 2.11.0