summaryrefslogtreecommitdiff
path: root/lib/cxx_abi.cc
blob: 872b4a2b5223e7c2a82f9721f002daff4772a806 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Copyright (C) 2026 Richard Qin */

/*
 * cxx_abi.cc — Minimal C++ ABI stubs for freestanding kernel
 *
 * Provides symbols that the compiler/linker expects from the C++
 * runtime library.  All error paths are fatal (kernel_panic).
 *
 * Reference: docs/specs/cpp_runtime.md
 */

#include <lume/klog.h>

/* Pure virtual function call trap.
 * Generated by the compiler in vtable entries for pure virtual methods.
 * Reaching this means a derived class failed to implement a pure virtual. */
extern "C" void __cxa_pure_virtual()
{
    kernel_panic("pure virtual function call");
}

/* Global destructor registration.
 * The kernel does not support global object destruction — all global
 * objects use Placement New with explicit lifetime management.
 * If the compiler emits a call to this, it indicates a code violation. */
extern "C" int __cxa_atexit(void (*)(void*), void*, void*)
{
    kernel_panic("__cxa_atexit called in kernel");
    return 0; // unreachable
}

/* DSO handle — required by __cxa_atexit ABI.
 * The kernel is statically linked; this symbol just needs to exist. */
extern "C" {
void* __dso_handle __attribute__((visibility("hidden"))) = nullptr;
}