Purple
0.1
Standard Language Specification
|
LLVM-IR emission. More...
#include <stdlib.h>
#include <string.h>
#include "data.h"
#include "translate/llvm.h"
#include "translate/translate.h"
#include "types/type.h"
#include "utils/clang.h"
#include "utils/formatting.h"
#include "utils/logging.h"
Functions | |
static void | print_function_annotation (const char *function_name) |
static char * | number_string (Number number) |
Gets the LLVM string representation of a Number struct, max length = 300. More... | |
static char * | llvmvalue_repr (LLVMValue val) |
Gets the LLVM string representation of an LLVMValue struct, max length = 600. More... | |
LLVMValue * | llvm_ensure_registers_loaded (int n_registers, LLVMValue registers[], int load_depth) |
Ensure that the values of a set of registers are loaded. More... | |
LLVMValue * | llvm_ensure_registers_fully_loaded (int n_registers, LLVMValue registers[]) |
Overloaded version of llvm_ensure_registers_loaded where load_depth=0. More... | |
void | llvm_preamble (void) |
Generated program's preamble. More... | |
void | llvm_postamble (void) |
Generated program's postamble. More... | |
bool | llvm_stack_allocation (LLVMStackEntryNode *stack_entries) |
Allocate space on stack for variables. More... | |
static LLVMValue | llvm_add (LLVMValue left_virtual_register, LLVMValue right_virtual_register) |
Generate code for binary addition. More... | |
static LLVMValue | llvm_subtract (LLVMValue left_virtual_register, LLVMValue right_virtual_register) |
Generate code for binary subtraction. More... | |
static LLVMValue | llvm_multiply (LLVMValue left_virtual_register, LLVMValue right_virtual_register) |
Generate code for binary multiplication. More... | |
static LLVMValue | llvm_divide (LLVMValue left_virtual_register, LLVMValue right_virtual_register) |
Generate code for unsigned binary division. More... | |
LLVMValue | llvm_binary_arithmetic (TokenType operation, LLVMValue left_virtual_register, LLVMValue right_virtual_register) |
Generates LLVM-IR for various binary arithmetic expressions. More... | |
LLVMValue | llvm_store_constant (Number value) |
Store a constant number value into a register. More... | |
type_register | get_next_local_virtual_register (void) |
Retrieves the next valid virtual register index. More... | |
LLVMValue | llvm_load_global_variable (char *symbol_name) |
Load a global variable's value into a new virtual register. More... | |
void | llvm_store_global_variable (char *symbol_name, LLVMValue rvalue_register) |
Store a value into a global variable. More... | |
LLVMValue | llvm_int_resize (LLVMValue reg, NumberType new_type) |
Generates an extend or truncate statement to change the bit-width of an integer. More... | |
void | llvm_declare_global_number_variable (char *symbol_name, Number n) |
Declare a global variable. More... | |
void | llvm_declare_assign_global_number_variable (char *symbol_name, Number number) |
Declare a global variable with an assigned number value. More... | |
void | llvm_print_int (LLVMValue print_vr) |
Generate code to print an integer. More... | |
void | llvm_print_bool (LLVMValue print_vr) |
Generate code to print a boolean value. More... | |
static void | llvm_relational_compare (TokenType comparison_type, LLVMValue out_register, LLVMValue left_virtual_register, LLVMValue right_virtual_register) |
Generates a relational (inline) comparison statement. More... | |
static void | llvm_logical_compare (TokenType comparison_type, LLVMValue out_register, LLVMValue left_virtual_register, LLVMValue right_virtual_register) |
Generates a logical (statement-level) comparison statement. More... | |
LLVMValue | llvm_compare (TokenType comparison_type, LLVMValue left_virtual_register, LLVMValue right_virtual_register) |
Generate code to compare two registers. More... | |
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. More... | |
LLVMValue | get_next_label (void) |
Get the next valid label. More... | |
void | llvm_label (LLVMValue label) |
Generate label code. More... | |
void | llvm_jump (LLVMValue label) |
Generate an unconditional jump statement. More... | |
void | llvm_conditional_jump (LLVMValue condition_register, LLVMValue true_label, LLVMValue false_label) |
Generate a conditional jump statement. More... | |
LLVMValue * | llvm_function_preamble (char *symbol_name) |
Generates the preamble for a function. More... | |
void | llvm_function_postamble (void) |
Generates the postamble for a function. More... | |
const char * | type_to_llvm_type (TokenType type) |
Convert a TokenType to the string representation of that type in LLVM. More... | |
LLVMValue | llvm_call_function (LLVMValue *args, unsigned long long int num_args, char *symbol_name) |
Generate a function call statement. More... | |
void | llvm_return (LLVMValue value, char *symbol_name) |
Generate a return statement. More... | |
char * | refstring (char *buf, int pointer_depth) |
Generate a string containing pointer stars. More... | |
char * | llvmvalue_repr_notype (char *buf, LLVMValue reg) |
LLVMValue | llvm_get_address (char *symbol_name) |
Generate an addressing statement. More... | |
LLVMValue | llvm_dereference (LLVMValue reg) |
Generate a dereference (load) statement. More... | |
void | llvm_store_dereference (LLVMValue destination, LLVMValue value) |
Generates code to store a value into a dereferenced value. More... | |
void | llvm_store_local (char *symbol_name, LLVMValue val) |
Variables | |
LLVMStackEntryNode * | buffered_stack_entries_head = NULL |
LLVM-IR emission.
type_register get_next_local_virtual_register | ( | void | ) |
Retrieves the next valid virtual register index.
|
static |
Generate code for binary addition.
left_virtual_register | Lvalue to be added |
right_virtual_register | Rvalue to be added |
LLVMValue llvm_binary_arithmetic | ( | TokenType | operation, |
LLVMValue | left_virtual_register, | ||
LLVMValue | right_virtual_register | ||
) |
Generates LLVM-IR for various binary arithmetic expressions.
operation | Operation to perform |
left_virtual_register | Operand left of operation |
right_virtual_register | Operand right of operation |
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.
comparison_type | Type of comparison to make |
left_virtual_register | LLVMValue storing left value register index |
right_virtual_register | LLVMValue storing right value register index |
false_label | LLVMValue storing label data for the branch in which the condition is false |
void llvm_conditional_jump | ( | LLVMValue | condition_register, |
LLVMValue | true_label, | ||
LLVMValue | false_label | ||
) |
Generate a conditional jump statement.
condition_register | LLVMValue holding information about the register from the prior condition |
true_label | Label to jump to if condition is true |
false_label | Label to jump to if condition is false |
void llvm_declare_assign_global_number_variable | ( | char * | symbol_name, |
Number | number | ||
) |
Declare a global variable with an assigned number value.
symbol_name | Name of global variable |
number | Default value of global variable |
void llvm_declare_global_number_variable | ( | char * | symbol_name, |
Number | n | ||
) |
Declare a global variable.
symbol_name | Name of global variable |
n | Number information of global variable |
|
static |
Generate code for unsigned binary division.
left_virtual_register | Lvalue to be divided |
right_virtual_register | Rvalue to be divided |
Overloaded version of llvm_ensure_registers_loaded where load_depth=0.
Ensure that the values of a set of registers are loaded.
n_registers | Number of registers to ensure |
registers | Array of register indices to ensure |
number_type | NumberType of registers to ensure |
load_depth | Pointer depth to be considered "loaded" |
void llvm_function_postamble | ( | void | ) |
Generates the postamble for a function.
LLVMValue * llvm_function_preamble | ( | char * | symbol_name | ) |
Generates the preamble for a function.
symbol_name | Name of function to generate for |
LLVMValue llvm_get_address | ( | char * | symbol_name | ) |
LLVMValue llvm_int_resize | ( | LLVMValue | reg, |
NumberType | new_type | ||
) |
void llvm_jump | ( | LLVMValue | label | ) |
Generate an unconditional jump statement.
label | Label to jump to |
void llvm_label | ( | LLVMValue | label | ) |
Generate label code.
label | LLVMValue containing label information |
LLVMValue llvm_load_global_variable | ( | char * | symbol_name | ) |
Load a global variable's value into a new virtual register.
symbol_name | Identifier name of variable to load |
|
static |
Generates a logical (statement-level) comparison statement.
comparison_type | What kind of comparison to generate |
out_register | Register to store output into |
left_virtual_register | Left comparison operand |
right_virtual_register | Right comparison operand |
|
static |
Generate code for binary multiplication.
left_virtual_register | Lvalue to be multiplied |
right_virtual_register | Rvalue to be multiplied |
void llvm_postamble | ( | void | ) |
Generated program's postamble.
void llvm_preamble | ( | void | ) |
Generated program's preamble.
void llvm_print_bool | ( | LLVMValue | print_vr | ) |
Generate code to print a boolean value.
print_vr | Register holding value to print |
void llvm_print_int | ( | LLVMValue | print_vr | ) |
Generate code to print an integer.
print_vr | Register holding value to print |
|
static |
Generates a relational (inline) comparison statement.
comparison_type | What kind of comparison to generate |
out_register | Register to store output into |
left_virtual_register | Left comparison operand |
right_virtual_register | Right comparison operand |
void llvm_return | ( | LLVMValue | value, |
char * | symbol_name | ||
) |
Generate a return statement.
value | Value to return |
symbol_name | Name of function to return from |
bool llvm_stack_allocation | ( | LLVMStackEntryNode * | stack_entries | ) |
Allocate space on stack for variables.
stack_entries | LLVMStackEntryNode pointers holding stack allocation information |
Store a constant number value into a register.
value | Number struct containing information about the constant |
Generates code to store a value into a dereferenced value.
destination | Destination register or variable to store into |
value | Value to store |
void llvm_store_global_variable | ( | char * | symbol_name, |
LLVMValue | rvalue_register | ||
) |
Store a value into a global variable.
symbol_name | Identifier name of variable to store new value to |
rvalue_register | Register number of statement's RValue to store |
void llvm_store_local | ( | char * | symbol_name, |
LLVMValue | val | ||
) |
|
static |
Generate code for binary subtraction.
left_virtual_register | Lvalue to be subtracted |
right_virtual_register | Rvalue to be subtracted |
|
static |
char * llvmvalue_repr_notype | ( | char * | buf, |
LLVMValue | reg | ||
) |
|
static |
|
static |
char * refstring | ( | char * | buf, |
int | pointer_depth | ||
) |
Generate a string containing pointer stars.
buf | Buffer to fill with pointer stars |
pointer_depth | Number of pointer stars to fill |
const char * type_to_llvm_type | ( | TokenType | type | ) |
Convert a TokenType to the string representation of that type in LLVM.
type | TokenType to convert |
LLVMStackEntryNode* buffered_stack_entries_head = NULL |