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