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  }