Luma 0.1.0
A low-level compiled alternative to C, C++, and more!
Loading...
Searching...
No Matches
Functions
expr.c File Reference
#include <llvm-c/Core.h>
#include <stdio.h>
#include <stdlib.h>
#include "../llvm.h"
Include dependency graph for expr.c:

Functions

LLVMTypeRef get_range_struct_type (CodeGenContext *ctx, LLVMTypeRef element_type)
 
LLVMValueRef create_range_struct (CodeGenContext *ctx, LLVMValueRef start, LLVMValueRef end)
 
LLVMValueRef range_contains (CodeGenContext *ctx, LLVMValueRef range_struct, LLVMValueRef value)
 
LLVMValueRef range_length (CodeGenContext *ctx, LLVMValueRef range_struct)
 
LLVMValueRef codegen_expr_literal (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_identifier (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_unary (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_call (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_assignment (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_array (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_index (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_cast (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_input (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_system (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_syscall (CodeGenContext *ctx, AstNode *node)
 Generate LLVM IR for syscall expression.
 
LLVMValueRef codegen_expr_sizeof (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_alloc (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_free (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_deref (CodeGenContext *ctx, AstNode *node)
 
LLVMValueRef codegen_expr_addr (CodeGenContext *ctx, AstNode *node)
 

Function Documentation

◆ codegen_expr_addr()

LLVMValueRef codegen_expr_addr ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_alloc()

LLVMValueRef codegen_expr_alloc ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_array()

LLVMValueRef codegen_expr_array ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_assignment()

LLVMValueRef codegen_expr_assignment ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_call()

LLVMValueRef codegen_expr_call ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_cast()

LLVMValueRef codegen_expr_cast ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_deref()

LLVMValueRef codegen_expr_deref ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_free()

LLVMValueRef codegen_expr_free ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_identifier()

LLVMValueRef codegen_expr_identifier ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_index()

LLVMValueRef codegen_expr_index ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_input()

LLVMValueRef codegen_expr_input ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_literal()

LLVMValueRef codegen_expr_literal ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_sizeof()

LLVMValueRef codegen_expr_sizeof ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_syscall()

LLVMValueRef codegen_expr_syscall ( CodeGenContext ctx,
AstNode node 
)

Generate LLVM IR for syscall expression.

Syscall in x86_64 Linux:

  • syscall number goes in rax
  • arguments go in rdi, rsi, rdx, r10, r8, r9 (in that order)
  • return value comes back in rax

We use inline assembly to invoke the syscall instruction.

◆ codegen_expr_system()

LLVMValueRef codegen_expr_system ( CodeGenContext ctx,
AstNode node 
)

◆ codegen_expr_unary()

LLVMValueRef codegen_expr_unary ( CodeGenContext ctx,
AstNode node 
)

◆ create_range_struct()

LLVMValueRef create_range_struct ( CodeGenContext ctx,
LLVMValueRef  start,
LLVMValueRef  end 
)

◆ get_range_struct_type()

LLVMTypeRef get_range_struct_type ( CodeGenContext ctx,
LLVMTypeRef  element_type 
)

◆ range_contains()

LLVMValueRef range_contains ( CodeGenContext ctx,
LLVMValueRef  range_struct,
LLVMValueRef  value 
)

◆ range_length()

LLVMValueRef range_length ( CodeGenContext ctx,
LLVMValueRef  range_struct 
)