From d95f8e7aef79393fbb95b8483c9f494da75b1d83 Mon Sep 17 00:00:00 2001 From: Georgii Rymar Date: Thu, 11 Jun 2020 23:18:40 +0300 Subject: [PATCH] [yaml2obj][MachO] - Fix PubName/PubType handling. `PubName` and `PubType` are optional fields since D80722. They are defined as: Optional PubNames; Optional PubTypes; And initialized in the following way: IO.mapOptional("debug_pubnames", DWARF.PubNames); IO.mapOptional("debug_pubtypes", DWARF.PubTypes); But problem is that because of the issue in `YAMLTraits.cpp`, when there are no `debug_pubnames`/`debug_pubtypes` keys in a YAML description, they are not initialized to `Optional::None` as the code expects, but they are initialized to default `PubSection()` instances. Because of this, the `if` condition in the following code is always true: if (Obj.DWARF.PubNames) Err = DWARFYAML::emitPubSection(OS, *Obj.DWARF.PubNames, Obj.IsLittleEndian); What means `emitPubSection` is always called and it writes few values. This patch fixes the issue. I've reduced `sizeofcmds` by size of data previously written because of this bug. Differential revision: https://reviews.llvm.org/D81686 --- llvm/lib/Support/YAMLTraits.cpp | 2 ++ llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Support/YAMLTraits.cpp b/llvm/lib/Support/YAMLTraits.cpp index f27be3e..752fab2 100644 --- a/llvm/lib/Support/YAMLTraits.cpp +++ b/llvm/lib/Support/YAMLTraits.cpp @@ -166,6 +166,8 @@ bool Input::preflightKey(const char *Key, bool Required, bool, bool &UseDefault, if (!MN) { if (Required || !isa(CurrentNode)) setError(CurrentNode, "not a mapping"); + else + UseDefault = true; return false; } MN->ValidKeys.push_back(Key); diff --git a/llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml b/llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml index 4faac06..0bc510d 100644 --- a/llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml +++ b/llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml @@ -356,7 +356,8 @@ DWARF: ## contents, if the "debug_pubnames"/"debug_pubtypes" entry doesn't exist in the ## "DWARF" entry. -# RUN: yaml2obj --docnum=2 %s | obj2yaml | FileCheck %s --check-prefix=EMPTY +# RUN: yaml2obj --docnum=2 %s -o %t2 +# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=EMPTY # EMPTY: Sections: # EMPTY-NEXT: - sectname: __debug_pubnames @@ -394,7 +395,7 @@ FileHeader: cpusubtype: 0x00000003 filetype: 0x0000000A ncmds: 1 - sizeofcmds: 1800 + sizeofcmds: 1772 flags: 0x00000000 reserved: 0x00000000 LoadCommands: -- 2.7.4