• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env ruby
2# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15$header = %{
16/**
17* Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
18*/
19
20// Autogenerated file -- DO NOT EDIT!
21
22#ifndef CROSS_VALUES_CROSS_VALUES_H
23#define CROSS_VALUES_CROSS_VALUES_H
24
25}
26
27Dir.glob("#{ARGV[1]}/*values_gen.h").each do |values_h|
28    $header += "#include \"generated_values/#{File.basename(values_h)}\"\n"
29end
30$header += "\n"
31$header += "#include <cstddef>\n"
32$header += "#include \"libpandabase/utils/arch.h\"\n"
33$header += "#include \"runtime/entrypoints/entrypoints.h\"\n\n"
34
35def generate(input_file, output_file)
36    data = File.read(input_file)
37    names = data.scan /DEFINE_VALUE\((\w+),/
38    File.open(output_file, "w") do |file|
39        file.puts $header
40        file.puts "namespace panda::cross_values {"
41
42        names.sort_by(&:first).each do |define|
43            file.puts %<
44[[maybe_unused]] static constexpr ptrdiff_t Get#{define[0].split('_').collect(&:capitalize).join}(Arch arch)
45{
46    switch (arch) {
47>
48            Dir.glob("#{ARGV[1]}/*_values_gen.h").each do |values_h|
49                file.puts "        case Arch::#{File.basename(values_h, "_values_gen.h")}:\n"
50                file.puts "            return cross_values::#{File.basename(values_h, "_values_gen.h")}::#{define[0]}_VAL;\n"
51            end
52            file.puts "        default:\n"
53            file.puts "            LOG(FATAL, COMMON) << \"No cross-values generated for \" << GetStringFromArch(arch);\n"
54            file.puts "            UNREACHABLE();\n"
55            file.puts "    }\n"
56            file.puts "}\n"
57        end
58
59        file.puts %<
60// Specific getter for TLS entrypoints offsets:
61[[maybe_unused]] static constexpr ptrdiff_t GetManagedThreadEntrypointOffset(Arch arch, panda::EntrypointId id)
62{
63    return GetManagedThreadEntrypointsOffset(arch) + static_cast<size_t>(id) * PointerSize(arch);
64}
65
66>
67        file.puts "}  // namespace panda::cross_values"
68        file.puts
69        file.puts "#endif  // CROSS_VALUES_CROSS_VALUES_H"
70        file.puts
71    end
72end
73
74abort "Failed: input file, generated values directory and output file required!" if ARGV.size < 3
75
76generate ARGV[0], ARGV[2]
77