Fix conversion of slices to pointers

This commit is contained in:
Sasha Koshka 2024-01-26 04:07:58 +00:00
parent 2ce910c54a
commit 8a6d4599d1
1 changed files with 23 additions and 2 deletions

View File

@ -170,11 +170,17 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
switch fromType := fromType.(type) {
case *entity.TypeInt, *entity.TypeWord:
// cast from integer to integer:
// basic truncated value assignment
return this.blockManager.NewTrunc(from, to), nil
case *entity.TypeFloat:
if analyzer.IsUnsigned(fromType) {
// cast from float to unsigned integer:
// convert float to unsigned integer
return this.blockManager.NewFPToUI(from, to), nil
} else {
// cast from float to signed integer:
// convert float to signed integer
return this.blockManager.NewFPToSI(from, to), nil
}
default: return fail()
@ -186,11 +192,17 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
switch fromType := fromType.(type) {
case *entity.TypeFloat:
// cast from float to float:
// basic truncated value assignment
return this.blockManager.NewFPTrunc(from, to), nil
case *entity.TypeInt, *entity.TypeWord:
if analyzer.IsUnsigned(fromType) {
// cast from unsigned integer to float:
// convert unsigned integer to float
return this.blockManager.NewUIToFP(from, to), nil
} else {
// cast from signed integer to float:
// convert signed integer to float
return this.blockManager.NewSIToFP(from, to), nil
}
default: return fail()
@ -199,14 +211,21 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
case *entity.TypePointer:
switch fromType := fromType.(type) {
case *entity.TypeSlice:
// cast from slice to pointer:
// pointer will point to the first element of the slice
from, _, err := generateFromLoc()
if err != nil { return nil, err }
irFromType, err := this.generateType(fromType)
return this.blockManager.NewGetElementPtr (
dataAddressFieldAddress := this.blockManager.NewGetElementPtr (
irFromType, from,
llvm.NewConstInt(llvm.I32, 0),
llvm.NewConstInt(llvm.I32, 0)), nil
llvm.NewConstInt(llvm.I32, 0))
return this.blockManager.NewLoad (
new(llvm.TypePointer),
dataAddressFieldAddress), nil
case *entity.TypePointer:
// cast from pointer to pointer:
// basic forceful value assignment
from, to, err := generateFrom()
if err != nil { return nil, err }
return this.blockManager.NewBitCast(from, to), nil
@ -216,6 +235,8 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
case *entity.TypeSlice,
*entity.TypeArray,
*entity.TypeStruct:
// cast from composite type to composite type:
// basic forceful value assignment
from, to, err := generateFrom()
if err != nil { return nil, err }
return this.blockManager.NewBitCast(from, to), nil