)]}'
{
  "commit": "eb5d8abc8770ae575716194635dd4c5fca21ae98",
  "tree": "2bd4cf9f4189a076a72d55cb3a77659d965f0f38",
  "parents": [
    "bd36d9a5641c725176b794df262af805807f11b5"
  ],
  "author": {
    "name": "Matthieu Longo",
    "email": "matthieu.longo@arm.com",
    "time": "Fri Nov 14 12:04:32 2025 +0000"
  },
  "committer": {
    "name": "Matthieu Longo",
    "email": "matthieu.longo@arm.com",
    "time": "Thu Jan 22 10:11:17 2026 +0000"
  },
  "message": "OAv2 merge: merging Object Attributes\n\nThe Object Ottributes merge process must handle both optional and\nrequired subsections. It also treats the first merge of the frozen set\nspecially, as the OAv2 list in the input BFD serves as the accumulator\nfor subsequent merges.\n\n** Optional subsections\n\nOptional subsections are processed as if merging two ordered sets — by\niterating linearly through both, checking whether an element of a given\nordinality is present in the opposite set, and adding it to the\naccumulator. The added diffuculty with subsections and attributes lies\nin the fact that missing elements have default values, and these must be\nmerged with existing ones to produce the final value to be stored.\n\n** Required subsections\n\nRequired subsections are processed slightly differently from the\noptional subsections, as they cannot be pruned since they are mandatory,\nhence an error will be raised by the linker if it is not recognized.\n\nFor now, the subsection for PAuth ABI is the only one use case, and\nno merge is applied on the values. The values simply need to match.\nThis implementation choice might be challenged in the future if required\nsubsections can have the same diversity as optional subsections. If the\ncase arises, the refactoring to handle this new behavior should consist\nin adding a new merge policy MERGE-EQUAL, or something similar. Some \"if\nrequired\" should be added in the optional subsections merge logic to\nerror on any missing elements, or mismatch, and messages should also be\nrephrased to point out that the error is for a required subsection.\n\n** Important note regarding support for testing\n\nIn order to test this generic logic, AArch64\u0027s use cases are not\noffering enough coverage, so a \"GNU testing namespace\" which corresponds\nto the name of the subsection was introduced. It follows the following\npattern:\n  gnu_testing_\u003cXXXXXX\u003e_MERGE_\u003cPOLICY\u003e\nwith:\n  - \u003cXXXXXX\u003e: an arbitrary name for your testing subsection.\n  - \u003cPOLICY\u003e: the name of the merging policy to apply on the values in\n    the subsection. The currently supported merge policy are:\n      * _MERGE_AND: bitwise AND applied on numerical values.\n      * _MERGE_OR: bitwise OR applied on numerical values.\n      * _MERGE_ADD: concatenates strings together with a \u0027+\u0027 in-between.\n    Note: \"_MERGE_ADD\" does not make really sense, and will very likely\n    never be used for a real merge. Its only purpose is to test the\n    correct handling of merges with strings.\nAny subsection name matching neither names supported by the backend, nor\nfollowing the pattern corresponding GNU testing namespace will be considered\nunknown and its status set to obj_attr_subsection_v2_unknown. This will\nhave for consequence the pruning of this subsection.\n\nAdditionally, the first two tags in gnu_testing namespace, GNUTestTag_0\nand GNUTestTag_1, are known, and so have a name and can be initialized\nto the default value (\u00270\u0027 or NULL) depending on the encoding specified\non the subsection. Any tags above 1 will be considered unknown, so will\nbe default-initialized in the same way but its status will be set to\nobj_attr_v2_unknown. This behavior of the testing tags allows to test\nthe pruning of unknown attributes.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d3d3f328985e07499f85f1014ee89f8c200e0d9a",
      "old_mode": 33188,
      "old_path": "bfd/elf-attrs.c",
      "new_id": "e1ca52a060cd9414f59d79fb692886a621025ce3",
      "new_mode": 33188,
      "new_path": "bfd/elf-attrs.c"
    },
    {
      "type": "modify",
      "old_id": "b57481035c504dea933014083236e8020f0bbc6a",
      "old_mode": 33188,
      "old_path": "bfd/elf-attrs.h",
      "new_id": "c604195dd984e05f9bb5d7904fbced4b751d4cdc",
      "new_mode": 33188,
      "new_path": "bfd/elf-attrs.h"
    },
    {
      "type": "modify",
      "old_id": "187e90c5c12da9cda06a02bd74f929b5766e1de3",
      "old_mode": 33188,
      "old_path": "bfd/elf-bfd.h",
      "new_id": "3a1e867250d38754040fea478d176437c4a75751",
      "new_mode": 33188,
      "new_path": "bfd/elf-bfd.h"
    },
    {
      "type": "modify",
      "old_id": "10d14c0045aec4aef7a65c2703c431d0632c00e9",
      "old_mode": 33188,
      "old_path": "bfd/elfxx-target.h",
      "new_id": "04c1355455a0694013c04c308d80882c3b6e59df",
      "new_mode": 33188,
      "new_path": "bfd/elfxx-target.h"
    }
  ]
}
