blob: f27d89e83e677cc24de0929b20048b75c3f106e8 [file] [log] [blame]
// Copyright 2017 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.
#pragma once
#include <functional>
#include <map>
#include <string>
#include <vector>
#include "parser/parser.h" // for FileCtx
constexpr size_t kMaxArgs = 8;
extern const std::map<std::string, std::string> rust_overrides;
extern const std::map<std::string, std::string> rust_primitives;
extern const std::map<std::string, std::string> rust_reserved_words;
struct ArraySpec {
enum Kind : uint32_t {
IN,
OUT,
INOUT
};
Kind kind;
// Size of the array is specified in one of the two ways:
// 1) a number in the range 1--9 ('count' is non-zero, 'multipliers' is empty)
// 2) a sequence of one or more identifiers separated by '*',
// e.g. "foo * bar" or "foo" ('count' is zero, 'multipliers' is non-empty)
uint32_t count;
std::vector<std::string> multipliers;
std::string kind_str() const;
std::string kind_lowercase_str() const;
bool assign_kind(const std::vector<std::string>& attrs);
std::string to_string() const;
};
struct TypeSpec {
std::string name;
std::string type;
std::vector<std::string> attributes;
std::unique_ptr<ArraySpec> arr_spec;
std::string to_string() const;
std::string as_cpp_declaration(bool is_wrapped) const;
std::string as_rust_declaration() const;
std::string as_cpp_cast(const std::string& arg) const;
};
// The tokens of a line of requirements.
using Requirement = std::vector<std::string>;
// The tokens of a line of top-of-md description in the "NAME" block.
using TopDescription = std::vector<std::string>;
struct Syscall {
// Move-only.
Syscall(Syscall&&) = default;
Syscall(const Syscall&) = delete;
Syscall& operator=(const Syscall&) = delete;
FileCtx fc;
std::string name;
int index = -1;
std::vector<TypeSpec> ret_spec;
std::vector<TypeSpec> arg_spec;
std::vector<std::string> attributes;
std::vector<Requirement> requirements;
TopDescription top_description;
Syscall(const FileCtx& sc_fc, const std::string& sc_name)
: fc(sc_fc), name(sc_name) {}
bool is_vdso() const;
bool is_noreturn() const;
bool is_blocking() const;
bool is_internal() const;
size_t num_kernel_args() const;
void for_each_kernel_arg(const std::function<void(const TypeSpec&)>& cb) const;
void for_each_return(const std::function<void(const TypeSpec&)>& cb) const;
bool validate() const;
void assign_index(int* next_index);
bool validate_array_spec(const TypeSpec& ts) const;
void print_error(const char* what) const;
std::string return_type() const;
bool is_void_return() const;
};
const std::string map_override(
const std::string& name, const std::map<std::string, std::string>& overrides);
bool has_attribute(const char* attr, const std::vector<std::string>& attrs);
void dump_attributes(const std::vector<std::string>& attrs);