From 07f27b1d445a27433f2c871935da2cefcfbdb458 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 12 May 2024 10:34:17 -0400 Subject: Fix alignment of generated UNWIND_INFO structures I missed a few parts of the Windows documentation: > The UNWIND_INFO structure must be DWORD aligned in memory. > For alignment purposes, this array [unwind codes] always has an even > number of entries, and the final entry is potentially unused. In that > case, the array is one longer than indicated by the count of unwind > codes field. https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170 This didn't seem to have any practical effect (unwinding tests worked as-is), but I noticed this while rewriting some handwritten codes. Bug: 259 Change-Id: I655f3a7f3a907797e7665a276f4926a31a1e1639 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/68407 Reviewed-by: Adam Langley Auto-Submit: David Benjamin Commit-Queue: Adam Langley --- crypto/perlasm/x86_64-xlate.pl | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'crypto') diff --git a/crypto/perlasm/x86_64-xlate.pl b/crypto/perlasm/x86_64-xlate.pl index 5b7705d..3011c91 100755 --- a/crypto/perlasm/x86_64-xlate.pl +++ b/crypto/perlasm/x86_64-xlate.pl @@ -903,6 +903,16 @@ $info{info_label}: $info{unwind_codes} ____ + # UNWIND_INFOs must be 4-byte aligned. If needed, we must add an extra + # unwind code. This does not change the unwind code count. Windows + # documentation says "For alignment purposes, this array always has an + # even number of entries, and the final entry is potentially unused. In + # that case, the array is one longer than indicated by the count of + # unwind codes field." + if ($info{num_codes} & 1) { + $xdata .= "\t.value\t0\n"; + } + %info = (); return $end_label; } -- cgit v1.1