[compiler-rt][xray] Fix alignment of XRayFileHeader
authorLeandro Lupori <leandro.lupori@linaro.org>
Tue, 11 Jul 2023 20:08:13 +0000 (20:08 +0000)
committerLeandro Lupori <leandro.lupori@linaro.org>
Mon, 17 Jul 2023 13:51:27 +0000 (10:51 -0300)
XRayFileHeader storage was obtained from std::aligned_storage
using its default alignment and not the struct's alignment
requirement. This was causing a bus error on AArch32, on armv8
machines, where vld1.64/vst1.64 instructions with 128-bit
alignment requirement were being used to copy XRayFileHeader.

There is still another issue with fdr-single-thread.cpp test on
armv7. Now it runs until completion and produces a valid log file,
but for some reason the function name appears as _end in it,
instead of the expected mangled fn name.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D155013

compiler-rt/lib/xray/xray_fdr_logging.cpp

index 6056f81..378a8c0 100644 (file)
@@ -15,6 +15,7 @@
 //===----------------------------------------------------------------------===//
 #include "xray_fdr_logging.h"
 #include <cassert>
+#include <cstddef>
 #include <errno.h>
 #include <limits>
 #include <memory>
@@ -140,7 +141,7 @@ static ThreadLocalData &getThreadLocalData() {
 }
 
 static XRayFileHeader &fdrCommonHeaderInfo() {
-  static std::aligned_storage<sizeof(XRayFileHeader)>::type HStorage;
+  alignas(XRayFileHeader) static std::byte HStorage[sizeof(XRayFileHeader)];
   static pthread_once_t OnceInit = PTHREAD_ONCE_INIT;
   static bool TSCSupported = true;
   static uint64_t CycleFrequency = NanosecondsPerSecond;
@@ -204,7 +205,8 @@ XRayBuffer fdrIterator(const XRayBuffer B) {
   // initialized the first time this function is called. We'll update one part
   // of this information with some relevant data (in particular the number of
   // buffers to expect).
-  static std::aligned_storage<sizeof(XRayFileHeader)>::type HeaderStorage;
+  alignas(
+      XRayFileHeader) static std::byte HeaderStorage[sizeof(XRayFileHeader)];
   static pthread_once_t HeaderOnce = PTHREAD_ONCE_INIT;
   pthread_once(
       &HeaderOnce, +[] {