Purple  0.1
Standard Language Specification
Functions | Variables
llvm.c File Reference

LLVM-IR emission. More...

#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"
Include dependency graph for llvm.c:

Functions

void prepend_loaded (type_register reg)
 Update loaded register linked list to include new register. More...
 
type_registerllvm_ensure_registers_loaded (int n_registers, type_register registers[], NumberType number_type)
 Ensure that the values of a set of registers are loaded. 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 type_register llvm_add (LLVMValue left_virtual_register, LLVMValue right_virtual_register)
 Generate code for binary addition. More...
 
static type_register llvm_subtract (LLVMValue left_virtual_register, LLVMValue right_virtual_register)
 Generate code for binary subtraction. More...
 
static type_register llvm_multiply (LLVMValue left_virtual_register, LLVMValue right_virtual_register)
 Generate code for binary multiplication. More...
 
static type_register 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_signed_extend (LLVMValue reg, NumberType new_type, NumberType old_type)
 
LLVMValue llvm_truncate (LLVMValue reg, NumberType new_type, NumberType old_type)
 
void llvm_declare_global_number_variable (char *symbol_name, NumberType number_type)
 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 (type_register print_vr, TokenType type)
 Generate code to print an integer. More...
 
void llvm_print_bool (type_register print_vr)
 Generate code to print a boolean value. More...
 
static void llvm_relational_compare (TokenType comparison_type, type_register out_register, LLVMValue left_virtual_register, LLVMValue right_virtual_register)
 
static void llvm_logical_compare (TokenType comparison_type, type_register out_register, LLVMValue left_virtual_register, LLVMValue right_virtual_register)
 
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...
 
void llvm_function_preamble (char *symbol_name)
 
void llvm_function_postamble (void)
 
const char * type_to_llvm_type (TokenType type)
 
LLVMValue llvm_call_function (LLVMValue virtual_register, char *symbol_name)
 
void llvm_return (LLVMValue value, char *symbol_name)
 

Variables

LLVMStackEntryNodebuffered_stack_entries_head = NULL
 

Detailed Description

LLVM-IR emission.

Author
Charles Averill
Date
12-Sep-2022

Function Documentation

◆ get_next_label()

LLVMValue get_next_label ( void  )

Get the next valid label.

Returns
LLVMValue Next valid label

◆ get_next_local_virtual_register()

type_register get_next_local_virtual_register ( void  )

Retrieves the next valid virtual register index.

Returns
type_register Index of next unused virtual register

◆ llvm_add()

static type_register llvm_add ( LLVMValue  left_virtual_register,
LLVMValue  right_virtual_register 
)
static

Generate code for binary addition.

Parameters
left_virtual_registerLvalue to be added
right_virtual_registerRvalue to be added
Returns
type_register Virtual register holding result

◆ llvm_binary_arithmetic()

LLVMValue llvm_binary_arithmetic ( TokenType  operation,
LLVMValue  left_virtual_register,
LLVMValue  right_virtual_register 
)

Generates LLVM-IR for various binary arithmetic expressions.

Parameters
operationOperation to perform
left_virtual_registerOperand left of operation
right_virtual_registerOperand right of operation
Returns
int Number of virtual register in which the result is stored

◆ llvm_call_function()

LLVMValue llvm_call_function ( LLVMValue  virtual_register,
char *  symbol_name 
)

◆ llvm_compare()

LLVMValue llvm_compare ( TokenType  comparison_type,
LLVMValue  left_virtual_register,
LLVMValue  right_virtual_register 
)

Generate code to compare two registers.

Parameters
comparison_typeType of comparison to make
left_virtual_registerLLVMValue storing left value register index
right_virtual_registerLLVMValue storing right value register index
Returns
LLVMValue Register index of comparison value

◆ llvm_compare_jump()

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.

Parameters
comparison_typeType of comparison to make
left_virtual_registerLLVMValue storing left value register index
right_virtual_registerLLVMValue storing right value register index
false_labelLLVMValue storing label data for the branch in which the condition is false
Returns
LLVMValue Register index of comparison value

◆ llvm_conditional_jump()

void llvm_conditional_jump ( LLVMValue  condition_register,
LLVMValue  true_label,
LLVMValue  false_label 
)

Generate a conditional jump statement.

Parameters
condition_registerLLVMValue holding information about the register from the prior condition
true_labelLabel to jump to if condition is true
false_labelLabel to jump to if condition is false

◆ llvm_declare_assign_global_number_variable()

void llvm_declare_assign_global_number_variable ( char *  symbol_name,
Number  number 
)

Declare a global variable with an assigned number value.

Parameters
symbol_nameName of global variable
numberDefault value of global variable

◆ llvm_declare_global_number_variable()

void llvm_declare_global_number_variable ( char *  symbol_name,
NumberType  number_type 
)

Declare a global variable.

Parameters
symbol_nameName of global variable
number_typeType of number of global variable

◆ llvm_divide()

static type_register llvm_divide ( LLVMValue  left_virtual_register,
LLVMValue  right_virtual_register 
)
static

Generate code for unsigned binary division.

Parameters
left_virtual_registerLvalue to be divided
right_virtual_registerRvalue to be divided
Returns
type_register Virtual register holding result

◆ llvm_ensure_registers_loaded()

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.

Parameters
n_registersNumber of registers to ensure
registersArray of register indices to ensure
number_typeNumberType of registers to ensure
Returns
type_register* If the registers were not loaded, this array contains the loaded registers

◆ llvm_function_postamble()

void llvm_function_postamble ( void  )

◆ llvm_function_preamble()

void llvm_function_preamble ( char *  symbol_name)

◆ llvm_jump()

void llvm_jump ( LLVMValue  label)

Generate an unconditional jump statement.

Parameters
labelLabel to jump to

◆ llvm_label()

void llvm_label ( LLVMValue  label)

Generate label code.

Parameters
labelLLVMValue containing label information

◆ llvm_load_global_variable()

LLVMValue llvm_load_global_variable ( char *  symbol_name)

Load a global variable's value into a new virtual register.

Parameters
symbol_nameIdentifier name of variable to load
Returns
LLVMValue Register number variable value is held in

◆ llvm_logical_compare()

static void llvm_logical_compare ( TokenType  comparison_type,
type_register  out_register,
LLVMValue  left_virtual_register,
LLVMValue  right_virtual_register 
)
static

◆ llvm_multiply()

static type_register llvm_multiply ( LLVMValue  left_virtual_register,
LLVMValue  right_virtual_register 
)
static

Generate code for binary multiplication.

Parameters
left_virtual_registerLvalue to be multiplied
right_virtual_registerRvalue to be multiplied
Returns
type_register Virtual register holding result

◆ llvm_postamble()

void llvm_postamble ( void  )

Generated program's postamble.

◆ llvm_preamble()

void llvm_preamble ( void  )

Generated program's preamble.

◆ llvm_print_bool()

void llvm_print_bool ( type_register  print_vr)

Generate code to print a boolean value.

Parameters
print_vrRegister holding value to print

◆ llvm_print_int()

void llvm_print_int ( type_register  print_vr,
TokenType  type 
)

Generate code to print an integer.

Parameters
print_vrRegister holding value to print
typeType of int (byte, char, int, long) to print

◆ llvm_relational_compare()

static void llvm_relational_compare ( TokenType  comparison_type,
type_register  out_register,
LLVMValue  left_virtual_register,
LLVMValue  right_virtual_register 
)
static

◆ llvm_return()

void llvm_return ( LLVMValue  value,
char *  symbol_name 
)

◆ llvm_signed_extend()

LLVMValue llvm_signed_extend ( LLVMValue  reg,
NumberType  new_type,
NumberType  old_type 
)

◆ llvm_stack_allocation()

bool llvm_stack_allocation ( LLVMStackEntryNode stack_entries)

Allocate space on stack for variables.

Parameters
stack_entriesLLVMStackEntryNode pointers holding stack allocation information
Returns
bool True if stack_entries may be freed

◆ llvm_store_constant()

LLVMValue llvm_store_constant ( Number  value)

Store a constant number value into a register.

Parameters
valueNumber struct containing information about the constant
Returns
int Register number value is held in

◆ llvm_store_global_variable()

void llvm_store_global_variable ( char *  symbol_name,
LLVMValue  rvalue_register 
)

Store a value into a global variable.

Parameters
symbol_nameIdentifier name of variable to store new value to
rvalue_registerRegister number of statement's RValue to store

◆ llvm_subtract()

static type_register llvm_subtract ( LLVMValue  left_virtual_register,
LLVMValue  right_virtual_register 
)
static

Generate code for binary subtraction.

Parameters
left_virtual_registerLvalue to be subtracted
right_virtual_registerRvalue to be subtracted
Returns
type_register Virtual register holding result

◆ llvm_truncate()

LLVMValue llvm_truncate ( LLVMValue  reg,
NumberType  new_type,
NumberType  old_type 
)

◆ prepend_loaded()

void prepend_loaded ( type_register  reg)

Update loaded register linked list to include new register.

Parameters
regRegister to include in list

◆ type_to_llvm_type()

const char * type_to_llvm_type ( TokenType  type)

Variable Documentation

◆ buffered_stack_entries_head

LLVMStackEntryNode* buffered_stack_entries_head = NULL