)]}'
{
  "commit": "54efa1afc08069c9dff3e7c419cea95222e65211",
  "tree": "10695169c6a10fb0a4036c42ded8d5bd4cf87710",
  "parents": [
    "2cc6f449d7e238f4a651e976481b56c1939839d9"
  ],
  "author": {
    "name": "David Benjamin",
    "email": "davidben@google.com",
    "time": "Sat Dec 15 18:58:43 2018 -0600"
  },
  "committer": {
    "name": "CQ bot account: commit-bot@chromium.org",
    "email": "commit-bot@chromium.org",
    "time": "Fri Dec 21 16:09:32 2018 +0000"
  },
  "message": "Add an ABI testing framework.\n\nDear reader, I must apologize in advance. This CL contains the following:\n\n- A new 256-line perlasm file with non-trivial perl bits and a dual-ABI\n  variadic function caller.\n\n- C preprocessor gymnastics, with variadic macros and fun facts about\n  __VA_ARGS__\u0027s behavior on empty argument lists.\n\n- C++ template gymnastics, including variadic arguments, template\n  specialization, std::enable_if, and machinery to control template argument\n  deduction.\n\nEnjoy.\n\nThis tests that our assembly functions correctly honor platform ABI\nconventions. Right now this only tests callee-saved registers, but it should be\nextendable to SEH/CFI unwind testing with single-step debugging APIs.\nRegister-checking does not involve anything funny and should be compatible with\nSDE. (The future unwind testing is unlikely to be compatible.)\n\nThis CL adds support for x86_64 SysV and Win64 ABIs. ARM, AArch64, and x86 can\nbe added in the future. The testing is injected in two places. First, all the\nassembly tests in p256-x86_64-test.cc are now instrumented. This is the\nintended workflow and should capture all registers.\n\nHowever, we currently do not unit-test our assembly much directly. We should do\nthat as follow-up work[0] but, in the meantime, I\u0027ve also wrapped all of the GTest\nmain function in an ABI test. This is imperfect as ABI failures may be masked\nby other stack frames, but it costs nothing[1] and is pretty reliable at\ncatching Win64 xmm register failures.\n\n[0] An alternate strategy would be, in debug builds, unconditionally instrument\nevery assembly call in libcrypto. But the CHECK_ABI macro would be difficult to\nreplicate in pure C, and unwind testing may be too invasive for this. Still,\nsomething to consider when we C++ libcrypto.\n\n[1] When single-stepped unwind testing exists, it won\u0027t cost nothing. The\ngtest_main.cc call will turn unwind testing off.\n\nChange-Id: I6643b26445891fd46abfacac52bc024024c8d7f6\nReviewed-on: https://boringssl-review.googlesource.com/c/33764\nReviewed-by: Adam Langley \u003cagl@google.com\u003e\nReviewed-by: Adam Langley \u003calangley@gmail.com\u003e\nCommit-Queue: David Benjamin \u003cdavidben@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "bf6964937ec9bbff9a4913cfefcd674cdfcf886d",
      "old_mode": 33188,
      "old_path": "crypto/CMakeLists.txt",
      "new_id": "863591020134ace4b4002298359d6474eaf21124",
      "new_mode": 33188,
      "new_path": "crypto/CMakeLists.txt"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cbc771f0b7def8d30d020bc2886d237dbebfb5ba",
      "new_mode": 33188,
      "new_path": "crypto/abi_self_test.cc"
    },
    {
      "type": "modify",
      "old_id": "9de32406e010232bbcefb969609e643cf2e8fa64",
      "old_mode": 33188,
      "old_path": "crypto/fipsmodule/ec/p256-x86_64.h",
      "new_id": "2d70ca78b961a3b97d453a64f7b69dfb7a13b172",
      "new_mode": 33188,
      "new_path": "crypto/fipsmodule/ec/p256-x86_64.h"
    },
    {
      "type": "modify",
      "old_id": "7d6d61652576d0f36464cbc836a03d4812236722",
      "old_mode": 33188,
      "old_path": "crypto/fipsmodule/ec/p256-x86_64_test.cc",
      "new_id": "202ea7e0320f4bb89989b9880f961fa585cb7760",
      "new_mode": 33188,
      "new_path": "crypto/fipsmodule/ec/p256-x86_64_test.cc"
    },
    {
      "type": "modify",
      "old_id": "3e02c3c754d6a6957761867e4f888028d66560be",
      "old_mode": 33188,
      "old_path": "crypto/test/CMakeLists.txt",
      "new_id": "0b1eab888dbf235e7a151a827b00f8f0fa6bfefa",
      "new_mode": 33188,
      "new_path": "crypto/test/CMakeLists.txt"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "890aa154973839b582d1a0e1b14c1222d3e51a26",
      "new_mode": 33188,
      "new_path": "crypto/test/abi_test.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ab9a729c4a98fa42bb7fc32734a543a87c54b0fd",
      "new_mode": 33188,
      "new_path": "crypto/test/abi_test.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b1f9b9306a0888a7f755a8bd334ec65bd03e3ad8",
      "new_mode": 33261,
      "new_path": "crypto/test/asm/trampoline-x86_64.pl"
    },
    {
      "type": "modify",
      "old_id": "a557168429e05a9bb2377bf1af265c8ce92d762b",
      "old_mode": 33188,
      "old_path": "crypto/test/gtest_main.cc",
      "new_id": "f19b830d9b3710d57e098406a68d9d02697e30e2",
      "new_mode": 33188,
      "new_path": "crypto/test/gtest_main.cc"
    }
  ]
}
