@@ -96,6 +96,10 @@ func (p *goProgram) Alignof(T types.Type) int64 {
9696 if layout , ok := p .wasmNativeLayout (T ); ok {
9797 return layout .align
9898 }
99+ return p .goAlignof (T )
100+ }
101+
102+ func (p * goProgram ) goAlignof (T types.Type ) int64 {
99103 if layout , ok := p .hostLayout (T ); ok {
100104 return layout .align
101105 }
@@ -109,22 +113,26 @@ func (p *goProgram) Alignof(T types.Type) int64 {
109113// Offsetsof must implement the offset guarantees required by the spec.
110114// A negative entry in the result indicates that the struct is too large.
111115func (p * goProgram ) Offsetsof (fields []* types.Var ) (ret []int64 ) {
112- prog := Program (unsafe .Pointer (p ))
116+ prog := Program (p )
117+ native := prog .nativeFields (fields )
113118 if prog .usesWideGoStorage () {
114- native := prog .nativeFields (fields )
115- changed := native
116- for _ , f := range fields {
117- if changed {
118- break
119- }
120- _ , changed = p .wasmNativeLayout (f .Type ())
121- }
122- if changed {
123- _ , offsets := p .wasmNativeFieldsLayout (len (fields ), func (i int ) * types.Var { return fields [i ] }, native )
119+ if native {
120+ _ , offsets := p .wasmNativeFieldsLayout (len (fields ), func (i int ) * types.Var { return fields [i ] })
124121 return offsets
125122 }
123+ for i , f := range fields {
124+ if known , ok := p .wasmNativeLayout (f .Type ()); ok {
125+ _ , offsets := aggregateSourceLayout (len (fields ), func (j int ) sourceLayout {
126+ if j == i {
127+ return known
128+ }
129+ return p .wasmGoFieldLayout (fields [j ].Type ())
130+ }, true )
131+ return offsets
132+ }
133+ }
126134 }
127- if ! prog . nativeFields ( fields ) {
135+ if ! native {
128136 for _ , f := range fields {
129137 if isHostLayoutMarker (f .Type ()) || containsHostLayout (f .Type ()) {
130138 _ , offsets := p .hostFieldsLayout (fields )
@@ -136,7 +144,7 @@ func (p *goProgram) Offsetsof(fields []*types.Var) (ret []int64) {
136144 if abi .IsClosureFields (fields ) {
137145 return []int64 {0 , ptrSize }
138146 }
139- if _ , offsets , ok := p .vectorStructLayout (fields , prog . nativeFields ( fields ) ); ok {
147+ if _ , offsets , ok := p .vectorStructLayout (fields , native ); ok {
140148 return offsets
141149 }
142150 extra := int64 (0 )
@@ -155,6 +163,10 @@ func (p *goProgram) Sizeof(T types.Type) int64 {
155163 if layout , ok := p .wasmNativeLayout (T ); ok {
156164 return layout .size
157165 }
166+ return p .goSizeof (T )
167+ }
168+
169+ func (p * goProgram ) goSizeof (T types.Type ) int64 {
158170 if layout , ok := p .hostLayout (T ); ok {
159171 return layout .size
160172 }
@@ -756,6 +768,9 @@ func (p Program) toNamed(raw *types.Named) Type {
756768 return p .toLLVMNamedStruct (name , raw , t , kind )
757769 default :
758770 typ := p .rawType (t )
771+ if _ , array := t .(* types.Array ); array && p .hasLegacyNativeTypeLayout (raw ) {
772+ typ = p .withNativeStorage (typ )
773+ }
759774 return & aType {typ .ll , rawType {raw }, typ .kind }
760775 }
761776}
0 commit comments