forked from go-llvm/llgo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
types.go
57 lines (52 loc) · 1.31 KB
/
types.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Copyright 2012 The llgo Authors.
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file.
package llgo
import (
"code.google.com/p/go.tools/go/types"
"fmt"
)
func deref(t types.Type) types.Type {
return t.Underlying().(*types.Pointer).Elem()
}
func (c *compiler) exportRuntimeTypes(exportedTypes []types.Type, builtin bool) {
if builtin {
kinds := [...]types.BasicKind{
types.Uint,
types.Uint8,
types.Uint16,
types.Uint32,
types.Uint64,
types.Int,
types.Int8,
types.Int16,
types.Int32,
types.Int64,
types.Float32,
types.Float64,
types.Complex64,
types.Complex128,
types.Bool,
types.Uintptr,
types.UnsafePointer,
types.String,
}
for _, kind := range kinds {
exportedTypes = append(exportedTypes, types.Typ[kind])
}
error_ := types.Universe.Lookup("error").Type()
exportedTypes = append(exportedTypes, error_)
}
for _, typ := range exportedTypes {
c.types.ToRuntime(types.NewPointer(typ))
}
}
// tupleType returns a struct type with anonymous
// fields with the specified types.
func tupleType(fieldTypes ...types.Type) types.Type {
vars := make([]*types.Var, len(fieldTypes))
for i, t := range fieldTypes {
vars[i] = types.NewParam(0, nil, fmt.Sprintf("f%d", i), t)
}
return types.NewStruct(vars, nil)
}