Fix conversion of slices to pointers
This commit is contained in:
parent
2ce910c54a
commit
8a6d4599d1
@ -170,11 +170,17 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
|
|||||||
|
|
||||||
switch fromType := fromType.(type) {
|
switch fromType := fromType.(type) {
|
||||||
case *entity.TypeInt, *entity.TypeWord:
|
case *entity.TypeInt, *entity.TypeWord:
|
||||||
|
// cast from integer to integer:
|
||||||
|
// basic truncated value assignment
|
||||||
return this.blockManager.NewTrunc(from, to), nil
|
return this.blockManager.NewTrunc(from, to), nil
|
||||||
case *entity.TypeFloat:
|
case *entity.TypeFloat:
|
||||||
if analyzer.IsUnsigned(fromType) {
|
if analyzer.IsUnsigned(fromType) {
|
||||||
|
// cast from float to unsigned integer:
|
||||||
|
// convert float to unsigned integer
|
||||||
return this.blockManager.NewFPToUI(from, to), nil
|
return this.blockManager.NewFPToUI(from, to), nil
|
||||||
} else {
|
} else {
|
||||||
|
// cast from float to signed integer:
|
||||||
|
// convert float to signed integer
|
||||||
return this.blockManager.NewFPToSI(from, to), nil
|
return this.blockManager.NewFPToSI(from, to), nil
|
||||||
}
|
}
|
||||||
default: return fail()
|
default: return fail()
|
||||||
@ -186,11 +192,17 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
|
|||||||
|
|
||||||
switch fromType := fromType.(type) {
|
switch fromType := fromType.(type) {
|
||||||
case *entity.TypeFloat:
|
case *entity.TypeFloat:
|
||||||
|
// cast from float to float:
|
||||||
|
// basic truncated value assignment
|
||||||
return this.blockManager.NewFPTrunc(from, to), nil
|
return this.blockManager.NewFPTrunc(from, to), nil
|
||||||
case *entity.TypeInt, *entity.TypeWord:
|
case *entity.TypeInt, *entity.TypeWord:
|
||||||
if analyzer.IsUnsigned(fromType) {
|
if analyzer.IsUnsigned(fromType) {
|
||||||
|
// cast from unsigned integer to float:
|
||||||
|
// convert unsigned integer to float
|
||||||
return this.blockManager.NewUIToFP(from, to), nil
|
return this.blockManager.NewUIToFP(from, to), nil
|
||||||
} else {
|
} else {
|
||||||
|
// cast from signed integer to float:
|
||||||
|
// convert signed integer to float
|
||||||
return this.blockManager.NewSIToFP(from, to), nil
|
return this.blockManager.NewSIToFP(from, to), nil
|
||||||
}
|
}
|
||||||
default: return fail()
|
default: return fail()
|
||||||
@ -199,14 +211,21 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
|
|||||||
case *entity.TypePointer:
|
case *entity.TypePointer:
|
||||||
switch fromType := fromType.(type) {
|
switch fromType := fromType.(type) {
|
||||||
case *entity.TypeSlice:
|
case *entity.TypeSlice:
|
||||||
|
// cast from slice to pointer:
|
||||||
|
// pointer will point to the first element of the slice
|
||||||
from, _, err := generateFromLoc()
|
from, _, err := generateFromLoc()
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
irFromType, err := this.generateType(fromType)
|
irFromType, err := this.generateType(fromType)
|
||||||
return this.blockManager.NewGetElementPtr (
|
dataAddressFieldAddress := this.blockManager.NewGetElementPtr (
|
||||||
irFromType, from,
|
irFromType, from,
|
||||||
llvm.NewConstInt(llvm.I32, 0),
|
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:
|
case *entity.TypePointer:
|
||||||
|
// cast from pointer to pointer:
|
||||||
|
// basic forceful value assignment
|
||||||
from, to, err := generateFrom()
|
from, to, err := generateFrom()
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
return this.blockManager.NewBitCast(from, to), nil
|
return this.blockManager.NewBitCast(from, to), nil
|
||||||
@ -216,6 +235,8 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
|
|||||||
case *entity.TypeSlice,
|
case *entity.TypeSlice,
|
||||||
*entity.TypeArray,
|
*entity.TypeArray,
|
||||||
*entity.TypeStruct:
|
*entity.TypeStruct:
|
||||||
|
// cast from composite type to composite type:
|
||||||
|
// basic forceful value assignment
|
||||||
from, to, err := generateFrom()
|
from, to, err := generateFrom()
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
return this.blockManager.NewBitCast(from, to), nil
|
return this.blockManager.NewBitCast(from, to), nil
|
||||||
|
Loading…
Reference in New Issue
Block a user