diff options
| author | Zachary Turner <zturner@google.com> | 2018-01-08 21:38:50 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2018-01-08 21:38:50 +0000 |
| commit | 59468f5a1edc8d1cc80c45f2c3012e1fad2be56e (patch) | |
| tree | c645e00856e43ddf66b7f057b587e1187c5528b7 | |
| parent | 281d20b601c8a2a77b9eac458cafb0482fa94c88 (diff) | |
| download | bcm5719-llvm-59468f5a1edc8d1cc80c45f2c3012e1fad2be56e.tar.gz bcm5719-llvm-59468f5a1edc8d1cc80c45f2c3012e1fad2be56e.zip | |
Fix uninitialized read error reported by MSAN.
The problem was that our Obj -> Yaml dumper had not been taught
to handle certain types of records. This meant that when I
generated the test input files, the records were still there but
none of its fields were filled out. So when it did the
Yaml -> Obj conversion as part of the test, it generated records
with garbage in them.
The patch here fixes the Obj <-> Yaml converter, and additionally
updates the test file with fresh Yaml generated by the fixed
converter.
llvm-svn: 322029
| -rw-r--r-- | lld/test/COFF/Inputs/pdb-file-statics-a.yaml | 72 | ||||
| -rw-r--r-- | lld/test/COFF/Inputs/pdb-file-statics-b.yaml | 25 | ||||
| -rw-r--r-- | llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp | 51 |
3 files changed, 127 insertions, 21 deletions
diff --git a/lld/test/COFF/Inputs/pdb-file-statics-a.yaml b/lld/test/COFF/Inputs/pdb-file-statics-a.yaml index 4c47092351a..1a0dbdb6785 100644 --- a/lld/test/COFF/Inputs/pdb-file-statics-a.yaml +++ b/lld/test/COFF/Inputs/pdb-file-statics-a.yaml @@ -100,12 +100,12 @@ sections: Checksums: - FileName: 'd:\src\llvmbuild\cl\debug\x64\a.cpp' Kind: MD5 - Checksum: 108D915B38B79821EA2169DBD317C259 + Checksum: 70DD90BF2C1A2E8D7C450DFA55E3062D - !InlineeLines HasExtraFiles: false Sites: - FileName: 'd:\src\llvmbuild\cl\debug\x64\a.cpp' - LineNum: 6 + LineNum: 8 Inlinee: 4099 - !StringTable Strings: @@ -1312,8 +1312,16 @@ sections: VarName: __formal - Kind: S_DEFRANGE_REGISTER DefRangeRegisterSym: + Register: 18 + MayHaveNoName: 0 + Range: + OffsetStart: 0 + ISectStart: 0 + Range: 10 + Gaps: - Kind: S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE DefRangeFramePointerRelFullScopeSym: + Register: 48 - Kind: S_CALLEES CallerSym: FuncID: [ 4103 ] @@ -1325,6 +1333,13 @@ sections: Name: x - Kind: S_DEFRANGE_REGISTER DefRangeRegisterSym: + Register: 18 + MayHaveNoName: 0 + Range: + OffsetStart: 10 + ISectStart: 0 + Range: 9 + Gaps: - Kind: S_FRAMEPROC FrameProcSym: TotalFrameBytes: 40 @@ -1351,19 +1366,19 @@ sections: - FileName: 'd:\src\llvmbuild\cl\debug\x64\a.cpp' Lines: - Offset: 0 - LineStart: 5 + LineStart: 7 IsStatement: true EndDelta: 0 - Offset: 4 - LineStart: 6 + LineStart: 8 IsStatement: true EndDelta: 0 - Offset: 14 - LineStart: 7 + LineStart: 9 IsStatement: true EndDelta: 0 - Offset: 19 - LineStart: 8 + LineStart: 10 IsStatement: true EndDelta: 0 Columns: @@ -1427,10 +1442,25 @@ sections: VarName: argc - Kind: S_DEFRANGE_REGISTER DefRangeRegisterSym: + Register: 18 + MayHaveNoName: 0 + Range: + OffsetStart: 0 + ISectStart: 0 + Range: 16 + Gaps: - Kind: S_DEFRANGE_REGISTER DefRangeRegisterSym: + Register: 18 + MayHaveNoName: 1 + Range: + OffsetStart: 27 + ISectStart: 0 + Range: 5 + Gaps: - Kind: S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE DefRangeFramePointerRelFullScopeSym: + Register: 48 - Kind: S_LOCAL LocalSym: Type: 4098 @@ -1438,10 +1468,25 @@ sections: VarName: argv - Kind: S_DEFRANGE_REGISTER DefRangeRegisterSym: + Register: 331 + MayHaveNoName: 0 + Range: + OffsetStart: 0 + ISectStart: 0 + Range: 21 + Gaps: - Kind: S_DEFRANGE_REGISTER DefRangeRegisterSym: + Register: 331 + MayHaveNoName: 1 + Range: + OffsetStart: 27 + ISectStart: 0 + Range: 5 + Gaps: - Kind: S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE DefRangeFramePointerRelFullScopeSym: + Register: 56 - Kind: S_INLINESITE InlineSiteSym: Inlinee: 4099 @@ -1458,6 +1503,15 @@ sections: Name: x - Kind: S_DEFRANGE_REGISTER DefRangeRegisterSym: + Register: 17 + MayHaveNoName: 0 + Range: + OffsetStart: 10 + ISectStart: 0 + Range: 22 + Gaps: + - GapStartOffset: 11 + Range: 6 - Kind: S_FRAMEPROC FrameProcSym: TotalFrameBytes: 40 @@ -1493,15 +1547,15 @@ sections: - FileName: 'd:\src\llvmbuild\cl\debug\x64\a.cpp' Lines: - Offset: 0 - LineStart: 10 + LineStart: 12 IsStatement: true EndDelta: 0 - Offset: 4 - LineStart: 11 + LineStart: 13 IsStatement: true EndDelta: 0 - Offset: 27 - LineStart: 13 + LineStart: 15 IsStatement: true EndDelta: 0 Columns: diff --git a/lld/test/COFF/Inputs/pdb-file-statics-b.yaml b/lld/test/COFF/Inputs/pdb-file-statics-b.yaml index 82e10daf314..f74bab70347 100644 --- a/lld/test/COFF/Inputs/pdb-file-statics-b.yaml +++ b/lld/test/COFF/Inputs/pdb-file-statics-b.yaml @@ -100,7 +100,7 @@ sections: Checksums: - FileName: 'd:\src\llvmbuild\cl\debug\x64\b.cpp' Kind: MD5 - Checksum: 2B9F08E2C7D63D3033E1997500CE3C53 + Checksum: 8B4E383DAF442E63771294D52BF55155 - !StringTable Strings: - 'd:\src\llvmbuild\cl\debug\x64\b.cpp' @@ -1287,8 +1287,16 @@ sections: VarName: __formal - Kind: S_DEFRANGE_REGISTER DefRangeRegisterSym: + Register: 18 + MayHaveNoName: 0 + Range: + OffsetStart: 0 + ISectStart: 0 + Range: 10 + Gaps: - Kind: S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE DefRangeFramePointerRelFullScopeSym: + Register: 48 - Kind: S_CALLEES CallerSym: FuncID: [ 4099 ] @@ -1300,6 +1308,13 @@ sections: Name: y - Kind: S_DEFRANGE_REGISTER DefRangeRegisterSym: + Register: 18 + MayHaveNoName: 0 + Range: + OffsetStart: 10 + ISectStart: 0 + Range: 9 + Gaps: - Kind: S_FRAMEPROC FrameProcSym: TotalFrameBytes: 40 @@ -1326,19 +1341,19 @@ sections: - FileName: 'd:\src\llvmbuild\cl\debug\x64\b.cpp' Lines: - Offset: 0 - LineStart: 5 + LineStart: 7 IsStatement: true EndDelta: 0 - Offset: 4 - LineStart: 6 + LineStart: 8 IsStatement: true EndDelta: 0 - Offset: 14 - LineStart: 7 + LineStart: 9 IsStatement: true EndDelta: 0 - Offset: 19 - LineStart: 8 + LineStart: 10 IsStatement: true EndDelta: 0 Columns: diff --git a/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp b/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp index 199a65a2870..f67a0db690e 100644 --- a/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp +++ b/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp @@ -40,6 +40,7 @@ using namespace llvm::CodeViewYAML::detail; using namespace llvm::yaml; LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(TypeIndex) +LLVM_YAML_IS_SEQUENCE_VECTOR(LocalVariableAddrGap) // We only need to declare these, the definitions are in CodeViewYAMLTypes.cpp LLVM_YAML_DECLARE_SCALAR_TRAITS(APSInt, QuotingType::None) @@ -181,6 +182,24 @@ void ScalarEnumerationTraits<FrameCookieKind>::enumeration( } namespace llvm { +namespace yaml { +template <> struct MappingTraits<LocalVariableAddrRange> { + static void mapping(IO &io, LocalVariableAddrRange &Range) { + io.mapRequired("OffsetStart", Range.OffsetStart); + io.mapRequired("ISectStart", Range.ISectStart); + io.mapRequired("Range", Range.Range); + } +}; +template <> struct MappingTraits<LocalVariableAddrGap> { + static void mapping(IO &io, LocalVariableAddrGap &Gap) { + io.mapRequired("GapStartOffset", Gap.GapStartOffset); + io.mapRequired("Range", Gap.Range); + } +}; +} // namespace yaml +} // namespace llvm + +namespace llvm { namespace CodeViewYAML { namespace detail { @@ -353,32 +372,50 @@ template <> void SymbolRecordImpl<LocalSym>::map(IO &IO) { } template <> void SymbolRecordImpl<DefRangeSym>::map(IO &IO) { - // TODO: Print the subfields + IO.mapRequired("Program", Symbol.Program); + IO.mapRequired("Range", Symbol.Range); + IO.mapRequired("Gaps", Symbol.Gaps); } template <> void SymbolRecordImpl<DefRangeSubfieldSym>::map(IO &IO) { - // TODO: Print the subfields + IO.mapRequired("Program", Symbol.Program); + IO.mapRequired("OffsetInParent", Symbol.OffsetInParent); + IO.mapRequired("Range", Symbol.Range); + IO.mapRequired("Gaps", Symbol.Gaps); } template <> void SymbolRecordImpl<DefRangeRegisterSym>::map(IO &IO) { - // TODO: Print the subfields + IO.mapRequired("Register", Symbol.Hdr.Register); + IO.mapRequired("MayHaveNoName", Symbol.Hdr.MayHaveNoName); + IO.mapRequired("Range", Symbol.Range); + IO.mapRequired("Gaps", Symbol.Gaps); } template <> void SymbolRecordImpl<DefRangeFramePointerRelSym>::map(IO &IO) { - // TODO: Print the subfields + IO.mapRequired("Offset", Symbol.Offset); + IO.mapRequired("Range", Symbol.Range); + IO.mapRequired("Gaps", Symbol.Gaps); } template <> void SymbolRecordImpl<DefRangeSubfieldRegisterSym>::map(IO &IO) { - // TODO: Print the subfields + IO.mapRequired("Register", Symbol.Hdr.Register); + IO.mapRequired("MayHaveNoName", Symbol.Hdr.MayHaveNoName); + IO.mapRequired("OffsetInParent", Symbol.Hdr.OffsetInParent); + IO.mapRequired("Range", Symbol.Range); + IO.mapRequired("Gaps", Symbol.Gaps); } template <> void SymbolRecordImpl<DefRangeFramePointerRelFullScopeSym>::map(IO &IO) { - // TODO: Print the subfields + IO.mapRequired("Register", Symbol.Offset); } template <> void SymbolRecordImpl<DefRangeRegisterRelSym>::map(IO &IO) { - // TODO: Print the subfields + IO.mapRequired("Register", Symbol.Hdr.Register); + IO.mapRequired("Flags", Symbol.Hdr.Flags); + IO.mapRequired("BasePointerOffset", Symbol.Hdr.BasePointerOffset); + IO.mapRequired("Range", Symbol.Range); + IO.mapRequired("Gaps", Symbol.Gaps); } template <> void SymbolRecordImpl<BlockSym>::map(IO &IO) { |

