Purple  0.1
Standard Language Specification
llvm.h
Go to the documentation of this file.
1
8#ifndef LLVM_H
9#define LLVM_H
10
11#include "scan.h"
12#include "types/number.h"
14
18static const char* numberTypeLLVMReprs[] = {"i1", "i8", "i16", "i32", "i64"};
19
24
29
33typedef enum
34{
40
44typedef struct LLVMValue {
52 union {
56 long long int constant;
61
65#define LLVMVALUE_NULL \
66 (LLVMValue) \
67 { \
68 .value_type = LLVMVALUETYPE_NONE, .value = 0 \
69 }
70
74#define LLVMVALUE_CONSTANT(c) \
75 (LLVMValue) \
76 { \
77 .value_type = LLVMVALUETYPE_CONSTANT, .value.constant = c \
78 }
79
83#define LLVMVALUE_VIRTUAL_REGISTER(register_number, n_t) \
84 (LLVMValue) \
85 { \
86 .value_type = LLVMVALUETYPE_VIRTUAL_REGISTER, .stores_pointer = false, \
87 .value.virtual_register_index = register_number, .number_type = n_t \
88 }
89
93#define LLVMVALUE_VIRTUAL_REGISTER_POINTER(register_number, n_t) \
94 (LLVMValue) \
95 { \
96 .value_type = LLVMVALUETYPE_VIRTUAL_REGISTER, .stores_pointer = true, \
97 .value.virtual_register_index = register_number, .number_type = n_t \
98 }
99
103#define LLVMVALUE_LABEL(label_number) \
104 (LLVMValue) \
105 { \
106 .value_type = LLVMVALUETYPE_LABEL, .value.label_index = label_number \
107 }
108
110#define PURPLE_LABEL_PREFIX "L"
111
112type_register* llvm_ensure_registers_loaded(int n_registers, type_register registers[],
113 NumberType number_type);
114
115void llvm_preamble(void);
116void llvm_postamble(void);
117
118bool llvm_stack_allocation(LLVMStackEntryNode* stack_entries);
119
120LLVMValue llvm_binary_arithmetic(TokenType operation, LLVMValue left_virtual_register,
121 LLVMValue right_virtual_register);
125
126LLVMValue llvm_load_global_variable(char* symbol_name);
127void llvm_store_global_variable(char* symbol_name, LLVMValue rvalue_register);
128void llvm_declare_global_number_variable(char* symbol_name, NumberType number_type);
130LLVMValue llvm_truncate(LLVMValue reg, NumberType new_type, NumberType old_type);
131void llvm_declare_assign_global_number_variable(char* symbol_name, Number number);
132void llvm_print_int(type_register print_vr, TokenType type);
133void llvm_print_bool(type_register print_vr);
134LLVMValue llvm_compare(TokenType comparison_type, LLVMValue left_virtual_register,
135 LLVMValue right_virtual_register);
136LLVMValue llvm_compare_jump(TokenType comparison_type, LLVMValue left_virtual_register,
137 LLVMValue right_virtual_register, LLVMValue false_label);
138void llvm_label(LLVMValue label);
139void llvm_jump(LLVMValue label);
140void llvm_conditional_jump(LLVMValue condition_register, LLVMValue true_label,
141 LLVMValue false_label);
142void llvm_function_preamble(char* symbol_name);
143void llvm_function_postamble(void);
144LLVMValue llvm_call_function(LLVMValue virtual_register, char* symbol_name);
145const char* type_to_llvm_type(TokenType type);
146void llvm_return(LLVMValue virtual_register, char* symbol_name);
147
148#endif /* LLVM_H */
LLVMValue llvm_load_global_variable(char *symbol_name)
Load a global variable's value into a new virtual register.
Definition: llvm.c:373
void llvm_print_int(type_register print_vr, TokenType type)
Generate code to print an integer.
Definition: llvm.c:489
LLVMStackEntryNode * freeVirtualRegistersHead
Head node of linked list containing register indices that are free to have values stored in them.
Definition: translate.c:13
LLVMValue llvm_call_function(LLVMValue virtual_register, char *symbol_name)
Definition: llvm.c:822
void llvm_postamble(void)
Generated program's postamble.
Definition: llvm.c:132
LLVMValue llvm_compare(TokenType comparison_type, LLVMValue left_virtual_register, LLVMValue right_virtual_register)
Generate code to compare two registers.
Definition: llvm.c:642
LLVMStackEntryNode * loadedRegistersHead
Head node of linked list containing register indices that have loaded values.
Definition: translate.c:12
void llvm_declare_assign_global_number_variable(char *symbol_name, Number number)
Declare a global variable with an assigned number value.
Definition: llvm.c:477
LLVMValue llvm_store_constant(Number value)
Store a constant number value into a register.
Definition: llvm.c:346
void llvm_function_preamble(char *symbol_name)
Definition: llvm.c:783
void llvm_label(LLVMValue label)
Generate label code.
Definition: llvm.c:739
void llvm_conditional_jump(LLVMValue condition_register, LLVMValue true_label, LLVMValue false_label)
Generate a conditional jump statement.
Definition: llvm.c:772
LLVMValue llvm_signed_extend(LLVMValue reg, NumberType new_type, NumberType old_type)
Definition: llvm.c:433
void llvm_jump(LLVMValue label)
Generate an unconditional jump statement.
Definition: llvm.c:754
void llvm_function_postamble(void)
Definition: llvm.c:808
void llvm_print_bool(type_register print_vr)
Generate code to print a boolean value.
Definition: llvm.c:536
void llvm_store_global_variable(char *symbol_name, LLVMValue rvalue_register)
Store a value into a global variable.
Definition: llvm.c:396
LLVMValue llvm_truncate(LLVMValue reg, NumberType new_type, NumberType old_type)
Definition: llvm.c:446
bool llvm_stack_allocation(LLVMStackEntryNode *stack_entries)
Allocate space on stack for variables.
Definition: llvm.c:166
void llvm_preamble(void)
Generated program's preamble.
Definition: llvm.c:97
LLVMValueType
Types of values possibly returned by ast_to_llvm.
Definition: llvm.h:34
@ LLVMVALUETYPE_VIRTUAL_REGISTER
Definition: llvm.h:36
@ LLVMVALUETYPE_NONE
Definition: llvm.h:35
@ LLVMVALUETYPE_LABEL
Definition: llvm.h:37
@ LLVMVALUETYPE_CONSTANT
Definition: llvm.h:38
LLVMValue llvm_binary_arithmetic(TokenType operation, LLVMValue left_virtual_register, LLVMValue right_virtual_register)
Generates LLVM-IR for various binary arithmetic expressions.
Definition: llvm.c:272
struct LLVMValue LLVMValue
Value returned by ast_to_llvm.
type_register * llvm_ensure_registers_loaded(int n_registers, type_register registers[], NumberType number_type)
Ensure that the values of a set of registers are loaded.
Definition: llvm.c:52
static const char * numberTypeLLVMReprs[]
LLVM-IR representations of data types.
Definition: llvm.h:18
type_register get_next_local_virtual_register(void)
Retrieves the next valid virtual register index.
Definition: llvm.c:362
void llvm_return(LLVMValue virtual_register, char *symbol_name)
Definition: llvm.c:854
void llvm_declare_global_number_variable(char *symbol_name, NumberType number_type)
Declare a global variable.
Definition: llvm.c:465
const char * type_to_llvm_type(TokenType type)
Definition: llvm.c:813
LLVMValue get_next_label(void)
Get the next valid label.
Definition: llvm.c:729
LLVMValue llvm_compare_jump(TokenType comparison_type, LLVMValue left_virtual_register, LLVMValue right_virtual_register, LLVMValue false_label)
Generate code to compare two registers and conditionally jump based on the result.
Definition: llvm.c:704
#define type_register
A too-big data type for register indices in case of stress testing.
Definition: llvm_stack_entry.h:16
#define type_label
A too-big data type for label indices in case of stress testing.
Definition: llvm_stack_entry.h:21
Definitions and function headers for the internal "Number" type.
NumberType
Types of numbers supported by Purple.
Definition: number.h:17
Lexical Scanner function headers.
TokenType
Types of scannable tokens.
Definition: scan.h:20
Node of a linked list containing information about required stack allocation for a piece of data....
Definition: llvm_stack_entry.h:28
Value returned by ast_to_llvm.
Definition: llvm.h:44
bool stores_pointer
Definition: llvm.h:48
long long int constant
Definition: llvm.h:56
type_label label_index
Definition: llvm.h:58
type_register virtual_register_index
Definition: llvm.h:54
union LLVMValue::@1 value
NumberType number_type
Definition: llvm.h:50
LLVMValueType value_type
Definition: llvm.h:46
Container for various kinds of number data.
Definition: number.h:51