aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-compile-base.h
blob: 4f039d2328ea6200dcccc95138336e32a00e5fcc (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Copyright (C) 2020-2023 Free Software Foundation, Inc.

// This file is part of GCC.

// GCC is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3, or (at your option) any later
// version.

// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// for more details.

// You should have received a copy of the GNU General Public License
// along with GCC; see the file COPYING3.  If not see
// <http://www.gnu.org/licenses/>.

#ifndef RUST_COMPILE_BASE
#define RUST_COMPILE_BASE

#include "rust-compile-context.h"
#include "rust-compile-type.h"
#include "rust-hir-visitor.h"
#include "rust-hir-full.h"

namespace Rust {
namespace Compile {

class HIRCompileBase
{
public:
  virtual ~HIRCompileBase () {}

protected:
  HIRCompileBase (Context *ctx) : ctx (ctx) {}

  Context *ctx;

protected:
  Context *get_context () { return ctx; }

  tree coercion_site (HirId id, tree rvalue, const TyTy::BaseType *actual,
		      const TyTy::BaseType *expected, Location lvalue_locus,
		      Location rvalue_locus);
  tree coercion_site1 (tree rvalue, const TyTy::BaseType *actual,
		       const TyTy::BaseType *expected, Location lvalue_locus,
		       Location rvalue_locus);

  tree coerce_to_dyn_object (tree compiled_ref, const TyTy::BaseType *actual,
			     const TyTy::DynamicObjectType *ty, Location locus);

  tree compute_address_for_trait_item (
    const Resolver::TraitItemReference *ref,
    const TyTy::TypeBoundPredicate *predicate,
    std::vector<std::pair<Resolver::TraitReference *, HIR::ImplBlock *>>
      &receiver_bounds,
    const TyTy::BaseType *receiver, const TyTy::BaseType *root, Location locus);

  bool verify_array_capacities (tree ltype, tree rtype, Location ltype_locus,
				Location rtype_locus);

  tree query_compile (HirId ref, TyTy::BaseType *lookup,
		      const HIR::PathIdentSegment &final_segment,
		      const Analysis::NodeMapping &mappings,
		      Location expr_locus, bool is_qualified_path);

  tree resolve_adjustements (std::vector<Resolver::Adjustment> &adjustments,
			     tree expression, Location locus);

  tree resolve_deref_adjustment (Resolver::Adjustment &adjustment,
				 tree expression, Location locus);

  tree resolve_indirection_adjustment (Resolver::Adjustment &adjustment,
				       tree expression, Location locus);

  tree resolve_unsized_adjustment (Resolver::Adjustment &adjustment,
				   tree expression, Location locus);

  tree resolve_unsized_slice_adjustment (Resolver::Adjustment &adjustment,
					 tree expression, Location locus);

  tree resolve_unsized_dyn_adjustment (Resolver::Adjustment &adjustment,
				       tree expression, Location locus);

  static void setup_fndecl (tree fndecl, bool is_main_entry_point,
			    bool is_generic_fn, HIR::Visibility &visibility,
			    const HIR::FunctionQualifiers &qualifiers,
			    const AST::AttrVec &attrs);

  static void handle_inline_attribute_on_fndecl (tree fndecl,
						 const AST::Attribute &attr);

  static void handle_cold_attribute_on_fndecl (tree fndecl,
					       const AST::Attribute &attr);

  static void handle_must_use_attribute_on_fndecl (tree fndecl,
						   const AST::Attribute &attr);

  static void
  handle_link_section_attribute_on_fndecl (tree fndecl,
					   const AST::Attribute &attr);
  static void
  handle_deprecated_attribute_on_fndecl (tree fndecl,
					 const AST::Attribute &attr);

  static void handle_no_mangle_attribute_on_fndecl (tree fndecl,
						    const AST::Attribute &attr);

  static void setup_abi_options (tree fndecl, ABI abi);

  static tree address_expression (tree expr, Location locus);

  static tree indirect_expression (tree expr, Location locus);

  static bool mark_addressable (tree, Location);

  static std::vector<Bvariable *>
  compile_locals_for_block (Context *ctx, Resolver::Rib &rib, tree fndecl);

  static void compile_function_body (Context *ctx, tree fndecl,
				     HIR::BlockExpr &function_body,
				     bool has_return_type);

  static tree compile_function (
    Context *ctx, const std::string &fn_name, HIR::SelfParam &self_param,
    std::vector<HIR::FunctionParam> &function_params,
    const HIR::FunctionQualifiers &qualifiers, HIR::Visibility &visibility,
    AST::AttrVec &outer_attrs, Location locus, HIR::BlockExpr *function_body,
    const Resolver::CanonicalPath *canonical_path, TyTy::FnType *fntype,
    bool function_has_return);

  static tree
  compile_constant_item (Context *ctx, TyTy::BaseType *resolved_type,
			 const Resolver::CanonicalPath *canonical_path,
			 HIR::Expr *const_value_expr, Location locus);

  static tree named_constant_expression (tree type_tree,
					 const std::string &name,
					 tree const_val, Location location);
};

} // namespace Compile
} // namespace Rust

#endif // RUST_COMPILE_BASE