<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Adrian,</div><div class=""><br class=""></div><div class="">I had a lengthy discussion with David and Chandler at Google a few weeks back discussing the YAML approach. It solves several problems that the assembly and IR testing approaches don't.</div><div class=""><br class=""></div><div class="">First and foremost it allows for bit-for-bit identical conversion of debug information into yaml and back into binary. Doing bit-for-bit identical round-tripping is required for being using the infrastructure to test debug information generated by multiple compilers. In particular because the structure of the DWARF from an IR file could change as LLVM changes, we need to be able to have stable tests for DWARF that are insulated from that change.</div><div class=""><br class=""></div><div class="">In terms of the YAML syntax being verbose. I suggested previously that we could come back later and construct a less verbose syntax that would be more suited for hand writing tests. This syntax is mostly targeted for generating a test case from a binary. It also can be used to make slight modifications, but there are restrictions on the modifications that can be safely made.</div><div class=""><br class=""></div><div class="">My intent for building the verbose syntax at the starting point is that it can be used for a much wider variety of test cases. While it may not be as ideal as a simplified syntax for simple tests, it is applicable to a much wider variety of tests.</div><div class=""><br class=""></div><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 3, 2017, at 3:23 PM, Adrian Prantl <<a href="mailto:aprantl@apple.com" class="">aprantl@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class=""><br class="Apple-interchange-newline">On Dec 20, 2016, at 1:35 PM, Chris Bieneman via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class=""><br class="">Author: cbieneman<br class="">Date: Tue Dec 20 15:35:31 2016<br class="">New Revision: 290204<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=290204&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=290204&view=rev</a><br class="">Log:<br class="">[ObjectYAML] Support for DWARF debug_info section<br class=""><br class="">This patch adds support for YAML<->DWARF for debug_info sections.<br class=""><br class="">This re-lands r290147, after fixing the issue that caused bots to fail (thank you UBSan!).<br class=""><br class="">Added:<br class="">  llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_info.yaml<br class="">Modified:<br class="">  llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h<br class="">  llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h<br class="">  llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h<br class="">  llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h<br class="">  llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp<br class="">  llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp<br class="">  llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp<br class="">  llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp<br class="">  llvm/trunk/tools/yaml2obj/yaml2macho.cpp<br class="">  llvm/trunk/tools/yaml2obj/yaml2obj.h<br class=""><br class="">Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h (original)<br class="">+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h Tue Dec 20 15:35:31 2016<br class="">@@ -82,6 +82,8 @@ public:<br class=""> Optional<uint64_t> getAsAddress() const;<br class=""> Optional<uint64_t> getAsSectionOffset() const;<br class=""> Optional<ArrayRef<uint8_t>> getAsBlock() const;<br class="">+  Optional<uint64_t> getAsCStringOffset() const;<br class="">+  Optional<uint64_t> getAsReferenceUVal() const;<br class=""> /// Get the fixed byte size for a given form.<br class=""> ///<br class=""> /// If the form always has a fixed valid byte size that doesn't depend on a<br class=""><br class="">Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h (original)<br class="">+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h Tue Dec 20 15:35:31 2016<br class="">@@ -11,6 +11,7 @@<br class="">#define LLVM_LIB_DEBUGINFO_DWARFUNIT_H<br class=""><br class="">#include "llvm/ADT/Optional.h"<br class="">+#include "llvm/ADT/iterator_range.h"<br class="">#include "llvm/ADT/STLExtras.h"<br class="">#include "llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h"<br class="">#include "llvm/DebugInfo/DWARF/DWARFDebugInfoEntry.h"<br class="">@@ -127,6 +128,8 @@ class DWARFUnit {<br class=""> uint64_t BaseAddr;<br class=""> // The compile unit debug information entry items.<br class=""> std::vector<DWARFDebugInfoEntry> DieArray;<br class="">+  typedef iterator_range<std::vector<DWARFDebugInfoEntry>::iterator><br class="">+      die_iterator_range;<br class=""><br class=""> class DWOHolder {<br class="">   object::OwningBinary<object::ObjectFile> DWOFile;<br class="">@@ -288,6 +291,11 @@ public:<br class="">   return 0;<br class=""> }<br class=""><br class="">+  die_iterator_range dies() {<br class="">+    extractDIEsIfNeeded(false);<br class="">+    return die_iterator_range(DieArray.begin(), DieArray.end());<br class="">+  }<br class="">+<br class="">private:<br class=""> /// Size in bytes of the .debug_info data associated with this compile unit.<br class=""> size_t getDebugInfoSize() const { return Length + 4 - getHeaderSize(); }<br class=""><br class="">Modified: llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h (original)<br class="">+++ llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h Tue Dec 20 15:35:31 2016<br class="">@@ -66,6 +66,25 @@ struct PubSection {<br class=""> std::vector<PubEntry> Entries;<br class="">};<br class=""><br class="">+struct FormValue {<br class="">+  llvm::yaml::Hex64 Value;<br class="">+  StringRef CStr;<br class="">+  std::vector<llvm::yaml::Hex8> BlockData;<br class="">+};<br class="">+<br class="">+struct Entry {<br class="">+  llvm::yaml::Hex32 AbbrCode;<br class="">+  std::vector<FormValue> Values;<br class="">+};<br class="">+<br class="">+struct Unit {<br class="">+  uint32_t Length;<br class="">+  uint16_t Version;<br class="">+  uint32_t AbbrOffset;<br class="">+  uint8_t AddrSize;<br class="">+  std::vector<Entry> Entries;<br class="">+};<br class="">+<br class="">struct Data {<br class=""> std::vector<Abbrev> AbbrevDecls;<br class=""> std::vector<StringRef> DebugStrings;<br class="">@@ -75,6 +94,8 @@ struct Data {<br class=""><br class=""> PubSection GNUPubNames;<br class=""> PubSection GNUPubTypes;<br class="">+  <br class="">+  std::vector<Unit> CompileUnits;<br class=""><br class=""> bool isEmpty() const;<br class="">};<br class="">@@ -82,12 +103,17 @@ struct Data {<br class="">} // namespace llvm::DWARFYAML<br class="">} // namespace llvm<br class=""><br class="">+LLVM_YAML_IS_SEQUENCE_VECTOR(uint8_t)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)<br class="">+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::Hex8)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::AttributeAbbrev)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Abbrev)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARangeDescriptor)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARange)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::PubEntry)<br class="">+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Unit)<br class="">+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::FormValue)<br class="">+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Entry)<br class=""><br class="">namespace llvm {<br class="">namespace yaml {<br class="">@@ -120,6 +146,18 @@ template <> struct MappingTraits<DWARFYA<br class=""> static void mapping(IO &IO, DWARFYAML::PubSection &Section);<br class="">};<br class=""><br class="">+template <> struct MappingTraits<DWARFYAML::Unit> {<br class="">+  static void mapping(IO &IO, DWARFYAML::Unit &Unit);<br class="">+};<br class="">+<br class="">+template <> struct MappingTraits<DWARFYAML::Entry> {<br class="">+  static void mapping(IO &IO, DWARFYAML::Entry &Entry);<br class="">+};<br class="">+<br class="">+template <> struct MappingTraits<DWARFYAML::FormValue> {<br class="">+  static void mapping(IO &IO, DWARFYAML::FormValue &FormValue);<br class="">+};<br class="">+<br class="">#define HANDLE_DW_TAG(unused, name)                                            \<br class=""> io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name);<br class=""><br class=""><br class="">Modified: llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h (original)<br class="">+++ llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h Tue Dec 20 15:35:31 2016<br class="">@@ -138,7 +138,6 @@ struct UniversalBinary {<br class=""><br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::LoadCommand)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Section)<br class="">-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::Hex8)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::Hex64)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(int64_t)<br class="">LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::RebaseOpcode)<br class=""><br class="">Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp (original)<br class="">+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp Tue Dec 20 15:35:31 2016<br class="">@@ -661,3 +661,15 @@ Optional<ArrayRef<uint8_t>> DWARFFormVal<br class=""> return makeArrayRef(Value.data, Value.uval);<br class="">}<br class=""><br class="">+Optional<uint64_t> DWARFFormValue::getAsCStringOffset() const {<br class="">+  if (!isFormClass(FC_String) && Form == DW_FORM_string)<br class="">+    return None;<br class="">+  return Value.uval;<br class="">+}<br class="">+<br class="">+Optional<uint64_t> DWARFFormValue::getAsReferenceUVal() const {<br class="">+  if (!isFormClass(FC_Reference))<br class="">+    return None;<br class="">+  return Value.uval;<br class="">+}<br class="">+<br class=""><br class="">Modified: llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp (original)<br class="">+++ llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp Tue Dec 20 15:35:31 2016<br class="">@@ -22,8 +22,9 @@ bool DWARFYAML::Data::isEmpty() const {<br class=""><br class="">namespace yaml {<br class=""><br class="">-void MappingTraits<DWARFYAML::Data>::mapping(<br class="">-    IO &IO, DWARFYAML::Data &DWARF) {<br class="">+void MappingTraits<DWARFYAML::Data>::mapping(IO &IO, DWARFYAML::Data &DWARF) {<br class="">+  auto oldContext = IO.getContext();<br class="">+  IO.setContext(&DWARF);<br class=""> IO.mapOptional("debug_str", DWARF.DebugStrings);<br class=""> IO.mapOptional("debug_abbrev", DWARF.AbbrevDecls);<br class=""> if(!DWARF.ARanges.empty() || !IO.outputting())<br class="">@@ -36,10 +37,12 @@ void MappingTraits<DWARFYAML::Data>::map<br class="">   IO.mapOptional("debug_gnu_pubnames", DWARF.GNUPubNames);<br class=""> if(!DWARF.GNUPubTypes.Entries.empty() || !IO.outputting())<br class="">   IO.mapOptional("debug_gnu_pubtypes", DWARF.GNUPubTypes);<br class="">+  IO.mapOptional("debug_info", DWARF.CompileUnits);<br class="">+  IO.setContext(&oldContext);<br class="">}<br class=""><br class="">-void MappingTraits<DWARFYAML::Abbrev>::mapping(<br class="">-    IO &IO, DWARFYAML::Abbrev &Abbrev) {<br class="">+void MappingTraits<DWARFYAML::Abbrev>::mapping(IO &IO,<br class="">+                                               DWARFYAML::Abbrev &Abbrev) {<br class=""> IO.mapRequired("Code", Abbrev.Code);<br class=""> IO.mapRequired("Tag", Abbrev.Tag);<br class=""> IO.mapRequired("Children", Abbrev.Children);<br class="">@@ -90,6 +93,28 @@ void MappingTraits<DWARFYAML::PubSection<br class=""> IO.setContext(OldContext);<br class="">}<br class=""><br class="">+void MappingTraits<DWARFYAML::Unit>::mapping(IO &IO, DWARFYAML::Unit &Unit) {<br class="">+  IO.mapRequired("Length", Unit.Length);<br class="">+  IO.mapRequired("Version", Unit.Version);<br class="">+  IO.mapRequired("AbbrOffset", Unit.AbbrOffset);<br class="">+  IO.mapRequired("AddrSize", Unit.AddrSize);<br class="">+  IO.mapOptional("Entries", Unit.Entries);<br class="">+}<br class="">+<br class="">+void MappingTraits<DWARFYAML::Entry>::mapping(IO &IO, DWARFYAML::Entry &Entry) {<br class="">+  IO.mapRequired("AbbrCode", Entry.AbbrCode);<br class="">+  IO.mapRequired("Values", Entry.Values);<br class="">+}<br class="">+<br class="">+void MappingTraits<DWARFYAML::FormValue>::mapping(IO &IO,<br class="">+                                             DWARFYAML::FormValue &FormValue) {<br class="">+  IO.mapOptional("Value", FormValue.Value);<br class="">+  if(!FormValue.CStr.empty() || !IO.outputting())<br class="">+    IO.mapOptional("CStr", FormValue.CStr);<br class="">+  if(!FormValue.BlockData.empty() || !IO.outputting())<br class="">+    IO.mapOptional("BlockData", FormValue.BlockData);<br class="">+}<br class="">+<br class="">} // namespace llvm::yaml<br class=""><br class="">} // namespace llvm<br class=""><br class="">Added: llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_info.yaml<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_info.yaml?rev=290204&view=auto" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_info.yaml?rev=290204&view=auto</a><br class="">==============================================================================<br class="">--- llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_info.yaml (added)<br class="">+++ llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_info.yaml Tue Dec 20 15:35:31 2016<br class="">@@ -0,0 +1,525 @@<br class="">+# RUN: yaml2obj %s | obj2yaml | FileCheck %s<br class="">+<br class="">+--- !mach-o<br class="">+FileHeader:      <br class="">+  magic:           0xFEEDFACF<br class="">+  cputype:         0x01000007<br class="">+  cpusubtype:      0x00000003<br class="">+  filetype:        0x0000000A<br class="">+  ncmds:           5<br class="">+  sizeofcmds:      1800<br class="">+  flags:           0x00000000<br class="">+  reserved:        0x00000000<br class="">+LoadCommands:    <br class="">+  - cmd:             LC_SEGMENT_64<br class="">+    cmdsize:         72<br class="">+    segname:         __PAGEZERO<br class="">+    vmaddr:          0<br class="">+    vmsize:          4294967296<br class="">+    fileoff:         0<br class="">+    filesize:        0<br class="">+    maxprot:         0<br class="">+    initprot:        0<br class="">+    nsects:          0<br class="">+    flags:           0<br class="">+  - cmd:             LC_SEGMENT_64<br class="">+    cmdsize:         472<br class="">+    segname:         __TEXT<br class="">+    vmaddr:          4294967296<br class="">+    vmsize:          4096<br class="">+    fileoff:         0<br class="">+    filesize:        0<br class="">+    maxprot:         7<br class="">+    initprot:        5<br class="">+    nsects:          5<br class="">+    flags:           0<br class="">+    Sections:        <br class="">+      - sectname:        __text<br class="">+        segname:         __TEXT<br class="">+        addr:            0x0000000100000F50<br class="">+        size:            52<br class="">+        offset:          0x00000000<br class="">+        align:           4<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x80000400<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __stubs<br class="">+        segname:         __TEXT<br class="">+        addr:            0x0000000100000F84<br class="">+        size:            6<br class="">+        offset:          0x00000000<br class="">+        align:           1<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x80000408<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000006<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __stub_helper<br class="">+        segname:         __TEXT<br class="">+        addr:            0x0000000100000F8C<br class="">+        size:            26<br class="">+        offset:          0x00000000<br class="">+        align:           2<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x80000400<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __cstring<br class="">+        segname:         __TEXT<br class="">+        addr:            0x0000000100000FA6<br class="">+        size:            14<br class="">+        offset:          0x00000000<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000002<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __unwind_info<br class="">+        segname:         __TEXT<br class="">+        addr:            0x0000000100000FB4<br class="">+        size:            72<br class="">+        offset:          0x00000000<br class="">+        align:           2<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+  - cmd:             LC_SEGMENT_64<br class="">+    cmdsize:         232<br class="">+    segname:         __DATA<br class="">+    vmaddr:          4294971392<br class="">+    vmsize:          4096<br class="">+    fileoff:         0<br class="">+    filesize:        0<br class="">+    maxprot:         7<br class="">+    initprot:        3<br class="">+    nsects:          2<br class="">+    flags:           0<br class="">+    Sections:        <br class="">+      - sectname:        __nl_symbol_ptr<br class="">+        segname:         __DATA<br class="">+        addr:            0x0000000100001000<br class="">+        size:            16<br class="">+        offset:          0x00000000<br class="">+        align:           3<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000006<br class="">+        reserved1:       0x00000001<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __la_symbol_ptr<br class="">+        segname:         __DATA<br class="">+        addr:            0x0000000100001010<br class="">+        size:            8<br class="">+        offset:          0x00000000<br class="">+        align:           3<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000007<br class="">+        reserved1:       0x00000003<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+  - cmd:             LC_SEGMENT_64<br class="">+    cmdsize:         72<br class="">+    segname:         __LINKEDIT<br class="">+    vmaddr:          4294975488<br class="">+    vmsize:          4096<br class="">+    fileoff:         4096<br class="">+    filesize:        60<br class="">+    maxprot:         7<br class="">+    initprot:        1<br class="">+    nsects:          0<br class="">+    flags:           0<br class="">+  - cmd:             LC_SEGMENT_64<br class="">+    cmdsize:         952<br class="">+    segname:         __DWARF<br class="">+    vmaddr:          4294979584<br class="">+    vmsize:          4096<br class="">+    fileoff:         8192<br class="">+    filesize:        764<br class="">+    maxprot:         7<br class="">+    initprot:        3<br class="">+    nsects:          11<br class="">+    flags:           0<br class="">+    Sections:        <br class="">+      - sectname:        __debug_line<br class="">+        segname:         __DWARF<br class="">+        addr:            0x0000000100003000<br class="">+        size:            69<br class="">+        offset:          0x00002000<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __debug_pubnames<br class="">+        segname:         __DWARF<br class="">+        addr:            0x0000000100003045<br class="">+        size:            27<br class="">+        offset:          0x00002045<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __debug_pubtypes<br class="">+        segname:         __DWARF<br class="">+        addr:            0x0000000100003060<br class="">+        size:            35<br class="">+        offset:          0x00002060<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __debug_aranges<br class="">+        segname:         __DWARF<br class="">+        addr:            0x0000000100003083<br class="">+        size:            48<br class="">+        offset:          0x00002083<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __debug_info<br class="">+        segname:         __DWARF<br class="">+        addr:            0x00000001000030B3<br class="">+        size:            121<br class="">+        offset:          0x000020B3<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __debug_abbrev<br class="">+        segname:         __DWARF<br class="">+        addr:            0x000000010000312C<br class="">+        size:            76<br class="">+        offset:          0x0000212C<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __debug_str<br class="">+        segname:         __DWARF<br class="">+        addr:            0x0000000100003178<br class="">+        size:            142<br class="">+        offset:          0x00002178<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __apple_names<br class="">+        segname:         __DWARF<br class="">+        addr:            0x0000000100003206<br class="">+        size:            60<br class="">+        offset:          0x00002206<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __apple_namespac<br class="">+        segname:         __DWARF<br class="">+        addr:            0x0000000100003242<br class="">+        size:            36<br class="">+        offset:          0x00002242<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __apple_types<br class="">+        segname:         __DWARF<br class="">+        addr:            0x0000000100003266<br class="">+        size:            114<br class="">+        offset:          0x00002266<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+      - sectname:        __apple_objc<br class="">+        segname:         __DWARF<br class="">+        addr:            0x00000001000032D8<br class="">+        size:            36<br class="">+        offset:          0x000022D8<br class="">+        align:           0<br class="">+        reloff:          0x00000000<br class="">+        nreloc:          0<br class="">+        flags:           0x00000000<br class="">+        reserved1:       0x00000000<br class="">+        reserved2:       0x00000000<br class="">+        reserved3:       0x00000000<br class="">+LinkEditData:    <br class="">+  NameList:        <br class="">+    - n_strx:          2<br class="">+      n_type:          0x0F<br class="">+      n_sect:          1<br class="">+      n_desc:          16<br class="">+      n_value:         4294967296<br class="">+    - n_strx:          22<br class="">+      n_type:          0x0F<br class="">+      n_sect:          1<br class="">+      n_desc:          0<br class="">+      n_value:         4294971216<br class="">+  StringTable:     <br class="">+    - ''<br class="">+    - ''<br class="">+    - __mh_execute_header<br class="">+    - _main<br class="">+DWARF:           <br class="">+  debug_abbrev:    <br class="">+    - Code:            0x00000001<br class="">+      Tag:             DW_TAG_compile_unit<br class="">+      Children:        DW_CHILDREN_yes<br class="">+      Attributes:      <br class="">+        - Attribute:       DW_AT_producer<br class="">+          Form:            DW_FORM_strp<br class="">+        - Attribute:       DW_AT_language<br class="">+          Form:            DW_FORM_data2<br class="">+        - Attribute:       DW_AT_name<br class="">+          Form:            DW_FORM_strp<br class="">+        - Attribute:       DW_AT_stmt_list<br class="">+          Form:            DW_FORM_sec_offset<br class="">+        - Attribute:       DW_AT_comp_dir<br class="">+          Form:            DW_FORM_strp<br class="">+        - Attribute:       DW_AT_low_pc<br class="">+          Form:            DW_FORM_addr<br class="">+        - Attribute:       DW_AT_high_pc<br class="">+          Form:            DW_FORM_data4<br class="">+    - Code:            0x00000002<br class="">+      Tag:             DW_TAG_subprogram<br class="">+      Children:        DW_CHILDREN_yes<br class="">+      Attributes:      <br class="">+        - Attribute:       DW_AT_low_pc<br class="">+          Form:            DW_FORM_addr<br class="">+        - Attribute:       DW_AT_high_pc<br class="">+          Form:            DW_FORM_data4<br class="">+        - Attribute:       DW_AT_frame_base<br class="">+          Form:            DW_FORM_exprloc<br class="">+        - Attribute:       DW_AT_name<br class="">+          Form:            DW_FORM_strp<br class="">+        - Attribute:       DW_AT_decl_file<br class="">+          Form:            DW_FORM_data1<br class="">+        - Attribute:       DW_AT_decl_line<br class="">+          Form:            DW_FORM_data1<br class="">+        - Attribute:       DW_AT_prototyped<br class="">+          Form:            DW_FORM_flag_present<br class="">+        - Attribute:       DW_AT_type<br class="">+          Form:            DW_FORM_ref4<br class="">+        - Attribute:       DW_AT_external<br class="">+          Form:            DW_FORM_flag_present<br class="">+    - Code:            0x00000003<br class="">+      Tag:             DW_TAG_formal_parameter<br class="">+      Children:        DW_CHILDREN_no<br class="">+      Attributes:      <br class="">+        - Attribute:       DW_AT_location<br class="">+          Form:            DW_FORM_exprloc<br class="">+        - Attribute:       DW_AT_name<br class="">+          Form:            DW_FORM_strp<br class="">+        - Attribute:       DW_AT_decl_file<br class="">+          Form:            DW_FORM_data1<br class="">+        - Attribute:       DW_AT_decl_line<br class="">+          Form:            DW_FORM_data1<br class="">+        - Attribute:       DW_AT_type<br class="">+          Form:            DW_FORM_ref4<br class="">+    - Code:            0x00000004<br class="">+      Tag:             DW_TAG_base_type<br class="">+      Children:        DW_CHILDREN_no<br class="">+      Attributes:      <br class="">+        - Attribute:       DW_AT_name<br class="">+          Form:            DW_FORM_strp<br class="">+        - Attribute:       DW_AT_encoding<br class="">+          Form:            DW_FORM_data1<br class="">+        - Attribute:       DW_AT_byte_size<br class="">+          Form:            DW_FORM_data1<br class="">+    - Code:            0x00000005<br class="">+      Tag:             DW_TAG_pointer_type<br class="">+      Children:        DW_CHILDREN_no<br class="">+      Attributes:      <br class="">+        - Attribute:       DW_AT_type<br class="">+          Form:            DW_FORM_ref4<br class="">+  debug_aranges:   <br class="">+    - Length:          44<br class="">+      Version:         2<br class="">+      CuOffset:        0<br class="">+      AddrSize:        8<br class="">+      SegSize:         0<br class="">+      Descriptors:     <br class="">+        - Address:         0x0000000100000F50<br class="">+          Length:          52<br class="">+  debug_info:      <br class="">+    - Length:          117<br class="">+      Version:         4<br class="">+      AbbrOffset:      0<br class="">+      AddrSize:        8<br class="">+      Entries:         <br class="">+        - AbbrCode:        0x00000001<br class="">+          Values:          <br class="">+            - Value:           0x0000000000000001<br class="">+            - Value:           0x000000000000000C<br class="">+            - Value:           0x0000000000000038<br class="">+            - Value:           0x0000000000000000<br class="">+            - Value:           0x0000000000000046<br class="">+            - Value:           0x0000000100000F50<br class="">+            - Value:           0x0000000000000034<br class="">+        - AbbrCode:        0x00000002<br class="">+          Values:          <br class="">+            - Value:           0x0000000100000F50<br class="">+            - Value:           0x0000000000000034<br class="">+            - Value:           0x0000000000000001<br class="">+              BlockData:       <br class="">+                - 0x56<br class="">+            - Value:           0x0000000000000076<br class="">+            - Value:           0x0000000000000001<br class="">+            - Value:           0x0000000000000003<br class="">+            - Value:           0x0000000000000001<br class="">+            - Value:           0x0000000000000060<br class="">+            - Value:           0x0000000000000001<br class="">+        - AbbrCode:        0x00000003<br class="">+          Values:          <br class="">+            - Value:           0x0000000000000002<br class="">+              BlockData:       <br class="">+                - 0x91<br class="">+                - 0x78<br class="">+            - Value:           0x000000000000007B<br class="">+            - Value:           0x0000000000000001<br class="">+            - Value:           0x0000000000000003<br class="">+            - Value:           0x0000000000000060<br class="">+        - AbbrCode:        0x00000003<br class="">+          Values:          <br class="">+            - Value:           0x0000000000000002<br class="">+              BlockData:       <br class="">+                - 0x91<br class="">+                - 0x70<br class="">+            - Value:           0x0000000000000080<br class="">+            - Value:           0x0000000000000001<br class="">+            - Value:           0x0000000000000003<br class="">+            - Value:           0x0000000000000067<br class="">+        - AbbrCode:        0x00000000<br class="">+          Values:          <br class="">+        - AbbrCode:        0x00000004<br class="">+          Values:          <br class="">+            - Value:           0x0000000000000085<br class="">+            - Value:           0x0000000000000005<br class="">+            - Value:           0x0000000000000004<br class="">+        - AbbrCode:        0x00000005<br class="">+          Values:          <br class="">+            - Value:           0x000000000000006C<br class="">+        - AbbrCode:        0x00000005<br class="">+          Values:          <br class="">+            - Value:           0x0000000000000071<br class="">+        - AbbrCode:        0x00000004<br class="">+          Values:          <br class="">+            - Value:           0x0000000000000089<br class="">+            - Value:           0x0000000000000006<br class="">+            - Value:           0x0000000000000001<br class="">+        - AbbrCode:        0x00000000<br class="">+          Values:          <br class="">+...<br class="">+<br class="">+<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Hi Chris,</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">sorry for replying to this so late, I think I missed the original discussion of this feature. Is there a review/proposal thread that outlines were you are going with this syntax?</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Looking at these examples I'm starting to be afraid that this doesn't really add much over just checking in tests written in assembler (+ perhaps some preprocessor macros for better readability). When I first heard of the YAML->Obj I was envisioning a slightly more higher-level syntax; for example, I would not have expected having to write abbreviations by hand or having to calculate any offsets by hand. I understand that being able to change all fields is useful to test the robustness of the parser, but for such very low-level tests, assembler is probably fine, too.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Let me know if I'm misunderstanding the purpose of this syntax (and/or if this isn't the final form of it yet). What kind of tests is this syntax designed for?</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">+#CHECK: DWARF:           <br class="">+#CHECK:   debug_info:      <br class="">+#CHECK:     - Length:          117<br class="">+#CHECK:       Version:         4<br class="">+#CHECK:       AbbrOffset:      0<br class="">+#CHECK:       AddrSize:        8<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">FYI: Are you aware that the format of the CU header is different in different DWARF major versions?</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div><div>All of the code I've written for reading and writing DWARF data is based on the DWARF parsing code in libDebugInfo. From reading that code (DWARFUnit.cpp) it does not seem to me that there is anything conditional on version.</div><div><br class=""></div><div>There are things in the compile units themselves, specifically the use of AddrSize or offset byte size, which I'm not correctly handling because I need to have line tables working first to identify DWARF32 or DWARF64. I have TODO's in the code marking where that needs to be corrected.</div><div><br class=""></div><div>-Chris</div><br class=""><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">-- adrian</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">+#CHECK:       Entries:         <br class="">+#CHECK:         - AbbrCode:        0x00000001<br class="">+#CHECK:           Values:          <br class="">+#CHECK:             - Value:           0x0000000000000001<br class="">+#CHECK:             - Value:           0x000000000000000C<br class="">+#CHECK:             - Value:           0x0000000000000038<br class="">+#CHECK:             - Value:           0x0000000000000000<br class="">+#CHECK:             - Value:           0x0000000000000046<br class="">+#CHECK:             - Value:           0x0000000100000F50<br class="">+#CHECK:             - Value:           0x0000000000000034<br class="">+#CHECK:         - AbbrCode:        0x00000002<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">+#CHECK:           Values:          <br class="">+#CHECK:             - Value:           0x0000000100000F50<br class="">+#CHECK:             - Value:           0x0000000000000034<br class="">+#CHECK:             - Value:           0x0000000000000001<br class="">+#CHECK:               BlockData:       <br class="">+#CHECK:                 - 0x56<br class="">+#CHECK:             - Value:           0x0000000000000076<br class="">+#CHECK:             - Value:           0x0000000000000001<br class="">+#CHECK:             - Value:           0x0000000000000003<br class="">+#CHECK:             - Value:           0x0000000000000001<br class="">+#CHECK:             - Value:           0x0000000000000060<br class="">+#CHECK:             - Value:           0x0000000000000001<br class="">+#CHECK:         - AbbrCode:        0x00000003<br class="">+#CHECK:           Values:          <br class="">+#CHECK:             - Value:           0x0000000000000002<br class="">+#CHECK:               BlockData:       <br class="">+#CHECK:                 - 0x91<br class="">+#CHECK:                 - 0x78<br class="">+#CHECK:             - Value:           0x000000000000007B<br class="">+#CHECK:             - Value:           0x0000000000000001<br class="">+#CHECK:             - Value:           0x0000000000000003<br class="">+#CHECK:             - Value:           0x0000000000000060<br class="">+#CHECK:         - AbbrCode:        0x00000003<br class="">+#CHECK:           Values:          <br class="">+#CHECK:             - Value:           0x0000000000000002<br class="">+#CHECK:               BlockData:       <br class="">+#CHECK:                 - 0x91<br class="">+#CHECK:                 - 0x70<br class="">+#CHECK:             - Value:           0x0000000000000080<br class="">+#CHECK:             - Value:           0x0000000000000001<br class="">+#CHECK:             - Value:           0x0000000000000003<br class="">+#CHECK:             - Value:           0x0000000000000067<br class="">+#CHECK:         - AbbrCode:        0x00000000<br class="">+#CHECK:           Values:          <br class="">+#CHECK:         - AbbrCode:        0x00000004<br class="">+#CHECK:           Values:          <br class="">+#CHECK:             - Value:           0x0000000000000085<br class="">+#CHECK:             - Value:           0x0000000000000005<br class="">+#CHECK:             - Value:           0x0000000000000004<br class="">+#CHECK:         - AbbrCode:        0x00000005<br class="">+#CHECK:           Values:          <br class="">+#CHECK:             - Value:           0x000000000000006C<br class="">+#CHECK:         - AbbrCode:        0x00000005<br class="">+#CHECK:           Values:          <br class="">+#CHECK:             - Value:           0x0000000000000071<br class="">+#CHECK:         - AbbrCode:        0x00000004<br class="">+#CHECK:           Values:          <br class="">+#CHECK:             - Value:           0x0000000000000089<br class="">+#CHECK:             - Value:           0x0000000000000006<br class="">+#CHECK:             - Value:           0x0000000000000001<br class="">+#CHECK:         - AbbrCode:        0x00000000<br class="">+#CHECK:           Values:          <br class=""><br class="">Modified: llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp (original)<br class="">+++ llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp Tue Dec 20 15:35:31 2016<br class="">@@ -10,8 +10,11 @@<br class="">#include "Error.h"<br class="">#include "llvm/DebugInfo/DWARF/DWARFContext.h"<br class="">#include "llvm/DebugInfo/DWARF/DWARFDebugArangeSet.h"<br class="">+#include "llvm/DebugInfo/DWARF/DWARFFormValue.h"<br class="">#include "llvm/ObjectYAML/DWARFYAML.h"<br class=""><br class="">+#include <algorithm><br class="">+<br class="">using namespace llvm;<br class=""><br class="">void dumpDebugAbbrev(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {<br class="">@@ -99,12 +102,120 @@ void dumpDebugPubSections(DWARFContextIn<br class=""> dumpPubSection(DCtx, Y.GNUPubTypes, DCtx.getGnuPubTypesSection());<br class="">}<br class=""><br class="">-std::error_code dwarf2yaml(DWARFContextInMemory &DCtx,<br class="">-                           DWARFYAML::Data &Y) {<br class="">+void dumpDebugInfo(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {<br class="">+  for (const auto &CU : DCtx.compile_units()) {<br class="">+    DWARFYAML::Unit NewUnit;<br class="">+    NewUnit.Length = CU->getLength();<br class="">+    NewUnit.Version = CU->getVersion();<br class="">+    NewUnit.AbbrOffset = CU->getAbbreviations()->getOffset();<br class="">+    NewUnit.AddrSize = CU->getAddressByteSize();<br class="">+    for (auto DIE : CU->dies()) {<br class="">+      DWARFYAML::Entry NewEntry;<br class="">+      DataExtractor EntryData = CU->getDebugInfoExtractor();<br class="">+      uint32_t offset = DIE.getOffset();<br class="">+<br class="">+      assert(EntryData.isValidOffset(offset) && "Invalid DIE Offset");<br class="">+      if (!EntryData.isValidOffset(offset))<br class="">+        continue;<br class="">+<br class="">+      NewEntry.AbbrCode = EntryData.getULEB128(&offset);<br class="">+<br class="">+      auto AbbrevDecl = DIE.getAbbreviationDeclarationPtr();<br class="">+      if (AbbrevDecl) {<br class="">+        for (const auto &AttrSpec : AbbrevDecl->attributes()) {<br class="">+          DWARFYAML::FormValue NewValue;<br class="">+          NewValue.Value = 0xDEADBEEFDEADBEEF;<br class="">+          DWARFDie DIEWrapper(CU.get(), &DIE);<br class="">+          auto FormValue = DIEWrapper.getAttributeValue(AttrSpec.Attr);<br class="">+          if(!FormValue)<br class="">+            return;<br class="">+          auto Form = FormValue.getValue().getForm();<br class="">+          bool indirect = false;<br class="">+          do {<br class="">+            indirect = false;<br class="">+            switch (Form) {<br class="">+            case dwarf::DW_FORM_addr:<br class="">+            case dwarf::DW_FORM_GNU_addr_index:<br class="">+              if (auto Val = FormValue.getValue().getAsAddress())<br class="">+                NewValue.Value = Val.getValue();<br class="">+              break;<br class="">+            case dwarf::DW_FORM_ref_addr:<br class="">+            case dwarf::DW_FORM_ref1:<br class="">+            case dwarf::DW_FORM_ref2:<br class="">+            case dwarf::DW_FORM_ref4:<br class="">+            case dwarf::DW_FORM_ref8:<br class="">+            case dwarf::DW_FORM_ref_udata:<br class="">+            case dwarf::DW_FORM_ref_sig8:<br class="">+              if (auto Val = FormValue.getValue().getAsReferenceUVal())<br class="">+                NewValue.Value = Val.getValue();<br class="">+              break;<br class="">+            case dwarf::DW_FORM_exprloc:<br class="">+            case dwarf::DW_FORM_block:<br class="">+            case dwarf::DW_FORM_block1:<br class="">+            case dwarf::DW_FORM_block2:<br class="">+            case dwarf::DW_FORM_block4:<br class="">+              if (auto Val = FormValue.getValue().getAsBlock()) {<br class="">+                auto BlockData = Val.getValue();<br class="">+                std::copy(BlockData.begin(), BlockData.end(),<br class="">+                          std::back_inserter(NewValue.BlockData));<br class="">+              }<br class="">+              NewValue.Value = NewValue.BlockData.size();<br class="">+              break;<br class="">+            case dwarf::DW_FORM_data1:<br class="">+            case dwarf::DW_FORM_flag:<br class="">+            case dwarf::DW_FORM_data2:<br class="">+            case dwarf::DW_FORM_data4:<br class="">+            case dwarf::DW_FORM_data8:<br class="">+            case dwarf::DW_FORM_sdata:<br class="">+            case dwarf::DW_FORM_udata:<br class="">+              if (auto Val = FormValue.getValue().getAsUnsignedConstant())<br class="">+                NewValue.Value = Val.getValue();<br class="">+              break;<br class="">+            case dwarf::DW_FORM_string:<br class="">+              if (auto Val = FormValue.getValue().getAsCString())<br class="">+                NewValue.CStr = Val.getValue();<br class="">+              break;<br class="">+            case dwarf::DW_FORM_indirect:<br class="">+              indirect = true;<br class="">+              if (auto Val = FormValue.getValue().getAsUnsignedConstant()) {<br class="">+                NewValue.Value = Val.getValue();<br class="">+                NewEntry.Values.push_back(NewValue);<br class="">+                Form = static_cast<dwarf::Form>(Val.getValue());<br class="">+              }<br class="">+              break;<br class="">+            case dwarf::DW_FORM_strp:<br class="">+            case dwarf::DW_FORM_sec_offset:<br class="">+            case dwarf::DW_FORM_GNU_ref_alt:<br class="">+            case dwarf::DW_FORM_GNU_strp_alt:<br class="">+            case dwarf::DW_FORM_line_strp:<br class="">+            case dwarf::DW_FORM_strp_sup:<br class="">+            case dwarf::DW_FORM_ref_sup:<br class="">+            case dwarf::DW_FORM_GNU_str_index:<br class="">+              if (auto Val = FormValue.getValue().getAsCStringOffset())<br class="">+                NewValue.Value = Val.getValue();<br class="">+              break;<br class="">+            case dwarf::DW_FORM_flag_present:<br class="">+              NewValue.Value = 1;<br class="">+              break;<br class="">+            default:<br class="">+              break;<br class="">+            }<br class="">+          } while (indirect);<br class="">+          NewEntry.Values.push_back(NewValue);<br class="">+        }<br class="">+      }<br class="">+<br class="">+      NewUnit.Entries.push_back(NewEntry);<br class="">+    }<br class="">+    Y.CompileUnits.push_back(NewUnit);<br class="">+  }<br class="">+}<br class="">+<br class="">+std::error_code dwarf2yaml(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {<br class=""> dumpDebugAbbrev(DCtx, Y);<br class=""> dumpDebugStrings(DCtx, Y);<br class=""> dumpDebugARanges(DCtx, Y);<br class=""> dumpDebugPubSections(DCtx, Y);<br class="">-<br class="">+  dumpDebugInfo(DCtx, Y);<br class=""> return obj2yaml_error::success;<br class="">}<br class=""><br class="">Modified: llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp (original)<br class="">+++ llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp Tue Dec 20 15:35:31 2016<br class="">@@ -17,6 +17,8 @@<br class="">#include "llvm/Support/LEB128.h"<br class="">#include "llvm/Support/raw_ostream.h"<br class=""><br class="">+#include <algorithm><br class="">+<br class="">using namespace llvm;<br class=""><br class="">void ZeroFillBytes(raw_ostream &OS, size_t Size) {<br class="">@@ -80,3 +82,127 @@ void yaml2pubsection(raw_ostream &OS, co<br class="">   OS.write('\0');<br class=""> }<br class="">}<br class="">+<br class="">+void yaml2debug_info(raw_ostream &OS, const DWARFYAML::Data &DI) {<br class="">+<br class="">+  for (auto CU : DI.CompileUnits) {<br class="">+    OS.write(reinterpret_cast<char *>(&CU.Length), 4);<br class="">+    OS.write(reinterpret_cast<char *>(&CU.Version), 2);<br class="">+    OS.write(reinterpret_cast<char *>(&CU.AbbrOffset), 4);<br class="">+    OS.write(reinterpret_cast<char *>(&CU.AddrSize), 1);<br class="">+<br class="">+    auto FirstAbbrevCode = CU.Entries[0].AbbrCode;<br class="">+<br class="">+    for (auto Entry : CU.Entries) {<br class="">+      encodeULEB128(Entry.AbbrCode, OS);<br class="">+      if(Entry.AbbrCode == 0u)<br class="">+        continue;<br class="">+      bool Indirect = false;<br class="">+      assert(Entry.AbbrCode-FirstAbbrevCode < DI.AbbrevDecls.size() &&<br class="">+        "Out of range AbbCode");<br class="">+      auto &Abbrev = DI.AbbrevDecls[Entry.AbbrCode-FirstAbbrevCode];<br class="">+<br class="">+      auto FormVal = Entry.Values.begin();<br class="">+      auto AbbrForm = Abbrev.Attributes.begin();<br class="">+      for (;<br class="">+           FormVal != Entry.Values.end() && AbbrForm != Abbrev.Attributes.end();<br class="">+           ++FormVal, ++AbbrForm) {<br class="">+        dwarf::Form Form = AbbrForm->Form;<br class="">+        do {<br class="">+          bool Indirect = false;<br class="">+          switch (Form) {<br class="">+          case dwarf::DW_FORM_addr:<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->Value), CU.AddrSize);<br class="">+            break;<br class="">+          case dwarf::DW_FORM_ref_addr: {<br class="">+            // TODO: Handle DWARF32/DWARF64 after Line Table data is done<br class="">+            auto writeSize = CU.Version == 2 ? CU.AddrSize : 4;<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->Value), writeSize);<br class="">+            break;<br class="">+          }<br class="">+          case dwarf::DW_FORM_exprloc:<br class="">+          case dwarf::DW_FORM_block:<br class="">+            encodeULEB128(FormVal->BlockData.size(), OS);<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),<br class="">+                     FormVal->BlockData.size());<br class="">+            break;<br class="">+          case dwarf::DW_FORM_block1: {<br class="">+            auto writeSize = FormVal->BlockData.size();<br class="">+            OS.write(reinterpret_cast<char *>(&writeSize), 1);<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),<br class="">+                     FormVal->BlockData.size());<br class="">+            break;<br class="">+          }<br class="">+          case dwarf::DW_FORM_block2: {<br class="">+            auto writeSize = FormVal->BlockData.size();<br class="">+            OS.write(reinterpret_cast<char *>(&writeSize), 2);<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),<br class="">+                     FormVal->BlockData.size());<br class="">+            break;<br class="">+          }<br class="">+          case dwarf::DW_FORM_block4: {<br class="">+            auto writeSize = FormVal->BlockData.size();<br class="">+            OS.write(reinterpret_cast<char *>(&writeSize), 4);<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),<br class="">+                     FormVal->BlockData.size());<br class="">+            break;<br class="">+          }<br class="">+          case dwarf::DW_FORM_data1:<br class="">+          case dwarf::DW_FORM_ref1:<br class="">+          case dwarf::DW_FORM_flag:<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->Value), 1);<br class="">+            break;<br class="">+          case dwarf::DW_FORM_data2:<br class="">+          case dwarf::DW_FORM_ref2:<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->Value), 2);<br class="">+            break;<br class="">+          case dwarf::DW_FORM_data4:<br class="">+          case dwarf::DW_FORM_ref4:<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->Value), 4);<br class="">+            break;<br class="">+          case dwarf::DW_FORM_data8:<br class="">+          case dwarf::DW_FORM_ref8:<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->Value), 8);<br class="">+            break;<br class="">+          case dwarf::DW_FORM_sdata:<br class="">+            encodeSLEB128(FormVal->Value, OS);<br class="">+            break;<br class="">+          case dwarf::DW_FORM_udata:<br class="">+          case dwarf::DW_FORM_ref_udata:<br class="">+            encodeULEB128(FormVal->Value, OS);<br class="">+            break;<br class="">+          case dwarf::DW_FORM_string:<br class="">+            OS.write(FormVal->CStr.data(), FormVal->CStr.size());<br class="">+            OS.write('\0');<br class="">+            break;<br class="">+          case dwarf::DW_FORM_indirect:<br class="">+            encodeULEB128(FormVal->Value, OS);<br class="">+            Indirect = true;<br class="">+            Form = static_cast<dwarf::Form>((uint64_t)FormVal->Value);<br class="">+            ++FormVal;<br class="">+            break;<br class="">+          case dwarf::DW_FORM_strp:<br class="">+          case dwarf::DW_FORM_sec_offset:<br class="">+          case dwarf::DW_FORM_GNU_ref_alt:<br class="">+          case dwarf::DW_FORM_GNU_strp_alt:<br class="">+          case dwarf::DW_FORM_line_strp:<br class="">+          case dwarf::DW_FORM_strp_sup:<br class="">+          case dwarf::DW_FORM_ref_sup:<br class="">+            // TODO: Handle DWARF32/64<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->Value), 4);<br class="">+            break;<br class="">+          case dwarf::DW_FORM_ref_sig8:<br class="">+            OS.write(reinterpret_cast<char *>(&FormVal->Value), 8);<br class="">+            break;<br class="">+          case dwarf::DW_FORM_GNU_addr_index:<br class="">+          case dwarf::DW_FORM_GNU_str_index:<br class="">+            encodeULEB128(FormVal->Value, OS);<br class="">+            break;<br class="">+          default:<br class="">+            break;<br class="">+          }<br class="">+        } while (Indirect);<br class="">+      }<br class="">+    }<br class="">+  }<br class="">+}<br class=""><br class="">Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)<br class="">+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Tue Dec 20 15:35:31 2016<br class="">@@ -398,6 +398,8 @@ Error MachOWriter::writeDWARFData(raw_os<br class="">     yaml2pubsection(OS, Obj.DWARF.PubNames);<br class="">   } else if (0 == strncmp(&Section.sectname[0], "__debug_pubtypes", 16)) {<br class="">     yaml2pubsection(OS, Obj.DWARF.PubTypes);<br class="">+    } else if (0 == strncmp(&Section.sectname[0], "__debug_info", 16)) {<br class="">+      yaml2debug_info(OS, Obj.DWARF);<br class="">   }<br class=""> }<br class=""> return Error::success();<br class=""><br class="">Modified: llvm/trunk/tools/yaml2obj/yaml2obj.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2obj.h?rev=290204&r1=290203&r2=290204&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2obj.h?rev=290204&r1=290203&r2=290204&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/tools/yaml2obj/yaml2obj.h (original)<br class="">+++ llvm/trunk/tools/yaml2obj/yaml2obj.h Tue Dec 20 15:35:31 2016<br class="">@@ -46,5 +46,6 @@ void yaml2debug_str(llvm::raw_ostream &O<br class="">void yaml2debug_aranges(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data &DI);<br class="">void yaml2pubsection(llvm::raw_ostream &OS,<br class="">                    const llvm::DWARFYAML::PubSection &Sect);<br class="">+void yaml2debug_info(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data &DI);<br class=""><br class="">#endif<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</blockquote></div></blockquote></div><br class=""></body></html>