mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-01 23:23:44 +02:00
268 lines
12 KiB
ObjectPascal
268 lines
12 KiB
ObjectPascal
unit TestDwarfSetupArray;
|
|
|
|
{$mode objfpc}{$H+}
|
|
{$IF FPC_FULLVERSION>=20701}
|
|
{$OPTIMIZATION NOREMOVEEMPTYPROCS}
|
|
{$OPTIMIZATION NOORDERFIELDS}
|
|
{$ENDIF}
|
|
{$OPTIMIZATION OFF}
|
|
{$A1}
|
|
|
|
(*
|
|
Data generated from testdata\dwarfsetupbasic.lpr
|
|
*)
|
|
|
|
interface
|
|
|
|
uses
|
|
FpDbgDwarfConst,
|
|
TestHelperClasses;
|
|
|
|
const
|
|
TTestSetupArrayProcMainAddr = $00400000;
|
|
|
|
type
|
|
|
|
{%region Types defined in the DWARF }
|
|
TDynIntArray = Array of integer;
|
|
TStatIntArray1 = Array [0..10] of integer;
|
|
TStatIntArray2 = Array [5..10] of integer;
|
|
{%endregion Types defined in the DWARF }
|
|
|
|
type
|
|
{ TTestDwarfSetupBasic }
|
|
|
|
{ TTestLoaderSetupArray }
|
|
|
|
TTestLoaderSetupArray = class(TTestDummyImageLoader)
|
|
public
|
|
constructor Create; override;
|
|
procedure PoissonTestFrame;
|
|
public
|
|
SectionDbgInfo: TTestDummySectionInfoEntries;
|
|
|
|
Unitdwarfsetuparray_lpr_0, VarVARDYNINTARRAY_1, VarVARSTATINTARRAY1_2, VarVARSTATINTARRAY2_3, Progmain_4, ProgPDWARFSETUPARRAY_init_implicit_5, ProgPDWARFSETUPARRAY_finalize_implicit_6, TypeDeclTDYNINTARRAY_7, TypePtr_8, TypeTDYNINTARRAY_9, Type_10, Type_11, TypeDeclTSTATINTARRAY1_12, TypeTSTATINTARRAY1_13, Type_14, Type_15, TypeDeclTSTATINTARRAY2_16, TypeTSTATINTARRAY2_17, Type_18, Type_19, TypeDeclLONGINT_20, TypeLONGINT_21, Type_22, TypeDeclSHORTINT_23, TypeSHORTINT_24, Type_25
|
|
: TTestDwarfInfoEntry;
|
|
|
|
// global vars
|
|
GlobalVar: record
|
|
PAD_Before: QWord; // padding will be filled with bad data
|
|
|
|
VarDynIntArray: TDynIntArray;
|
|
VarStatIntArray1: TStatIntArray1;
|
|
VarStatIntArray2: TStatIntArray2;
|
|
|
|
PAD_After: QWord;
|
|
end;
|
|
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TTestLoaderSetupArray }
|
|
|
|
constructor TTestLoaderSetupArray.Create;
|
|
begin
|
|
inherited Create;
|
|
PoissonTestFrame;
|
|
|
|
SectionDbgInfo := TestImgReader.TestSection['.debug_info'] as TTestDummySectionInfoEntries;
|
|
Unitdwarfsetuparray_lpr_0 := SectionDbgInfo.GetFirstInfoEntryObj;
|
|
|
|
// Generated with fpc 2.6.2 32 bit win
|
|
|
|
Unitdwarfsetuparray_lpr_0.Tag := DW_TAG_compile_unit;
|
|
Unitdwarfsetuparray_lpr_0.Children := 1;
|
|
Unitdwarfsetuparray_lpr_0.Add(DW_AT_name, DW_FORM_string, 'dwarfsetuparray.lpr'+#0);
|
|
Unitdwarfsetuparray_lpr_0.Add(DW_AT_producer, DW_FORM_string, 'Free Pascal 2.6.2 2013/02/16'+#0);
|
|
Unitdwarfsetuparray_lpr_0.Add(DW_AT_comp_dir, DW_FORM_string, 'B:/lazarus_latest/components/fpdebug/test/testdata/'+#0);
|
|
Unitdwarfsetuparray_lpr_0.Add(DW_AT_language, DW_FORM_data1, [$09]);
|
|
Unitdwarfsetuparray_lpr_0.Add(DW_AT_identifier_case, DW_FORM_data1, [$03]);
|
|
Unitdwarfsetuparray_lpr_0.Add(DW_AT_stmt_list, DW_FORM_data4, [$00, $00, $00, $00]);
|
|
Unitdwarfsetuparray_lpr_0.AddAddr(DW_AT_low_pc, DW_FORM_addr, $00400000);
|
|
Unitdwarfsetuparray_lpr_0.AddAddr(DW_AT_high_pc, DW_FORM_addr, $004FFFFF);
|
|
|
|
VarVARDYNINTARRAY_1 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
VarVARDYNINTARRAY_1.Tag := DW_TAG_variable;
|
|
VarVARDYNINTARRAY_1.Children := 0;
|
|
VarVARDYNINTARRAY_1.Add(DW_AT_name, DW_FORM_string, 'VARDYNINTARRAY'+#0);
|
|
VarVARDYNINTARRAY_1.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GlobalVar.VarDYNINTARRAY)])); // $03, $00, $00, $00, $00
|
|
VarVARDYNINTARRAY_1.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTDYNINTARRAY_7); // $41, $01, $00, $00
|
|
|
|
VarVARSTATINTARRAY1_2 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
VarVARSTATINTARRAY1_2.Tag := DW_TAG_variable;
|
|
VarVARSTATINTARRAY1_2.Children := 0;
|
|
VarVARSTATINTARRAY1_2.Add(DW_AT_name, DW_FORM_string, 'VARSTATINTARRAY1'+#0);
|
|
VarVARSTATINTARRAY1_2.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GlobalVar.VarSTATINTARRAY1)])); // $03, $00, $90, $40, $00
|
|
VarVARSTATINTARRAY1_2.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTSTATINTARRAY1_12); // $77, $01, $00, $00
|
|
|
|
VarVARSTATINTARRAY2_3 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
VarVARSTATINTARRAY2_3.Tag := DW_TAG_variable;
|
|
VarVARSTATINTARRAY2_3.Children := 0;
|
|
VarVARSTATINTARRAY2_3.Add(DW_AT_name, DW_FORM_string, 'VARSTATINTARRAY2'+#0);
|
|
VarVARSTATINTARRAY2_3.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GlobalVar.VarSTATINTARRAY2)])); // $03, $00, $00, $00, $00
|
|
VarVARSTATINTARRAY2_3.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTSTATINTARRAY2_16); // $AE, $01, $00, $00
|
|
|
|
Progmain_4 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
Progmain_4.Tag := DW_TAG_subprogram;
|
|
Progmain_4.Children := 0;
|
|
Progmain_4.Add(DW_AT_name, DW_FORM_string, 'main'+#0);
|
|
Progmain_4.Add(DW_AT_prototyped, DW_FORM_flag, [$01]);
|
|
Progmain_4.Add(DW_AT_calling_convention, DW_FORM_data1, [$41]);
|
|
Progmain_4.Add(DW_AT_external, DW_FORM_flag, [$01]);
|
|
Progmain_4.AddAddr(DW_AT_low_pc, DW_FORM_addr, $00400000);
|
|
Progmain_4.AddAddr(DW_AT_high_pc, DW_FORM_addr, $00400FFF);
|
|
|
|
ProgPDWARFSETUPARRAY_init_implicit_5 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
ProgPDWARFSETUPARRAY_init_implicit_5.Tag := DW_TAG_subprogram;
|
|
ProgPDWARFSETUPARRAY_init_implicit_5.Children := 0;
|
|
ProgPDWARFSETUPARRAY_init_implicit_5.Add(DW_AT_name, DW_FORM_string, 'P$DWARFSETUPARRAY_init_implicit'+#0);
|
|
ProgPDWARFSETUPARRAY_init_implicit_5.Add(DW_AT_prototyped, DW_FORM_flag, [$01]);
|
|
ProgPDWARFSETUPARRAY_init_implicit_5.Add(DW_AT_calling_convention, DW_FORM_data1, [$41]);
|
|
ProgPDWARFSETUPARRAY_init_implicit_5.Add(DW_AT_external, DW_FORM_flag, [$01]);
|
|
ProgPDWARFSETUPARRAY_init_implicit_5.AddAddr(DW_AT_low_pc, DW_FORM_addr, $00401000);
|
|
ProgPDWARFSETUPARRAY_init_implicit_5.AddAddr(DW_AT_high_pc, DW_FORM_addr, $00401FFF);
|
|
|
|
ProgPDWARFSETUPARRAY_finalize_implicit_6 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
ProgPDWARFSETUPARRAY_finalize_implicit_6.Tag := DW_TAG_subprogram;
|
|
ProgPDWARFSETUPARRAY_finalize_implicit_6.Children := 0;
|
|
ProgPDWARFSETUPARRAY_finalize_implicit_6.Add(DW_AT_name, DW_FORM_string, 'P$DWARFSETUPARRAY_finalize_implicit'+#0);
|
|
ProgPDWARFSETUPARRAY_finalize_implicit_6.Add(DW_AT_prototyped, DW_FORM_flag, [$01]);
|
|
ProgPDWARFSETUPARRAY_finalize_implicit_6.Add(DW_AT_calling_convention, DW_FORM_data1, [$41]);
|
|
ProgPDWARFSETUPARRAY_finalize_implicit_6.Add(DW_AT_external, DW_FORM_flag, [$01]);
|
|
ProgPDWARFSETUPARRAY_finalize_implicit_6.AddAddr(DW_AT_low_pc, DW_FORM_addr, $00402000);
|
|
ProgPDWARFSETUPARRAY_finalize_implicit_6.AddAddr(DW_AT_high_pc, DW_FORM_addr, $00402FFF);
|
|
|
|
TypeDeclTDYNINTARRAY_7 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeDeclTDYNINTARRAY_7.Tag := DW_TAG_typedef;
|
|
TypeDeclTDYNINTARRAY_7.Children := 0;
|
|
TypeDeclTDYNINTARRAY_7.Add(DW_AT_name, DW_FORM_string, 'TDYNINTARRAY'+#0);
|
|
TypeDeclTDYNINTARRAY_7.AddRef(DW_AT_type, DW_FORM_ref4, @TypePtr_8); // $53, $01, $00, $00
|
|
|
|
TypePtr_8 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypePtr_8.Tag := DW_TAG_pointer_type;
|
|
TypePtr_8.Children := 0;
|
|
TypePtr_8.AddRef(DW_AT_type, DW_FORM_ref4, @TypeTDYNINTARRAY_9); // $58, $01, $00, $00
|
|
|
|
TypeTDYNINTARRAY_9 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeTDYNINTARRAY_9.Tag := DW_TAG_array_type;
|
|
TypeTDYNINTARRAY_9.Children := 1;
|
|
TypeTDYNINTARRAY_9.Add(DW_AT_name, DW_FORM_string, 'TDYNINTARRAY'+#0);
|
|
TypeTDYNINTARRAY_9.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclLONGINT_20); // $E5, $01, $00, $00
|
|
|
|
Type_10 := TypeTDYNINTARRAY_9.GetNewChild;
|
|
Type_10.Tag := DW_TAG_subrange_type;
|
|
Type_10.Children := 0;
|
|
Type_10.AddSLEB(DW_AT_lower_bound, DW_FORM_sdata, 0);
|
|
Type_10.AddULEB(DW_AT_byte_stride, DW_FORM_udata, 4);
|
|
Type_10.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclLONGINT_20); // $E5, $01, $00, $00
|
|
|
|
Type_11 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
Type_11.Tag := DW_TAG_reference_type;
|
|
Type_11.Children := 0;
|
|
Type_11.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTDYNINTARRAY_7); // $41, $01, $00, $00
|
|
|
|
TypeDeclTSTATINTARRAY1_12 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeDeclTSTATINTARRAY1_12.Tag := DW_TAG_typedef;
|
|
TypeDeclTSTATINTARRAY1_12.Children := 0;
|
|
TypeDeclTSTATINTARRAY1_12.Add(DW_AT_name, DW_FORM_string, 'TSTATINTARRAY1'+#0);
|
|
TypeDeclTSTATINTARRAY1_12.AddRef(DW_AT_type, DW_FORM_ref4, @TypeTSTATINTARRAY1_13); // $8B, $01, $00, $00
|
|
|
|
TypeTSTATINTARRAY1_13 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeTSTATINTARRAY1_13.Tag := DW_TAG_array_type;
|
|
TypeTSTATINTARRAY1_13.Children := 1;
|
|
TypeTSTATINTARRAY1_13.Add(DW_AT_name, DW_FORM_string, 'TSTATINTARRAY1'+#0);
|
|
TypeTSTATINTARRAY1_13.AddULEB(DW_AT_byte_size, DW_FORM_udata, 44);
|
|
TypeTSTATINTARRAY1_13.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclLONGINT_20); // $E5, $01, $00, $00
|
|
|
|
Type_14 := TypeTSTATINTARRAY1_13.GetNewChild;
|
|
Type_14.Tag := DW_TAG_subrange_type;
|
|
Type_14.Children := 0;
|
|
Type_14.AddSLEB(DW_AT_lower_bound, DW_FORM_sdata, 0);
|
|
Type_14.AddSLEB(DW_AT_upper_bound, DW_FORM_sdata, 10);
|
|
Type_14.AddULEB(DW_AT_byte_stride, DW_FORM_udata, 4);
|
|
Type_14.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclSHORTINT_23); // $02, $02, $00, $00
|
|
|
|
Type_15 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
Type_15.Tag := DW_TAG_reference_type;
|
|
Type_15.Children := 0;
|
|
Type_15.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTSTATINTARRAY1_12); // $77, $01, $00, $00
|
|
|
|
TypeDeclTSTATINTARRAY2_16 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeDeclTSTATINTARRAY2_16.Tag := DW_TAG_typedef;
|
|
TypeDeclTSTATINTARRAY2_16.Children := 0;
|
|
TypeDeclTSTATINTARRAY2_16.Add(DW_AT_name, DW_FORM_string, 'TSTATINTARRAY2'+#0);
|
|
TypeDeclTSTATINTARRAY2_16.AddRef(DW_AT_type, DW_FORM_ref4, @TypeTSTATINTARRAY2_17); // $C2, $01, $00, $00
|
|
|
|
TypeTSTATINTARRAY2_17 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeTSTATINTARRAY2_17.Tag := DW_TAG_array_type;
|
|
TypeTSTATINTARRAY2_17.Children := 1;
|
|
TypeTSTATINTARRAY2_17.Add(DW_AT_name, DW_FORM_string, 'TSTATINTARRAY2'+#0);
|
|
TypeTSTATINTARRAY2_17.AddULEB(DW_AT_byte_size, DW_FORM_udata, 24);
|
|
TypeTSTATINTARRAY2_17.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclLONGINT_20); // $E5, $01, $00, $00
|
|
|
|
Type_18 := TypeTSTATINTARRAY2_17.GetNewChild;
|
|
Type_18.Tag := DW_TAG_subrange_type;
|
|
Type_18.Children := 0;
|
|
Type_18.AddSLEB(DW_AT_lower_bound, DW_FORM_sdata, 5);
|
|
Type_18.AddSLEB(DW_AT_upper_bound, DW_FORM_sdata, 10);
|
|
Type_18.AddULEB(DW_AT_byte_stride, DW_FORM_udata, 4);
|
|
Type_18.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclSHORTINT_23); // $02, $02, $00, $00
|
|
|
|
Type_19 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
Type_19.Tag := DW_TAG_reference_type;
|
|
Type_19.Children := 0;
|
|
Type_19.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTSTATINTARRAY2_16); // $AE, $01, $00, $00
|
|
|
|
TypeDeclLONGINT_20 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeDeclLONGINT_20.Tag := DW_TAG_typedef;
|
|
TypeDeclLONGINT_20.Children := 0;
|
|
TypeDeclLONGINT_20.Add(DW_AT_name, DW_FORM_string, 'LONGINT'+#0);
|
|
TypeDeclLONGINT_20.AddRef(DW_AT_type, DW_FORM_ref4, @TypeLONGINT_21); // $F2, $01, $00, $00
|
|
|
|
TypeLONGINT_21 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeLONGINT_21.Tag := DW_TAG_base_type;
|
|
TypeLONGINT_21.Children := 0;
|
|
TypeLONGINT_21.Add(DW_AT_name, DW_FORM_string, 'LONGINT'+#0);
|
|
TypeLONGINT_21.Add(DW_AT_encoding, DW_FORM_data1, [$05]);
|
|
TypeLONGINT_21.Add(DW_AT_byte_size, DW_FORM_data1, [$04]);
|
|
|
|
Type_22 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
Type_22.Tag := DW_TAG_reference_type;
|
|
Type_22.Children := 0;
|
|
Type_22.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclLONGINT_20); // $E5, $01, $00, $00
|
|
|
|
TypeDeclSHORTINT_23 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeDeclSHORTINT_23.Tag := DW_TAG_typedef;
|
|
TypeDeclSHORTINT_23.Children := 0;
|
|
TypeDeclSHORTINT_23.Add(DW_AT_name, DW_FORM_string, 'SHORTINT'+#0);
|
|
TypeDeclSHORTINT_23.AddRef(DW_AT_type, DW_FORM_ref4, @TypeSHORTINT_24); // $10, $02, $00, $00
|
|
|
|
TypeSHORTINT_24 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
TypeSHORTINT_24.Tag := DW_TAG_base_type;
|
|
TypeSHORTINT_24.Children := 0;
|
|
TypeSHORTINT_24.Add(DW_AT_name, DW_FORM_string, 'SHORTINT'+#0);
|
|
TypeSHORTINT_24.Add(DW_AT_encoding, DW_FORM_data1, [$05]);
|
|
TypeSHORTINT_24.Add(DW_AT_byte_size, DW_FORM_data1, [$01]);
|
|
|
|
Type_25 := Unitdwarfsetuparray_lpr_0.GetNewChild;
|
|
Type_25.Tag := DW_TAG_reference_type;
|
|
Type_25.Children := 0;
|
|
Type_25.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclSHORTINT_23); // $02, $02, $00, $00
|
|
|
|
//
|
|
SectionDbgInfo.CreateSectionData;
|
|
SectionDbgInfo.AbbrevSection.CreateSectionData;
|
|
end;
|
|
|
|
procedure TTestLoaderSetupArray.PoissonTestFrame;
|
|
begin
|
|
// do not poison managed types
|
|
// Ensure any out of bound reads get bad data
|
|
// FillByte(GlobalVar, SizeOf(GlobalVar), $D5);
|
|
|
|
end;
|
|
|
|
end.
|
|
|