codegen

package
v0.0.0-...-c04ea6e Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 11, 2021 License: MIT Imports: 12 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AsLocalVariable

func AsLocalVariable(identifier string) string

func Generate

func Generate(node ast.Node, logger logger.Logger) string

Generate llvm IR for ast

Types

type BlocksFragment

type BlocksFragment struct {
	Blocks       []*ir.Block
	CurrentBlock *ir.Block
	// contains filtered or unexported fields
}

func NewBlocksFragment

func NewBlocksFragment(resultType ResultType) *BlocksFragment

func (*BlocksFragment) AddBlock

func (blocksFragment *BlocksFragment) AddBlock(block *ir.Block)

func (*BlocksFragment) Append

func (blocksFragment *BlocksFragment) Append(fragment Fragment)

func (*BlocksFragment) AppendWithResultPropogation

func (blocksFragment *BlocksFragment) AppendWithResultPropogation(fragment Fragment)

func (*BlocksFragment) ChainBlocks

func (blocksFragment *BlocksFragment) ChainBlocks(blocks ...*ir.Block)

func (*BlocksFragment) GetResult

func (blocksFragment *BlocksFragment) GetResult() value.Value

func (*BlocksFragment) GetResultType

func (blocksFragment *BlocksFragment) GetResultType() ResultType

func (*BlocksFragment) NewBlock

func (blocksFragment *BlocksFragment) NewBlock(name string)

type CodegenVisitor

type CodegenVisitor struct {
	// contains filtered or unexported fields
}

CodegenVisitor visits each node and generates llvm IR.

func (*CodegenVisitor) Init

func (visitor *CodegenVisitor) Init(logger logger.Logger)

Init with a logger

func (*CodegenVisitor) VisitBooleanNode

func (visitor *CodegenVisitor) VisitBooleanNode(node *ast.BooleanNode)

VisitBooleanNode do something

func (*CodegenVisitor) VisitBreakNode

func (visitor *CodegenVisitor) VisitBreakNode(node *ast.BreakNode)

func (*CodegenVisitor) VisitCharacterNode

func (visitor *CodegenVisitor) VisitCharacterNode(node *ast.CharacterNode)

VisitCharacterNode do something

func (*CodegenVisitor) VisitEnterAssignmentNode

func (visitor *CodegenVisitor) VisitEnterAssignmentNode(node *ast.AssignmentNode)

VisitEnterAssignmentNode do something

func (*CodegenVisitor) VisitEnterBinaryOepratorNode

func (visitor *CodegenVisitor) VisitEnterBinaryOepratorNode(node *ast.BinaryOperatorNode)

VisitEnterBinaryOepratorNode do something

func (*CodegenVisitor) VisitEnterBlockNode

func (visitor *CodegenVisitor) VisitEnterBlockNode(node *ast.BlockNode)

func (*CodegenVisitor) VisitEnterForStmtNode

func (visitor *CodegenVisitor) VisitEnterForStmtNode(node *ast.ForStmtNode)

func (*CodegenVisitor) VisitEnterForStmtNodeBeforeBlockNode

func (visitor *CodegenVisitor) VisitEnterForStmtNodeBeforeBlockNode(node *ast.ForStmtNode)

func (*CodegenVisitor) VisitEnterIfStmtNode

func (visitor *CodegenVisitor) VisitEnterIfStmtNode(node *ast.IfStmtNode)

func (*CodegenVisitor) VisitEnterIncDecNode

func (visitor *CodegenVisitor) VisitEnterIncDecNode(node *ast.IncDecNode)

func (*CodegenVisitor) VisitEnterPrintNode

func (visitor *CodegenVisitor) VisitEnterPrintNode(node *ast.PrintNode)

VisitEnterPrintNode do something

func (*CodegenVisitor) VisitEnterProgramNode

func (visitor *CodegenVisitor) VisitEnterProgramNode(node *ast.ProgramNode)

VisitEnterProgramNode creates program scope

func (*CodegenVisitor) VisitEnterSwitchStmtNode

func (visitor *CodegenVisitor) VisitEnterSwitchStmtNode(node *ast.SwitchStmtNode)

func (*CodegenVisitor) VisitEnterTernaryOperatorNode

func (visitor *CodegenVisitor) VisitEnterTernaryOperatorNode(node *ast.TernaryOperatorNode)

VisitEnterTernaryOperatorNode do something

func (*CodegenVisitor) VisitEnterUnaryOperatorNode

func (visitor *CodegenVisitor) VisitEnterUnaryOperatorNode(node *ast.UnaryOperatorNode)

VisitEnterUnaryOperatorNode do something

func (*CodegenVisitor) VisitEnterVariableDeclarationNode

func (visitor *CodegenVisitor) VisitEnterVariableDeclarationNode(node *ast.VariableDeclarationNode)

VisitEnterVariableDeclarationNode do something

func (*CodegenVisitor) VisitEnterWhileStmtNode

func (visitor *CodegenVisitor) VisitEnterWhileStmtNode(node *ast.WhileStmtNode)

func (*CodegenVisitor) VisitErrorNode

func (visitor *CodegenVisitor) VisitErrorNode(node *ast.ErrorNode)

VisitErrorNode should not happen during codegen

func (*CodegenVisitor) VisitFloatNode

func (visitor *CodegenVisitor) VisitFloatNode(node *ast.FloatNode)

VisitFloatNode do something

func (*CodegenVisitor) VisitIdentifierNode

func (visitor *CodegenVisitor) VisitIdentifierNode(node *ast.IdentifierNode)

VisitIdentifierNode do something

func (*CodegenVisitor) VisitIntegerNode

func (visitor *CodegenVisitor) VisitIntegerNode(node *ast.IntegerNode)

VisitIntegerNode do something

func (*CodegenVisitor) VisitLeaveAssignmentNode

func (visitor *CodegenVisitor) VisitLeaveAssignmentNode(node *ast.AssignmentNode)

VisitLeaveAssignmentNode do something

func (*CodegenVisitor) VisitLeaveBinaryOperatorNode

func (visitor *CodegenVisitor) VisitLeaveBinaryOperatorNode(node *ast.BinaryOperatorNode)

VisitLeaveBinaryOperatorNode do something

func (*CodegenVisitor) VisitLeaveBlockNode

func (visitor *CodegenVisitor) VisitLeaveBlockNode(node *ast.BlockNode)

func (*CodegenVisitor) VisitLeaveForStmtNode

func (visitor *CodegenVisitor) VisitLeaveForStmtNode(node *ast.ForStmtNode)

func (*CodegenVisitor) VisitLeaveIfStmtNode

func (visitor *CodegenVisitor) VisitLeaveIfStmtNode(node *ast.IfStmtNode)

func (*CodegenVisitor) VisitLeaveIncDecNode

func (visitor *CodegenVisitor) VisitLeaveIncDecNode(node *ast.IncDecNode)

func (*CodegenVisitor) VisitLeavePrintNode

func (visitor *CodegenVisitor) VisitLeavePrintNode(node *ast.PrintNode)

VisitLeavePrintNode do something

func (*CodegenVisitor) VisitLeaveProgramNode

func (visitor *CodegenVisitor) VisitLeaveProgramNode(node *ast.ProgramNode)

VisitLeaveProgramNode closes program scope

func (*CodegenVisitor) VisitLeaveSwitchStmtNode

func (visitor *CodegenVisitor) VisitLeaveSwitchStmtNode(node *ast.SwitchStmtNode)

func (*CodegenVisitor) VisitLeaveTernaryOperatorNode

func (visitor *CodegenVisitor) VisitLeaveTernaryOperatorNode(node *ast.TernaryOperatorNode)

VisitLeaveTernaryOperatorNode do something

func (*CodegenVisitor) VisitLeaveUnaryOperatorNode

func (visitor *CodegenVisitor) VisitLeaveUnaryOperatorNode(node *ast.UnaryOperatorNode)

VisitLeaveUnaryOperatorNode do something

func (*CodegenVisitor) VisitLeaveVariableDeclarationNode

func (visitor *CodegenVisitor) VisitLeaveVariableDeclarationNode(node *ast.VariableDeclarationNode)

VisitLeaveVariableDeclarationNode do something

func (*CodegenVisitor) VisitLeaveWhileStmtNode

func (visitor *CodegenVisitor) VisitLeaveWhileStmtNode(node *ast.WhileStmtNode)

func (*CodegenVisitor) VisitStringNode

func (visitor *CodegenVisitor) VisitStringNode(node *ast.StringNode)

VisitStringNode do something

func (*CodegenVisitor) VisitTypeLiteralNode

func (visitor *CodegenVisitor) VisitTypeLiteralNode(node *ast.TypeLiteralNode)

VisitTypeLiteralNode do something

type Fragment

type Fragment interface {
	Append(fragment Fragment)
	AppendWithResultPropogation(fragment Fragment)
	GetResultType() ResultType
	GetResult() value.Value
}

Fragment represents a fragment of instructions in asm

type FragmentType

type FragmentType int
const (
	MODULE FragmentType = iota
	FUNCTIONS
	BLOCKS
	INSTRUCTIONS
)

type FunctionsFragment

type FunctionsFragment struct {
	Functions []*ir.Func
	// contains filtered or unexported fields
}

func NewFunctionsFragment

func NewFunctionsFragment() *FunctionsFragment

func (*FunctionsFragment) AddFunc

func (functionsFragment *FunctionsFragment) AddFunc(function *ir.Func)

func (*FunctionsFragment) Append

func (functionsFragment *FunctionsFragment) Append(fragment Fragment)

func (*FunctionsFragment) AppendWithResultPropogation

func (functionsFragment *FunctionsFragment) AppendWithResultPropogation(fragment Fragment)

func (*FunctionsFragment) GetResult

func (functionsFragment *FunctionsFragment) GetResult() value.Value

func (*FunctionsFragment) GetResultType

func (functionsFragment *FunctionsFragment) GetResultType() ResultType

type GlobalIdentifierTracker

type GlobalIdentifierTracker struct {
	// contains filtered or unexported fields
}

GlobalIdentifierTracker manages creating new global identifiers State is managed on a function level

func (*GlobalIdentifierTracker) CurrentIdentifier

func (globalIdentifierTracker *GlobalIdentifierTracker) CurrentIdentifier() string

func (*GlobalIdentifierTracker) NewIdentifier

func (globalIdentifierTracker *GlobalIdentifierTracker) NewIdentifier() string

func (*GlobalIdentifierTracker) Reset

func (globalIdentifierTracker *GlobalIdentifierTracker) Reset()

type IdentifierTracker

type IdentifierTracker interface {
	NewIdentifier() string
	CurrentIdentifier() string
	Reset()
}

IdentifierTracker keeps track of identifiers in llvm ir

type Instruction

type Instruction struct {
	Result    string // resulting local variable, if exists
	Operation string // actual operation
}

Instruction is one line of instruction in ir

func (*Instruction) Line

func (instruction *Instruction) Line() string

type InstructionsFragment

type InstructionsFragment struct {
	Instructions []ir.Instruction
	// contains filtered or unexported fields
}

func NewInstructionsFragment

func NewInstructionsFragment(resultType ResultType) *InstructionsFragment

func (*InstructionsFragment) AddInstruction

func (instructionsFragment *InstructionsFragment) AddInstruction(instr ir.Instruction)

func (*InstructionsFragment) Append

func (instructionsFragment *InstructionsFragment) Append(fragment Fragment)

func (*InstructionsFragment) AppendWithResultPropogation

func (instructionsFragment *InstructionsFragment) AppendWithResultPropogation(fragment Fragment)

func (*InstructionsFragment) GetResult

func (instructionsFragment *InstructionsFragment) GetResult() value.Value

func (*InstructionsFragment) GetResultType

func (instructionsFragment *InstructionsFragment) GetResultType() ResultType

type IrLiner

type IrLiner interface {
	Line() string
}

IrLiner represents one line of code in IR

type Label

type Label struct {
	Name string
}

Label is a label in ir

func (*Label) Line

func (label *Label) Line() string

type Labeller

type Labeller struct {
	// contains filtered or unexported fields
}

Labeller manages creating new labels that are never used before state is managed on a module level

func (*Labeller) Label

func (labeller *Labeller) Label(tags ...string) string

Label creates a new label under the current set

func (*Labeller) NewSet

func (labeller *Labeller) NewSet(tags ...string) string

NewSet increments the label index, making sure the label is not used before

func (*Labeller) Reset

func (labeller *Labeller) Reset()

Reset the label index to 0

type LocalIdentifierTracker

type LocalIdentifierTracker struct {
	// contains filtered or unexported fields
}

LocalIdentifierTracker manages creating new local variables in current function scope State is managed on a function level

func (*LocalIdentifierTracker) CurrentIdentifier

func (localIdentifierTracker *LocalIdentifierTracker) CurrentIdentifier() string

func (*LocalIdentifierTracker) NewIdentifier

func (localIdentifierTracker *LocalIdentifierTracker) NewIdentifier() string

func (*LocalIdentifierTracker) Reset

func (localIdentifierTracker *LocalIdentifierTracker) Reset()

type ModuleFragment

type ModuleFragment struct {
	Module *ir.Module
}

func NewModuleFragment

func NewModuleFragment(module *ir.Module) *ModuleFragment

func (*ModuleFragment) Append

func (moduleFragment *ModuleFragment) Append(fragment Fragment)

func (*ModuleFragment) AppendWithResultPropogation

func (moduleFragment *ModuleFragment) AppendWithResultPropogation(fragment Fragment)

func (*ModuleFragment) GetResult

func (moduleFragment *ModuleFragment) GetResult() value.Value

func (*ModuleFragment) GetResultType

func (moduleFragment *ModuleFragment) GetResultType() ResultType

type OperatorCodegen

type OperatorCodegen struct {
	// contains filtered or unexported fields
}

func NewOperatorCodegen

func NewOperatorCodegen(fragment *BlocksFragment, operator signature.Operator, typing typing.Typing, labeller *Labeller, operands ...Fragment) *OperatorCodegen

func (*OperatorCodegen) GenerateCode

func (gen *OperatorCodegen) GenerateCode()

func (*OperatorCodegen) GenerateComparisonInstr

func (gen *OperatorCodegen) GenerateComparisonInstr(frag *BlocksFragment) func(value.Value, value.Value) value.Value

type ResultType

type ResultType int
const (
	VOID    ResultType = iota // fragment will not produce a value
	VALUE                     // fragment will produce a value
	POINTER                   // fragment will produce a pointer value
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL