)]}'
{
  "commit": "5fb8d6f4fe2b120981f4800fdb085c19882fa899",
  "tree": "9593c19d44bc7a2a4686fc2164885f98b57f1875",
  "parents": [
    "1f1abaeafbc4881c3e7eba0e194b241d91f51643"
  ],
  "author": {
    "name": "David Reveman",
    "email": "reveman@meta.com",
    "time": "Tue Mar 10 18:45:48 2026 -0700"
  },
  "committer": {
    "name": "David Reveman",
    "email": "reveman@meta.com",
    "time": "Wed Mar 11 11:19:09 2026 -0400"
  },
  "message": "EXPERIMENT: Add nongnu.org libunwind as alternative unwinding backend\n\nNOT FOR REVIEW\n\nAdd optional support for nongnu.org libunwind as an alternative to\nAndroid\u0027s libunwindstack for DWARF-based stack unwinding in both\ntraced_perf and heapprofd. Selected at build time via the GN flag\nenable_perfetto_libunwind.\n\nlibunwindstack pulls in several vendored Android dependencies\n(android-libprocinfo, android-libbase, bionic kernel UAPI headers)\nmaking it difficult to use perfetto\u0027s profiling tools on non-Android\nplatforms. With this change, setting enable_perfetto_libunwind\u003dtrue\nbuilds everything without any libunwindstack dependency.\n\nThe refactoring introduces:\n\n- An UnwindBackend interface with two implementations:\n  LibunwindstackBackend (wrapping existing logic) and LibunwindBackend\n  (using libunwind\u0027s remote API with custom accessors for sampled\n  stack overlays and /proc/pid/mem).\n- Backend-agnostic types (UnwindFrame, UnwindErrorCode, RegisterData)\n  replacing direct use of unwindstack types throughout the pipeline.\n- Perfetto-owned register capture (regs_common.h, regs_local.h, .S)\n  so the heapprofd client no longer depends on libunwindstack for\n  AsmGetRegs, ArchEnum, or register constants.\n- Wire protocol updated to use Perfetto-owned types, maintaining ABI\n  compatibility with existing register layouts.\n- Bookkeeping simplified to use UnwindFrame directly, removing the\n  intermediate unwindstack::FrameData conversion layer.\n\nAlso fixes nongnu libunwind\u0027s Gget_proc_info_in_range.c which\nincorrectly dereferenced a remote .eh_frame_hdr address as a local\npointer, causing crashes during remote unwinding.\n\nlibunwind v1.8.0 is vendored via tools/install-build-deps and built\nfrom source with UNW_REMOTE_ONLY (no local unwinding assembly).\nPre-baked config headers live in buildtools/nongnu_libunwind_config/.\n\nOn non-Android Linux standalone builds, enable_perfetto_libunwind\ndefaults to true.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9d03f08b211a06c5f16fc009a59e7e1240de47d7",
      "old_mode": 33188,
      "old_path": "Android.bp",
      "new_id": "9b8af39c978c054323cbc5dd52e7c636278aaaaf",
      "new_mode": 33188,
      "new_path": "Android.bp"
    },
    {
      "type": "modify",
      "old_id": "802e496b742a8340619bf7e1ba8e36bff8cc89f1",
      "old_mode": 33188,
      "old_path": "buildtools/.gitignore",
      "new_id": "d52b03e0778332d3f2c2928bbdba131764bed633",
      "new_mode": 33188,
      "new_path": "buildtools/.gitignore"
    },
    {
      "type": "modify",
      "old_id": "fe37368a0e99362755e05c0391be272cfede6f7a",
      "old_mode": 33188,
      "old_path": "buildtools/BUILD.gn",
      "new_id": "92a29f85eddc6a064a1f843382f55b82eadbccb3",
      "new_mode": 33188,
      "new_path": "buildtools/BUILD.gn"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "74ab6814986092fdc550b6c1d494a0f413b0420a",
      "new_mode": 33188,
      "new_path": "buildtools/nongnu_libunwind_config/config.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cc9638b9b1a5117713e6a338da679934be50f2bf",
      "new_mode": 33188,
      "new_path": "buildtools/nongnu_libunwind_config/libunwind-common.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c1dbd78d8abd36d48f8623f9cd5f7da3f14ff053",
      "new_mode": 33188,
      "new_path": "buildtools/nongnu_libunwind_config/libunwind.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "887830ccf5d7ce57d5b4f53ef3005670cb7fb720",
      "new_mode": 33188,
      "new_path": "buildtools/nongnu_libunwind_config/tdep/libunwind_i.h"
    },
    {
      "type": "modify",
      "old_id": "af0d688a588578dae028964f85f7b1ff5f11abd0",
      "old_mode": 33188,
      "old_path": "gn/BUILD.gn",
      "new_id": "d86b15d045ad2e84d7e7aeff4e5a0fc779261b25",
      "new_mode": 33188,
      "new_path": "gn/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "4fb532064c916aebe50b7192865ad849beeb8ffd",
      "old_mode": 33188,
      "old_path": "gn/perfetto.gni",
      "new_id": "4c889508ec8f764018dc4a0d418bdf342509d867",
      "new_mode": 33188,
      "new_path": "gn/perfetto.gni"
    },
    {
      "type": "modify",
      "old_id": "465e506734d7ac847e60ed28c61b7449b2590e4b",
      "old_mode": 33188,
      "old_path": "include/perfetto/base/build_configs/android_tree/perfetto_build_flags.h",
      "new_id": "d6dc3bb4a39f6780826cd4c36018e7a317be7168",
      "new_mode": 33188,
      "new_path": "include/perfetto/base/build_configs/android_tree/perfetto_build_flags.h"
    },
    {
      "type": "modify",
      "old_id": "a9bfdbc2aa9e1ea83830e4b094ad2cd12aae0936",
      "old_mode": 33188,
      "old_path": "include/perfetto/base/build_configs/bazel/perfetto_build_flags.h",
      "new_id": "87f6d3d67f2c371027b3def0c1c7a74bdf21b338",
      "new_mode": 33188,
      "new_path": "include/perfetto/base/build_configs/bazel/perfetto_build_flags.h"
    },
    {
      "type": "modify",
      "old_id": "1fcc6fb968417b6e7bb94eac3c0022186e153bb0",
      "old_mode": 33188,
      "old_path": "src/profiling/common/BUILD.gn",
      "new_id": "168a0962c16b3d9d936c2b02d738fb5464acb271",
      "new_mode": 33188,
      "new_path": "src/profiling/common/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "7cfd0833d3795e29f96ae10c7573b6b58d0222cc",
      "old_mode": 33188,
      "old_path": "src/profiling/common/callstack_trie.cc",
      "new_id": "6597fe19cc6b0eea1e1961f0915a2634ae29ff51",
      "new_mode": 33188,
      "new_path": "src/profiling/common/callstack_trie.cc"
    },
    {
      "type": "modify",
      "old_id": "f5d2378cd518ff81058bf71688e5042b103c70ef",
      "old_mode": 33188,
      "old_path": "src/profiling/common/callstack_trie.h",
      "new_id": "08649fc914133b851cac117df55fa2a1cefa6fba",
      "new_mode": 33188,
      "new_path": "src/profiling/common/callstack_trie.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dfb078a736a0d77eb085c291cda9199ca4bad2ef",
      "new_mode": 33188,
      "new_path": "src/profiling/common/regs_common.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bd1e9ec751d19fce11b9c5f8fbdeabe47e7a4e2d",
      "new_mode": 33188,
      "new_path": "src/profiling/common/regs_local.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3cbb16e918bf8daee44c9eae04432b241654d5d8",
      "new_mode": 33188,
      "new_path": "src/profiling/common/regs_local_x86_64.S"
    },
    {
      "type": "modify",
      "old_id": "6807e84cc1f895588e7394e47e0f9b578464cff6",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/BUILD.gn",
      "new_id": "4116c12ab2dc37b55f186107ad7f69f42d3f6c05",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "828280d7df43c66be5611e7b751b85ece866b325",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/bookkeeping.cc",
      "new_id": "0ed03cf070ae875cc612239a3b0d6833774896a5",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/bookkeeping.cc"
    },
    {
      "type": "modify",
      "old_id": "77a1319785815eabe42caac8254edc14f0e4e8fd",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/bookkeeping.h",
      "new_id": "857f1057548d1f674124fe858fc5c43002cc39d8",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/bookkeeping.h"
    },
    {
      "type": "modify",
      "old_id": "c1653ccb76fb04b71c7a7df706abee871008008a",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/bookkeeping_unittest.cc",
      "new_id": "557ac422b4e5c7daa958086c9a6bf7f573f70271",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/bookkeeping_unittest.cc"
    },
    {
      "type": "modify",
      "old_id": "62f78e8d51ba9c75ba53e3a53cd7029847abb917",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/client.cc",
      "new_id": "7982a6953ef4007e072754f0c23c4bce99ffcef9",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/client.cc"
    },
    {
      "type": "modify",
      "old_id": "3f62551e38c956bb52981a255cba87a6ed93a58a",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/client.h",
      "new_id": "e2a0c1612121c077d99704073140ecb3654f354e",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/client.h"
    },
    {
      "type": "modify",
      "old_id": "70e7ca3bc1916e41c1a60f0a335677dafca9c6cc",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/client_api_factory_standalone.cc",
      "new_id": "1f6fb6265017c618ef4c7a33f58fdd4f94700837",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/client_api_factory_standalone.cc"
    },
    {
      "type": "modify",
      "old_id": "e4f462f9b3d19ecc13c2fab8693af0dc176e5117",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/heapprofd.cc",
      "new_id": "cf1e89fc53ee75d72ebf9b53ebd9e4058722f06c",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/heapprofd.cc"
    },
    {
      "type": "modify",
      "old_id": "c7eb94919e49aa2a70029bf4b471f6dafce58178",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/heapprofd_producer.cc",
      "new_id": "9d531bd0d0f401f46a2cf6a375cffde9ab10a5ff",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/heapprofd_producer.cc"
    },
    {
      "type": "modify",
      "old_id": "f1473c806651f358e384cc92b0809ade6e40c021",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/heapprofd_producer.h",
      "new_id": "4d843ac22e86825b0935eb31c24fe568b7f7cf6d",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/heapprofd_producer.h"
    },
    {
      "type": "modify",
      "old_id": "d6221fd42646a205c9eb0dec0b2893ad573244ab",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/unwinding.cc",
      "new_id": "a4d5aa74305d06d0ef57bf6b2b9b23587c90a607",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/unwinding.cc"
    },
    {
      "type": "modify",
      "old_id": "7dd1c6a90de709b982ef8ed46d9a8ae377587877",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/unwinding.h",
      "new_id": "49a6abfc936d6fb806cd50113cebdaf1eaf49ec3",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/unwinding.h"
    },
    {
      "type": "modify",
      "old_id": "a038cf25942ec6bcd691831c5eba5b9f637ecf57",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/unwinding_fuzzer.cc",
      "new_id": "abd40179a588737c63fd775d3060882203f64bd4",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/unwinding_fuzzer.cc"
    },
    {
      "type": "modify",
      "old_id": "37eedee7028b20a504b192011c26839cc3546f40",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/unwinding_unittest.cc",
      "new_id": "ac664e9822cd80a4d1d1a427b533aaa2c1a6d0ed",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/unwinding_unittest.cc"
    },
    {
      "type": "modify",
      "old_id": "cf0401d8302c58e2c02daea274414bd4dd8099f0",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/unwound_messages.h",
      "new_id": "984554f8921e032f83f907a74ae0711edc92c329",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/unwound_messages.h"
    },
    {
      "type": "modify",
      "old_id": "6efd478e8dfe9bd6019b053ae704522deebddaea",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/wire_protocol.h",
      "new_id": "31dfec39c3f561a3230fb5bbd704e4e164035566",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/wire_protocol.h"
    },
    {
      "type": "modify",
      "old_id": "873d977614942260f2d00bccad8b598a5bdba7ba",
      "old_mode": 33188,
      "old_path": "src/profiling/memory/wire_protocol_unittest.cc",
      "new_id": "de3ae5af9fa441b313a772d8607ff268c04a6315",
      "new_mode": 33188,
      "new_path": "src/profiling/memory/wire_protocol_unittest.cc"
    },
    {
      "type": "modify",
      "old_id": "5d3837457f3108c893e6dfaba88a198e1be85006",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/BUILD.gn",
      "new_id": "8d2a71d07239fc935854654f3a5d1636db94402f",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "58b45fdeaf896fabdbaba8a4ea074be16d26e1bf",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/common_types.h",
      "new_id": "6be13408c3869815af9b03f357d218315ac597cf",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/common_types.h"
    },
    {
      "type": "modify",
      "old_id": "28d05691a267c6caf8adb5e4383acd224138db89",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/event_config.cc",
      "new_id": "034c80209ca6ceef6066ce6b4fe1586ccaf59338",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/event_config.cc"
    },
    {
      "type": "modify",
      "old_id": "e27abb20a99489276a988c451e18bf1a865a52c3",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/event_config.h",
      "new_id": "cd74def9e249fb6c0ce4c186af0e04f1d8f0c878",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/event_config.h"
    },
    {
      "type": "modify",
      "old_id": "1116aa3d90d2ec4bd87b09386e1d247835c88e12",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/event_config_unittest.cc",
      "new_id": "9dc5a4a1f6ab4139be33d802f2312c3ac5295d38",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/event_config_unittest.cc"
    },
    {
      "type": "modify",
      "old_id": "a50409818e457cb86635d8ecf0c7b2801e1c8034",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/event_reader.cc",
      "new_id": "bce6c32720e2d114e1b6ac62b42831309058c688",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/event_reader.cc"
    },
    {
      "type": "modify",
      "old_id": "47c5ca780e3c48f019ef43425bd914b0a39981b8",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/event_reader.h",
      "new_id": "bf050094799d5b6bfdbc3b60e5e465c0bd3f6ccf",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/event_reader.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b29106938bff12b07cf7d134ffefe1352f788e46",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/libunwind_backend.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d928f036cd7c92b575e428b5d7527d760ed65c2c",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/libunwind_backend.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e861cca943c59c28bbaae0e2831515fcf1a32780",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/libunwindstack_backend.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e6c8c9664e0aefc72d95a7a28a3690ece01e8790",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/libunwindstack_backend.h"
    },
    {
      "type": "modify",
      "old_id": "fbeceeb2842c052932b69233fae9f93c3b180282",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/perf_producer.cc",
      "new_id": "884ca5cfae0f83f71a1a3115481cc4396eb9c205",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/perf_producer.cc"
    },
    {
      "type": "modify",
      "old_id": "e4dc7143cd0fbb74ec55fdf1592e502eefb5653e",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/perf_producer.h",
      "new_id": "932cd55eafc3730ad84fac301d58837aa4afa1e2",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/perf_producer.h"
    },
    {
      "type": "modify",
      "old_id": "a00d0480effd3ba8bd1d18fabf70025b58dc529f",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/traced_perf.cc",
      "new_id": "f21f8a2d962f5a1f7ec667f31341751f78f69430",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/traced_perf.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2260274b5c4c6a937985b0f4a9ec3351104f10f6",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/unwind_backend.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c026423570d4b433b8cf1404753cade5a804e0bf",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/unwind_backend.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6168b05dccc06a15b29d32096387f12b2f41cf62",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/unwind_types.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "492f2745b2fb9569fdb4837b16f62dc2fecd6154",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/unwind_types.h"
    },
    {
      "type": "modify",
      "old_id": "83c538fd6b3407f4be75cf455dd3f1904d58788a",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/unwinding.cc",
      "new_id": "b17b91e79f0abdb5480567c8f70806f7a199398e",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/unwinding.cc"
    },
    {
      "type": "modify",
      "old_id": "8ec44489c0e089764f11c8002b06dbbe106682f2",
      "old_mode": 33188,
      "old_path": "src/profiling/perf/unwinding.h",
      "new_id": "1102923335f5a8894a882d9f6e7925241974404a",
      "new_mode": 33188,
      "new_path": "src/profiling/perf/unwinding.h"
    },
    {
      "type": "modify",
      "old_id": "6a26ae03f0a01262b3157dcd9212c9295a20c8f4",
      "old_mode": 33261,
      "old_path": "tools/install-build-deps",
      "new_id": "ae5667ebb618ea9678eac2eaa1543244397becf8",
      "new_mode": 33261,
      "new_path": "tools/install-build-deps"
    }
  ]
}
