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 Signed-off-by: Jan André Reuter <j.reuter@fz-juelich.de>
57 lines
1.9 KiB
C
57 lines
1.9 KiB
C
// Check that we can patch and un-patch on demand, and that logging gets invoked
|
|
// appropriately.
|
|
//
|
|
// 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: %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 <stdio.h>
|
|
|
|
bool called = false;
|
|
|
|
void test_handler(int32_t fid, enum XRayEntryType type) {
|
|
printf("called: %d, type=%d\n", fid, (int32_t)(type));
|
|
called = true;
|
|
}
|
|
|
|
[[clang::xray_always_instrument]] void always_instrument() {
|
|
printf("always instrumented called\n");
|
|
}
|
|
|
|
int main() {
|
|
__xray_set_handler(test_handler);
|
|
always_instrument();
|
|
// CHECK: always instrumented called
|
|
auto status = __xray_patch();
|
|
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", (int32_t)status);
|
|
// CHECK-NEXT: patching status: 1
|
|
always_instrument();
|
|
// CHECK-NEXT: always instrumented called
|
|
status = __xray_patch();
|
|
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", (int32_t)status);
|
|
// CHECK-NEXT: patching status: 1
|
|
}
|