summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2017-06-20 21:19:22 +0000
committerReid Kleckner <rnk@google.com>2017-06-20 21:19:22 +0000
commit91ef9de643e9a7043bcf88599882e6d8345d46cf (patch)
tree5e5e886ce94d945d1a634b42c61134ab7ca45567
parent4d121e21823cf0b2c53829e1e2889582754f1ab9 (diff)
downloadbcm5719-llvm-91ef9de643e9a7043bcf88599882e6d8345d46cf.tar.gz
bcm5719-llvm-91ef9de643e9a7043bcf88599882e6d8345d46cf.zip
[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. llvm-svn: 305857
-rw-r--r--lld/test/COFF/Inputs/pdb1.yaml4
-rw-r--r--llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp46
-rw-r--r--llvm/test/DebugInfo/COFF/globals.ll38
-rw-r--r--llvm/test/DebugInfo/PDB/pdb-yaml-symbols.test3
4 files changed, 62 insertions, 29 deletions
diff --git a/lld/test/COFF/Inputs/pdb1.yaml b/lld/test/COFF/Inputs/pdb1.yaml
index 566f2da003c..90905ae191e 100644
--- a/lld/test/COFF/Inputs/pdb1.yaml
+++ b/lld/test/COFF/Inputs/pdb1.yaml
@@ -34,14 +34,10 @@ sections:
Records:
- Kind: S_GPROC32_ID
ProcSym:
- PtrParent: 0
- PtrEnd: 0
- PtrNext: 0
CodeSize: 14
DbgStart: 4
DbgEnd: 9
FunctionType: 4101
- Segment: 0
Flags: [ ]
DisplayName: main
- Kind: S_FRAMEPROC
diff --git a/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp b/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
index edabe415fd0..83f3d55b8e5 100644
--- a/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
+++ b/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
@@ -286,16 +286,15 @@ template <> void SymbolRecordImpl<ExportSym>::map(IO &IO) {
}
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<RegisterSym>::map(IO &IO) {
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<EnvBlockSym>::map(IO &IO) {
}
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<DefRangeRegisterRelSym>::map(IO &IO) {
}
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<FrameProcSym>::map(IO &IO) {
}
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<FileStaticSym>::map(IO &IO) {
}
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<ConstantSym>::map(IO &IO) {
}
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);
}
}
diff --git a/llvm/test/DebugInfo/COFF/globals.ll b/llvm/test/DebugInfo/COFF/globals.ll
index aadf6ab557f..0d1b9413e3d 100644
--- a/llvm/test/DebugInfo/COFF/globals.ll
+++ b/llvm/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/llvm/test/DebugInfo/PDB/pdb-yaml-symbols.test b/llvm/test/DebugInfo/PDB/pdb-yaml-symbols.test
index 574065176b5..7afa1c3b2a7 100644
--- a/llvm/test/DebugInfo/PDB/pdb-yaml-symbols.test
+++ b/llvm/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: ...
OpenPOWER on IntegriCloud