65#define LLVMVALUE_NULL \
68 .value_type = LLVMVALUETYPE_NONE, .value = 0 \
74#define LLVMVALUE_CONSTANT(c) \
77 .value_type = LLVMVALUETYPE_CONSTANT, .value.constant = c \
83#define LLVMVALUE_VIRTUAL_REGISTER(register_number, n_t) \
86 .value_type = LLVMVALUETYPE_VIRTUAL_REGISTER, .stores_pointer = false, \
87 .value.virtual_register_index = register_number, .number_type = n_t \
93#define LLVMVALUE_VIRTUAL_REGISTER_POINTER(register_number, n_t) \
96 .value_type = LLVMVALUETYPE_VIRTUAL_REGISTER, .stores_pointer = true, \
97 .value.virtual_register_index = register_number, .number_type = n_t \
103#define LLVMVALUE_LABEL(label_number) \
106 .value_type = LLVMVALUETYPE_LABEL, .value.label_index = label_number \
110#define PURPLE_LABEL_PREFIX "L"
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