Page 1 of 1

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

Posted: Wed Nov 10, 2021 8:02 pm
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

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

Posted: Thu Nov 11, 2021 10:29 am
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

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

Posted: Thu Nov 11, 2021 10:34 pm
by User_Russian
Looks like a bug PB 6.0.
GCC x86 return 16.

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

Posted: Sat Nov 13, 2021 9:33 am
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?

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

Posted: Sun Nov 14, 2021 7:56 am
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.

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

Posted: Sun Nov 14, 2021 11:28 am
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?

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

Posted: Tue Nov 16, 2021 5:28 am
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

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

Posted: Wed Dec 08, 2021 11:07 am
by tester