Am 18.05.2021 um 15:24 schrieb Martin Frb via fpc-devel:
I was looking at TypeInfo (based on 3.2.2rc)

line 632  unit TypInfo
            tkMethod:
              (MethodKind : TMethodKind;
               ParamCount : Byte;
               ParamList : array[0..1023] of Char
             {in reality ParamList is a array[1..ParamCount] of:
                  record
                    Flags : TParamFlags;
                    ParamName : ShortString;
                    TypeName : ShortString;
                  end;
              followed by
                  ResultType : ShortString     // for mkFunction, mkClassFunction only                   ResultTypeRef : PPTypeInfo;  // for mkFunction, mkClassFunction only
                  CC : TCallConv;
                  ParamTypeRefs : array[1..ParamCount] of PPTypeInfo;}
              );

To find out about alignment (for any target which needs alignment), I looked through other code:

fpc_3.2.2\source\tests\webtbs\tw12038.pp
   line 194    procedure DisplayDetails(Informations : TPropInfo; const expectedresult: ansistring);
appears to access the data (except for the ParamTypeRefs array)
The testcase does not seem to make any adjustments for alignment.

It does at line 285.


fpc_3.2.2\source\packages\rtl-objpas\src\inc\rtti.pp
   line 3341    TRttiMethodType.GetParameters
also appears to access the same typeinfo.
It makes alignments in 3 different places
   ptr := AlignTParamFlags(ptr);                // foreach   Flags : TParamFlags;   in the ParamList    ptr := AlignToPtr(PByte(ptr) + ptr^ + SizeOf(Byte));    // ResultTypeRef
   paramtypes := PPPTypeInfo(AlignTypeData(ptr));       // ParamTypeRefs

Which is correct?
Or do they access different structures?

They are for different parts of the structure, cause they have different alignment requirements (e.g. the param names and flags are aligned to the TParamFlags (which is 2 Byte) while the ResultType is aligned to a pointer. Though right now I don't know why the last one uses AlignTypeData which would align to the QWord fields instead of Pointer ones...

A few other notes:
FPC_REQUIRES_PROPER_ALIGNMENT
does not seem to be listed on https://www.freepascal.org/docs-html/prog/progap7.html

There are a few from TOption.TargetOptions (in options.pas) that are not yet documented.

TypInfo line 1461
in Procedure GetPropInfos(TypeInfo : PTypeInfo;PropList : PPropList);
TP:=aligntoptr(PPropInfo(aligntoptr((Pointer(@TD^.UnitName)+Length(TD^.UnitName)+1))));
Why call aligntoptr twice?
The TypeCast in between does not change the alignment. (all the math is done within the innermost call)

That one is already fixed in trunk.

Regards,
Sven
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to