More routines in data.go

This commit is contained in:
Sasha Koshka 2024-01-26 05:35:22 +00:00
parent cf201a08c6
commit effebe5f64
1 changed files with 17 additions and 5 deletions

View File

@ -3,7 +3,7 @@ package generator
import "git.tebibyte.media/sashakoshka/fspl/llvm"
import "git.tebibyte.media/sashakoshka/fspl/entity"
func (this *generator) generateSlice (ty entity.Type, data llvm.Value, length int64) (llvm.Value, error) {
func (this *generator) generateSlice (ty entity.Type, data llvm.Value, length llvm.Value) (llvm.Value, error) {
irType, err := this.generateType(ty)
if err != nil { return nil, err }
@ -17,12 +17,24 @@ func (this *generator) generateSlice (ty entity.Type, data llvm.Value, length in
irType, slice,
llvm.NewConstInt(llvm.I32, 0),
llvm.NewConstInt(llvm.I32, 1))
this.blockManager.NewStore(length, lengthField)
return slice, nil
}
func (this *generator) generateSliceDefinedLength (ty entity.Type, data llvm.Value, length int64) (llvm.Value, error) {
sizeType, err := this.typedef("Index")
if err != nil { return nil, err }
this.blockManager.NewStore (
llvm.NewConstInt(sizeType.(*llvm.TypeInt), length),
lengthField)
return slice, nil
return this.generateSlice(ty, data, llvm.NewConstInt(sizeType.(*llvm.TypeInt), length))
}
func (this *generator) getSliceDataAddress (slice llvm.Value, irType llvm.Type) llvm.Value {
dataAddressFieldAddress := this.blockManager.NewGetElementPtr (
irType, slice,
llvm.NewConstInt(llvm.I32, 0),
llvm.NewConstInt(llvm.I32, 0))
return this.blockManager.NewLoad (
new(llvm.TypePointer),
dataAddressFieldAddress)
}
func (this *generator) getInterfaceData (iface llvm.Value, irType llvm.Type) llvm.Value {