FPDebug: more Value handling /start pointers

git-svn-id: trunk@43885 -
This commit is contained in:
martin 2014-02-05 02:10:12 +00:00
parent 3981ff33fd
commit 3ab0ac8feb
6 changed files with 211 additions and 30 deletions

View File

@ -607,6 +607,7 @@ type
function GetMemberByName(AIndex: String): TDbgSymbolValue; override; function GetMemberByName(AIndex: String): TDbgSymbolValue; override;
function GetMember(AIndex: Integer): TDbgSymbolValue; override; function GetMember(AIndex: Integer): TDbgSymbolValue; override;
function GetDbgSymbol: TDbgSymbol; override; function GetDbgSymbol: TDbgSymbol; override;
function GetTypeInfo: TDbgSymbol; override;
property MemReader: TFpDbgMemReaderBase read FMemReader; property MemReader: TFpDbgMemReaderBase read FMemReader;
public public
@ -680,6 +681,7 @@ type
TDbgDwarfPointerSymbolValue = class(TDbgDwarfNumericSymbolValue) TDbgDwarfPointerSymbolValue = class(TDbgDwarfNumericSymbolValue)
protected protected
function GetFieldFlags: TDbgSymbolValueFieldFlags; override; function GetFieldFlags: TDbgSymbolValueFieldFlags; override;
function GetDataAddress: TDbgPtr; override;
end; end;
@ -1681,7 +1683,12 @@ end;
function TDbgDwarfPointerSymbolValue.GetFieldFlags: TDbgSymbolValueFieldFlags; function TDbgDwarfPointerSymbolValue.GetFieldFlags: TDbgSymbolValueFieldFlags;
begin begin
Result := inherited GetFieldFlags; Result := inherited GetFieldFlags;
Result := Result + [svfSizeOfPointer] - [svfSize]; // data address Result := Result + [svfOrdinal, svfSizeOfPointer, svfDataAddress] - [svfSize]; // data address
end;
function TDbgDwarfPointerSymbolValue.GetDataAddress: TDbgPtr;
begin
Result := GetAsCardinal;
end; end;
{ TDbgDwarfIntegerSymbolValue } { TDbgDwarfIntegerSymbolValue }
@ -1819,7 +1826,7 @@ begin
tmp := FTypeCastInfo.MemberByName[AIndex]; tmp := FTypeCastInfo.MemberByName[AIndex];
if (tmp <> nil) then begin if (tmp <> nil) then begin
assert(tmp is TDbgDwarfIdentifierMember); assert(tmp is TDbgDwarfIdentifierMember, 'TDbgDwarfStructTypeCastSymbolValue.GetMemberByName'+DbgSName(tmp));
if FMembers = nil then if FMembers = nil then
FMembers := TFpDbgCircularRefCntObjList.Create; FMembers := TFpDbgCircularRefCntObjList.Create;
FMembers.Add(tmp); FMembers.Add(tmp);
@ -1915,10 +1922,12 @@ begin
(FTypeCastSource.Size = FSize) (FTypeCastSource.Size = FSize)
then then
exit; exit;
//if (FTypeCastSource.FieldFlags * [svfAddress, svfSizeOfPointer] = [svfAddress, svfSizeOfPointer]) and if (FTypeCastSource.FieldFlags * [svfAddress, svfSizeOfPointer] = [svfAddress, svfSizeOfPointer]) and
// (FSize = AddressSize xxxxxxx) not ( (FTypeCastInfo.Kind = skPointer) //or
//then //(FSize = AddressSize xxxxxxx)
// exit; )
then
exit;
Result := False; Result := False;
end; end;
@ -2043,6 +2052,9 @@ function TDbgDwarfSymbolValue.GetKind: TDbgSymbolKind;
begin begin
if FOwner <> nil then if FOwner <> nil then
Result := FOwner.Kind Result := FOwner.Kind
else
if HasTypeCastInfo then
Result := FTypeCastInfo.Kind
else else
Result := inherited GetKind; Result := inherited GetKind;
end; end;
@ -2095,6 +2107,14 @@ begin
Result := FOwner; Result := FOwner;
end; end;
function TDbgDwarfSymbolValue.GetTypeInfo: TDbgSymbol;
begin
if HasTypeCastInfo then
Result := FTypeCastInfo
else
Result := inherited GetTypeInfo;
end;
constructor TDbgDwarfSymbolValue.Create(AMemReader: TFpDbgMemReaderBase); constructor TDbgDwarfSymbolValue.Create(AMemReader: TFpDbgMemReaderBase);
begin begin
FMemReader := AMemReader; FMemReader := AMemReader;
@ -4553,8 +4573,7 @@ begin
if IsInternalPointer then if IsInternalPointer then
Result := NestedTypeInfo.GetTypedValueObject(ATypeCast) Result := NestedTypeInfo.GetTypedValueObject(ATypeCast)
else else
// TODO: Result := TDbgDwarfPointerSymbolValue.Create(FCU.FOwner.FMemReader, FCU.FAddressSize);
Result := TDbgDwarfPointerSymbolValue.Create(FCU.FOwner.FMemReader, FCU.FAddressSize);
end; end;
{ TDbgDwarfTypeIdentifierDeclaration } { TDbgDwarfTypeIdentifierDeclaration }

View File

@ -124,6 +124,7 @@ type
end; end;
TDbgSymbolValueFieldFlag = ( TDbgSymbolValueFieldFlag = (
// svfAddress, svfDataAddress this symbol does have an address, but it may still be nil
svfAddress, svfSize, svfSizeOfPointer, svfAddress, svfSize, svfSizeOfPointer,
svfDataAddress, svfDataSize, svfDataSizeOfPointer, svfDataAddress, svfDataSize, svfDataSizeOfPointer,
svfInteger, svfCardinal, svfInteger, svfCardinal,

View File

@ -421,6 +421,20 @@ type
constructor Create(AValue: QWord; ASigned: Boolean = False); constructor Create(AValue: QWord; ASigned: Boolean = False);
end; end;
{ TPasParserDerefPointerSymbolValue }
TPasParserDerefPointerSymbolValue = class(TDbgSymbolValue)
private
FValue: TDbgSymbolValue;
protected
function GetFieldFlags: TDbgSymbolValueFieldFlags; override;
function GetAddress: TDbgPtr; override;
function GetSize: Integer; override;
public
constructor Create(AValue: TDbgSymbolValue);
destructor Destroy; override;
end;
{ TPasParserAddressOfSymbolValue } { TPasParserAddressOfSymbolValue }
TPasParserAddressOfSymbolValue = class(TDbgSymbolValue) TPasParserAddressOfSymbolValue = class(TDbgSymbolValue)
@ -440,6 +454,53 @@ type
property PointedToValue: TDbgSymbolValue read GetPointedToValue; property PointedToValue: TDbgSymbolValue read GetPointedToValue;
end; end;
{ TPasParserDerefPointerSymbolValue }
function TPasParserDerefPointerSymbolValue.GetFieldFlags: TDbgSymbolValueFieldFlags;
var
t: TDbgSymbol;
begin
// MUST *NOT* have ordinal
Result := [svfAddress];
t := FValue.TypeInfo;
if t <> nil then t := t.TypeInfo;
if t <> nil then
if t.Kind = skPointer then
Result := Result + [svfSizeOfPointer]
else
Result := Result + [svfSize];
end;
function TPasParserDerefPointerSymbolValue.GetAddress: TDbgPtr;
begin
Result := FValue.DataAddress;
end;
function TPasParserDerefPointerSymbolValue.GetSize: Integer;
var
t: TDbgSymbol;
begin
t := FValue.TypeInfo;
if t <> nil then t := t.TypeInfo;
if t <> nil then
Result := t.Size
else
Result := inherited GetSize;
end;
constructor TPasParserDerefPointerSymbolValue.Create(AValue: TDbgSymbolValue);
begin
inherited Create;
FValue := AValue;
FValue.AddReference{$IFDEF WITH_REFCOUNT_DEBUG}(@FValue, 'TPasParserDerefPointerSymbolValue'){$ENDIF};
end;
destructor TPasParserDerefPointerSymbolValue.Destroy;
begin
inherited Destroy;
FValue.ReleaseReference{$IFDEF WITH_REFCOUNT_DEBUG}(@FValue, 'TPasParserDerefPointerSymbolValue'){$ENDIF};
end;
{ TPasParserAddressOfSymbolValue } { TPasParserAddressOfSymbolValue }
function TPasParserAddressOfSymbolValue.GetPointedToValue: TDbgSymbolValue; function TPasParserAddressOfSymbolValue.GetPointedToValue: TDbgSymbolValue;
@ -1621,7 +1682,7 @@ end;
function TFpPascalExpressionPartOperatorDeRef.DoGetResultValue: TDbgSymbolValue; function TFpPascalExpressionPartOperatorDeRef.DoGetResultValue: TDbgSymbolValue;
var var
tmp: TDbgSymbolValue; tmp, tmp2: TDbgSymbolValue;
begin begin
Result := nil; Result := nil;
if Count <> 1 then exit; if Count <> 1 then exit;
@ -1636,8 +1697,15 @@ begin
end end
else else
if tmp.Kind = skPointer then begin if tmp.Kind = skPointer then begin
// TODO if (svfDataAddress in tmp.FieldFlags) and (tmp.DataAddress <> 0) and
//Result := Result.TypeInfo; (tmp.TypeInfo <> nil) and (tmp.TypeInfo.TypeInfo <> nil)
then begin
//TODO: maybe introduce a method TypeCastFromAddress, so we can skip the twp2 object
tmp2 := TPasParserDerefPointerSymbolValue.Create(tmp);
Result := tmp.TypeInfo.TypeInfo.TypeCastValue(tmp2);
{$IFDEF WITH_REFCOUNT_DEBUG} if Result <> nil then Result.DbgRenameReference(nil, 'DoGetResultValue'){$ENDIF};
tmp2.ReleaseReference;
end;
end end
//if tmp.Kind = skArray then // dynarray //if tmp.Kind = skArray then // dynarray
else else

View File

@ -203,84 +203,84 @@ Unitdwarfsetup1_lpr_0.AddAddr(DW_AT_high_pc, DW_FORM_addr, $00501510);
VarGLOBTESTSETUP1RECORD_1.Tag := DW_TAG_variable; VarGLOBTESTSETUP1RECORD_1.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1RECORD_1.Children := 0; VarGLOBTESTSETUP1RECORD_1.Children := 0;
VarGLOBTESTSETUP1RECORD_1.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1RECORD'+#0); VarGLOBTESTSETUP1RECORD_1.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1RECORD'+#0);
VarGLOBTESTSETUP1RECORD_1.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00409000)])); // $03, $00, $90, $40, $00 VarGLOBTESTSETUP1RECORD_1.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1RECORD)])); // $03, $00, $90, $40, $00
VarGLOBTESTSETUP1RECORD_1.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1RECORD_102); // $90, $07, $00, $00 VarGLOBTESTSETUP1RECORD_1.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1RECORD_102); // $90, $07, $00, $00
VarGLOBTESTSETUP1RECORDP_2 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1RECORDP_2 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1RECORDP_2.Tag := DW_TAG_variable; VarGLOBTESTSETUP1RECORDP_2.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1RECORDP_2.Children := 0; VarGLOBTESTSETUP1RECORDP_2.Children := 0;
VarGLOBTESTSETUP1RECORDP_2.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1RECORDP'+#0); VarGLOBTESTSETUP1RECORDP_2.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1RECORDP'+#0);
VarGLOBTESTSETUP1RECORDP_2.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00409010)])); // $03, $10, $90, $40, $00 VarGLOBTESTSETUP1RECORDP_2.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1RECORDP)])); // $03, $10, $90, $40, $00
VarGLOBTESTSETUP1RECORDP_2.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPTESTSETUP1RECORD_108); // $EB, $07, $00, $00 VarGLOBTESTSETUP1RECORDP_2.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPTESTSETUP1RECORD_108); // $EB, $07, $00, $00
VarGLOBTESTSETUP1CLASS_3 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1CLASS_3 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1CLASS_3.Tag := DW_TAG_variable; VarGLOBTESTSETUP1CLASS_3.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1CLASS_3.Children := 0; VarGLOBTESTSETUP1CLASS_3.Children := 0;
VarGLOBTESTSETUP1CLASS_3.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASS'+#0); VarGLOBTESTSETUP1CLASS_3.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASS'+#0);
VarGLOBTESTSETUP1CLASS_3.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00409020)])); // $03, $20, $90, $40, $00 VarGLOBTESTSETUP1CLASS_3.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1CLASS)])); // $03, $20, $90, $40, $00
VarGLOBTESTSETUP1CLASS_3.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1CLASS_88); // $D3, $06, $00, $00 VarGLOBTESTSETUP1CLASS_3.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1CLASS_88); // $D3, $06, $00, $00
VarGLOBTESTSETUP1CLASSP_4 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1CLASSP_4 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1CLASSP_4.Tag := DW_TAG_variable; VarGLOBTESTSETUP1CLASSP_4.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1CLASSP_4.Children := 0; VarGLOBTESTSETUP1CLASSP_4.Children := 0;
VarGLOBTESTSETUP1CLASSP_4.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSP'+#0); VarGLOBTESTSETUP1CLASSP_4.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSP'+#0);
VarGLOBTESTSETUP1CLASSP_4.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00409030)])); // $03, $30, $90, $40, $00 VarGLOBTESTSETUP1CLASSP_4.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1CLASSP)])); // $03, $30, $90, $40, $00
VarGLOBTESTSETUP1CLASSP_4.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPTESTSETUP1CLASS_111); // $0C, $08, $00, $00 VarGLOBTESTSETUP1CLASSP_4.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPTESTSETUP1CLASS_111); // $0C, $08, $00, $00
VarGLOBTESTSETUP1CLASSCHILD_5 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1CLASSCHILD_5 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1CLASSCHILD_5.Tag := DW_TAG_variable; VarGLOBTESTSETUP1CLASSCHILD_5.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1CLASSCHILD_5.Children := 0; VarGLOBTESTSETUP1CLASSCHILD_5.Children := 0;
VarGLOBTESTSETUP1CLASSCHILD_5.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSCHILD'+#0); VarGLOBTESTSETUP1CLASSCHILD_5.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSCHILD'+#0);
VarGLOBTESTSETUP1CLASSCHILD_5.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00409040)])); // $03, $40, $90, $40, $00 VarGLOBTESTSETUP1CLASSCHILD_5.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1CLASSCHILD)])); // $03, $40, $90, $40, $00
VarGLOBTESTSETUP1CLASSCHILD_5.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1CLASSCHILD_114); // $2C, $08, $00, $00 VarGLOBTESTSETUP1CLASSCHILD_5.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1CLASSCHILD_114); // $2C, $08, $00, $00
VarGLOBTESTSETUP1CLASSCHILDP_6 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1CLASSCHILDP_6 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1CLASSCHILDP_6.Tag := DW_TAG_variable; VarGLOBTESTSETUP1CLASSCHILDP_6.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1CLASSCHILDP_6.Children := 0; VarGLOBTESTSETUP1CLASSCHILDP_6.Children := 0;
VarGLOBTESTSETUP1CLASSCHILDP_6.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSCHILDP'+#0); VarGLOBTESTSETUP1CLASSCHILDP_6.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSCHILDP'+#0);
VarGLOBTESTSETUP1CLASSCHILDP_6.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00409050)])); // $03, $50, $90, $40, $00 VarGLOBTESTSETUP1CLASSCHILDP_6.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1CLASSCHILDP)])); // $03, $50, $90, $40, $00
VarGLOBTESTSETUP1CLASSCHILDP_6.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPTESTSETUP1CLASSCHILD_121); // $91, $08, $00, $00 VarGLOBTESTSETUP1CLASSCHILDP_6.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPTESTSETUP1CLASSCHILD_121); // $91, $08, $00, $00
VarGLOBTESTSETUP1CLASSCLASS_7 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1CLASSCLASS_7 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1CLASSCLASS_7.Tag := DW_TAG_variable; VarGLOBTESTSETUP1CLASSCLASS_7.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1CLASSCLASS_7.Children := 0; VarGLOBTESTSETUP1CLASSCLASS_7.Children := 0;
VarGLOBTESTSETUP1CLASSCLASS_7.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSCLASS'+#0); VarGLOBTESTSETUP1CLASSCLASS_7.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSCLASS'+#0);
VarGLOBTESTSETUP1CLASSCLASS_7.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00409060)])); // $03, $60, $90, $40, $00 VarGLOBTESTSETUP1CLASSCLASS_7.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1CLASSCLASS)])); // $03, $60, $90, $40, $00
VarGLOBTESTSETUP1CLASSCLASS_7.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1CLASSCLASS_124); // $B6, $08, $00, $00 VarGLOBTESTSETUP1CLASSCLASS_7.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1CLASSCLASS_124); // $B6, $08, $00, $00
VarGLOBTESTSETUP1CLASSCHILDCLASS_8 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1CLASSCHILDCLASS_8 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1CLASSCHILDCLASS_8.Tag := DW_TAG_variable; VarGLOBTESTSETUP1CLASSCHILDCLASS_8.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1CLASSCHILDCLASS_8.Children := 0; VarGLOBTESTSETUP1CLASSCHILDCLASS_8.Children := 0;
VarGLOBTESTSETUP1CLASSCHILDCLASS_8.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSCHILDCLASS'+#0); VarGLOBTESTSETUP1CLASSCHILDCLASS_8.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1CLASSCHILDCLASS'+#0);
VarGLOBTESTSETUP1CLASSCHILDCLASS_8.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00409070)])); // $03, $70, $90, $40, $00 VarGLOBTESTSETUP1CLASSCHILDCLASS_8.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1CLASSCHILDCLASS)])); // $03, $70, $90, $40, $00
VarGLOBTESTSETUP1CLASSCHILDCLASS_8.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1CLASSCHILDCLASS_127); // $DB, $08, $00, $00 VarGLOBTESTSETUP1CLASSCHILDCLASS_8.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1CLASSCHILDCLASS_127); // $DB, $08, $00, $00
VarGLOBTESTSETUP1OBJECT_9 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1OBJECT_9 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1OBJECT_9.Tag := DW_TAG_variable; VarGLOBTESTSETUP1OBJECT_9.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1OBJECT_9.Children := 0; VarGLOBTESTSETUP1OBJECT_9.Children := 0;
VarGLOBTESTSETUP1OBJECT_9.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1OBJECT'+#0); VarGLOBTESTSETUP1OBJECT_9.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1OBJECT'+#0);
VarGLOBTESTSETUP1OBJECT_9.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00409080)])); // $03, $80, $90, $40, $00 VarGLOBTESTSETUP1OBJECT_9.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1OBJECT)])); // $03, $80, $90, $40, $00
VarGLOBTESTSETUP1OBJECT_9.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1OBJECT_130); // $05, $09, $00, $00 VarGLOBTESTSETUP1OBJECT_9.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclTTESTSETUP1OBJECT_130); // $05, $09, $00, $00
VarGLOBTESTSETUP1OBJECTP_10 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1OBJECTP_10 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1OBJECTP_10.Tag := DW_TAG_variable; VarGLOBTESTSETUP1OBJECTP_10.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1OBJECTP_10.Children := 0; VarGLOBTESTSETUP1OBJECTP_10.Children := 0;
VarGLOBTESTSETUP1OBJECTP_10.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1OBJECTP'+#0); VarGLOBTESTSETUP1OBJECTP_10.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1OBJECTP'+#0);
VarGLOBTESTSETUP1OBJECTP_10.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($004090C0)])); // $03, $C0, $90, $40, $00 VarGLOBTESTSETUP1OBJECTP_10.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1OBJECTP)])); // $03, $C0, $90, $40, $00
VarGLOBTESTSETUP1OBJECTP_10.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPTESTSETUP1OBJECT_145); // $F6, $09, $00, $00 VarGLOBTESTSETUP1OBJECTP_10.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPTESTSETUP1OBJECT_145); // $F6, $09, $00, $00
VarGLOBTESTSETUP1POINTER_11 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1POINTER_11 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1POINTER_11.Tag := DW_TAG_variable; VarGLOBTESTSETUP1POINTER_11.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1POINTER_11.Children := 0; VarGLOBTESTSETUP1POINTER_11.Children := 0;
VarGLOBTESTSETUP1POINTER_11.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1POINTER'+#0); VarGLOBTESTSETUP1POINTER_11.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1POINTER'+#0);
VarGLOBTESTSETUP1POINTER_11.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00000000)])); // $03, $00, $00, $00, $00 VarGLOBTESTSETUP1POINTER_11.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1POINTER)])); // $03, $00, $00, $00, $00
VarGLOBTESTSETUP1POINTER_11.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPOINTER_85); // $C0, $06, $00, $00 VarGLOBTESTSETUP1POINTER_11.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclPOINTER_85); // $C0, $06, $00, $00
VarGLOBTESTSETUP1QWORD_12 := Unitdwarfsetup1_lpr_0.GetNewChild; VarGLOBTESTSETUP1QWORD_12 := Unitdwarfsetup1_lpr_0.GetNewChild;
VarGLOBTESTSETUP1QWORD_12.Tag := DW_TAG_variable; VarGLOBTESTSETUP1QWORD_12.Tag := DW_TAG_variable;
VarGLOBTESTSETUP1QWORD_12.Children := 0; VarGLOBTESTSETUP1QWORD_12.Children := 0;
VarGLOBTESTSETUP1QWORD_12.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1QWORD'+#0); VarGLOBTESTSETUP1QWORD_12.Add(DW_AT_name, DW_FORM_string, 'GLOBTESTSETUP1QWORD'+#0);
VarGLOBTESTSETUP1QWORD_12.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB($00000000)])); // $03, $00, $00, $00, $00 VarGLOBTESTSETUP1QWORD_12.Add(DW_AT_location, DW_FORM_block1, BytesLen1([DW_OP_addr, AddrB(@GLOBTESTSETUP1QWORD)])); // $03, $00, $00, $00, $00
VarGLOBTESTSETUP1QWORD_12.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclQWORD_79); // $8A, $06, $00, $00 VarGLOBTESTSETUP1QWORD_12.AddRef(DW_AT_type, DW_FORM_ref4, @TypeDeclQWORD_79); // $8A, $06, $00, $00
Progmain_13 := Unitdwarfsetup1_lpr_0.GetNewChild; Progmain_13 := Unitdwarfsetup1_lpr_0.GetNewChild;

View File

@ -164,6 +164,7 @@ type
function ULEB(ANum: QWord): TBytes; function ULEB(ANum: QWord): TBytes;
function SLEB(ANum: Int64): TBytes; function SLEB(ANum: Int64): TBytes;
function AddrB(ANum: Int64): TBytes; function AddrB(ANum: Int64): TBytes;
function AddrB(ANum: Pointer): TBytes;
function NumS(ANum: Int64; ASize: Integer): TBytes; function NumS(ANum: Int64; ASize: Integer): TBytes;
function NumU(ANum: QWord; ASize: Integer): TBytes; function NumU(ANum: QWord; ASize: Integer): TBytes;
@ -356,6 +357,11 @@ begin
else PInt64(@Result[0])^ := Int64(ANum); else PInt64(@Result[0])^ := Int64(ANum);
end; end;
function AddrB(ANum: Pointer): TBytes;
begin
Result := AddrB(Int64(ANum));
end;
function NumS(ANum: Int64; ASize: Integer): TBytes; function NumS(ANum: Int64; ASize: Integer): TBytes;
begin begin
SetLength(Result, ASize); SetLength(Result, ASize);

View File

@ -62,6 +62,9 @@ begin
end; end;
procedure TTestTypInfo.New1; procedure TTestTypInfo.New1;
type
TTestFlag = (ttHasType, ttNotHasType, ttHasSymbol, ttHasValSymbol, ttHasTypeSymbol);
TTestFlags = set of TTestFlag;
var var
CurrentTestName: String; CurrentTestName: String;
Ctx: TDbgInfoAddressContext; Ctx: TDbgInfoAddressContext;
@ -74,11 +77,32 @@ var
Expression.Free; Expression.Free;
Expression := TTestPascalExpression.Create(Expr, Ctx); Expression := TTestPascalExpression.Create(Expr, Ctx);
end; end;
procedure StartTest(Expr: String; ExtraName: String = ''); procedure StartTest(Expr: String; TestFlags: TTestFlags = []; ExtraName: String = '');
var
i: TTestFlag;
begin begin
InitTest(Expr, ExtraName); InitTest(Expr, ExtraName);
AssertTrue(CurrentTestName + 'valid', Expression.Valid); AssertTrue(CurrentTestName + 'valid', Expression.Valid);
AssertTrue(CurrentTestName + 'has ResVal', Expression.ResultValue <> nil); AssertTrue(CurrentTestName + 'has ResVal', Expression.ResultValue <> nil);
for i := low(TTestFlags) to high(TTestFlags) do
if i in TestFlags then
case i of
ttHasType: AssertTrue('hastype', Expression.ResultValue.TypeInfo <> nil);
ttNotHasType: AssertTrue('has not type', Expression.ResultValue.TypeInfo = nil);
ttHasSymbol: AssertTrue('hassymbol', Expression.ResultValue.DbgSymbol <> nil);
ttHasValSymbol: AssertTrue('hassymbol', (Expression.ResultValue.DbgSymbol <> nil) and
(Expression.ResultValue.DbgSymbol.SymbolType = stValue));
ttHasTypeSymbol: AssertTrue('hassymbol', (Expression.ResultValue.DbgSymbol <> nil) and
(Expression.ResultValue.DbgSymbol.SymbolType = stType));
end;
end;
procedure StartTest(Expr: String; ExpKind: TDbgSymbolKind; TestFlags: TTestFlags = []; ExtraName: String = '');
var
s: String;
begin
StartTest(Expr, TestFlags, ExtraName);
WriteStr(s, 'Kind exected ', ExpKind, ' but was ', Expression.ResultValue.Kind);
AssertTrue(s, Expression.ResultValue.Kind = ExpKind);
end; end;
procedure StartInvalTest(Expr: String; ExpError: String; ExtraName: String = ''); procedure StartInvalTest(Expr: String; ExpError: String; ExtraName: String = '');
begin begin
@ -215,11 +239,20 @@ begin
AssertTrue('got sym', sym <> nil); AssertTrue('got sym', sym <> nil);
sym.ReleaseReference(); sym.ReleaseReference();
StartTest('Int1'); // Not existing
StartInvalTest('NotExisting1399', 'xxx');
// Not Existing Typecast
StartInvalTest('TNotExisting1399(Int1)', 'xxx');
StartTest('Int1', skInteger, [ttHasType]);
ExpResult(svfInteger, -299); ExpResult(svfInteger, -299);
ExpFlags([svfInteger, svfOrdinal, svfAddress]); // svfSize; ExpFlags([svfInteger, svfOrdinal, svfAddress]); // svfSize;
StartTest('@Int1'); StartTest('@Int1');
// TODO: dataAddr
ExpResult(svfCardinal, PtrUInt(@ImageLoader.TestStackFrame.Int1)); ExpResult(svfCardinal, PtrUInt(@ImageLoader.TestStackFrame.Int1));
ExpFlags([svfCardinal, svfOrdinal], [svfAddress]); ExpFlags([svfCardinal, svfOrdinal], [svfAddress]);
@ -306,7 +339,7 @@ begin
StartTest('(@Obj1)^.FWord'); StartTest('(@Obj1)^.FWord');
ExpResult(svfCardinal, 1019); ExpResult(svfCardinal, 1019);
ExpFlags([svfCardinal, svfOrdinal, svfAddress]); // svfSize; ExpFlags([svfCardinal, svfOrdinal, svfAddress]); // svfSize; //
StartTest('(@Obj1.FWord)^'); StartTest('(@Obj1.FWord)^');
ExpResult(svfCardinal, 1019); ExpResult(svfCardinal, 1019);
@ -334,13 +367,67 @@ begin
ExpFlags([svfInteger, svfOrdinal, svfAddress]); ExpFlags([svfInteger, svfOrdinal, svfAddress]);
// Not existing // pointer
StartInvalTest('NotExisting1399', 'xxx'); ImageLoader.TestStackFrame.Int1 := -299;
ImageLoader.TestStackFrame.pi := @ImageLoader.TestStackFrame.int1;
GlobTestSetup1Pointer := @ImageLoader.TestStackFrame.int1;
GlobTestSetup1QWord := QWord(@ImageLoader.TestStackFrame.int1);
// Not Existing Typecast StartTest('pi', skPointer, [ttHasType]);
StartInvalTest('TNotExisting1399(Int1)', 'xxx'); ExpResult(svfOrdinal, QWord(@ImageLoader.TestStackFrame.int1));
ExpResult(svfAddress, QWord(@ImageLoader.TestStackFrame.pi));
ExpResult(svfDataAddress, QWord(@ImageLoader.TestStackFrame.int1));
ExpFlags([svfOrdinal, svfAddress, svfDataAddress, svfSizeOfPointer]);
StartTest('GlobTestSetup1Pointer', skPointer, [ttHasType]);
ExpResult(svfOrdinal, QWord(@ImageLoader.TestStackFrame.int1));
ExpResult(svfAddress, QWord(@GlobTestSetup1Pointer));
ExpResult(svfDataAddress, QWord(@ImageLoader.TestStackFrame.int1));
ExpFlags([svfOrdinal, svfAddress, svfDataAddress, svfSizeOfPointer]);
StartTest('pointer(pi)', skPointer, [ttHasType]);
ExpResult(svfOrdinal, QWord(@ImageLoader.TestStackFrame.int1));
ExpResult(svfAddress, QWord(@ImageLoader.TestStackFrame.pi));
ExpResult(svfDataAddress, QWord(@ImageLoader.TestStackFrame.int1));
ExpFlags([svfOrdinal, svfAddress, svfDataAddress, svfSizeOfPointer]);
StartTest('PInt(pi)', skPointer, [ttHasType]);
ExpResult(svfOrdinal, QWord(@ImageLoader.TestStackFrame.int1));
ExpResult(svfAddress, QWord(@ImageLoader.TestStackFrame.pi));
ExpResult(svfDataAddress, QWord(@ImageLoader.TestStackFrame.int1));
ExpFlags([svfOrdinal, svfAddress, svfDataAddress, svfSizeOfPointer]);
StartTest('PTestSetup1Class(pi)', skPointer, [ttHasType]);
ExpResult(svfOrdinal, QWord(@ImageLoader.TestStackFrame.int1));
ExpResult(svfAddress, QWord(@ImageLoader.TestStackFrame.pi));
ExpResult(svfDataAddress, QWord(@ImageLoader.TestStackFrame.int1));
ExpFlags([svfOrdinal, svfAddress, svfDataAddress, svfSizeOfPointer]);
StartTest('pointer(GlobTestSetup1Pointer)', skPointer, [ttHasType]);
ExpResult(svfOrdinal, QWord(@ImageLoader.TestStackFrame.int1));
ExpResult(svfAddress, QWord(@GlobTestSetup1Pointer));
ExpResult(svfDataAddress, QWord(@ImageLoader.TestStackFrame.int1));
ExpFlags([svfOrdinal, svfAddress, svfDataAddress, svfSizeOfPointer]);
StartTest('pint(GlobTestSetup1Pointer)', skPointer, [ttHasType]);
ExpResult(svfOrdinal, QWord(@ImageLoader.TestStackFrame.int1));
ExpResult(svfAddress, QWord(@GlobTestSetup1Pointer));
ExpResult(svfDataAddress, QWord(@ImageLoader.TestStackFrame.int1));
ExpFlags([svfOrdinal, svfAddress, svfDataAddress, svfSizeOfPointer]);
StartTest('pi^', skInteger, [ttHasType]);
ExpResult(svfInteger, -299);
ExpFlags([svfInteger, svfOrdinal, svfAddress], [svfDataAddress]); // svfSize;
StartTest('PInt(pi)^', skInteger, [ttHasType]);
ExpResult(svfInteger, -299);
ExpFlags([svfInteger, svfOrdinal, svfAddress], [svfDataAddress]); // svfSize;
StartTest('PInt(GlobTestSetup1Pointer)^', skInteger, [ttHasType]);
ExpResult(svfInteger, -299);
ExpFlags([svfInteger, svfOrdinal, svfAddress], [svfDataAddress]); // svfSize;
// TODO Integer(pointer(pi)^)
/////////////////////////// ///////////////////////////
finally finally