| // Copyright 2024 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <lib/zx/channel.h> |
| #include <zircon/assert.h> |
| #include <zircon/syscalls.h> |
| #include <zircon/types.h> |
| |
| #include <string_view> |
| |
| #ifndef HAVE_LLVM_PROFDATA |
| #error "BUILD BUG: HAVE_LLVM_PROFDATA must be 0 or 1" |
| #endif |
| |
| constexpr std::string_view kPayload = "llvm-profdata"; |
| |
| extern "C" int64_t TestStart(zx_handle_t bootstrap_channel, void* vdso, |
| zx_handle_t svc_server_end) { |
| // The bootstrap handle is a channel where the test that launched this |
| // process will wait for a message. |
| zx::channel bootstrap{bootstrap_channel}; |
| |
| #if HAVE_LLVM_PROFDATA |
| // The startup dynamic linker should have been compiled in the same variant |
| // as this test program. In a variant that enables llvm-profdata, the |
| // channel should have been provided. |
| ZX_ASSERT(svc_server_end != ZX_HANDLE_INVALID); |
| #else |
| // In a variant without llvm-profdata, no channel should have been provided. |
| ZX_ASSERT(svc_server_end == ZX_HANDLE_INVALID); |
| |
| // This exit code tells the test it was skipped intentionally. |
| return 77; |
| #endif |
| |
| // Write back on the bootstrap channel to transfer the /svc server end back |
| // to the test for validation. After exit the test will inspect the message |
| // from the bootstrap channel. |
| return bootstrap.write(0, kPayload.data(), kPayload.size(), &svc_server_end, 1); |
| } |