aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/boot/initialize_runtime.cpp
blob: 70172c9682a2ecd3f3c06ce1b442d32206bc683c (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
#include <algorithm>
#include <functional>
#include <span>

extern "C"
{
  using global_initializer = auto (*)() -> void;

  extern global_initializer __ctors_start;
  extern global_initializer __ctors_end;
  extern global_initializer __init_array_start;
  extern global_initializer __init_array_end;

  auto invoke_global_constructors() -> void
  {
    auto constructors = std::span{&__ctors_start, &__ctors_end};
    auto initializers = std::span{&__init_array_start, &__init_array_end};

    auto apply_invoke = [](auto invokable) {
      return std::invoke(invokable);
    };

    std::ranges::for_each(constructors, apply_invoke);
    std::ranges::for_each(initializers, apply_invoke);
  }
}