gitlab.com/cznic/ccir@v1.0.0/model.go (about) 1 // Copyright 2017 The CCIR Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package ccir // import "modernc.org/ccir" 6 7 import ( 8 "fmt" 9 "runtime" 10 11 "modernc.org/cc" 12 ) 13 14 func longSize() cc.ModelItem { 15 s := 8 16 if runtime.GOOS == "windows" { 17 s = 4 18 } 19 return cc.ModelItem{Size: s, Align: s, StructAlign: s} 20 } 21 22 // NewModel returns a *cc.Model for the current architecture and platform. 23 func NewModel() (*cc.Model, error) { 24 switch arch := runtime.GOARCH; arch { 25 case "386", "arm", "armbe", "mips", "mipsle", "ppc", "ppc64le", "s390", "s390x", "sparc": 26 return &cc.Model{ 27 Items: map[cc.Kind]cc.ModelItem{ 28 cc.Void: {Align: 1, Size: 0, StructAlign: 1}, 29 cc.Ptr: {Align: 4, Size: 4, StructAlign: 4}, 30 cc.UintPtr: {Align: 4, Size: 4, StructAlign: 4}, 31 cc.Char: {Align: 1, Size: 1, StructAlign: 1}, 32 cc.SChar: {Align: 1, Size: 1, StructAlign: 1}, 33 cc.UChar: {Align: 1, Size: 1, StructAlign: 1}, 34 cc.Short: {Align: 2, Size: 2, StructAlign: 2}, 35 cc.UShort: {Align: 2, Size: 2, StructAlign: 2}, 36 cc.Int: {Align: 4, Size: 4, StructAlign: 4}, 37 cc.UInt: {Align: 4, Size: 4, StructAlign: 4}, 38 cc.Long: {Align: 4, Size: 4, StructAlign: 4}, 39 cc.ULong: {Align: 4, Size: 4, StructAlign: 4}, 40 cc.LongLong: {Align: 8, Size: 8, StructAlign: 4}, 41 cc.ULongLong: {Align: 8, Size: 8, StructAlign: 4}, 42 cc.Float: {Align: 4, Size: 4, StructAlign: 4}, 43 cc.Double: {Align: 8, Size: 8, StructAlign: 4}, 44 cc.LongDouble: {Align: 8, Size: 8, StructAlign: 4}, 45 cc.Bool: {Align: 1, Size: 1, StructAlign: 1}, 46 cc.FloatComplex: {Align: 8, Size: 8, StructAlign: 4}, 47 cc.DoubleComplex: {Align: 8, Size: 16, StructAlign: 4}, 48 cc.LongDoubleComplex: {Align: 8, Size: 16, StructAlign: 4}, 49 }, 50 }, nil 51 case "amd64p32", "mips64p32", "mips64p32le": 52 return &cc.Model{ 53 Items: map[cc.Kind]cc.ModelItem{ 54 cc.Void: {Align: 1, Size: 0, StructAlign: 1}, 55 cc.Ptr: {Align: 4, Size: 4, StructAlign: 4}, 56 cc.UintPtr: {Align: 4, Size: 4, StructAlign: 4}, 57 cc.Char: {Align: 1, Size: 1, StructAlign: 1}, 58 cc.SChar: {Align: 1, Size: 1, StructAlign: 1}, 59 cc.UChar: {Align: 1, Size: 1, StructAlign: 1}, 60 cc.Short: {Align: 2, Size: 2, StructAlign: 2}, 61 cc.UShort: {Align: 2, Size: 2, StructAlign: 2}, 62 cc.Int: {Align: 4, Size: 4, StructAlign: 4}, 63 cc.UInt: {Align: 4, Size: 4, StructAlign: 4}, 64 cc.Long: {Align: 8, Size: 8, StructAlign: 8}, 65 cc.ULong: {Align: 8, Size: 8, StructAlign: 8}, 66 cc.LongLong: {Align: 8, Size: 8, StructAlign: 8}, 67 cc.ULongLong: {Align: 8, Size: 8, StructAlign: 8}, 68 cc.Float: {Align: 4, Size: 4, StructAlign: 4}, 69 cc.Double: {Align: 8, Size: 8, StructAlign: 8}, 70 cc.LongDouble: {Align: 8, Size: 8, StructAlign: 8}, 71 cc.Bool: {Align: 1, Size: 1, StructAlign: 1}, 72 cc.FloatComplex: {Align: 8, Size: 8, StructAlign: 4}, 73 cc.DoubleComplex: {Align: 8, Size: 16, StructAlign: 8}, 74 cc.LongDoubleComplex: {Align: 8, Size: 16, StructAlign: 8}, 75 }, 76 }, nil 77 case "amd64", "arm64", "arm64be", "mips64", "mips64le", "ppc64", "sparc64": 78 return &cc.Model{ 79 Items: map[cc.Kind]cc.ModelItem{ 80 cc.Void: {Align: 1, Size: 0, StructAlign: 1}, 81 cc.Ptr: {Align: 8, Size: 8, StructAlign: 8}, 82 cc.UintPtr: {Align: 8, Size: 8, StructAlign: 8}, 83 cc.Char: {Align: 1, Size: 1, StructAlign: 1}, 84 cc.SChar: {Align: 1, Size: 1, StructAlign: 1}, 85 cc.UChar: {Align: 1, Size: 1, StructAlign: 1}, 86 cc.Short: {Align: 2, Size: 2, StructAlign: 2}, 87 cc.UShort: {Align: 2, Size: 2, StructAlign: 2}, 88 cc.Int: {Align: 4, Size: 4, StructAlign: 4}, 89 cc.UInt: {Align: 4, Size: 4, StructAlign: 4}, 90 cc.Long: longSize(), 91 cc.ULong: longSize(), 92 cc.LongLong: {Align: 8, Size: 8, StructAlign: 8}, 93 cc.ULongLong: {Align: 8, Size: 8, StructAlign: 8}, 94 cc.Float: {Align: 4, Size: 4, StructAlign: 4}, 95 cc.Double: {Align: 8, Size: 8, StructAlign: 8}, 96 cc.LongDouble: {Align: 8, Size: 8, StructAlign: 8}, 97 cc.Bool: {Align: 1, Size: 1, StructAlign: 1}, 98 cc.FloatComplex: {Align: 8, Size: 8, StructAlign: 4}, 99 cc.DoubleComplex: {Align: 8, Size: 16, StructAlign: 8}, 100 cc.LongDoubleComplex: {Align: 8, Size: 16, StructAlign: 8}, 101 }, 102 }, nil 103 default: 104 return nil, fmt.Errorf("unknown/unsupported architecture %s", arch) 105 } 106 }