| 69 | type memLayoutKey string |
| 70 | |
| 71 | func (c *C) declareTypes() { |
| 72 | c.T.targetABI = c.Settings.TargetABI |
| 73 | |
| 74 | c.T.Types = c.M.Types |
| 75 | c.T.Ctx = c.T.DeclareStruct("context") |
| 76 | c.T.CtxPtr = c.T.Pointer(c.T.Ctx) |
| 77 | c.T.Globals = c.T.DeclareStruct("globals") |
| 78 | c.T.GlobalsPtr = c.T.Pointer(c.T.Globals) |
| 79 | c.T.Pool = c.T.TypeOf(C.pool{}) |
| 80 | c.T.PoolPtr = c.T.Pointer(c.T.Pool) |
| 81 | c.T.Sli = c.T.TypeOf(C.slice{}) |
| 82 | c.T.Str = c.T.TypeOf(C.string{}).(*codegen.Struct) |
| 83 | c.T.StrPtr = c.T.Pointer(c.T.Str) |
| 84 | c.T.Uint8Ptr = c.T.Pointer(c.T.Uint8) |
| 85 | c.T.Any = c.T.TypeOf(C.gapil_any{}).(*codegen.Struct) |
| 86 | c.T.AnyPtr = c.T.Pointer(c.T.Any) |
| 87 | c.T.Msg = c.T.TypeOf(C.gapil_msg{}).(*codegen.Struct) |
| 88 | c.T.MsgPtr = c.T.Pointer(c.T.Msg) |
| 89 | c.T.MsgArg = c.T.TypeOf(C.gapil_msg_arg{}).(*codegen.Struct) |
| 90 | c.T.MsgArgPtr = c.T.Pointer(c.T.MsgArg) |
| 91 | c.T.RTTI = c.T.TypeOf(C.gapil_rtti{}).(*codegen.Struct) |
| 92 | c.T.Arena = c.T.DeclareStruct("arena") |
| 93 | c.T.ArenaPtr = c.T.Pointer(c.T.Arena) |
| 94 | c.T.VoidPtr = c.T.Pointer(c.T.Void) |
| 95 | c.T.VoidPtrPtr = c.T.Pointer(c.T.VoidPtr) |
| 96 | c.T.Buf = c.T.TypeOf(C.buffer{}) |
| 97 | c.T.BufPtr = c.T.Pointer(c.T.Buf) |
| 98 | c.T.Maps = map[*semantic.Map]*MapInfo{} |
| 99 | c.T.CmdParams = map[*semantic.Function]*codegen.Struct{} |
| 100 | c.T.DataAccess = c.T.Enum("gapil_data_access") |
| 101 | c.T.target = map[semantic.Type]codegen.Type{} |
| 102 | c.T.storage = map[memLayoutKey]*StorageTypes{} |
| 103 | c.T.captureToTarget = map[semantic.Type]*codegen.Function{} |
| 104 | c.T.targetToCapture = map[semantic.Type]*codegen.Function{} |
| 105 | c.T.mangled = map[codegen.Type]mangling.Type{} |
| 106 | c.T.rttis = map[semantic.Type]codegen.Global{} |
| 107 | |
| 108 | for _, api := range c.APIs { |
| 109 | // Forward-declare all the class types. |
| 110 | for _, t := range api.Classes { |
| 111 | cgTy := c.T.DeclareStruct("T_" + t.Name()) |
| 112 | c.T.target[t] = cgTy |
| 113 | } |
| 114 | |
| 115 | // Forward-declare all the reference types. |
| 116 | for _, t := range api.References { |
| 117 | cgTy := c.T.DeclareStruct(t.Name()) |
| 118 | c.T.target[t] = c.T.Pointer(cgTy) |
| 119 | } |
| 120 | |
| 121 | // Forward-declare all the map types. |
| 122 | for _, t := range api.Maps { |
| 123 | cgTy := c.T.DeclareStruct(t.Name()) |
| 124 | mapStrTy := cgTy |
| 125 | mapPtrTy := c.T.Pointer(mapStrTy) |
| 126 | c.T.target[t] = mapPtrTy |
| 127 | } |
| 128 | |