KCC - Kayte C Compiler 1.10.0
A C compiler implementation with preprocessor, lexer, parser, and code generator
Loading...
Searching...
No Matches
multiarch_codegen.h
1#ifndef MULTIARCH_CODEGEN_H
2#define MULTIARCH_CODEGEN_H
3
4#include <stdio.h>
5#include <stdlib.h>
6#include <stdarg.h>
7#include <stdbool.h>
8#include <string.h>
9
10// Target architectures
11typedef enum {
12 ARCH_X86_64,
13 ARCH_ARM64,
14 ARCH_UNKNOWN
15} TargetArch;
16
17// Target platforms
18typedef enum {
19 PLATFORM_LINUX,
20 PLATFORM_MACOS,
21 PLATFORM_UNKNOWN
22} TargetPlatform;
23
24// Calling conventions
25typedef enum {
26 CALL_CONV_SYSV, // System V ABI (Linux x86_64)
27 CALL_CONV_MS, // Microsoft ABI (Windows x86_64)
28 CALL_CONV_AARCH64 // ARM64 ABI (both Linux and macOS)
29} CallingConvention;
30
31// Register types
32typedef enum {
33 REG_GENERAL, // General purpose registers
34 REG_FLOAT, // Floating point registers
35 REG_VECTOR, // Vector/SIMD registers
36 REG_SPECIAL // Special purpose registers
37} RegisterType;
38
39// Register information
40typedef struct {
41 const char *name;
42 RegisterType type;
43 int size; // Size in bytes
44 bool preserved; // Callee-saved register
46
47// Target configuration
48typedef struct {
49 TargetArch arch;
50 TargetPlatform platform;
51 CallingConvention calling_conv;
52
53 // Architecture-specific info
54 const char *arch_name;
55 const char *platform_name;
56 int pointer_size;
57 int stack_alignment;
58
59 // Register sets
60 const RegisterInfo *general_regs;
61 const RegisterInfo *float_regs;
62 int num_general_regs;
63 int num_float_regs;
64
65 // Calling convention specifics
66 const char **param_regs; // Parameter passing registers
67 const char **return_regs; // Return value registers
68 int num_param_regs;
69 int num_return_regs;
70
71 // System call information
72 const char *syscall_reg; // System call number register
73 const char *syscall_instruction;
74
75 // Assembly syntax
76 const char *comment_prefix;
77 const char *global_directive;
78 const char *section_text;
79 const char *section_data;
80 bool att_syntax; // AT&T vs Intel syntax
81
83
84// Multi-architecture code generator
85typedef struct MultiArchCodegen {
86 FILE *output_file;
87 TargetConfig *target;
88
89 // Code generation state
90 int label_counter;
91 int temp_counter;
92 int current_function_locals;
93 int stack_offset;
94
95 // Symbol tables and tracking
96 struct {
97 char name[64];
98 int offset;
99 int size;
100 } local_vars[256];
101 int local_var_count;
102
103 // Function prologue/epilogue tracking
104 bool in_function;
105 char current_function[64];
106 int stack_size;
107
109
110// Target configuration functions
111TargetConfig *target_config_create(TargetArch arch, TargetPlatform platform);
112void target_config_destroy(TargetConfig *config);
113TargetArch detect_host_architecture(void);
114TargetPlatform detect_host_platform(void);
115
116// Multi-arch codegen functions
117MultiArchCodegen *multiarch_codegen_create(const char *output_file, TargetArch arch, TargetPlatform platform);
118void multiarch_codegen_destroy(MultiArchCodegen *codegen);
119
120// Main code generation
121bool multiarch_codegen_generate(MultiArchCodegen *codegen, struct ASTNode *ast);
122
123// Architecture-neutral code generation
124void multiarch_emit(MultiArchCodegen *codegen, const char *format, ...);
125void multiarch_emit_comment(MultiArchCodegen *codegen, const char *comment);
126void multiarch_emit_label(MultiArchCodegen *codegen, const char *label);
127void multiarch_emit_directive(MultiArchCodegen *codegen, const char *directive, const char *args);
128
129// Function management
130void multiarch_function_prologue(MultiArchCodegen *codegen, const char *func_name, int param_count);
131void multiarch_function_epilogue(MultiArchCodegen *codegen);
132void multiarch_function_call(MultiArchCodegen *codegen, const char *func_name, int arg_count);
133void multiarch_function_return(MultiArchCodegen *codegen, bool has_value);
134
135// Memory operations
136void multiarch_load_immediate(MultiArchCodegen *codegen, const char *dest_reg, long value);
137void multiarch_load_address(MultiArchCodegen *codegen, const char *dest_reg, const char *symbol);
138void multiarch_load_memory(MultiArchCodegen *codegen, const char *dest_reg, const char *src_addr, int size);
139void multiarch_store_memory(MultiArchCodegen *codegen, const char *src_reg, const char *dest_addr, int size);
140
141// Arithmetic operations
142void multiarch_add(MultiArchCodegen *codegen, const char *dest, const char *src1, const char *src2);
143void multiarch_sub(MultiArchCodegen *codegen, const char *dest, const char *src1, const char *src2);
144void multiarch_mul(MultiArchCodegen *codegen, const char *dest, const char *src1, const char *src2);
145void multiarch_div(MultiArchCodegen *codegen, const char *dest, const char *src1, const char *src2);
146void multiarch_mod(MultiArchCodegen *codegen, const char *dest, const char *src1, const char *src2);
147void multiarch_neg(MultiArchCodegen *codegen, const char *dest, const char *src);
148
149// Logical operations
150void multiarch_and(MultiArchCodegen *codegen, const char *dest, const char *src1, const char *src2);
151void multiarch_or(MultiArchCodegen *codegen, const char *dest, const char *src1, const char *src2);
152void multiarch_xor(MultiArchCodegen *codegen, const char *dest, const char *src1, const char *src2);
153void multiarch_not(MultiArchCodegen *codegen, const char *dest, const char *src);
154
155// Comparison operations
156void multiarch_compare(MultiArchCodegen *codegen, const char *reg1, const char *reg2);
157void multiarch_test(MultiArchCodegen *codegen, const char *reg1, const char *reg2);
158
159// Control flow
160void multiarch_jump(MultiArchCodegen *codegen, const char *label);
161void multiarch_jump_if_zero(MultiArchCodegen *codegen, const char *label);
162void multiarch_jump_if_not_zero(MultiArchCodegen *codegen, const char *label);
163void multiarch_jump_if_equal(MultiArchCodegen *codegen, const char *label);
164void multiarch_jump_if_not_equal(MultiArchCodegen *codegen, const char *label);
165void multiarch_jump_if_less(MultiArchCodegen *codegen, const char *label);
166void multiarch_jump_if_greater(MultiArchCodegen *codegen, const char *label);
167void multiarch_jump_if_less_equal(MultiArchCodegen *codegen, const char *label);
168void multiarch_jump_if_greater_equal(MultiArchCodegen *codegen, const char *label);
169
170// Register management
171const char *multiarch_get_param_reg(MultiArchCodegen *codegen, int param_index);
172const char *multiarch_get_return_reg(MultiArchCodegen *codegen);
173const char *multiarch_get_temp_reg(MultiArchCodegen *codegen, int index);
174const char *multiarch_get_stack_pointer(MultiArchCodegen *codegen);
175const char *multiarch_get_frame_pointer(MultiArchCodegen *codegen);
176
177// Stack operations
178void multiarch_push(MultiArchCodegen *codegen, const char *reg);
179void multiarch_pop(MultiArchCodegen *codegen, const char *reg);
180void multiarch_stack_alloc(MultiArchCodegen *codegen, int bytes);
181void multiarch_stack_dealloc(MultiArchCodegen *codegen, int bytes);
182
183// Variable management
184void multiarch_declare_local_var(MultiArchCodegen *codegen, const char *name, int size);
185int multiarch_get_local_var_offset(MultiArchCodegen *codegen, const char *name);
186void multiarch_load_local_var(MultiArchCodegen *codegen, const char *dest_reg, const char *var_name);
187void multiarch_store_local_var(MultiArchCodegen *codegen, const char *src_reg, const char *var_name);
188
189// System calls
190void multiarch_syscall(MultiArchCodegen *codegen, int syscall_num, int arg_count);
191void multiarch_exit_program(MultiArchCodegen *codegen, int exit_code);
192
193// Utility functions
194char *multiarch_new_label(MultiArchCodegen *codegen);
195char *multiarch_new_temp(MultiArchCodegen *codegen);
196void multiarch_align_stack(MultiArchCodegen *codegen);
197
198// AST-specific code generation
199void multiarch_codegen_program(MultiArchCodegen *codegen, struct ASTNode *node);
200void multiarch_codegen_function_declaration(MultiArchCodegen *codegen, struct ASTNode *node);
201void multiarch_codegen_variable_declaration(MultiArchCodegen *codegen, struct ASTNode *node);
202void multiarch_codegen_statement(MultiArchCodegen *codegen, struct ASTNode *node);
203void multiarch_codegen_expression(MultiArchCodegen *codegen, struct ASTNode *node);
204void multiarch_codegen_binary_expr(MultiArchCodegen *codegen, struct ASTNode *node);
205void multiarch_codegen_unary_expr(MultiArchCodegen *codegen, struct ASTNode *node);
206void multiarch_codegen_call_expr(MultiArchCodegen *codegen, struct ASTNode *node);
207void multiarch_codegen_return_stmt(MultiArchCodegen *codegen, struct ASTNode *node);
208void multiarch_codegen_if_stmt(MultiArchCodegen *codegen, struct ASTNode *node);
209void multiarch_codegen_while_stmt(MultiArchCodegen *codegen, struct ASTNode *node);
210
211#endif // MULTIARCH_CODEGEN_H
AST Node structure.
Definition types.h:333