[compiler-rt] Reapply "[compiler-rt][XRay] Make xray_interface.h C compliant" (PR #141728)

Jan André Reuter via llvm-commits llvm-commits at lists.llvm.org
Wed May 28 01:29:51 PDT 2025


https://github.com/Thyre created https://github.com/llvm/llvm-project/pull/141728

Changes to initial PR (#140068):

- Mark failing test as unsupported for powerpc64le, as test failure is unrelated to PR changes. See https://github.com/llvm/llvm-project/issues/141598

---

Original description (from #140068)

The XRay interface header uses no C++ specific features aside from using the std namespace and including the C++ variant of C headers. Yet, these changes prevent using `xray_interface.h` in external tools relying on C for different reasons. Make this header C compliant by using C headers, removing the std namespace from std::size_t and guard `extern "C"`.

To make sure that further changes to not break the interface accidentially, port one test from C++ to C. This requires the C23 standard to officially support the attribute syntax used in this test case.

Note that this only resolves this issue for `xray_interface.h`. `xray_records.h` is also not C compliant, but requires more work to port.

Fixes #139902

>From a70b96df4e5d458ddb19741bc71275e624b353ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Andr=C3=A9=20Reuter?= <j.reuter at fz-juelich.de>
Date: Thu, 15 May 2025 16:32:52 +0200
Subject: [PATCH] [compiler-rt][XRay] Make xray_interface.h C compliant
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The XRay interface header uses no C++ specific features aside from using
the std namespace and including the C++ variant of C headers. Yet, these
changes prevent using `xray_interface.h` in external tools relying on C
for different reasons. Make this header C compliant by using C headers,
removing the std namespace from std::size_t and guard `extern "C"`.

To make sure that further changes to not break the interface
accidentially, port one test from C++ to C. This requires the C23
standard to officially support the attribute syntax used in this test
case.

Note that this only resolves this issue for `xray_interface.h`.
`xray_records.h` is also not C compliant, but requires more work to
port.

Fixes #139902

Signed-off-by: Jan André Reuter <j.reuter at fz-juelich.de>
---
 compiler-rt/include/xray/xray_interface.h     | 21 +++++++++++++------
 ...g-unpatching.cpp => patching-unpatching.c} | 21 ++++++++++++-------
 2 files changed, 28 insertions(+), 14 deletions(-)
 rename compiler-rt/test/xray/TestCases/Posix/{patching-unpatching.cpp => patching-unpatching.c} (64%)

diff --git a/compiler-rt/include/xray/xray_interface.h b/compiler-rt/include/xray/xray_interface.h
index 675ea0cbc48c8..a34c025657621 100644
--- a/compiler-rt/include/xray/xray_interface.h
+++ b/compiler-rt/include/xray/xray_interface.h
@@ -1,4 +1,4 @@
-//===- xray_interface.h -----------------------------------------*- C++ -*-===//
+//===- xray_interface.h ---------------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -14,20 +14,27 @@
 #ifndef XRAY_XRAY_INTERFACE_H
 #define XRAY_XRAY_INTERFACE_H
 
+#ifdef __cplusplus
 #include <cstddef>
 #include <cstdint>
+#else
+#include <stddef.h>
+#include <stdint.h>
+#endif
 
+#ifdef __cplusplus
 extern "C" {
+#endif
 
 /// Synchronize this with AsmPrinter::SledKind in LLVM.
-enum XRayEntryType {
+typedef enum {
   ENTRY = 0,
   EXIT = 1,
   TAIL = 2,
   LOG_ARGS_ENTRY = 3,
   CUSTOM_EVENT = 4,
   TYPED_EVENT = 5,
-};
+} XRayEntryType;
 
 /// Provide a function to invoke for when instrumentation points are hit. This
 /// is a user-visible control surface that overrides the default implementation.
@@ -68,7 +75,7 @@ extern int __xray_set_handler_arg1(void (*entry)(int32_t, XRayEntryType,
 extern int __xray_remove_handler_arg1();
 
 /// Provide a function to invoke when XRay encounters a custom event.
-extern int __xray_set_customevent_handler(void (*entry)(void *, std::size_t));
+extern int __xray_set_customevent_handler(void (*entry)(void *, size_t));
 
 /// This removes whatever the currently provided custom event handler is.
 /// Returns 1 on success, 0 on error.
@@ -86,12 +93,12 @@ extern int __xray_remove_typedevent_handler();
 
 extern uint16_t __xray_register_event_type(const char *event_type);
 
-enum XRayPatchingStatus {
+typedef enum {
   NOT_INITIALIZED = 0,
   SUCCESS = 1,
   ONGOING = 2,
   FAILED = 3,
-};
+} XRayPatchingStatus;
 
 /// This tells XRay to patch the instrumentation points in all currently loaded
 /// objects. See XRayPatchingStatus for possible result values.
@@ -173,6 +180,8 @@ extern int32_t __xray_pack_id(int32_t FuncId, int32_t ObjId);
 /// Calling __xray_init() more than once is safe across multiple threads.
 extern void __xray_init();
 
+#ifdef __cplusplus
 } // end extern "C"
+#endif
 
 #endif // XRAY_XRAY_INTERFACE_H
diff --git a/compiler-rt/test/xray/TestCases/Posix/patching-unpatching.cpp b/compiler-rt/test/xray/TestCases/Posix/patching-unpatching.c
similarity index 64%
rename from compiler-rt/test/xray/TestCases/Posix/patching-unpatching.cpp
rename to compiler-rt/test/xray/TestCases/Posix/patching-unpatching.c
index a8a820bbe45f2..488c55a0280be 100644
--- a/compiler-rt/test/xray/TestCases/Posix/patching-unpatching.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/patching-unpatching.c
@@ -1,21 +1,26 @@
 // Check that we can patch and un-patch on demand, and that logging gets invoked
 // appropriately.
 //
-// RUN: %clangxx_xray -fxray-instrument -std=c++11 %s -o %t
+// Do not run on powerpc64le, as linking XRay with C compiler causes linker error
+// due to std::__throw_system_error(int) being present in XRay libraries.
+// See https://github.com/llvm/llvm-project/issues/141598
+//
+// RUN: %clang_xray -fxray-instrument -std=c23 %s -o %t
 // RUN: env XRAY_OPTIONS="patch_premain=false" %run %t 2>&1 | FileCheck %s
-// RUN: %clangxx_xray -fxray-instrument -fno-xray-function-index -std=c++11 %s -o %t
+// RUN: %clang_xray -fxray-instrument -fno-xray-function-index -std=c23 %s -o %t
 // RUN: env XRAY_OPTIONS="patch_premain=false" %run %t 2>&1 | FileCheck %s
 
 // UNSUPPORTED: target-is-mips64,target-is-mips64el
+// UNSUPPORTED: target=powerpc64le-{{.*}}
 
 #include "xray/xray_interface.h"
 
-#include <cstdio>
+#include <stdio.h>
 
 bool called = false;
 
 void test_handler(int32_t fid, XRayEntryType type) {
-  printf("called: %d, type=%d\n", fid, static_cast<int32_t>(type));
+  printf("called: %d, type=%d\n", fid, (int32_t)(type));
   called = true;
 }
 
@@ -28,24 +33,24 @@ int main() {
   always_instrument();
   // CHECK: always instrumented called
   auto status = __xray_patch();
-  printf("patching status: %d\n", static_cast<int32_t>(status));
+  printf("patching status: %d\n", (int32_t)status);
   // CHECK-NEXT: patching status: 1
   always_instrument();
   // CHECK-NEXT: called: {{.*}}, type=0
   // CHECK-NEXT: always instrumented called
   // CHECK-NEXT: called: {{.*}}, type=1
   status = __xray_unpatch();
-  printf("patching status: %d\n", static_cast<int32_t>(status));
+  printf("patching status: %d\n", (int32_t)status);
   // CHECK-NEXT: patching status: 1
   always_instrument();
   // CHECK-NEXT: always instrumented called
   status = __xray_patch();
-  printf("patching status: %d\n", static_cast<int32_t>(status));
+  printf("patching status: %d\n", (int32_t)status);
   // CHECK-NEXT: patching status: 1
   __xray_remove_handler();
   always_instrument();
   // CHECK-NEXT: always instrumented called
   status = __xray_unpatch();
-  printf("patching status: %d\n", static_cast<int32_t>(status));
+  printf("patching status: %d\n", (int32_t)status);
   // CHECK-NEXT: patching status: 1
 }



More information about the llvm-commits mailing list