[compiler-rt] [compiler-rt][XRay] Make `xray_interface.h` C compliant (PR #140068)

via llvm-commits llvm-commits at lists.llvm.org
Thu May 15 07:41:20 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-xray

Author: Jan André Reuter (Thyre)

<details>
<summary>Changes</summary>

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 accidentally, 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

---
Full diff: https://github.com/llvm/llvm-project/pull/140068.diff


2 Files Affected:

- (modified) compiler-rt/include/xray/xray_interface.h (+12-8) 
- (renamed) compiler-rt/test/xray/TestCases/Posix/patching-unpatching.c (+8-8) 


``````````diff
diff --git a/compiler-rt/include/xray/xray_interface.h b/compiler-rt/include/xray/xray_interface.h
index 675ea0cbc48c8..325c463e976b2 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,22 @@
 #ifndef XRAY_XRAY_INTERFACE_H
 #define XRAY_XRAY_INTERFACE_H
 
-#include <cstddef>
-#include <cstdint>
+#include <stddef.h>
+#include <stdint.h>
 
+#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 +70,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 +88,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 +175,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 71%
rename from compiler-rt/test/xray/TestCases/Posix/patching-unpatching.cpp
rename to compiler-rt/test/xray/TestCases/Posix/patching-unpatching.c
index a8a820bbe45f2..1417c5d74548d 100644
--- a/compiler-rt/test/xray/TestCases/Posix/patching-unpatching.cpp
+++ b/compiler-rt/test/xray/TestCases/Posix/patching-unpatching.c
@@ -1,21 +1,21 @@
 // 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
+// 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
 
 #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 +28,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
 }

``````````

</details>


https://github.com/llvm/llvm-project/pull/140068


More information about the llvm-commits mailing list