Compare commits

...

2 Commits

Author SHA1 Message Date
Sasha Koshka 9ffed9bd94 The absolute SLOG! 2024-04-22 20:20:49 -04:00
Sasha Koshka ec7bd32184 Re-named some things relating to constants 2024-04-22 20:03:25 -04:00
14 changed files with 198 additions and 189 deletions

View File

@ -5,7 +5,7 @@ import "testing"
func TestValueCastSlicePointer (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
%2 = alloca ptr
@ -26,7 +26,7 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
func TestValueCastIntegerIneffectual (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::A" = type i64
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca i64
store i64 5, ptr %1
@ -49,7 +49,7 @@ func TestValueCastStringIneffectual (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
%2 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String"
@ -70,7 +70,7 @@ func TestBitCastStringIneffectual (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
%2 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String"

View File

@ -1,50 +1,44 @@
package generator
import "fmt"
import "errors"
import "git.tebibyte.media/fspl/fspl/llvm"
import "git.tebibyte.media/fspl/fspl/entity"
import "git.tebibyte.media/fspl/fspl/analyzer"
func (this *generator) generateConstantInt (literal *entity.LiteralInt) (llvm.Const, error) {
irType, err := this.generateType(analyzer.ReduceToBase(literal.Type()))
if err != nil { return nil, err }
base := analyzer.ReduceToBase(literal.Type())
switch base.(type) {
case *entity.TypeInt, *entity.TypeWord:
return llvm.NewConstInt(irType.(*llvm.TypeInt), int64(literal.Value)), nil
case *entity.TypeFloat:
return llvm.NewConstFloat(irType.(*llvm.TypeFloat), float64(literal.Value)), nil
default:
return nil, errors.New(fmt.Sprintln("int can't be used as", base))
func (this *generator) generateConstantDeclaration (
ty *entity.Typedef,
constantName string,
) (
*llvm.Global,
error,
) {
key := entity.Key {
Unit: ty.Unit(),
Type: ty.Name,
Constant: constantName,
}
}
constant := ty.ConstantMap[constantName]
func (this *generator) generateConstantFloat (literal *entity.LiteralFloat) (llvm.Const, error) {
irType, err := this.generateType(analyzer.ReduceToBase(literal.Type()))
irType, err := this.typedef(key.OnlyType())
if err != nil { return nil, err }
return llvm.NewConstFloat(irType.(*llvm.TypeFloat), literal.Value), nil
}
func (this *generator) generateConstantString (literal *entity.LiteralString) (llvm.Const, error) {
panic("BUG: not supported yet")
}
// TODO: have two maps, constantsVal and constantsLoc. if the constant
// is multivalue, generate a constant global and put it in constantsLoc.
// if not, put the value in constantsVal. have generator.constant try
// both. have single generateConstant method that converts if necessary
// by either loading or allocating a copy on the stack.
//
// have a Multivalue method of types and disallow referencing of
// non-multivalue constants.
irGlobal := this.module.NewGlobal(constantName, irType)
irGlobal.Constant = true
func (this *generator) generateConstantArray (literal *entity.LiteralArray) (llvm.Const, error) {
panic("BUG: not supported yet")
}
func (this *generator) generateConstantStruct (literal *entity.LiteralStruct) (llvm.Const, error) {
panic("BUG: not supported yet")
}
func (this *generator) generateConstantBoolean (literal *entity.LiteralBoolean) (llvm.Const, error) {
return llvm.NewConstBool(bool(literal.Value)), nil
}
func (this *generator) generateConstantNil (literal *entity.LiteralNil) (llvm.Const, error) {
ty, err := this.generateType(literal.Type())
if err != nil { return nil, err }
return llvm.NewConstZeroInitializer(ty), nil
if ty.Unit() == this.tree.Unit() {
// in root unit, so generate data
initial, err := this.generateEvaluated(constant.Value)
if err != nil { return nil, err }
irGlobal.Initial = initial
}
this.constants[key] = irGlobal
return irGlobal, nil
}

View File

@ -5,12 +5,12 @@ import "testing"
func TestConstantValueSpecified (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::E" = type i64
define void @"0zNZN147MN2wzMAQ6NS2dQ==::f"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[f]"() {
0:
%1 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::plus4"(i64 2)
%1 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[plus4]"(i64 2)
ret void
}
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::plus4"(%"0zNZN147MN2wzMAQ6NS2dQ==::E" %e) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[plus4]"(%"0zNZN147MN2wzMAQ6NS2dQ==::E" %e) {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::E"
store %"0zNZN147MN2wzMAQ6NS2dQ==::E" %e, ptr %1
@ -50,12 +50,12 @@ E: Int
func TestConstantValueUnspecified (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::E" = type i64
define void @"0zNZN147MN2wzMAQ6NS2dQ==::f"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[f]"() {
0:
%1 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::plus4"(i64 1)
%1 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[plus4]"(i64 1)
ret void
}
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::plus4"(%"0zNZN147MN2wzMAQ6NS2dQ==::E" %e) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[plus4]"(%"0zNZN147MN2wzMAQ6NS2dQ==::E" %e) {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::E"
store %"0zNZN147MN2wzMAQ6NS2dQ==::E" %e, ptr %1

View File

@ -1,35 +0,0 @@
package generator
import "git.tebibyte.media/fspl/fspl/llvm"
import "git.tebibyte.media/fspl/fspl/entity"
func (this *generator) generateConstantDeclaration (
ty *entity.Typedef,
constantName string,
) (
*llvm.Global,
error,
) {
key := entity.Key {
Unit: ty.Unit(),
Type: ty.Name,
Constant: constantName,
}
constant := ty.ConstantMap[constantName]
irType, err := this.typedef(key.OnlyType())
if err != nil { return nil, err }
irGlobal := this.module.NewGlobal(constantName, irType)
irGlobal.Constant = true
if ty.Unit() == this.tree.Unit() {
// in root unit, so generate data
initial, err := this.generateConstant(constant.Value)
if err != nil { return nil, err }
irGlobal.Initial = initial
}
this.constants[key] = irGlobal
return irGlobal, nil
}

View File

@ -4,7 +4,7 @@ import "testing"
func TestBranchAssign (test *testing.T) {
testString (test,
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca i64
br i1 true, label %2, label %4
@ -32,7 +32,7 @@ testString (test,
func TestBranchAssignNoFalse (test *testing.T) {
testString (test,
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca i64
br i1 true, label %2, label %3
@ -55,7 +55,7 @@ testString (test,
func TestBranchResult (test *testing.T) {
testString (test,
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca i64
br i1 true, label %2, label %5
@ -78,7 +78,7 @@ testString (test,
func TestLoopSimple (test *testing.T) {
testString (test,
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
br label %1
1:
@ -98,7 +98,7 @@ testString (test,
func TestLoopResult (test *testing.T) {
testString (test,
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca i64
br label %2
@ -121,7 +121,7 @@ testString (test,
func TestLoopBranchResult (test *testing.T) {
testString (test,
`define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
`define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca i64
store i64 6, ptr %1
@ -162,7 +162,7 @@ testString (test,
func TestMatch (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::U" = type { i64, i64 }
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::matchToInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[matchToInt]"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::U"
store %"0zNZN147MN2wzMAQ6NS2dQ==::U" %u, ptr %1
@ -204,7 +204,7 @@ func TestMatchReturn (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Bool" = type i1
%"0zNZN147MN2wzMAQ6NS2dQ==::U" = type { i64, i64 }
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::isInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::[isInt]"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::U"
store %"0zNZN147MN2wzMAQ6NS2dQ==::U" %u, ptr %1
@ -236,7 +236,7 @@ func TestMatchReturnValueUsed (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Bool" = type i1
%"0zNZN147MN2wzMAQ6NS2dQ==::U" = type { i64, i64 }
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::isInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::[isInt]"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::U"
store %"0zNZN147MN2wzMAQ6NS2dQ==::U" %u, ptr %1
@ -276,7 +276,7 @@ testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::U" = type { i64, i64 }
%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
define void @"0zNZN147MN2wzMAQ6NS2dQ==::matchToInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[matchToInt]"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::U"
store %"0zNZN147MN2wzMAQ6NS2dQ==::U" %u, ptr %1
@ -309,7 +309,7 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::matchToInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::
%18 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %3, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 3, ptr %18
%19 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %3
call void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %19)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %19)
br label %10
20:
%21 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::U", ptr %1, i32 0, i32 1
@ -326,10 +326,10 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::matchToInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::
%27 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %6, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 3, ptr %27
%28 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %6
call void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %28)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %28)
br label %10
}
declare void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str)
declare void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str)
`,
`
U: (| Int F64 UInt)
@ -345,7 +345,7 @@ testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::U" = type { i64, i64 }
%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
define void @"0zNZN147MN2wzMAQ6NS2dQ==::matchToInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[matchToInt]"(%"0zNZN147MN2wzMAQ6NS2dQ==::U" %u) {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::U"
store %"0zNZN147MN2wzMAQ6NS2dQ==::U" %u, ptr %1
@ -380,7 +380,7 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::matchToInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::
%20 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %3, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 3, ptr %20
%21 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %3
call void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %21)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %21)
br label %12
22:
%23 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::U", ptr %1, i32 0, i32 1
@ -397,7 +397,7 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::matchToInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::
%29 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %6, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 3, ptr %29
%30 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %6
call void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %30)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %30)
br label %12
31:
%32 = getelementptr [3 x i8], ptr %9, i32 0, i32 0
@ -411,10 +411,10 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::matchToInt"(%"0zNZN147MN2wzMAQ6NS2dQ==::
%36 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %8, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 3, ptr %36
%37 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %8
call void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %37)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %37)
br label %12
}
declare void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str)
declare void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str)
`,
`
U: (| Int F64 UInt)
@ -430,7 +430,7 @@ U: (| Int F64 UInt)
func TestSwitchReturn (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Bool" = type i1
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::is5"(i64 %x) {
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::[is5]"(i64 %x) {
0:
%1 = alloca i64
store i64 %x, ptr %1
@ -455,7 +455,7 @@ define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::is5"(i64 %x
func TestSwitchReturnValueUsed (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Bool" = type i1
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::is5"(i64 %x) {
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::[is5]"(i64 %x) {
0:
%1 = alloca i64
store i64 %x, ptr %1
@ -482,7 +482,7 @@ define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::is5"(i64 %x
func TestIfElseReturnValueUsed (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Bool" = type i1
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::is5"(i64 %x) {
define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::[is5]"(i64 %x) {
0:
%1 = alloca i64
store i64 %x, ptr %1
@ -507,7 +507,7 @@ define %"AAAAAAAAAAAAAAAAAAAAAA==::Bool" @"0zNZN147MN2wzMAQ6NS2dQ==::is5"(i64 %x
func TestIfElseBreakValueUsed (test *testing.T) {
testString (test,
`define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::f"(i64 %x) {
`define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[f]"(i64 %x) {
0:
%1 = alloca i64
store i64 %x, ptr %1
@ -545,7 +545,7 @@ testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" = type i8
define void @"0zNZN147MN2wzMAQ6NS2dQ==::f"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str) {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[f]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str) {
0:
%1 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String"
store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %str, ptr %1
@ -566,7 +566,7 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::f"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %
%14 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %13
store %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %14, ptr %3
%15 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %3
call void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %15)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %15)
%16 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2
%17 = add %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %16, 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %17, ptr %2
@ -574,8 +574,8 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::f"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %
18:
ret void
}
declare void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %x)
define void @"0zNZN147MN2wzMAQ6NS2dQ==::g"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str) {
declare void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %x)
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[g]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str) {
0:
%1 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String"
store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %str, ptr %1
@ -597,7 +597,7 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::g"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %
%14 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %13
store %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %14, ptr %3
%15 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %3
call void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %15)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %15)
%16 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2
%17 = add %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %16, 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %17, ptr %2
@ -617,7 +617,7 @@ testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" = type i8
%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
define %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" @"0zNZN147MN2wzMAQ6NS2dQ==::f"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str) {
define %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" @"0zNZN147MN2wzMAQ6NS2dQ==::[f]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str) {
0:
%1 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String"
store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %str, ptr %1

View File

@ -4,22 +4,22 @@ import "fmt"
import "git.tebibyte.media/fspl/fspl/llvm"
import "git.tebibyte.media/fspl/fspl/entity"
func (this *generator) generateConstant (constant entity.Expression) (llvm.Const, error) {
func (this *generator) generateEvaluated (constant entity.Expression) (llvm.Const, error) {
switch constant := constant.(type) {
case *entity.LiteralInt:
return this.generateConstantInt(constant)
return this.generateEvaluatedInt(constant)
case *entity.LiteralFloat:
return this.generateConstantFloat(constant)
return this.generateEvaluatedFloat(constant)
case *entity.LiteralString:
return this.generateConstantString(constant)
return this.generateEvaluatedString(constant)
case *entity.LiteralArray:
return this.generateConstantArray(constant)
return this.generateEvaluatedArray(constant)
case *entity.LiteralStruct:
return this.generateConstantStruct(constant)
return this.generateEvaluatedStruct(constant)
case *entity.LiteralBoolean:
return this.generateConstantBoolean(constant)
return this.generateEvaluatedBoolean(constant)
case *entity.LiteralNil:
return this.generateConstantNil(constant)
return this.generateEvaluatedNil(constant)
default:
panic(fmt.Sprintf (
"BUG: generator doesnt know about constant %v, ty: %T",

50
generator/evaluated.go Normal file
View File

@ -0,0 +1,50 @@
package generator
import "fmt"
import "errors"
import "git.tebibyte.media/fspl/fspl/llvm"
import "git.tebibyte.media/fspl/fspl/entity"
import "git.tebibyte.media/fspl/fspl/analyzer"
func (this *generator) generateEvaluatedInt (literal *entity.LiteralInt) (llvm.Const, error) {
irType, err := this.generateType(analyzer.ReduceToBase(literal.Type()))
if err != nil { return nil, err }
base := analyzer.ReduceToBase(literal.Type())
switch base.(type) {
case *entity.TypeInt, *entity.TypeWord:
return llvm.NewConstInt(irType.(*llvm.TypeInt), int64(literal.Value)), nil
case *entity.TypeFloat:
return llvm.NewConstFloat(irType.(*llvm.TypeFloat), float64(literal.Value)), nil
default:
return nil, errors.New(fmt.Sprintln("int can't be used as", base))
}
}
func (this *generator) generateEvaluatedFloat (literal *entity.LiteralFloat) (llvm.Const, error) {
irType, err := this.generateType(analyzer.ReduceToBase(literal.Type()))
if err != nil { return nil, err }
return llvm.NewConstFloat(irType.(*llvm.TypeFloat), literal.Value), nil
}
func (this *generator) generateEvaluatedString (literal *entity.LiteralString) (llvm.Const, error) {
panic("BUG: not supported yet")
}
func (this *generator) generateEvaluatedArray (literal *entity.LiteralArray) (llvm.Const, error) {
panic("BUG: not supported yet")
}
func (this *generator) generateEvaluatedStruct (literal *entity.LiteralStruct) (llvm.Const, error) {
panic("BUG: not supported yet")
}
func (this *generator) generateEvaluatedBoolean (literal *entity.LiteralBoolean) (llvm.Const, error) {
return llvm.NewConstBool(bool(literal.Value)), nil
}
func (this *generator) generateEvaluatedNil (literal *entity.LiteralNil) (llvm.Const, error) {
ty, err := this.generateType(literal.Type())
if err != nil { return nil, err }
return llvm.NewConstZeroInitializer(ty), nil
}

View File

@ -19,20 +19,20 @@ define void @main() {
func TestFunctionCall (test *testing.T) {
testString (test,
`define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::f"() {
`define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[f]"() {
0:
%1 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::g"(i64 5)
%1 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[g]"(i64 5)
ret i64 %1
}
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::g"(i64 %x) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[g]"(i64 %x) {
0:
%1 = alloca i64
store i64 %x, ptr %1
%2 = load i64, ptr %1
%3 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::h"(i64 %2)
%3 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[h]"(i64 %2)
ret i64 %3
}
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::h"(i64 %x) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[h]"(i64 %x) {
0:
%1 = alloca i64
store i64 %x, ptr %1
@ -49,21 +49,21 @@ define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::h"(i64 %x) {
func TestFunctionCallVoid (test *testing.T) {
testString (test,
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::f"() {
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::[f]"() {
0:
%1 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::g"(i64 5)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::h"()
%2 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::g"(i64 6)
%1 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[g]"(i64 5)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[h]"()
%2 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[g]"(i64 6)
ret void
}
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::g"(i64 %x) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[g]"(i64 %x) {
0:
%1 = alloca i64
store i64 %x, ptr %1
%2 = load i64, ptr %1
ret i64 %2
}
define void @"0zNZN147MN2wzMAQ6NS2dQ==::h"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[h]"() {
0:
ret void
}
@ -78,14 +78,14 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::h"() {
func TestMethod (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::Number" = type i64
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::Number"
store i64 5, ptr %1
%2 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.number"(ptr %1)
%2 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[number]"(ptr %1)
ret i64 %2
}
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.number"(ptr %this) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[number]"(ptr %this) {
0:
%1 = alloca ptr
store ptr %this, ptr %1
@ -108,17 +108,17 @@ Number.[number]: Int = [.this]
func TestMethodPtr (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::Number" = type i64
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::Number"
store i64 5, ptr %1
%2 = alloca ptr
store ptr %1, ptr %2
%3 = load ptr, ptr %2
%4 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.number"(ptr %3)
%4 = call i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[number]"(ptr %3)
ret i64 %4
}
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.number"(ptr %this) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[number]"(ptr %this) {
0:
%1 = alloca ptr
store ptr %this, ptr %1
@ -142,17 +142,17 @@ Number.[number]: Int = [.this]
func TestMethodChained (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::Number" = type i64
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca i64
store i64 5, ptr %1
%2 = call %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.add"(ptr %1, i64 8)
%2 = call %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[add]"(ptr %1, i64 8)
%3 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::Number"
store %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %2, ptr %3
%4 = call %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.mul"(ptr %3, i64 3)
%4 = call %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[mul]"(ptr %3, i64 3)
ret %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %4
}
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.mul"(ptr %this, %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %x) {
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[mul]"(ptr %this, %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %x) {
0:
%1 = alloca ptr
store ptr %this, ptr %1
@ -164,7 +164,7 @@ define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.mu
%6 = mul %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %4, %5
ret %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %6
}
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.add"(ptr %this, %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %x) {
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[add]"(ptr %this, %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %x) {
0:
%1 = alloca ptr
store ptr %this, ptr %1
@ -176,7 +176,7 @@ define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.ad
%6 = add %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %4, %5
ret %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %6
}
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.div"(ptr %this, %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %x) {
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[div]"(ptr %this, %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %x) {
0:
%1 = alloca ptr
store ptr %this, ptr %1
@ -188,7 +188,7 @@ define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.di
%6 = sdiv %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %4, %5
ret %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %6
}
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.sub"(ptr %this, %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %x) {
define %"0zNZN147MN2wzMAQ6NS2dQ==::Number" @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[sub]"(ptr %this, %"0zNZN147MN2wzMAQ6NS2dQ==::Number" %x) {
0:
%1 = alloca ptr
store ptr %this, ptr %1
@ -239,10 +239,10 @@ define void @main() {
store ptr %3, ptr %10
%11 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 6, ptr %11
call void @"0zNZN147MN2wzMAQ6NS2dQ==::Greeter.greet"(ptr %1)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::Greeter.[greet]"(ptr %1)
ret void
}
define void @"0zNZN147MN2wzMAQ6NS2dQ==::Greeter.greet"(ptr %this) {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::Greeter.[greet]"(ptr %this) {
0:
%1 = alloca ptr
store ptr %this, ptr %1

View File

@ -6,14 +6,14 @@ func TestInterfaceBasic (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::Doer" = type { ptr, ptr }
%"0zNZN147MN2wzMAQ6NS2dQ==::T" = type i64
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::Doer"
%2 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Doer", ptr %1, i32 0, i32 0
%3 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::T"
store ptr %3, ptr %2
%4 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Doer", ptr %1, i32 0, i32 1
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::T.do", ptr %4
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::T.[do]", ptr %4
%5 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Doer", ptr %1, i32 0, i32 1
%6 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Doer", ptr %1, i32 0, i32 0
%7 = load ptr, ptr %6
@ -21,7 +21,7 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
call void %8(ptr %7)
ret void
}
define void @"0zNZN147MN2wzMAQ6NS2dQ==::T.do"(ptr %this) {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::T.[do]"(ptr %this) {
0:
%1 = alloca ptr
store ptr %this, ptr %1
@ -44,7 +44,7 @@ func TestInterfaceIntegerReturn (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::Number" = type i64
%"0zNZN147MN2wzMAQ6NS2dQ==::Numbered" = type { ptr, ptr }
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::Number"
store i64 5, ptr %1
@ -52,7 +52,7 @@ define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
%3 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Numbered", ptr %2, i32 0, i32 0
store ptr %1, ptr %3
%4 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Numbered", ptr %2, i32 0, i32 1
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::Number.number", ptr %4
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[number]", ptr %4
%5 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Numbered", ptr %2, i32 0, i32 1
%6 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Numbered", ptr %2, i32 0, i32 0
%7 = load ptr, ptr %6
@ -60,7 +60,7 @@ define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
%9 = call i64 %8(ptr %7)
ret i64 %9
}
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.number"(ptr %this) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Number.[number]"(ptr %this) {
0:
%1 = alloca ptr
store ptr %this, ptr %1
@ -96,12 +96,12 @@ define i64 @main() {
%3 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Writer", ptr %2, i32 0, i32 0
store ptr %1, ptr %3
%4 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Writer", ptr %2, i32 0, i32 1
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::File.write", ptr %4
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::File.[write]", ptr %4
%5 = load %"0zNZN147MN2wzMAQ6NS2dQ==::Writer", ptr %2
call void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"0zNZN147MN2wzMAQ6NS2dQ==::Writer" %5)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[sayHello]"(%"0zNZN147MN2wzMAQ6NS2dQ==::Writer" %5)
ret i64 0
}
define void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"0zNZN147MN2wzMAQ6NS2dQ==::Writer" %writer) {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[sayHello]"(%"0zNZN147MN2wzMAQ6NS2dQ==::Writer" %writer) {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::Writer"
store %"0zNZN147MN2wzMAQ6NS2dQ==::Writer" %writer, ptr %1
@ -153,7 +153,7 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"0zNZN147MN2wzMAQ6NS2dQ==::Wr
%28 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %27(ptr %26, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %23)
ret void
}
define %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"0zNZN147MN2wzMAQ6NS2dQ==::File.write"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer) {
define %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"0zNZN147MN2wzMAQ6NS2dQ==::File.[write]"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer) {
0:
%1 = alloca ptr
store ptr %this, ptr %1
@ -165,10 +165,10 @@ define %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"0zNZN147MN2wzMAQ6NS2dQ==::File.write
%6 = load ptr, ptr %5
%7 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %2, i32 0, i32 1
%8 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %7
%9 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"0zNZN147MN2wzMAQ6NS2dQ==::write"(%"0zNZN147MN2wzMAQ6NS2dQ==::File" %4, ptr %6, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %8)
%9 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"0zNZN147MN2wzMAQ6NS2dQ==::[write]"(%"0zNZN147MN2wzMAQ6NS2dQ==::File" %4, ptr %6, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %8)
ret %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %9
}
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"0zNZN147MN2wzMAQ6NS2dQ==::write"(%"0zNZN147MN2wzMAQ6NS2dQ==::File" %fd, ptr %buffer, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %count)
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"0zNZN147MN2wzMAQ6NS2dQ==::[write]"(%"0zNZN147MN2wzMAQ6NS2dQ==::File" %fd, ptr %buffer, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %count)
`,
`
[write fd:File buffer:*Byte count:Index]: Index
@ -202,10 +202,10 @@ define void @main() {
store i32 0, ptr %4
store ptr %4, ptr %3
%5 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Writer", ptr %2, i32 0, i32 1
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::File.write", ptr %5
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::File.[write]", ptr %5
ret void
}
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"0zNZN147MN2wzMAQ6NS2dQ==::File.write"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer)
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"0zNZN147MN2wzMAQ6NS2dQ==::File.[write]"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer)
`,
`
Writer: (& [write buffer:*:Byte]: Index)
@ -230,10 +230,10 @@ define void @main() {
%3 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::Impl"
store ptr %3, ptr %2
%4 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::Face", ptr %1, i32 0, i32 1
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::Impl.x", ptr %4
store ptr @"0zNZN147MN2wzMAQ6NS2dQ==::Impl.[x]", ptr %4
ret void
}
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Impl.x"(ptr %this) {
define i64 @"0zNZN147MN2wzMAQ6NS2dQ==::Impl.[x]"(ptr %this) {
0:
%1 = alloca ptr
store ptr %this, ptr %1

View File

@ -7,11 +7,11 @@ import "git.tebibyte.media/fspl/fspl/entity"
import "git.tebibyte.media/fspl/fspl/analyzer"
func (this *generator) generateLiteralInt (literal *entity.LiteralInt) (llvm.Value, error) {
return this.generateConstant(literal)
return this.generateEvaluated(literal)
}
func (this *generator) generateLiteralFloat (literal *entity.LiteralFloat) (llvm.Value, error) {
return this.generateConstant(literal)
return this.generateEvaluated(literal)
}
// generateLiteralArrayLoc generates an array literal. irDestLoc specifies the
@ -256,9 +256,9 @@ func (this *generator) generateLiteralStructLoc (literal *entity.LiteralStruct,
}
func (this *generator) generateLiteralBoolean (literal *entity.LiteralBoolean) (llvm.Value, error) {
return this.generateConstant(literal)
return this.generateEvaluated(literal)
}
func (this *generator) generateLiteralNil (literal *entity.LiteralNil) (llvm.Value, error) {
return this.generateConstant(literal)
return this.generateEvaluated(literal)
}

View File

@ -6,7 +6,7 @@ func TestPrintDigit (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" = type i8
%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
define void @"0zNZN147MN2wzMAQ6NS2dQ==::printDigit"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %digit) {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[printDigit]"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %digit) {
0:
%1 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::Byte"
store %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %digit, ptr %1
@ -33,7 +33,7 @@ declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @write(i32 %file, ptr %buffer, %"AAAA
func TestSignedUnsignedDivision (test *testing.T) {
testString (test,
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca i64
%2 = sdiv i64 20, -5
@ -71,7 +71,7 @@ testString (test,
func TestFloatMath (test *testing.T) {
testString (test,
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
`define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca double
%2 = fadd double 2.0, 3.0
@ -95,7 +95,7 @@ func TestCompare (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Bool" = type i1
%"0zNZN147MN2wzMAQ6NS2dQ==::A" = type i64
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca i64
store i64 32, ptr %1
@ -131,7 +131,7 @@ func TestSlice (test *testing.T) {
testString (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
define void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %string) {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[print]"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %string) {
0:
%1 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String"
store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %string, ptr %1

View File

@ -5,7 +5,7 @@ import "testing"
func TestUnitTwo (test *testing.T) {
testUnits (test,
`%"E80Pxr3rNdulEDOmHs9Hsg==::X" = type i64
define %"E80Pxr3rNdulEDOmHs9Hsg==::X" @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define %"E80Pxr3rNdulEDOmHs9Hsg==::X" @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
ret i64 5
}
@ -19,7 +19,7 @@ define %"E80Pxr3rNdulEDOmHs9Hsg==::X" @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
func TestUnitAssignRestricted (test *testing.T) {
testUnits (test,
`%"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt" = type i64
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt"
%2 = alloca %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt"
@ -42,7 +42,7 @@ func TestNestedUnitTypedef (test *testing.T) {
testUnits (test,
`%"kOsrvvRIOh2nYGTmlfGyKQ==::X" = type i64
%"qnTuCId6O/ihTdVz5Ln6WQ==::X" = type %"kOsrvvRIOh2nYGTmlfGyKQ==::X"
define %"qnTuCId6O/ihTdVz5Ln6WQ==::X" @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define %"qnTuCId6O/ihTdVz5Ln6WQ==::X" @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
ret i64 5
}
@ -72,12 +72,12 @@ define i32 @main() {
%3 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %2, i32 0, i32 0
store ptr %1, ptr %3
%4 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %2, i32 0, i32 1
store ptr @"1cqXRNyHN06gi9QQb4GCsg==::File.write", ptr %4
store ptr @"1cqXRNyHN06gi9QQb4GCsg==::File.[write]", ptr %4
%5 = load %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %2
call void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"1cqXRNyHN06gi9QQb4GCsg==::Writer" %5)
call void @"0zNZN147MN2wzMAQ6NS2dQ==::[sayHello]"(%"1cqXRNyHN06gi9QQb4GCsg==::Writer" %5)
ret i32 0
}
define void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"1cqXRNyHN06gi9QQb4GCsg==::Writer" %writer) {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[sayHello]"(%"1cqXRNyHN06gi9QQb4GCsg==::Writer" %writer) {
0:
%1 = alloca %"1cqXRNyHN06gi9QQb4GCsg==::Writer"
store %"1cqXRNyHN06gi9QQb4GCsg==::Writer" %writer, ptr %1
@ -101,7 +101,7 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"1cqXRNyHN06gi9QQb4GCsg==::Wr
%14 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %13(ptr %12, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %9)
ret void
}
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"1cqXRNyHN06gi9QQb4GCsg==::File.write"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer)
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"1cqXRNyHN06gi9QQb4GCsg==::File.[write]"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer)
`,
`[sayHello writer:io::Writer] = writer.[write 'hi\n']
@ -130,10 +130,10 @@ testUnits (test,
define void @main() {
0:
%1 = alloca %"9U3Q1r5tPJSXoVNdBSzCow==::T"
call void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %1)
call void @"9U3Q1r5tPJSXoVNdBSzCow==::T.[method]"(ptr %1)
ret void
}
declare void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %this)
declare void @"9U3Q1r5tPJSXoVNdBSzCow==::T.[method]"(ptr %this)
`,
`[main] 'main' = {
@ -152,10 +152,10 @@ testUnits (test,
0:
%1 = alloca ptr
%2 = load ptr, ptr %1
call void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %2)
call void @"9U3Q1r5tPJSXoVNdBSzCow==::T.[method]"(ptr %2)
ret void
}
declare void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %this)
declare void @"9U3Q1r5tPJSXoVNdBSzCow==::T.[method]"(ptr %this)
`,
`[main] 'main' = {

View File

@ -17,7 +17,7 @@ testString (test,
%"0zNZN147MN2wzMAQ6NS2dQ==::Path" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
%"0zNZN147MN2wzMAQ6NS2dQ==::Quadrangle" = type [4 x %"0zNZN147MN2wzMAQ6NS2dQ==::Point"]
%"0zNZN147MN2wzMAQ6NS2dQ==::AllTypes" = type { %"AAAAAAAAAAAAAAAAAAAAAA==::String", %"0zNZN147MN2wzMAQ6NS2dQ==::Pegasus", %"0zNZN147MN2wzMAQ6NS2dQ==::Rectangle", %"0zNZN147MN2wzMAQ6NS2dQ==::AllInts", %"0zNZN147MN2wzMAQ6NS2dQ==::AllFloats", %"0zNZN147MN2wzMAQ6NS2dQ==::Path", %"0zNZN147MN2wzMAQ6NS2dQ==::Quadrangle" }
declare %"0zNZN147MN2wzMAQ6NS2dQ==::AllTypes" @"0zNZN147MN2wzMAQ6NS2dQ==::x"()
declare %"0zNZN147MN2wzMAQ6NS2dQ==::AllTypes" @"0zNZN147MN2wzMAQ6NS2dQ==::[x]"()
`,
`
Point: (.x:Int y:Int)
@ -67,7 +67,7 @@ testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::A" = type ptr
%"0zNZN147MN2wzMAQ6NS2dQ==::B" = type ptr
%"0zNZN147MN2wzMAQ6NS2dQ==::C" = type ptr
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::A"
%2 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::B"
@ -90,7 +90,7 @@ testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::A" = type ptr
%"0zNZN147MN2wzMAQ6NS2dQ==::B" = type %"0zNZN147MN2wzMAQ6NS2dQ==::A"
%"0zNZN147MN2wzMAQ6NS2dQ==::C" = type %"0zNZN147MN2wzMAQ6NS2dQ==::B"
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::A"
%2 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::B"
@ -112,7 +112,7 @@ func TestChainedTypedefGetElementPtr (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::A" = type { i64 }
%"0zNZN147MN2wzMAQ6NS2dQ==::B" = type %"0zNZN147MN2wzMAQ6NS2dQ==::A"
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::B"
%2 = getelementptr %"0zNZN147MN2wzMAQ6NS2dQ==::B", ptr %1, i32 0, i32 0
@ -139,7 +139,7 @@ testString (test,
%"0zNZN147MN2wzMAQ6NS2dQ==::Point" = type { i64, i64 }
%"0zNZN147MN2wzMAQ6NS2dQ==::Error" = type { ptr, ptr }
%"0zNZN147MN2wzMAQ6NS2dQ==::PointOrError" = type { i64, i128 }
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::U"
%2 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::SmallU"

View File

@ -5,7 +5,7 @@ import "testing"
func TestAssignmentUnion (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::U" = type { i64, i64 }
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca double
store double 0x401ECCCCCCCCCCCD, ptr %1
@ -29,7 +29,7 @@ U: (| Int F64)
func TestAssignmentUnionToUnion (test *testing.T) {
testString (test,
`%"0zNZN147MN2wzMAQ6NS2dQ==::U" = type { i64, i64 }
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
define void @"0zNZN147MN2wzMAQ6NS2dQ==::[main]"() {
0:
%1 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::U"
%2 = alloca %"0zNZN147MN2wzMAQ6NS2dQ==::U"