)]}'
{
  "commit": "8bb486a78e350ce6072d71e15cc4f01a142e80d4",
  "tree": "ce4a98de895bb081c67417271bd560523364704c",
  "parents": [
    "608a9158b06598c6403dea766822534a347b1f27"
  ],
  "author": {
    "name": "David Srbecky",
    "email": "dsrbecky@google.com",
    "time": "Wed Jan 12 13:31:00 2022 +0000"
  },
  "committer": {
    "name": "Treehugger Robot",
    "email": "treehugger-gerrit@google.com",
    "time": "Thu Apr 07 17:50:17 2022 +0000"
  },
  "message": "Add CFI-checking script and fix found CFI issues.\n\nIt is essential for the unwinder to know the stack size at any point.\nOur assembly is manually annotated with this information, but it is\neasy to make mistakes (e.g. cfi_restore_state handles register spills,\nbut does not restore CFI offset as one might easily assume).\n\nAdd python script which compares the CFI information to disassembly\nand checks that they match (that is, it is checking that push/pop\ninstructions result in the expected CFI offset increment/decrement).\nIn general, this is unfeasible (as we would not need CFI otherwise),\nbut even conservative checks can catch many bugs.\n\nTest: ./art/test.py -b -r\nChange-Id: I232fc0a31fa6f28381e18fdf6aceaf0b8323f550\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "96b6241a2052340f811d33f784cce27701620d18",
      "old_mode": 33188,
      "old_path": "runtime/arch/arm/jni_entrypoints_arm.S",
      "new_id": "fc57df76d352d122d2b8e0325042ffa7e91735af",
      "new_mode": 33188,
      "new_path": "runtime/arch/arm/jni_entrypoints_arm.S"
    },
    {
      "type": "modify",
      "old_id": "7e11d326562305ffdda9404220224843bb9f14a3",
      "old_mode": 33188,
      "old_path": "runtime/arch/arm/quick_entrypoints_arm.S",
      "new_id": "d6f129be506094eabef675101097c89b38226c40",
      "new_mode": 33188,
      "new_path": "runtime/arch/arm/quick_entrypoints_arm.S"
    },
    {
      "type": "modify",
      "old_id": "a20d5582407799cbbb69f342fce8504196dfc1bc",
      "old_mode": 33188,
      "old_path": "runtime/arch/arm64/quick_entrypoints_arm64.S",
      "new_id": "d8c91e11b9ba8b79b0079a7d51a01d15e09817a9",
      "new_mode": 33188,
      "new_path": "runtime/arch/arm64/quick_entrypoints_arm64.S"
    },
    {
      "type": "modify",
      "old_id": "f2d0559064d7efe2d27f7e5ffe6d07dece0ac086",
      "old_mode": 33188,
      "old_path": "runtime/interpreter/mterp/arm64ng/control_flow.S",
      "new_id": "7873ca6b7c440b852d52521aaa4d374ba915de04",
      "new_mode": 33188,
      "new_path": "runtime/interpreter/mterp/arm64ng/control_flow.S"
    },
    {
      "type": "modify",
      "old_id": "8ada63c03e93e152269567d36d3b5e51b9fab608",
      "old_mode": 33188,
      "old_path": "runtime/interpreter/mterp/arm64ng/main.S",
      "new_id": "89de81f5e4006b760cb80cff763baeb383f32ae0",
      "new_mode": 33188,
      "new_path": "runtime/interpreter/mterp/arm64ng/main.S"
    },
    {
      "type": "modify",
      "old_id": "ab05228c2c1f0ba8f3d96f16f25c4d13b91d8d20",
      "old_mode": 33188,
      "old_path": "runtime/interpreter/mterp/armng/control_flow.S",
      "new_id": "689b245729342d891fc17d7ecfc340fbc416fc4e",
      "new_mode": 33188,
      "new_path": "runtime/interpreter/mterp/armng/control_flow.S"
    },
    {
      "type": "modify",
      "old_id": "5a086f597d517a74e59bc6dcd069ed559bd240c4",
      "old_mode": 33188,
      "old_path": "runtime/interpreter/mterp/armng/main.S",
      "new_id": "310a3fd8f1d9f4fa0c2b3f6d680f73894c20a7e7",
      "new_mode": 33188,
      "new_path": "runtime/interpreter/mterp/armng/main.S"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ac258c28aa18329a3b110a6f2cea0fc56241459b",
      "new_mode": 33261,
      "new_path": "tools/check_cfi.py"
    }
  ]
}
