mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-12 13:17:18 +02:00
FPDebug: Value handling / more typecasts
git-svn-id: trunk@43960 -
This commit is contained in:
parent
82bb935fdd
commit
97a11734fc
@ -593,8 +593,8 @@ type
|
|||||||
private
|
private
|
||||||
FOwner: TDbgDwarfIdentifier; // the creator, usually the type
|
FOwner: TDbgDwarfIdentifier; // the creator, usually the type
|
||||||
FValueSymbol: TDbgDwarfValueIdentifier;
|
FValueSymbol: TDbgDwarfValueIdentifier;
|
||||||
FTypeCastInfo: TDbgDwarfTypeIdentifier;
|
FTypeCastTargetType: TDbgDwarfTypeIdentifier;
|
||||||
FTypeCastSource: TDbgSymbolValue;
|
FTypeCastSourceValue: TDbgSymbolValue;
|
||||||
function MemReader: TFpDbgMemReaderBase; inline;
|
function MemReader: TFpDbgMemReaderBase; inline;
|
||||||
function AddressSize: Byte; inline;
|
function AddressSize: Byte; inline;
|
||||||
protected
|
protected
|
||||||
@ -758,6 +758,7 @@ type
|
|||||||
// ParentTypeInfo: funtion for local var / class for member
|
// ParentTypeInfo: funtion for local var / class for member
|
||||||
property ParentTypeInfo: TDbgDwarfIdentifier read FParentTypeInfo write SetParentTypeInfo;
|
property ParentTypeInfo: TDbgDwarfIdentifier read FParentTypeInfo write SetParentTypeInfo;
|
||||||
|
|
||||||
|
function DataSize: Integer; virtual;
|
||||||
protected
|
protected
|
||||||
// TODO: InitLocationParser may fail
|
// TODO: InitLocationParser may fail
|
||||||
procedure InitLocationParser(const {%H-}ALocationParser: TDwarfLocationExpression; {%H-}AnObjectDataAddress: TDbgPtr = 0); virtual;
|
procedure InitLocationParser(const {%H-}ALocationParser: TDwarfLocationExpression; {%H-}AnObjectDataAddress: TDbgPtr = 0); virtual;
|
||||||
@ -964,9 +965,11 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
|
|||||||
protected
|
protected
|
||||||
procedure TypeInfoNeeded; override;
|
procedure TypeInfoNeeded; override;
|
||||||
procedure KindNeeded; override;
|
procedure KindNeeded; override;
|
||||||
|
procedure SizeNeeded; override;
|
||||||
procedure ForwardToSymbolNeeded; override;
|
procedure ForwardToSymbolNeeded; override;
|
||||||
function GetDataAddress(var AnAddress: TDbgPtr; ATargetType: TDbgDwarfTypeIdentifier = nil): Boolean; override;
|
function GetDataAddress(var AnAddress: TDbgPtr; ATargetType: TDbgDwarfTypeIdentifier = nil): Boolean; override;
|
||||||
function GetTypedValueObject(ATypeCast: Boolean): TDbgDwarfSymbolValue; override;
|
function GetTypedValueObject(ATypeCast: Boolean): TDbgDwarfSymbolValue; override;
|
||||||
|
function DataSize: Integer; override;
|
||||||
public
|
public
|
||||||
property IsInternalPointer: Boolean read GetIsInternalPointer write FIsInternalPointer; // Class (also DynArray, but DynArray is handled without this)
|
property IsInternalPointer: Boolean read GetIsInternalPointer write FIsInternalPointer; // Class (also DynArray, but DynArray is handled without this)
|
||||||
end;
|
end;
|
||||||
@ -1737,15 +1740,15 @@ function TDbgDwarfStructSymbolValue.GetFieldFlags: TDbgSymbolValueFieldFlags;
|
|||||||
begin
|
begin
|
||||||
Result := inherited GetFieldFlags;
|
Result := inherited GetFieldFlags;
|
||||||
Result := Result + [svfMembers];
|
Result := Result + [svfMembers];
|
||||||
if kind = skClass then // todo detect hidden pointer
|
|
||||||
Result := Result + [svfDataSize]
|
|
||||||
else
|
|
||||||
Result := Result + [svfSize];
|
|
||||||
//TODO: svfDataAddress should depend on (hidden) Pointer or Ref in the TypeInfo
|
//TODO: svfDataAddress should depend on (hidden) Pointer or Ref in the TypeInfo
|
||||||
if Kind in [skClass] then begin
|
if Kind in [skClass] then begin
|
||||||
Result := Result + [svfDataAddress, svfSizeOfPointer]; // svfDataSize
|
Result := Result + [svfOrdinal, svfDataAddress, svfDataSize]; // svfDataSize
|
||||||
if (FValueSymbol <> nil) and FValueSymbol.HasAddress then
|
if (FValueSymbol <> nil) and FValueSymbol.HasAddress then
|
||||||
Result := Result + [svfOrdinal];
|
Result := Result + [svfSizeOfPointer];
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
Result := Result + [svfSize];
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1775,8 +1778,12 @@ end;
|
|||||||
|
|
||||||
function TDbgDwarfStructSymbolValue.GetDataSize: Integer;
|
function TDbgDwarfStructSymbolValue.GetDataSize: Integer;
|
||||||
begin
|
begin
|
||||||
|
Assert((FValueSymbol = nil) or (FValueSymbol.TypeInfo is TDbgDwarfIdentifier));
|
||||||
if (FValueSymbol <> nil) and (FValueSymbol.TypeInfo <> nil) then
|
if (FValueSymbol <> nil) and (FValueSymbol.TypeInfo <> nil) then
|
||||||
Result := FValueSymbol.TypeInfo.Size
|
if FValueSymbol.TypeInfo.Kind = skClass then
|
||||||
|
Result := TDbgDwarfIdentifier(FValueSymbol.TypeInfo).DataSize
|
||||||
|
else
|
||||||
|
Result := FValueSymbol.TypeInfo.Size
|
||||||
else
|
else
|
||||||
Result := -1;
|
Result := -1;
|
||||||
end;
|
end;
|
||||||
@ -1808,7 +1815,7 @@ end;
|
|||||||
function TDbgDwarfStructTypeCastSymbolValue.GetKind: TDbgSymbolKind;
|
function TDbgDwarfStructTypeCastSymbolValue.GetKind: TDbgSymbolKind;
|
||||||
begin
|
begin
|
||||||
if HasTypeCastInfo then
|
if HasTypeCastInfo then
|
||||||
Result := FTypeCastInfo.Kind
|
Result := FTypeCastTargetType.Kind
|
||||||
else
|
else
|
||||||
Result := inherited GetKind;
|
Result := inherited GetKind;
|
||||||
end;
|
end;
|
||||||
@ -1820,16 +1827,20 @@ end;
|
|||||||
|
|
||||||
function TDbgDwarfStructTypeCastSymbolValue.GetSize: Integer;
|
function TDbgDwarfStructTypeCastSymbolValue.GetSize: Integer;
|
||||||
begin
|
begin
|
||||||
if (Kind <> skClass) and (FTypeCastInfo <> nil) then
|
if (Kind <> skClass) and (FTypeCastTargetType <> nil) then
|
||||||
Result := FTypeCastInfo.Size
|
Result := FTypeCastTargetType.Size
|
||||||
else
|
else
|
||||||
Result := -1;
|
Result := -1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TDbgDwarfStructTypeCastSymbolValue.GetDataSize: Integer;
|
function TDbgDwarfStructTypeCastSymbolValue.GetDataSize: Integer;
|
||||||
begin
|
begin
|
||||||
if FTypeCastInfo <> nil then
|
Assert((FTypeCastTargetType = nil) or (FTypeCastTargetType is TDbgDwarfIdentifier));
|
||||||
Result := FTypeCastInfo.Size
|
if FTypeCastTargetType <> nil then
|
||||||
|
if FTypeCastTargetType.Kind = skClass then
|
||||||
|
Result := TDbgDwarfIdentifier(FTypeCastTargetType).DataSize
|
||||||
|
else
|
||||||
|
Result := FTypeCastTargetType.Size
|
||||||
else
|
else
|
||||||
Result := -1;
|
Result := -1;
|
||||||
end;
|
end;
|
||||||
@ -1841,13 +1852,14 @@ var
|
|||||||
begin
|
begin
|
||||||
if HasTypeCastInfo then begin
|
if HasTypeCastInfo then begin
|
||||||
if not FDataAddressDone then begin
|
if not FDataAddressDone then begin
|
||||||
fields := FTypeCastSource.FieldFlags;
|
// TODO: wrong for records // use GetDwarfDataAddress
|
||||||
|
fields := FTypeCastSourceValue.FieldFlags;
|
||||||
if svfOrdinal in fields then
|
if svfOrdinal in fields then
|
||||||
FDataAddress := TDbgPtr(FTypeCastSource.AsCardinal)
|
FDataAddress := TDbgPtr(FTypeCastSourceValue.AsCardinal)
|
||||||
else
|
else
|
||||||
if svfAddress in fields then begin
|
if svfAddress in fields then begin
|
||||||
FDataAddress := 0;
|
FDataAddress := 0;
|
||||||
t := FTypeCastSource.Address;
|
t := FTypeCastSourceValue.Address;
|
||||||
assert(SizeOf(FDataAddress) >= AddressSize, 'TDbgDwarfStructSymbolValue.GetDataAddress');
|
assert(SizeOf(FDataAddress) >= AddressSize, 'TDbgDwarfStructSymbolValue.GetDataAddress');
|
||||||
if (t <> 0) and (MemReader <> nil) then
|
if (t <> 0) and (MemReader <> nil) then
|
||||||
MemReader.ReadMemory(t, AddressSize, @FDataAddress);
|
MemReader.ReadMemory(t, AddressSize, @FDataAddress);
|
||||||
@ -1869,12 +1881,12 @@ begin
|
|||||||
Result := HasTypeCastInfo;
|
Result := HasTypeCastInfo;
|
||||||
if not Result then
|
if not Result then
|
||||||
exit;
|
exit;
|
||||||
fields := FTypeCastSource.FieldFlags;
|
fields := FTypeCastSourceValue.FieldFlags;
|
||||||
AnAddress := 0;
|
AnAddress := 0;
|
||||||
if svfOrdinal in fields then begin
|
if svfOrdinal in fields then begin
|
||||||
AnAddress := FTypeCastSource.AsCardinal;
|
AnAddress := FTypeCastSourceValue.AsCardinal;
|
||||||
// MUST store, and provide address of it // for now, skip the pointer
|
// MUST store, and provide address of it // for now, skip the pointer
|
||||||
t := FTypeCastInfo;
|
t := FTypeCastTargetType;
|
||||||
if t is TDbgDwarfTypeIdentifierDeclaration then t := t.NestedTypeInfo;
|
if t is TDbgDwarfTypeIdentifierDeclaration then t := t.NestedTypeInfo;
|
||||||
if (t<> nil) and (t is TDbgDwarfTypeIdentifierPointer) then t := t.NestedTypeInfo;
|
if (t<> nil) and (t is TDbgDwarfTypeIdentifierPointer) then t := t.NestedTypeInfo;
|
||||||
if (t<> nil) then begin
|
if (t<> nil) then begin
|
||||||
@ -1888,19 +1900,47 @@ begin
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
if svfAddress in fields then
|
if svfAddress in fields then
|
||||||
AnAddress := FTypeCastSource.Address;
|
AnAddress := FTypeCastSourceValue.Address;
|
||||||
|
|
||||||
Result := AnAddress <> 0;
|
Result := AnAddress <> 0;
|
||||||
if not Result then
|
if not Result then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
Result := FTypeCastInfo.GetDataAddress(AnAddress, ATargetType);
|
Result := FTypeCastTargetType.GetDataAddress(AnAddress, ATargetType);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TDbgDwarfStructTypeCastSymbolValue.IsValidTypeCast: Boolean;
|
function TDbgDwarfStructTypeCastSymbolValue.IsValidTypeCast: Boolean;
|
||||||
|
var
|
||||||
|
f: TDbgSymbolValueFieldFlags;
|
||||||
begin
|
begin
|
||||||
Result := HasTypeCastInfo and
|
Result := HasTypeCastInfo;
|
||||||
(FTypeCastSource.FieldFlags * [svfOrdinal, svfAddress] <> []);
|
if not Result then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
if FTypeCastTargetType.Kind = skClass then begin
|
||||||
|
f := FTypeCastSourceValue.FieldFlags;
|
||||||
|
Result := (svfOrdinal in f); // ordinal is prefered in GetDataAddress
|
||||||
|
if Result then
|
||||||
|
exit;
|
||||||
|
Result := (svfAddress in f) and
|
||||||
|
( ( not(svfSize in f) ) or // either svfSizeOfPointer or a void type, e.g. pointer(1)^
|
||||||
|
( (svfSize in f) and (FTypeCastSourceValue.Size = AddressSize) )
|
||||||
|
);
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
f := FTypeCastSourceValue.FieldFlags;
|
||||||
|
if (f * [{svfOrdinal, }svfAddress] = [svfAddress]) then begin
|
||||||
|
if (f * [svfSize, svfSizeOfPointer]) = [svfSize] then
|
||||||
|
Result := Result and (FTypeCastTargetType.Size = FTypeCastSourceValue.Size)
|
||||||
|
else
|
||||||
|
if (f * [svfSize, svfSizeOfPointer]) = [svfSizeOfPointer] then
|
||||||
|
Result := Result and (FTypeCastTargetType.Size = AddressSize)
|
||||||
|
else
|
||||||
|
Result := (f * [svfSize, svfSizeOfPointer]) = []; // source is a void type, e.g. pointer(1)^
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TDbgDwarfStructTypeCastSymbolValue.Destroy;
|
destructor TDbgDwarfStructTypeCastSymbolValue.Destroy;
|
||||||
@ -1922,7 +1962,7 @@ begin
|
|||||||
if not HasTypeCastInfo then
|
if not HasTypeCastInfo then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
tmp := FTypeCastInfo.MemberByName[AIndex];
|
tmp := FTypeCastTargetType.MemberByName[AIndex];
|
||||||
if (tmp <> nil) then begin
|
if (tmp <> nil) then begin
|
||||||
assert((tmp is TDbgDwarfValueIdentifier), 'TDbgDwarfStructTypeCastSymbolValue.GetMemberByName'+DbgSName(tmp));
|
assert((tmp is TDbgDwarfValueIdentifier), 'TDbgDwarfStructTypeCastSymbolValue.GetMemberByName'+DbgSName(tmp));
|
||||||
if FMembers = nil then
|
if FMembers = nil then
|
||||||
@ -1943,7 +1983,7 @@ begin
|
|||||||
if not HasTypeCastInfo then
|
if not HasTypeCastInfo then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
tmp := FTypeCastInfo.Member[AIndex];
|
tmp := FTypeCastTargetType.Member[AIndex];
|
||||||
if (tmp <> nil) then begin
|
if (tmp <> nil) then begin
|
||||||
assert((tmp is TDbgDwarfValueIdentifier), 'TDbgDwarfStructTypeCastSymbolValue.GetMemberByName'+DbgSName(tmp));
|
assert((tmp is TDbgDwarfValueIdentifier), 'TDbgDwarfStructTypeCastSymbolValue.GetMemberByName'+DbgSName(tmp));
|
||||||
if FMembers = nil then
|
if FMembers = nil then
|
||||||
@ -1962,7 +2002,7 @@ begin
|
|||||||
if not HasTypeCastInfo then
|
if not HasTypeCastInfo then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
Result := FTypeCastInfo.MemberCount;
|
Result := FTypeCastTargetType.MemberCount;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TDbgDwarfBooleanSymbolValue }
|
{ TDbgDwarfBooleanSymbolValue }
|
||||||
@ -2021,7 +2061,7 @@ begin
|
|||||||
if FValueSymbol <> nil then
|
if FValueSymbol <> nil then
|
||||||
addr := FValueSymbol.Address
|
addr := FValueSymbol.Address
|
||||||
else
|
else
|
||||||
addr := FTypeCastSource.Address;
|
addr := FTypeCastSourceValue.Address;
|
||||||
|
|
||||||
Result := addr <> 0;
|
Result := addr <> 0;
|
||||||
if not Result then
|
if not Result then
|
||||||
@ -2040,8 +2080,8 @@ begin
|
|||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
if HasTypeCastInfo and (svfOrdinal in FTypeCastSource.FieldFlags) then begin
|
if HasTypeCastInfo and (svfOrdinal in FTypeCastSourceValue.FieldFlags) then begin
|
||||||
Result := FTypeCastSource.AsCardinal;
|
Result := FTypeCastSourceValue.AsCardinal;
|
||||||
Result := Result and (QWord(-1) shr ((SizeOf(Result)-FSize) * 8));
|
Result := Result and (QWord(-1) shr ((SizeOf(Result)-FSize) * 8));
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -2059,15 +2099,15 @@ end;
|
|||||||
function TDbgDwarfNumericSymbolValue.CanUseTypeCastAddress: Boolean;
|
function TDbgDwarfNumericSymbolValue.CanUseTypeCastAddress: Boolean;
|
||||||
begin
|
begin
|
||||||
Result := True;
|
Result := True;
|
||||||
if (FTypeCastSource.FieldFlags * [svfAddress, svfSize, svfSizeOfPointer] = [svfAddress]) then
|
if (FTypeCastSourceValue.FieldFlags * [svfAddress, svfSize, svfSizeOfPointer] = [svfAddress]) then
|
||||||
exit
|
exit
|
||||||
else
|
else
|
||||||
if (FTypeCastSource.FieldFlags * [svfAddress, svfSize] = [svfAddress, svfSize]) and
|
if (FTypeCastSourceValue.FieldFlags * [svfAddress, svfSize] = [svfAddress, svfSize]) and
|
||||||
(FTypeCastSource.Size = FSize) and (FSize > 0)
|
(FTypeCastSourceValue.Size = FSize) and (FSize > 0)
|
||||||
then
|
then
|
||||||
exit;
|
exit;
|
||||||
if (FTypeCastSource.FieldFlags * [svfAddress, svfSizeOfPointer] = [svfAddress, svfSizeOfPointer]) and
|
if (FTypeCastSourceValue.FieldFlags * [svfAddress, svfSizeOfPointer] = [svfAddress, svfSizeOfPointer]) and
|
||||||
not ( (FTypeCastInfo.Kind = skPointer) //or
|
not ( (FTypeCastTargetType.Kind = skPointer) //or
|
||||||
//(FSize = AddressSize xxxxxxx)
|
//(FSize = AddressSize xxxxxxx)
|
||||||
)
|
)
|
||||||
then
|
then
|
||||||
@ -2080,7 +2120,7 @@ begin
|
|||||||
Result := HasTypeCastInfo;
|
Result := HasTypeCastInfo;
|
||||||
If not Result then
|
If not Result then
|
||||||
exit;
|
exit;
|
||||||
if (svfOrdinal in FTypeCastSource.FieldFlags) or CanUseTypeCastAddress then
|
if (svfOrdinal in FTypeCastSourceValue.FieldFlags) or CanUseTypeCastAddress then
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2146,13 +2186,13 @@ begin
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
if HasTypeCastInfo then begin
|
if HasTypeCastInfo then begin
|
||||||
Result := Result + FTypeCastSource.FieldFlags * [svfAddress];
|
Result := Result + FTypeCastSourceValue.FieldFlags * [svfAddress];
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TDbgDwarfSymbolValue.HasTypeCastInfo: Boolean;
|
function TDbgDwarfSymbolValue.HasTypeCastInfo: Boolean;
|
||||||
begin
|
begin
|
||||||
Result := (FTypeCastInfo <> nil) and (FTypeCastSource <> nil);
|
Result := (FTypeCastTargetType <> nil) and (FTypeCastSourceValue <> nil);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TDbgDwarfSymbolValue.IsValidTypeCast: Boolean;
|
function TDbgDwarfSymbolValue.IsValidTypeCast: Boolean;
|
||||||
@ -2180,7 +2220,7 @@ begin
|
|||||||
Result := FValueSymbol.Kind
|
Result := FValueSymbol.Kind
|
||||||
else
|
else
|
||||||
if HasTypeCastInfo then
|
if HasTypeCastInfo then
|
||||||
Result := FTypeCastInfo.Kind
|
Result := FTypeCastTargetType.Kind
|
||||||
else
|
else
|
||||||
Result := inherited GetKind;
|
Result := inherited GetKind;
|
||||||
end;
|
end;
|
||||||
@ -2191,7 +2231,7 @@ begin
|
|||||||
Result := FValueSymbol.Address
|
Result := FValueSymbol.Address
|
||||||
else
|
else
|
||||||
if HasTypeCastInfo then
|
if HasTypeCastInfo then
|
||||||
Result := FTypeCastSource.Address
|
Result := FTypeCastSourceValue.Address
|
||||||
else
|
else
|
||||||
Result := inherited GetAddress;
|
Result := inherited GetAddress;
|
||||||
end;
|
end;
|
||||||
@ -2236,7 +2276,7 @@ end;
|
|||||||
function TDbgDwarfSymbolValue.GetTypeInfo: TDbgSymbol;
|
function TDbgDwarfSymbolValue.GetTypeInfo: TDbgSymbol;
|
||||||
begin
|
begin
|
||||||
if HasTypeCastInfo then
|
if HasTypeCastInfo then
|
||||||
Result := FTypeCastInfo
|
Result := FTypeCastTargetType
|
||||||
else
|
else
|
||||||
Result := inherited GetTypeInfo;
|
Result := inherited GetTypeInfo;
|
||||||
end;
|
end;
|
||||||
@ -2249,8 +2289,8 @@ end;
|
|||||||
|
|
||||||
destructor TDbgDwarfSymbolValue.Destroy;
|
destructor TDbgDwarfSymbolValue.Destroy;
|
||||||
begin
|
begin
|
||||||
ReleaseRefAndNil(FTypeCastInfo);
|
ReleaseRefAndNil(FTypeCastTargetType);
|
||||||
ReleaseRefAndNil(FTypeCastSource);
|
ReleaseRefAndNil(FTypeCastSourceValue);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2268,20 +2308,20 @@ end;
|
|||||||
function TDbgDwarfSymbolValue.SetTypeCastInfo(AStructure: TDbgDwarfTypeIdentifier;
|
function TDbgDwarfSymbolValue.SetTypeCastInfo(AStructure: TDbgDwarfTypeIdentifier;
|
||||||
ASource: TDbgSymbolValue): Boolean;
|
ASource: TDbgSymbolValue): Boolean;
|
||||||
begin
|
begin
|
||||||
if FTypeCastSource <> ASource then begin
|
if FTypeCastSourceValue <> ASource then begin
|
||||||
if FTypeCastSource <> nil then
|
if FTypeCastSourceValue <> nil then
|
||||||
FTypeCastSource.ReleaseReference;
|
FTypeCastSourceValue.ReleaseReference;
|
||||||
FTypeCastSource := ASource;
|
FTypeCastSourceValue := ASource;
|
||||||
if FTypeCastSource <> nil then
|
if FTypeCastSourceValue <> nil then
|
||||||
FTypeCastSource.AddReference;
|
FTypeCastSourceValue.AddReference;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if FTypeCastInfo <> AStructure then begin
|
if FTypeCastTargetType <> AStructure then begin
|
||||||
if FTypeCastInfo <> nil then
|
if FTypeCastTargetType <> nil then
|
||||||
FTypeCastInfo.ReleaseReference;
|
FTypeCastTargetType.ReleaseReference;
|
||||||
FTypeCastInfo := AStructure;
|
FTypeCastTargetType := AStructure;
|
||||||
if FTypeCastInfo <> nil then
|
if FTypeCastTargetType <> nil then
|
||||||
FTypeCastInfo.AddReference;
|
FTypeCastTargetType.AddReference;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Result := IsValidTypeCast;
|
Result := IsValidTypeCast;
|
||||||
@ -4660,6 +4700,11 @@ begin
|
|||||||
SetKind(skPointer);
|
SetKind(skPointer);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TDbgDwarfTypeIdentifierPointer.SizeNeeded;
|
||||||
|
begin
|
||||||
|
SetSize(FCU.FAddressSize);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TDbgDwarfTypeIdentifierPointer.ForwardToSymbolNeeded;
|
procedure TDbgDwarfTypeIdentifierPointer.ForwardToSymbolNeeded;
|
||||||
begin
|
begin
|
||||||
if IsInternalPointer then
|
if IsInternalPointer then
|
||||||
@ -4706,6 +4751,14 @@ begin
|
|||||||
Result := TDbgDwarfPointerSymbolValue.Create(Self, FCU.FAddressSize);
|
Result := TDbgDwarfPointerSymbolValue.Create(Self, FCU.FAddressSize);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TDbgDwarfTypeIdentifierPointer.DataSize: Integer;
|
||||||
|
begin
|
||||||
|
if Kind = skClass then
|
||||||
|
Result := NestedTypeInfo.Size
|
||||||
|
else
|
||||||
|
Result := inherited DataSize;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TDbgDwarfTypeIdentifierDeclaration }
|
{ TDbgDwarfTypeIdentifierDeclaration }
|
||||||
|
|
||||||
function TDbgDwarfTypeIdentifierDeclaration.DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier;
|
function TDbgDwarfTypeIdentifierDeclaration.DoGetNestedTypeInfo: TDbgDwarfTypeIdentifier;
|
||||||
@ -5508,6 +5561,17 @@ begin
|
|||||||
SetTypeInfo(NestedTypeInfo);
|
SetTypeInfo(NestedTypeInfo);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TDbgDwarfIdentifier.DataSize: Integer;
|
||||||
|
var
|
||||||
|
t: TDbgDwarfTypeIdentifier;
|
||||||
|
begin
|
||||||
|
t := NestedTypeInfo;
|
||||||
|
if t <> nil then
|
||||||
|
Result := t.DataSize
|
||||||
|
else
|
||||||
|
Result := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TDbgDwarfIdentifier.InitLocationParser(const ALocationParser: TDwarfLocationExpression;
|
procedure TDbgDwarfIdentifier.InitLocationParser(const ALocationParser: TDwarfLocationExpression;
|
||||||
AnObjectDataAddress: TDbgPtr);
|
AnObjectDataAddress: TDbgPtr);
|
||||||
begin
|
begin
|
||||||
|
@ -458,8 +458,10 @@ begin
|
|||||||
ExpFlags(FieldsExp);
|
ExpFlags(FieldsExp);
|
||||||
if i in [7..9, 16] then
|
if i in [7..9, 16] then
|
||||||
ExpFlags([], [svfAddress]);
|
ExpFlags([], [svfAddress]);
|
||||||
if svfAddress in FieldsExp then
|
if svfAddress in FieldsExp then begin
|
||||||
ExpResult(svfAddress, AddrExp);
|
ExpResult(svfAddress, AddrExp);
|
||||||
|
ExpFlags([svfSizeOfPointer]);
|
||||||
|
end;
|
||||||
ExpResult(svfDataAddress, TDbgPtr(PtrUInt(ImageLoader.TestStackFrame.Obj1)));
|
ExpResult(svfDataAddress, TDbgPtr(PtrUInt(ImageLoader.TestStackFrame.Obj1)));
|
||||||
ExpResult(svfOrdinal, PtrUInt (ImageLoader.TestStackFrame.Obj1));
|
ExpResult(svfOrdinal, PtrUInt (ImageLoader.TestStackFrame.Obj1));
|
||||||
case i of
|
case i of
|
||||||
@ -566,7 +568,7 @@ begin
|
|||||||
StartTest('PRec1', skPointer, [ttHasType]);
|
StartTest('PRec1', skPointer, [ttHasType]);
|
||||||
ExpFlags([svfCardinal, svfOrdinal, svfAddress, svfDataAddress]); // svfSize;
|
ExpFlags([svfCardinal, svfOrdinal, svfAddress, svfDataAddress]); // svfSize;
|
||||||
|
|
||||||
for i := 0 to 5 do begin
|
for i := 0 to 7 do begin
|
||||||
case i of
|
case i of
|
||||||
0: s := 'Rec1';
|
0: s := 'Rec1';
|
||||||
1: s := 'PRec1^';
|
1: s := 'PRec1^';
|
||||||
@ -574,6 +576,8 @@ begin
|
|||||||
3: s := '(@PRec1)^^';
|
3: s := '(@PRec1)^^';
|
||||||
4: s := 'VParamTestSetup1Record';
|
4: s := 'VParamTestSetup1Record';
|
||||||
5: s := 'VParamTestRecord^';
|
5: s := 'VParamTestRecord^';
|
||||||
|
6: s := 'TTestSetup1Record(Rec1)';
|
||||||
|
7: s := 'TTestSetup1Record2(Rec1)'; // TTestSetup1Record2 is a sdistinct type, but same sive (actually identical)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
StartTest(s, skRecord, [ttHasType]);
|
StartTest(s, skRecord, [ttHasType]);
|
||||||
@ -615,6 +619,11 @@ begin
|
|||||||
ExpFlags([svfCardinal, svfOrdinal, svfAddress]);
|
ExpFlags([svfCardinal, svfOrdinal, svfAddress]);
|
||||||
|
|
||||||
|
|
||||||
|
StartInvalTest('TTestSetup1Record3(Rec1)', 'xxx'); // wrong size
|
||||||
|
StartInvalTest('TTestSetup1Record3(Rec1).FWord', 'xxx'); // wrong size
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// type = Object ... end;
|
// type = Object ... end;
|
||||||
StartTest('OldObj1', skObject, [ttHasType]);
|
StartTest('OldObj1', skObject, [ttHasType]);
|
||||||
ExpFlags([svfMembers, svfAddress], [svfOrdinal, svfCardinal, svfInteger, svfDataAddress]);
|
ExpFlags([svfMembers, svfAddress], [svfOrdinal, svfCardinal, svfInteger, svfDataAddress]);
|
||||||
@ -628,7 +637,7 @@ begin
|
|||||||
ImageLoader.TestStackFrame.VParamTestSetup1Object := @vobj1;
|
ImageLoader.TestStackFrame.VParamTestSetup1Object := @vobj1;
|
||||||
ImageLoader.TestStackFrame.VParamTestSetup1ObjectP := @ImageLoader.TestStackFrame.POldObj1;
|
ImageLoader.TestStackFrame.VParamTestSetup1ObjectP := @ImageLoader.TestStackFrame.POldObj1;
|
||||||
|
|
||||||
for i := 0 to 5 do begin
|
for i := 0 to 7 do begin
|
||||||
case i of
|
case i of
|
||||||
2,4: AddrExp := TDbgPtr(PtrUInt(@ImageLoader.TestStackFrame.OldObj1));
|
2,4: AddrExp := TDbgPtr(PtrUInt(@ImageLoader.TestStackFrame.OldObj1));
|
||||||
else AddrExp := TDbgPtr(PtrUInt(@vobj1));
|
else AddrExp := TDbgPtr(PtrUInt(@vobj1));
|
||||||
@ -640,6 +649,8 @@ begin
|
|||||||
3: s := 'POldObj1^';
|
3: s := 'POldObj1^';
|
||||||
4: s := '(@OldObj1)^';
|
4: s := '(@OldObj1)^';
|
||||||
5: s := '(@POldObj1)^^';
|
5: s := '(@POldObj1)^^';
|
||||||
|
6: s := 'TTestSetup1Object(VParamTestSetup1Object)';
|
||||||
|
7: s := 'TTestSetup1Object2(VParamTestSetup1Object)';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
StartTest(s, skObject, [ttHasType]);
|
StartTest(s, skObject, [ttHasType]);
|
||||||
@ -662,6 +673,7 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
StartInvalTest('TTestSetup1Object3(VParamTestSetup1Object)', 'xxx');
|
||||||
|
|
||||||
// pointer
|
// pointer
|
||||||
ImageLoader.TestStackFrame.Int1 := -299;
|
ImageLoader.TestStackFrame.Int1 := -299;
|
||||||
|
Loading…
Reference in New Issue
Block a user