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

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

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...
 
LLVMValuellvm_ensure_registers_loaded (int n_registers, LLVMValue registers[], int load_depth)
 Ensure that the values of a set of registers are loaded. More...
 
LLVMValuellvm_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...
 
LLVMValuellvm_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

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 LLVMValue 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
LLVMValue 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 args,
unsigned long long int  num_args,
char *  symbol_name 
)

Generate a function call statement.

Parameters
argsCurrently unused function parameter
num_argsNumber of args passed
symbol_nameName of function to call
Returns
LLVMValue Output of function, or LLVMVALUE_NULL if it is a void function

◆ 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,
Number  n 
)

Declare a global variable.

Parameters
symbol_nameName of global variable
nNumber information of global variable

◆ llvm_dereference()

LLVMValue llvm_dereference ( LLVMValue  reg)

Generate a dereference (load) statement.

Parameters
regRegister to dereference
Returns
LLVMValue LLVMValue containing loaded value

◆ llvm_divide()

static LLVMValue 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
LLVMValue Virtual register holding result

◆ llvm_ensure_registers_fully_loaded()

LLVMValue * llvm_ensure_registers_fully_loaded ( int  n_registers,
LLVMValue  registers[] 
)

Overloaded version of llvm_ensure_registers_loaded where load_depth=0.

◆ llvm_ensure_registers_loaded()

LLVMValue * llvm_ensure_registers_loaded ( int  n_registers,
LLVMValue  registers[],
int  load_depth 
)

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
load_depthPointer depth to be considered "loaded"
Returns
LLVMValue* If the registers were not loaded, this array contains the loaded registers

◆ llvm_function_postamble()

void llvm_function_postamble ( void  )

Generates the postamble for a function.

◆ llvm_function_preamble()

LLVMValue * llvm_function_preamble ( char *  symbol_name)

Generates the preamble for a function.

Parameters
symbol_nameName of function to generate for
Returns
LLVMValue* List of LLVMValues corresponding to the latest_llvmvalues for each function input

◆ llvm_get_address()

LLVMValue llvm_get_address ( char *  symbol_name)

Generate an addressing statement.

Parameters
symbol_nameSymbol to take the address of
Returns
LLVMValue LLVMValue containing address of symbol

◆ llvm_int_resize()

LLVMValue llvm_int_resize ( LLVMValue  reg,
NumberType  new_type 
)

Generates an extend or truncate statement to change the bit-width of an integer.

Parameters
regRegister whose contents are to be resized
new_typeNew NumberType to resize to
Returns
LLVMValue Resized LLVMValue

◆ 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,
LLVMValue  out_register,
LLVMValue  left_virtual_register,
LLVMValue  right_virtual_register 
)
static

Generates a logical (statement-level) comparison statement.

Parameters
comparison_typeWhat kind of comparison to generate
out_registerRegister to store output into
left_virtual_registerLeft comparison operand
right_virtual_registerRight comparison operand

◆ llvm_multiply()

static LLVMValue 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
LLVMValue 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 ( LLVMValue  print_vr)

Generate code to print a boolean value.

Parameters
print_vrRegister holding value to print

◆ llvm_print_int()

void llvm_print_int ( LLVMValue  print_vr)

Generate code to print an integer.

Parameters
print_vrRegister holding value to print

◆ llvm_relational_compare()

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

Generates a relational (inline) comparison statement.

Parameters
comparison_typeWhat kind of comparison to generate
out_registerRegister to store output into
left_virtual_registerLeft comparison operand
right_virtual_registerRight comparison operand

◆ llvm_return()

void llvm_return ( LLVMValue  value,
char *  symbol_name 
)

Generate a return statement.

Parameters
valueValue to return
symbol_nameName of function to return from

◆ 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_dereference()

void llvm_store_dereference ( LLVMValue  destination,
LLVMValue  value 
)

Generates code to store a value into a dereferenced value.

Parameters
destinationDestination register or variable to store into
valueValue to store

◆ 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_store_local()

void llvm_store_local ( char *  symbol_name,
LLVMValue  val 
)

◆ llvm_subtract()

static LLVMValue 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
LLVMValue Virtual register holding result

◆ llvmvalue_repr()

static char * llvmvalue_repr ( LLVMValue  val)
static

Gets the LLVM string representation of an LLVMValue struct, max length = 600.

Parameters
valLLVMValue to represent
Returns
char* calloc'd string

◆ llvmvalue_repr_notype()

char * llvmvalue_repr_notype ( char *  buf,
LLVMValue  reg 
)

◆ number_string()

static char * number_string ( Number  number)
static

Gets the LLVM string representation of a Number struct, max length = 300.

Parameters
numberNumber to represent
Returns
char* calloc'd string

◆ print_function_annotation()

static void print_function_annotation ( const char *  function_name)
static

◆ refstring()

char * refstring ( char *  buf,
int  pointer_depth 
)

Generate a string containing pointer stars.

Parameters
bufBuffer to fill with pointer stars
pointer_depthNumber of pointer stars to fill
Returns
char* Resulting string (for inline use)

◆ type_to_llvm_type()

const char * type_to_llvm_type ( TokenType  type)

Convert a TokenType to the string representation of that type in LLVM.

Parameters
typeTokenType to convert
Returns
const char* Matching LLVM type string

Variable Documentation

◆ buffered_stack_entries_head

LLVMStackEntryNode* buffered_stack_entries_head = NULL