[llvm] r290139 - [ObjectYAML] Support for DWARF Pub Sections
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 19 20:39:24 PST 2016
On Mon, Dec 19, 2016 at 2:32 PM Chris Bieneman via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: cbieneman
> Date: Mon Dec 19 16:22:12 2016
> New Revision: 290139
>
> URL: http://llvm.org/viewvc/llvm-project?rev=290139&view=rev
> Log:
> [ObjectYAML] Support for DWARF Pub Sections
>
> This patch adds support for YAML<->DWARF round tripping for pub* section
> data. The patch supports both GNU and non-GNU style entries.
>
> Added:
> llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml
> Modified:
> llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h
> llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp
> llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp
> llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp
> llvm/trunk/tools/yaml2obj/yaml2macho.cpp
> llvm/trunk/tools/yaml2obj/yaml2obj.h
>
> Modified: llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h?rev=290139&r1=290138&r2=290139&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h (original)
> +++ llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h Mon Dec 19 16:22:12 2016
> @@ -49,10 +49,32 @@ struct ARange {
> std::vector<ARangeDescriptor> Descriptors;
> };
>
> +struct PubEntry {
> + llvm::yaml::Hex32 DieOffset;
> + llvm::yaml::Hex8 Descriptor;
> + StringRef Name;
> +};
> +
> +struct PubSection {
> + PubSection() : IsGNUStyle(false) {}
> +
> + uint32_t Length;
> + uint16_t Version;
> + uint32_t UnitOffset;
> + uint32_t UnitSize;
> + bool IsGNUStyle;
> + std::vector<PubEntry> Entries;
> +};
> +
> struct Data {
> std::vector<Abbrev> AbbrevDecls;
> std::vector<StringRef> DebugStrings;
> std::vector<ARange> ARanges;
> + PubSection PubNames;
> + PubSection PubTypes;
> +
> + PubSection GNUPubNames;
> + PubSection GNUPubTypes;
>
> bool isEmpty() const;
> };
> @@ -65,6 +87,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARF
> LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Abbrev)
> LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARangeDescriptor)
> LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARange)
> +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::PubEntry)
>
> namespace llvm {
> namespace yaml {
> @@ -89,6 +112,14 @@ template <> struct MappingTraits<DWARFYA
> static void mapping(IO &IO, DWARFYAML::ARange &Range);
> };
>
> +template <> struct MappingTraits<DWARFYAML::PubEntry> {
> + static void mapping(IO &IO, DWARFYAML::PubEntry &Entry);
> +};
> +
> +template <> struct MappingTraits<DWARFYAML::PubSection> {
> + static void mapping(IO &IO, DWARFYAML::PubSection &Section);
> +};
> +
> #define HANDLE_DW_TAG(unused, name)
> \
> io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name);
>
>
> Modified: llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp?rev=290139&r1=290138&r2=290139&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp (original)
> +++ llvm/trunk/lib/ObjectYAML/DWARFYAML.cpp Mon Dec 19 16:22:12 2016
> @@ -28,6 +28,14 @@ void MappingTraits<DWARFYAML::Data>::map
> IO.mapOptional("debug_abbrev", DWARF.AbbrevDecls);
> if(!DWARF.ARanges.empty() || !IO.outputting())
> IO.mapOptional("debug_aranges", DWARF.ARanges);
> + if(!DWARF.PubNames.Entries.empty() || !IO.outputting())
> + IO.mapOptional("debug_pubnames", DWARF.PubNames);
> + if(!DWARF.PubTypes.Entries.empty() || !IO.outputting())
> + IO.mapOptional("debug_pubtypes", DWARF.PubTypes);
> + if(!DWARF.GNUPubNames.Entries.empty() || !IO.outputting())
> + IO.mapOptional("debug_gnu_pubnames", DWARF.GNUPubNames);
> + if(!DWARF.GNUPubTypes.Entries.empty() || !IO.outputting())
> + IO.mapOptional("debug_gnu_pubtypes", DWARF.GNUPubTypes);
> }
>
> void MappingTraits<DWARFYAML::Abbrev>::mapping(
> @@ -60,6 +68,28 @@ void MappingTraits<DWARFYAML::ARange>::m
> IO.mapRequired("Descriptors", Range.Descriptors);
> }
>
> +void MappingTraits<DWARFYAML::PubEntry>::mapping(IO &IO,
> + DWARFYAML::PubEntry
> &Entry) {
> + IO.mapRequired("DieOffset", Entry.DieOffset);
> + if (reinterpret_cast<DWARFYAML::PubSection
> *>(IO.getContext())->IsGNUStyle)
> + IO.mapRequired("Descriptor", Entry.Descriptor);
> + IO.mapRequired("Name", Entry.Name);
> +}
> +
> +void MappingTraits<DWARFYAML::PubSection>::mapping(
> + IO &IO, DWARFYAML::PubSection &Section) {
> + auto OldContext = IO.getContext();
> + IO.setContext(&Section);
> +
> + IO.mapRequired("Length", Section.Length);
> + IO.mapRequired("Version", Section.Version);
> + IO.mapRequired("UnitOffset", Section.UnitOffset);
> + IO.mapRequired("UnitSize", Section.UnitSize);
> + IO.mapRequired("Entries", Section.Entries);
> +
> + IO.setContext(OldContext);
> +}
> +
> } // namespace llvm::yaml
>
> } // namespace llvm
>
> Added: llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml?rev=290139&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml (added)
> +++ llvm/trunk/test/ObjectYAML/MachO/DWARF-pubsections.yaml Mon Dec 19
> 16:22:12 2016
> @@ -0,0 +1,355 @@
> +# RUN: yaml2obj %s | obj2yaml | FileCheck %s
> +
> +--- !mach-o
> +FileHeader:
> + magic: 0xFEEDFACF
> + cputype: 0x01000007
> + cpusubtype: 0x00000003
> + filetype: 0x0000000A
> + ncmds: 5
> + sizeofcmds: 1800
> + flags: 0x00000000
> + reserved: 0x00000000
> +LoadCommands:
> + - cmd: LC_SEGMENT_64
> + cmdsize: 72
> + segname: __PAGEZERO
> + vmaddr: 0
> + vmsize: 4294967296
> + fileoff: 0
> + filesize: 0
> + maxprot: 0
> + initprot: 0
> + nsects: 0
> + flags: 0
> + - cmd: LC_SEGMENT_64
> + cmdsize: 472
> + segname: __TEXT
> + vmaddr: 4294967296
> + vmsize: 4096
> + fileoff: 0
> + filesize: 0
> + maxprot: 7
> + initprot: 5
> + nsects: 5
> + flags: 0
> + Sections:
> + - sectname: __text
> + segname: __TEXT
> + addr: 0x0000000100000F50
> + size: 52
> + offset: 0x00000000
> + align: 4
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x80000400
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __stubs
> + segname: __TEXT
> + addr: 0x0000000100000F84
> + size: 6
> + offset: 0x00000000
> + align: 1
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x80000408
> + reserved1: 0x00000000
> + reserved2: 0x00000006
> + reserved3: 0x00000000
> + - sectname: __stub_helper
> + segname: __TEXT
> + addr: 0x0000000100000F8C
> + size: 26
> + offset: 0x00000000
> + align: 2
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x80000400
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __cstring
> + segname: __TEXT
> + addr: 0x0000000100000FA6
> + size: 14
> + offset: 0x00000000
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000002
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __unwind_info
> + segname: __TEXT
> + addr: 0x0000000100000FB4
> + size: 72
> + offset: 0x00000000
> + align: 2
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - cmd: LC_SEGMENT_64
> + cmdsize: 232
> + segname: __DATA
> + vmaddr: 4294971392
> + vmsize: 4096
> + fileoff: 0
> + filesize: 0
> + maxprot: 7
> + initprot: 3
> + nsects: 2
> + flags: 0
> + Sections:
> + - sectname: __nl_symbol_ptr
> + segname: __DATA
> + addr: 0x0000000100001000
> + size: 16
> + offset: 0x00000000
> + align: 3
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000006
> + reserved1: 0x00000001
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __la_symbol_ptr
> + segname: __DATA
> + addr: 0x0000000100001010
> + size: 8
> + offset: 0x00000000
> + align: 3
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000007
> + reserved1: 0x00000003
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - cmd: LC_SEGMENT_64
> + cmdsize: 72
> + segname: __LINKEDIT
> + vmaddr: 4294975488
> + vmsize: 4096
> + fileoff: 4096
> + filesize: 60
> + maxprot: 7
> + initprot: 1
> + nsects: 0
> + flags: 0
> + - cmd: LC_SEGMENT_64
> + cmdsize: 952
> + segname: __DWARF
> + vmaddr: 4294979584
> + vmsize: 4096
> + fileoff: 8192
> + filesize: 764
> + maxprot: 7
> + initprot: 3
> + nsects: 11
> + flags: 0
> + Sections:
> + - sectname: __debug_line
> + segname: __DWARF
> + addr: 0x0000000100003000
> + size: 69
> + offset: 0x00002000
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __debug_pubnames
> + segname: __DWARF
> + addr: 0x0000000100003045
> + size: 27
> + offset: 0x00002045
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __debug_pubtypes
> + segname: __DWARF
> + addr: 0x0000000100003060
> + size: 35
> + offset: 0x00002060
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __debug_aranges
> + segname: __DWARF
> + addr: 0x0000000100003083
> + size: 48
> + offset: 0x00002083
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __debug_info
> + segname: __DWARF
> + addr: 0x00000001000030B3
> + size: 121
> + offset: 0x000020B3
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __debug_abbrev
> + segname: __DWARF
> + addr: 0x000000010000312C
> + size: 76
> + offset: 0x0000212C
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __debug_str
> + segname: __DWARF
> + addr: 0x0000000100003178
> + size: 142
> + offset: 0x00002178
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __apple_names
> + segname: __DWARF
> + addr: 0x0000000100003206
> + size: 60
> + offset: 0x00002206
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __apple_namespac
> + segname: __DWARF
> + addr: 0x0000000100003242
> + size: 36
> + offset: 0x00002242
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __apple_types
> + segname: __DWARF
> + addr: 0x0000000100003266
> + size: 114
> + offset: 0x00002266
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> + - sectname: __apple_objc
> + segname: __DWARF
> + addr: 0x00000001000032D8
> + size: 36
> + offset: 0x000022D8
> + align: 0
> + reloff: 0x00000000
> + nreloc: 0
> + flags: 0x00000000
> + reserved1: 0x00000000
> + reserved2: 0x00000000
> + reserved3: 0x00000000
> +LinkEditData:
> + NameList:
> + - n_strx: 2
> + n_type: 0x0F
> + n_sect: 1
> + n_desc: 16
> + n_value: 4294967296
> + - n_strx: 22
> + n_type: 0x0F
> + n_sect: 1
> + n_desc: 0
> + n_value: 4294971216
> + StringTable:
> + - ''
> + - ''
> + - __mh_execute_header
> + - _main
> +DWARF:
> + debug_str:
> + - ''
> + - 'clang version 4.0.0 (trunk 288923) (llvm/trunk 288991)'
> + - hello_world.c
> + - /Users/cbieneman/dev/open-source/llvm-build-rel
> + - main
> + - argc
> + - argv
> + - int
> + - char
> + debug_pubnames:
> + Length: 23
> + Version: 2
> + UnitOffset: 0
> + UnitSize: 121
> + Entries:
> + - DieOffset: 0x0000002A
> + Name: main
> + debug_pubtypes:
> + Length: 31
> + Version: 2
> + UnitOffset: 0
> + UnitSize: 121
> + Entries:
> + - DieOffset: 0x00000060
> + Name: int
> + - DieOffset: 0x00000071
> + Name: char
> +...
> +
> +#CHECK: DWARF:
> +#CHECK: debug_pubnames:
> +#CHECK: Length: 23
> +#CHECK: Version: 2
> +#CHECK: UnitOffset: 0
> +#CHECK: UnitSize: 121
> +#CHECK: Entries:
> +#CHECK: - DieOffset: 0x0000002A
> +#CHECK: Name: main
> +#CHECK: debug_pubtypes:
> +#CHECK: Length: 31
> +#CHECK: Version: 2
> +#CHECK: UnitOffset: 0
> +#CHECK: UnitSize: 121
> +#CHECK: Entries:
> +#CHECK: - DieOffset: 0x00000060
> +#CHECK: Name: int
> +#CHECK: - DieOffset: 0x00000071
> +#CHECK: Name: char
> +#CHECK: ...
>
> Modified: llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp?rev=290139&r1=290138&r2=290139&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp (original)
> +++ llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp Mon Dec 19 16:22:12 2016
> @@ -67,11 +67,44 @@ void dumpDebugARanges(DWARFContextInMemo
> }
> }
>
> +void dumpPubSection(DWARFContextInMemory &DCtx, DWARFYAML::PubSection &Y,
> + StringRef Section) {
> + DataExtractor PubSectionData(Section, DCtx.isLittleEndian(), 0);
> + uint32_t Offset = 0;
> + Y.Length = PubSectionData.getU32(&Offset);
> + Y.Version = PubSectionData.getU16(&Offset);
> + Y.UnitOffset = PubSectionData.getU32(&Offset);
> + Y.UnitSize = PubSectionData.getU32(&Offset);
> + while (Offset < Y.Length) {
> + DWARFYAML::PubEntry NewEntry;
> + NewEntry.DieOffset = PubSectionData.getU32(&Offset);
> + if (Y.IsGNUStyle)
> + NewEntry.Descriptor = PubSectionData.getU8(&Offset);
> + NewEntry.Name = PubSectionData.getCStr(&Offset);
> + Y.Entries.push_back(NewEntry);
> + }
> +}
> +
> +void dumpDebugPubSections(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y)
> {
> + Y.PubNames.IsGNUStyle = false;
> + dumpPubSection(DCtx, Y.PubNames, DCtx.getPubNamesSection());
> +
> + Y.PubTypes.IsGNUStyle = false;
> + dumpPubSection(DCtx, Y.PubTypes, DCtx.getPubTypesSection());
> +
> + Y.GNUPubNames.IsGNUStyle = true;
> + dumpPubSection(DCtx, Y.GNUPubNames, DCtx.getGnuPubNamesSection());
> +
> + Y.GNUPubTypes.IsGNUStyle = true;
> + dumpPubSection(DCtx, Y.GNUPubTypes, DCtx.getGnuPubTypesSection());
> +}
> +
> std::error_code dwarf2yaml(DWARFContextInMemory &DCtx,
> DWARFYAML::Data &Y) {
> dumpDebugAbbrev(DCtx, Y);
> dumpDebugStrings(DCtx, Y);
> dumpDebugARanges(DCtx, Y);
> + dumpDebugPubSections(DCtx, Y);
>
> return obj2yaml_error::success;
> }
>
> Modified: llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp?rev=290139&r1=290138&r2=290139&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp (original)
> +++ llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp Mon Dec 19 16:22:12 2016
> @@ -66,3 +66,17 @@ void yaml2debug_aranges(raw_ostream &OS,
> ZeroFillBytes(OS, Range.AddrSize * 2);
> }
> }
> +
> +void yaml2pubsection(raw_ostream &OS, const DWARFYAML::PubSection &Sect) {
> + OS.write(reinterpret_cast<const char *>(&Sect.Length), 4);
>
What's the deal with endianness, etc in code like this (seems to be
idiomatic in this yaml obj code - but on first blush looks like it'd be
broken (not write the expected bytes to the output stream) if the values
weren't stored in the desired alignment))?
> + OS.write(reinterpret_cast<const char *>(&Sect.Version), 2);
> + OS.write(reinterpret_cast<const char *>(&Sect.UnitOffset), 4);
> + OS.write(reinterpret_cast<const char *>(&Sect.UnitSize), 4);
> + for (auto Entry : Sect.Entries) {
> + OS.write(reinterpret_cast<const char *>(&Entry.DieOffset), 4);
> + if (Sect.IsGNUStyle)
> + OS.write(reinterpret_cast<const char *>(&Entry.Descriptor), 4);
> + OS.write(Entry.Name.data(), Entry.Name.size());
> + OS.write('\0');
> + }
> +}
>
> Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=290139&r1=290138&r2=290139&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
> +++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Mon Dec 19 16:22:12 2016
> @@ -394,6 +394,10 @@ Error MachOWriter::writeDWARFData(raw_os
> yaml2debug_abbrev(OS, Obj.DWARF);
> } else if (0 == strncmp(&Section.sectname[0], "__debug_aranges", 16))
> {
> yaml2debug_aranges(OS, Obj.DWARF);
> + } else if (0 == strncmp(&Section.sectname[0], "__debug_pubnames",
> 16)) {
> + yaml2pubsection(OS, Obj.DWARF.PubNames);
> + } else if (0 == strncmp(&Section.sectname[0], "__debug_pubtypes",
> 16)) {
> + yaml2pubsection(OS, Obj.DWARF.PubTypes);
> }
> }
> return Error::success();
>
> Modified: llvm/trunk/tools/yaml2obj/yaml2obj.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2obj.h?rev=290139&r1=290138&r2=290139&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/yaml2obj/yaml2obj.h (original)
> +++ llvm/trunk/tools/yaml2obj/yaml2obj.h Mon Dec 19 16:22:12 2016
> @@ -25,6 +25,7 @@ struct Object;
>
> namespace DWARFYAML {
> struct Data;
> +struct PubSection;
> }
>
> namespace yaml {
> @@ -43,5 +44,7 @@ void yaml2debug_str(llvm::raw_ostream &O
> const llvm::DWARFYAML::Data &DI);
>
> void yaml2debug_aranges(llvm::raw_ostream &OS, const
> llvm::DWARFYAML::Data &DI);
> +void yaml2pubsection(llvm::raw_ostream &OS,
> + const llvm::DWARFYAML::PubSection &Sect);
>
> #endif
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161220/aa922013/attachment.html>
More information about the llvm-commits
mailing list