[Done] 6.0 alpha 5 x86 - #PB_Structure_AlignC wrong align?

Just starting out? Need help? Post your questions and find answers here.
tester
User
User
Posts: 30
Joined: Sun Dec 28, 2014 1:12 pm

[Done] 6.0 alpha 5 x86 - #PB_Structure_AlignC wrong align?

Post by tester »

Code: Select all

Structure proto Align #PB_Structure_AlignC
  a.q
  b.l
EndStructure

Debug SizeOf(proto)

; PB 6.0 alpha 5 x86 ASM Backend & C Backend:
; [Debug] 12
;
; PB 5.73 x86:
; [Debug] 16
Last edited by tester on Wed Dec 08, 2021 11:05 am, edited 2 times in total.
juergenkulow
Enthusiast
Enthusiast
Posts: 544
Joined: Wed Sep 25, 2019 10:18 am

Re: 6.0 alpha 5 x86 - #PB_Structure_AlignC wrong align?

Post by juergenkulow »

Code: Select all

Structure proto Align #PB_Structure_AlignC
  a.q
  b.l
EndStructure

s.s= "Compiler Version: "+Str(#PB_Compiler_Version)+#CRLF$
If #PB_Compiler_Processor=#PB_Processor_x86
  s+"x86"+#CRLF$
ElseIf #PB_Compiler_Processor=#PB_Processor_x64
  s+"x64"+#CRLF$ 
EndIf
CompilerIf Defined(PB_Compiler_Backend,#PB_Constant) 
  If #PB_Compiler_Backend=#PB_Backend_Asm
    s+"ASM Backend"+#CRLF$
  ElseIf #PB_Compiler_Backend=#PB_Backend_C
    s+"C Backend"+#CRLF$ 
  EndIf 
CompilerElse
  s+"ASM Backend"+#CRLF$
CompilerEndIf 
s+"SizeOf(proto): "+Str(SizeOf(proto))
SetClipboardText(s)

; PB_Str(12LL,SYS_PopStringBasePosition());
; Compiler Version: 600
; x86
; C Backend
; SizeOf(proto): 12

; PB_Str(16LL,SYS_PopStringBasePosition());
; Compiler Version: 600
; x64
; C Backend
; SizeOf(proto): 16

; Compiler Version: 600
; x86
; ASM Backend
; SizeOf(proto): 12

; Compiler Version: 600
; x64
; ASM Backend
; SizeOf(proto): 16

; Compiler Version: 573
; x64
; ASM Backend
; SizeOf(proto): 16

; Compiler Version: 573
; x86
; ASM Backend
; SizeOf(proto): 16
User_Russian
Addict
Addict
Posts: 1443
Joined: Wed Nov 12, 2008 5:01 pm
Location: Russia

Re: 6.0 alpha 5 x86 - #PB_Structure_AlignC wrong align?

Post by User_Russian »

Looks like a bug PB 6.0.
GCC x86 return 16.
User avatar
STARGÅTE
Addict
Addict
Posts: 2067
Joined: Thu Jan 10, 2008 1:30 pm
Location: Germany, Glienicke
Contact:

Re: 6.0 alpha 5 x86 - #PB_Structure_AlignC wrong align?

Post by STARGÅTE »

I ask me, why a structure have to be aligned to 16 byte in a x86 environment?
The word size is 4 byte, so 12 byte is fine.

What is the rule behind #PB_Structure_AlignC?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Lizard - Script language for symbolic calculations and moreTypeface - Sprite-based font include/module
juergenkulow
Enthusiast
Enthusiast
Posts: 544
Joined: Wed Sep 25, 2019 10:18 am

Re: 6.0 alpha 5 x86 - #PB_Structure_AlignC wrong align?

Post by juergenkulow »

Code: Select all

#include <stdio.h>
struct longlong { long l1; long l2; }; 
struct mystruct { struct longlong a; long b;};

int main() {
    struct mystruct my; 
	printf("sizeof(my):%i",sizeof(my)); 
}
//Visual C++ 6.0:Windows 2000 SP 4: sizeof(my):12
#PB_Structure_AlignC = -1 exist since 2013 Version 5.10. 'Align' keyword support for structure, with a special #PB_Structure_AlignC value to mimic C structures padding. /documentation/reference/structures.html The special value #PB_Structure_AlignC can be used to align the structure as it would be done in language C, useful when importing C structures to use with API functions.
Version 5.73 LTS [Done] OffsetOf in StructureUnion with AlignC
Re: Disable TreeGadget Item
If you want to use #PB_Structure_AlignC, testing for x64, x86 code on x64 and x86 with versions 6.00Alpha, 5.73LTS and younger than 5.10 would be useful.
User avatar
STARGÅTE
Addict
Addict
Posts: 2067
Joined: Thu Jan 10, 2008 1:30 pm
Location: Germany, Glienicke
Contact:

Re: 6.0 alpha 5 x86 - #PB_Structure_AlignC wrong align?

Post by STARGÅTE »

I know what is written in the Pure basic help, thanks.
But what is the rule behind this alignment in language C?
I thought the alignment was based on the processor word size?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Lizard - Script language for symbolic calculations and moreTypeface - Sprite-based font include/module
juergenkulow
Enthusiast
Enthusiast
Posts: 544
Joined: Wed Sep 25, 2019 10:18 am

Re: 6.0 alpha 5 x86 - #PB_Structure_AlignC wrong align?

Post by juergenkulow »

STARGÅTE wrote: Sat Nov 13, 2021 9:33 am What is the rule behind #PB_Structure_AlignC?

Code: Select all

; What does #PB_Structure_AlignC actually do? 
Structure Struct    Align #PB_Structure_AlignC : a.a     : q.q    : a2.a : l.l : a3.a : w.w : EndStructure
Structure Struct10  Align #PB_Structure_AlignC : a.a[10] : q.q    : a2.a : l.l : a3.a : w.w : EndStructure
Structure wlq : w.w : l.l  : q.q  : EndStructure
Structure Structwlq Align #PB_Structure_AlignC : a.a     : q.wlq  : a2.a : l.l : a3.a : w.w : EndStructure
Structure Without                              : a.a     : q.q    : a2.a : l.l : a3.a : w.w : EndStructure

s.s= "; Compiler Version: "+Str(#PB_Compiler_Version)
If #PB_Compiler_Processor=#PB_Processor_x86
  s+" x86 "
ElseIf #PB_Compiler_Processor=#PB_Processor_x64
  s+" x64 " 
EndIf
CompilerIf Defined(PB_Compiler_Backend,#PB_Constant) 
  If #PB_Compiler_Backend=#PB_Backend_Asm
    s+"ASM Backend "
  ElseIf #PB_Compiler_Backend=#PB_Backend_C
    s+"C Backend " 
  EndIf 
CompilerElse
  s+"ASM Backend "
CompilerEndIf 
s+#CRLF$+"; OffsetOf a, OffsetOf q,  OffsetOf a2, OffsetOf l, OffsetOf a3, OffsetOf w "+#CRLF$
s+"; Struct   "+Str(OffsetOf(Struct\a))+","+Str(OffsetOf(Struct\q))+","+Str(OffsetOf(Struct\a2))+","+
  Str(OffsetOf(Struct\l))+","+Str(OffsetOf(Struct\a3))+","+Str(OffsetOf(Struct\w))+#CRLF$
s+"; Struct10 "+Str(OffsetOf(Struct10\a))+","+Str(OffsetOf(Struct10\q))+","+Str(OffsetOf(Struct10\a2))+","+
  Str(OffsetOf(Struct10\l))+","+Str(OffsetOf(Struct10\a3))+","+Str(OffsetOf(Struct10\w))+#CRLF$
s+"; Structwlq "+Str(OffsetOf(Structwlq\a))+","+Str(OffsetOf(Structwlq\q))+","+Str(OffsetOf(Structwlq\a2))+","+
  Str(OffsetOf(Structwlq\l))+","+Str(OffsetOf(Structwlq\a3))+","+Str(OffsetOf(Structwlq\w))+#CRLF$
s+"; Without "+Str(OffsetOf(Without\a))+","+Str(OffsetOf(Without\q))+","+Str(OffsetOf(Without\a2))+","+
  Str(OffsetOf(Without\l))+","+Str(OffsetOf(Without\a3))+","+Str(OffsetOf(Without\w))+#CRLF$

SetClipboardText(s)

; Compiler Version: 600 x64 C Backend 
; OffsetOf a, OffsetOf q,  OffsetOf a2, OffsetOf l, OffsetOf a3, OffsetOf w 
; Struct   0,8,16,20,24,26
; Struct10 0,16,24,28,32,34
; Structwlq 0,8,22,24,28,30
; Without 0,1,9,10,14,15

; Compiler Version: 573 x86 ASM Backend 
; OffsetOf a, OffsetOf q,  OffsetOf a2, OffsetOf l, OffsetOf a3, OffsetOf w 
; Struct   0,8,16,20,24,26
; Struct10 0,16,24,28,32,34
; Structwlq 0,8,22,24,28,30
; Without 0,1,9,10,14,15

; #PB_Structure_AlignC fills the structure between two values with 0 to 7 bytes. 
; Select SizeOF(largest second basic value)
; case 1: ; no padding
; case 2: ; Fill up to full 2 bytes.
; case 4: ; Fill up to full 4 bytes.
; case 8: ; Fill up to full 8 bytes.

Code: Select all

#include <stdio.h>
#include <stddef.h>
struct alignstruct { char a; long long q; char a2; long l; char a3; short w; };

int main() {
  printf("%i, %i, %i, %i, %i, %i",  offsetof(struct alignstruct,a) , offsetof(struct alignstruct,q), offsetof(struct alignstruct,a2),
                                    offsetof(struct alignstruct,l), offsetof(struct alignstruct,a3), offsetof(struct alignstruct,w));
}
//Pelles C 10.10.6
//0, 8, 16, 20, 24, 26
tester
User
User
Posts: 30
Joined: Sun Dec 28, 2014 1:12 pm

Re: [Done] 6.0 alpha 5 x86 - #PB_Structure_AlignC wrong align?

Post by tester »

Post Reply