mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 01:48:00 +02:00
* reimplemented r28329 in a different way, as suggested by Jonas
git-svn-id: trunk@28332 -
This commit is contained in:
parent
ff77bd1bf2
commit
94bcb9878a
@ -508,14 +508,14 @@ type
|
||||
destructor Destroy; override;
|
||||
procedure Clear;
|
||||
{ finds an entry by key }
|
||||
function Find(Key: Pointer; KeyLen: Integer): PHashSetItem;
|
||||
function Find(Key: Pointer; KeyLen: Integer): PHashSetItem;virtual;
|
||||
{ finds an entry, creates one if not exists }
|
||||
function FindOrAdd(Key: Pointer; KeyLen: Integer;
|
||||
var Found: Boolean): PHashSetItem;
|
||||
var Found: Boolean): PHashSetItem;virtual;
|
||||
{ finds an entry, creates one if not exists }
|
||||
function FindOrAdd(Key: Pointer; KeyLen: Integer): PHashSetItem;
|
||||
function FindOrAdd(Key: Pointer; KeyLen: Integer): PHashSetItem;virtual;
|
||||
{ returns Data by given Key }
|
||||
function Get(Key: Pointer; KeyLen: Integer): TObject;
|
||||
function Get(Key: Pointer; KeyLen: Integer): TObject;virtual;
|
||||
{ removes an entry, returns False if entry wasn't there }
|
||||
function Remove(Entry: PHashSetItem): Boolean;
|
||||
property Count: LongWord read FCount;
|
||||
|
@ -142,10 +142,7 @@ interface
|
||||
checkforwarddefs,
|
||||
deflist,
|
||||
symlist : TFPObjectList;
|
||||
ptrdefs : THashSet; { list of pointerdefs created in this module so we can reuse them (not saved/restored) }
|
||||
{$ifdef x86}
|
||||
x86ptrdefs : array [tx86pointertyp] of THashSet;
|
||||
{$endif x86}
|
||||
ptrdefs : tPtrDefHashSet; { list of pointerdefs created in this module so we can reuse them (not saved/restored) }
|
||||
arraydefs : THashSet; { list of single-element-arraydefs created in this module so we can reuse them (not saved/restored) }
|
||||
ansistrdef : tobject; { an ansistring def redefined for the current module }
|
||||
wpoinfo : tunitwpoinfobase; { whole program optimization-related information that is generated during the current run for this unit }
|
||||
@ -517,9 +514,6 @@ implementation
|
||||
var
|
||||
n:string;
|
||||
fn:TPathStr;
|
||||
{$ifdef x86}
|
||||
ptrtyp:tx86pointertyp;
|
||||
{$endif x86}
|
||||
begin
|
||||
if amodulename='' then
|
||||
n:=ChangeFileExt(ExtractFileName(afilename),'')
|
||||
@ -573,13 +567,7 @@ implementation
|
||||
derefdataintflen:=0;
|
||||
deflist:=TFPObjectList.Create(false);
|
||||
symlist:=TFPObjectList.Create(false);
|
||||
{$ifdef x86}
|
||||
for ptrtyp in tx86pointertyp do
|
||||
x86ptrdefs[ptrtyp]:=THashSet.Create(64,true,false);
|
||||
ptrdefs:=x86ptrdefs[tcpupointerdefclass(cpointerdef).default_x86_data_pointer_type];
|
||||
{$else x86}
|
||||
ptrdefs:=THashSet.Create(64,true,false);
|
||||
{$endif x86}
|
||||
ptrdefs:=cPtrDefHashSet.Create;
|
||||
arraydefs:=THashSet.Create(64,true,false);
|
||||
ansistrdef:=nil;
|
||||
wpoinfo:=nil;
|
||||
@ -622,9 +610,6 @@ implementation
|
||||
var
|
||||
i : longint;
|
||||
current_debuginfo_reset : boolean;
|
||||
{$ifdef x86}
|
||||
ptrtyp : tx86pointertyp;
|
||||
{$endif x86}
|
||||
begin
|
||||
if assigned(unitmap) then
|
||||
freemem(unitmap);
|
||||
@ -696,13 +681,7 @@ implementation
|
||||
derefdata.free;
|
||||
deflist.free;
|
||||
symlist.free;
|
||||
{$ifdef x86}
|
||||
for ptrtyp in tx86pointertyp do
|
||||
x86ptrdefs[ptrtyp].free;
|
||||
ptrdefs:=nil;
|
||||
{$else x86}
|
||||
ptrdefs.free;
|
||||
{$endif x86}
|
||||
arraydefs.free;
|
||||
ansistrdef:=nil;
|
||||
wpoinfo.free;
|
||||
@ -722,9 +701,6 @@ implementation
|
||||
var
|
||||
i : longint;
|
||||
current_debuginfo_reset : boolean;
|
||||
{$ifdef x86}
|
||||
ptrtyp : tx86pointertyp;
|
||||
{$endif x86}
|
||||
begin
|
||||
if assigned(scanner) then
|
||||
begin
|
||||
@ -767,17 +743,8 @@ implementation
|
||||
deflist:=TFPObjectList.Create(false);
|
||||
symlist.free;
|
||||
symlist:=TFPObjectList.Create(false);
|
||||
{$ifdef x86}
|
||||
for ptrtyp in tx86pointertyp do
|
||||
begin
|
||||
x86ptrdefs[ptrtyp].free;
|
||||
x86ptrdefs[ptrtyp]:=THashSet.Create(64,true,false);
|
||||
end;
|
||||
ptrdefs:=x86ptrdefs[tcpupointerdefclass(cpointerdef).default_x86_data_pointer_type];
|
||||
{$else x86}
|
||||
ptrdefs.free;
|
||||
ptrdefs:=THashSet.Create(64,true,false);
|
||||
{$endif x86}
|
||||
ptrdefs:=cPtrDefHashSet.Create;
|
||||
arraydefs.free;
|
||||
arraydefs:=THashSet.Create(64,true,false);
|
||||
wpoinfo.free;
|
||||
|
@ -207,5 +207,7 @@ begin
|
||||
cconstsym:=tcpuconstsym;
|
||||
cenumsym:=tcpuenumsym;
|
||||
csyssym:=tcpusyssym;
|
||||
|
||||
cPtrDefHashSet:=tx86PtrDefHashSet;
|
||||
end.
|
||||
|
||||
|
@ -219,7 +219,7 @@ const
|
||||
implementation
|
||||
|
||||
uses
|
||||
globals, cpuinfo, verbose;
|
||||
globals, cpuinfo, verbose, fmodule;
|
||||
|
||||
|
||||
function is_proc_far(p: tabstractprocdef): boolean;
|
||||
@ -470,5 +470,7 @@ begin
|
||||
cconstsym:=tcpuconstsym;
|
||||
cenumsym:=tcpuenumsym;
|
||||
csyssym:=tcpusyssym;
|
||||
|
||||
cPtrDefHashSet:=tx86PtrDefHashSet;
|
||||
end.
|
||||
|
||||
|
@ -435,6 +435,14 @@ interface
|
||||
function GetCopy:tmacro;
|
||||
end;
|
||||
|
||||
{ tPtrDefHashSet }
|
||||
|
||||
tPtrDefHashSet = class(THashSet)
|
||||
public
|
||||
constructor Create;virtual;
|
||||
end;
|
||||
tPtrDefHashSetClass = class of tPtrDefHashSet;
|
||||
|
||||
var
|
||||
generrorsym : tsym;
|
||||
|
||||
@ -452,6 +460,7 @@ interface
|
||||
cconstsym: tconstsymclass;
|
||||
cenumsym: tenumsymclass;
|
||||
csyssym: tsyssymclass;
|
||||
cPtrDefHashSet : tPtrDefHashSetClass = tPtrDefHashSet;
|
||||
|
||||
{ generate internal static field name based on regular field name }
|
||||
function internal_static_field_name(const fieldname: TSymStr): TSymStr;
|
||||
@ -2690,4 +2699,14 @@ implementation
|
||||
Result:=p;
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
tPtrDefHashSet
|
||||
****************************************************************************}
|
||||
|
||||
constructor tPtrDefHashSet.Create;
|
||||
begin
|
||||
inherited Create(64,true,false);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
@ -26,7 +26,7 @@ unit symx86;
|
||||
interface
|
||||
|
||||
uses
|
||||
globtype,
|
||||
globtype, cclasses,
|
||||
symconst, symtype,symdef,symsym;
|
||||
|
||||
type
|
||||
@ -45,6 +45,24 @@ type
|
||||
end;
|
||||
tx86pointerdefclass = class of tx86pointerdef;
|
||||
|
||||
tx86PtrDefKey = packed record
|
||||
def: tdef;
|
||||
x86typ:tx86pointertyp;
|
||||
end;
|
||||
|
||||
{ tx86PtrDefHashSet }
|
||||
|
||||
tx86PtrDefHashSet = class(TPtrDefHashSet)
|
||||
private
|
||||
class procedure Key2FullKey(Key: Pointer; out FullKey: tx86PtrDefKey);
|
||||
public
|
||||
function Find(Key: Pointer; KeyLen: Integer): PHashSetItem;override;
|
||||
function FindOrAdd(Key: Pointer; KeyLen: Integer;
|
||||
var Found: Boolean): PHashSetItem;override;
|
||||
function FindOrAdd(Key: Pointer; KeyLen: Integer): PHashSetItem;override;
|
||||
function Get(Key: Pointer; KeyLen: Integer): TObject;override;
|
||||
end;
|
||||
|
||||
{ returns a pointerdef for def, reusing an existing one in case it exists
|
||||
in the current module }
|
||||
function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef;
|
||||
@ -52,17 +70,20 @@ type
|
||||
implementation
|
||||
|
||||
uses
|
||||
globals, verbose, cclasses,
|
||||
globals, verbose,
|
||||
symbase, fmodule;
|
||||
|
||||
function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef;
|
||||
var
|
||||
res: PHashSetItem;
|
||||
oldsymtablestack: tsymtablestack;
|
||||
key: tx86PtrDefKey;
|
||||
begin
|
||||
if not assigned(current_module) then
|
||||
internalerror(2011071101);
|
||||
res:=current_module.x86ptrdefs[x86typ].FindOrAdd(@def,sizeof(def));
|
||||
key.def:=def;
|
||||
key.x86typ:=x86typ;
|
||||
res:=current_module.ptrdefs.FindOrAdd(@key,sizeof(key));
|
||||
if not assigned(res^.Data) then
|
||||
begin
|
||||
{ since these pointerdefs can be reused anywhere in the current
|
||||
@ -167,5 +188,69 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
tx86PtrDefHashSet
|
||||
****************************************************************************}
|
||||
|
||||
class procedure tx86PtrDefHashSet.Key2FullKey(Key: Pointer; out FullKey: tx86PtrDefKey);
|
||||
type
|
||||
pdef=^tdef;
|
||||
begin
|
||||
FullKey.def:=pdef(Key)^;
|
||||
FullKey.x86typ:=tx86pointerdefclass(cpointerdef).default_x86_data_pointer_type;
|
||||
end;
|
||||
|
||||
function tx86PtrDefHashSet.Find(Key: Pointer; KeyLen: Integer): PHashSetItem;
|
||||
var
|
||||
FullKey: tx86PtrDefKey;
|
||||
begin
|
||||
if KeyLen=SizeOf(tdef) then
|
||||
begin
|
||||
Key2FullKey(Key, FullKey);
|
||||
Result:=inherited Find(@FullKey, SizeOf(FullKey));
|
||||
end
|
||||
else
|
||||
Result:=inherited Find(Key, KeyLen);
|
||||
end;
|
||||
|
||||
function tx86PtrDefHashSet.FindOrAdd(Key: Pointer; KeyLen: Integer; var Found: Boolean): PHashSetItem;
|
||||
var
|
||||
FullKey: tx86PtrDefKey;
|
||||
begin
|
||||
if KeyLen=SizeOf(tdef) then
|
||||
begin
|
||||
Key2FullKey(Key, FullKey);
|
||||
Result:=inherited FindOrAdd(@FullKey, SizeOf(FullKey), Found);
|
||||
end
|
||||
else
|
||||
Result:=inherited FindOrAdd(Key, KeyLen, Found);
|
||||
end;
|
||||
|
||||
function tx86PtrDefHashSet.FindOrAdd(Key: Pointer; KeyLen: Integer): PHashSetItem;
|
||||
var
|
||||
FullKey: tx86PtrDefKey;
|
||||
begin
|
||||
if KeyLen=SizeOf(tdef) then
|
||||
begin
|
||||
Key2FullKey(Key, FullKey);
|
||||
Result:=inherited FindOrAdd(@FullKey, SizeOf(FullKey));
|
||||
end
|
||||
else
|
||||
Result:=inherited FindOrAdd(Key, KeyLen);
|
||||
end;
|
||||
|
||||
function tx86PtrDefHashSet.Get(Key: Pointer; KeyLen: Integer): TObject;
|
||||
var
|
||||
FullKey: tx86PtrDefKey;
|
||||
begin
|
||||
if KeyLen=SizeOf(tdef) then
|
||||
begin
|
||||
Key2FullKey(Key, FullKey);
|
||||
Result:=inherited Get(@FullKey, SizeOf(FullKey));
|
||||
end
|
||||
else
|
||||
Result:=inherited Get(Key, KeyLen);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
@ -207,5 +207,7 @@ begin
|
||||
cconstsym:=tcpuconstsym;
|
||||
cenumsym:=tcpuenumsym;
|
||||
csyssym:=tcpusyssym;
|
||||
|
||||
cPtrDefHashSet:=tx86PtrDefHashSet;
|
||||
end.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user