compiler: Add boolean constants
Этот коммит содержится в:
родитель
6ad451a582
коммит
bddb0c49b2
1 изменённых файлов: 11 добавлений и 4 удалений
15
tgo.go
15
tgo.go
|
@ -968,16 +968,16 @@ func (c *Compiler) parseBinOp(frame *Frame, binop *ssa.BinOp) (llvm.Value, error
|
||||||
|
|
||||||
func (c *Compiler) parseConst(expr *ssa.Const) (llvm.Value, error) {
|
func (c *Compiler) parseConst(expr *ssa.Const) (llvm.Value, error) {
|
||||||
switch expr.Value.Kind() {
|
switch expr.Value.Kind() {
|
||||||
|
case constant.Bool, constant.Int:
|
||||||
|
return c.parseConstInt(expr, expr.Type())
|
||||||
case constant.String:
|
case constant.String:
|
||||||
str := constant.StringVal(expr.Value)
|
str := constant.StringVal(expr.Value)
|
||||||
strLen := llvm.ConstInt(c.stringLenType, uint64(len(str)), false)
|
strLen := llvm.ConstInt(c.stringLenType, uint64(len(str)), false)
|
||||||
strPtr := c.builder.CreateGlobalStringPtr(str, ".str") // TODO: remove \0 at end
|
strPtr := c.builder.CreateGlobalStringPtr(str, ".str") // TODO: remove \0 at end
|
||||||
strObj := llvm.ConstStruct([]llvm.Value{strLen, strPtr}, false)
|
strObj := llvm.ConstStruct([]llvm.Value{strLen, strPtr}, false)
|
||||||
return strObj, nil
|
return strObj, nil
|
||||||
case constant.Int:
|
|
||||||
return c.parseConstInt(expr, expr.Type())
|
|
||||||
default:
|
default:
|
||||||
return llvm.Value{}, errors.New("todo: unknown constant")
|
return llvm.Value{}, errors.New("todo: unknown constant: " + fmt.Sprintf("%#v", expr.Value.Kind()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -988,7 +988,14 @@ func (c *Compiler) parseConstInt(expr *ssa.Const, typ types.Type) (llvm.Value, e
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return llvm.Value{}, err
|
return llvm.Value{}, err
|
||||||
}
|
}
|
||||||
if typ.Info() & types.IsUnsigned != 0 || typ.Info() & types.IsBoolean != 0 {
|
if typ.Info() & types.IsBoolean != 0 {
|
||||||
|
b := constant.BoolVal(expr.Value)
|
||||||
|
n := uint64(0)
|
||||||
|
if b {
|
||||||
|
n = 1
|
||||||
|
}
|
||||||
|
return llvm.ConstInt(llvmType, n, false), nil
|
||||||
|
} else if typ.Info() & types.IsUnsigned != 0 {
|
||||||
n, _ := constant.Uint64Val(expr.Value)
|
n, _ := constant.Uint64Val(expr.Value)
|
||||||
return llvm.ConstInt(llvmType, n, false), nil
|
return llvm.ConstInt(llvmType, n, false), nil
|
||||||
} else if typ.Info() & types.IsInteger != 0 { // signed
|
} else if typ.Info() & types.IsInteger != 0 { // signed
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче