34 lines
1.1 KiB
Go
34 lines
1.1 KiB
Go
package generator
|
|
|
|
import "git.tebibyte.media/sashakoshka/fspl/llvm"
|
|
import "git.tebibyte.media/sashakoshka/fspl/entity"
|
|
|
|
func (this *generator) generateSlice (ty *entity.TypeSlice, data llvm.Value, start, end int64) (llvm.Value, error) {
|
|
irType, err := this.generateTypeSlice(ty)
|
|
if err != nil { return nil, err }
|
|
|
|
slice := this.blockManager.newAllocaFront(irType)
|
|
dataField := this.blockManager.NewGetElementPtr (
|
|
irType, slice,
|
|
llvm.NewConstInt(llvm.I32, 0),
|
|
llvm.NewConstInt(llvm.I32, 0))
|
|
this.blockManager.NewStore(data, dataField)
|
|
startField := this.blockManager.NewGetElementPtr (
|
|
irType, slice,
|
|
llvm.NewConstInt(llvm.I32, 0),
|
|
llvm.NewConstInt(llvm.I32, 1))
|
|
endField := this.blockManager.NewGetElementPtr (
|
|
irType, slice,
|
|
llvm.NewConstInt(llvm.I32, 0),
|
|
llvm.NewConstInt(llvm.I32, 2))
|
|
sizeType, err := this.typedef("Index")
|
|
if err != nil { return nil, err }
|
|
this.blockManager.NewStore (
|
|
llvm.NewConstInt(sizeType.(*llvm.TypeInt), start),
|
|
startField)
|
|
this.blockManager.NewStore (
|
|
llvm.NewConstInt (sizeType.(*llvm.TypeInt), end),
|
|
endField)
|
|
return slice, nil
|
|
}
|