Zen-C
Loading...
Searching...
No Matches
codegen.h
Go to the documentation of this file.
1
2#ifndef CODEGEN_H
3#define CODEGEN_H
4
5#include "../ast/ast.h"
6#include "../parser/parser.h"
7#include "../zprep.h"
8#include <stdio.h>
9
10// Main codegen entry points.
11
19void codegen_node(ParserContext *ctx, ASTNode *node, FILE *out);
20
24void codegen_node_single(ParserContext *ctx, ASTNode *node, FILE *out);
25
29void codegen_walker(ParserContext *ctx, ASTNode *node, FILE *out);
30
34void codegen_expression(ParserContext *ctx, ASTNode *node, FILE *out);
35
39void codegen_match_internal(ParserContext *ctx, ASTNode *node, FILE *out, int use_result);
40
41// Utility functions (codegen_utils.c).
42char *infer_type(ParserContext *ctx, ASTNode *node);
44char *get_field_type_str(ParserContext *ctx, const char *struct_name, const char *field_name);
45char *extract_call_args(const char *args);
46void emit_var_decl_type(ParserContext *ctx, FILE *out, const char *type_str, const char *var_name);
47char *replace_string_type(const char *args);
48const char *parse_original_method_name(const char *mangled);
49void emit_auto_type(ParserContext *ctx, ASTNode *init_expr, Token t, FILE *out);
51void emit_func_signature(ParserContext *ctx, FILE *out, ASTNode *func, const char *name_override);
52char *strip_template_suffix(const char *name);
53int emit_move_invalidation(ParserContext *ctx, ASTNode *node, FILE *out);
54void codegen_expression_with_move(ParserContext *ctx, ASTNode *node, FILE *out);
55
56// Declaration emission (codegen_decl.c).
60void emit_preamble(ParserContext *ctx, FILE *out);
61void emit_includes_and_aliases(ASTNode *node, FILE *out);
62void emit_type_aliases(ASTNode *node, FILE *out);
63void emit_global_aliases(ParserContext *ctx, FILE *out);
64void emit_struct_defs(ParserContext *ctx, ASTNode *node, FILE *out);
65void emit_trait_defs(ASTNode *node, FILE *out);
66void emit_enum_protos(ASTNode *node, FILE *out);
67void emit_globals(ParserContext *ctx, ASTNode *node, FILE *out);
68void emit_lambda_defs(ParserContext *ctx, FILE *out);
69void emit_protos(ParserContext *ctx, ASTNode *node, FILE *out);
70void emit_impl_vtables(ParserContext *ctx, FILE *out);
71
75int emit_tests_and_runner(ParserContext *ctx, ASTNode *node, FILE *out);
76void print_type_defs(ParserContext *ctx, FILE *out, ASTNode *nodes);
77
78// Global state (shared across modules).
80extern char *g_current_impl_type;
81extern int tmp_counter;
82extern int defer_count;
83extern ASTNode *defer_stack[];
85extern char *g_current_func_ret_type;
86
87// Defer boundary tracking for proper defer execution on break/continue/return
88#define MAX_DEFER 1024
89#define MAX_LOOP_DEPTH 64
90extern int loop_defer_boundary[];
91extern int loop_depth;
92extern int func_defer_boundary;
93
94#endif
const char *const name
Definition cJSON.h:307
ASTNode * find_struct_def_codegen(ParserContext *ctx, const char *name)
Definition codegen_utils.c:119
void emit_var_decl_type(ParserContext *ctx, FILE *out, const char *type_str, const char *var_name)
Definition codegen_utils.c:113
void codegen_expression_with_move(ParserContext *ctx, ASTNode *node, FILE *out)
Definition codegen_utils.c:893
char * get_field_type_str(ParserContext *ctx, const char *struct_name, const char *field_name)
Definition codegen_utils.c:159
void emit_struct_defs(ParserContext *ctx, ASTNode *node, FILE *out)
Definition codegen_decl.c:331
void print_type_defs(ParserContext *ctx, FILE *out, ASTNode *nodes)
Definition codegen_decl.c:1064
void emit_lambda_defs(ParserContext *ctx, FILE *out)
Definition codegen_decl.c:277
int emit_move_invalidation(ParserContext *ctx, ASTNode *node, FILE *out)
Definition codegen_utils.c:844
char * replace_string_type(const char *args)
Definition codegen_utils.c:659
void emit_enum_protos(ASTNode *node, FILE *out)
Definition codegen_decl.c:249
int defer_count
Counter for defer statements in current scope.
Definition codegen_utils.c:16
void emit_protos(ParserContext *ctx, ASTNode *node, FILE *out)
Definition codegen_decl.c:702
void codegen_walker(ParserContext *ctx, ASTNode *node, FILE *out)
Walker for list of nodes (calls codegen_node recursively).
Definition codegen_stmt.c:1794
void emit_impl_vtables(ParserContext *ctx, FILE *out)
Definition codegen_decl.c:889
int emit_tests_and_runner(ParserContext *ctx, ASTNode *node, FILE *out)
Emits test runner and test cases if testing is enabled.
Definition codegen_decl.c:1029
void codegen_node(ParserContext *ctx, ASTNode *node, FILE *out)
Generates code for a given AST node.
Definition codegen_main.c:299
int func_defer_boundary
Defer stack index at function entry.
Definition codegen_utils.c:21
void codegen_match_internal(ParserContext *ctx, ASTNode *node, FILE *out, int use_result)
Internal handler for match statements.
Definition codegen_stmt.c:152
void emit_preamble(ParserContext *ctx, FILE *out)
Emits the standard preamble (includes, macros) to the output file.
Definition codegen_decl.c:43
void emit_func_signature(ParserContext *ctx, FILE *out, ASTNode *func, const char *name_override)
Definition codegen_utils.c:731
char * codegen_type_to_string(Type *t)
Definition codegen_utils.c:725
void emit_type_aliases(ASTNode *node, FILE *out)
Definition codegen_decl.c:225
int loop_depth
Current loop nesting depth.
Definition codegen_utils.c:20
ASTNode * defer_stack[]
Stack of deferred nodes.
Definition codegen_utils.c:15
void emit_auto_type(ParserContext *ctx, ASTNode *init_expr, Token t, FILE *out)
Definition codegen_utils.c:695
void codegen_expression(ParserContext *ctx, ASTNode *node, FILE *out)
Generates code for an expression node.
Definition codegen.c:157
char * g_current_impl_type
Type currently being implemented (in impl block).
Definition codegen_utils.c:13
int loop_defer_boundary[]
Defer stack index at start of each loop.
Definition codegen_utils.c:19
char * g_current_func_ret_type
Return type of current function.
Definition codegen_stmt.c:14
const char * parse_original_method_name(const char *mangled)
Definition codegen_utils.c:638
char * strip_template_suffix(const char *name)
Definition codegen_utils.c:25
ASTNode * g_current_lambda
Current lambda being generated.
Definition codegen_utils.c:17
char * infer_type(ParserContext *ctx, ASTNode *node)
Definition codegen_utils.c:190
void emit_includes_and_aliases(ASTNode *node, FILE *out)
Definition codegen_decl.c:205
void codegen_node_single(ParserContext *ctx, ASTNode *node, FILE *out)
Generates code for a single AST node (non-recursive for siblings).
Definition codegen_stmt.c:514
ASTNode * global_user_structs
List of user defined structs.
Definition codegen_utils.c:12
void emit_trait_defs(ASTNode *node, FILE *out)
Definition codegen_decl.c:496
void emit_globals(ParserContext *ctx, ASTNode *node, FILE *out)
Definition codegen_decl.c:658
void emit_global_aliases(ParserContext *ctx, FILE *out)
Definition codegen_decl.c:238
int tmp_counter
Counter for temporary variables.
Definition codegen_utils.c:14
char * extract_call_args(const char *args)
Definition codegen_utils.c:595
Definition ast.h:187
Global compilation state and symbol table.
Definition parser.h:275
Represents a source token.
Definition zprep.h:119
Represents a formal type in the type system.
Definition ast.h:81