* reimplemented r28329 in a different way, as suggested by Jonas

git-svn-id: trunk@28332 -
This commit is contained in:
nickysn 2014-08-07 19:36:52 +00:00
parent ff77bd1bf2
commit 94bcb9878a
7 changed files with 121 additions and 44 deletions

View File

@ -508,14 +508,14 @@ type
destructor Destroy; override; destructor Destroy; override;
procedure Clear; procedure Clear;
{ finds an entry by key } { 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 } { finds an entry, creates one if not exists }
function FindOrAdd(Key: Pointer; KeyLen: Integer; function FindOrAdd(Key: Pointer; KeyLen: Integer;
var Found: Boolean): PHashSetItem; var Found: Boolean): PHashSetItem;virtual;
{ finds an entry, creates one if not exists } { 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 } { 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 } { removes an entry, returns False if entry wasn't there }
function Remove(Entry: PHashSetItem): Boolean; function Remove(Entry: PHashSetItem): Boolean;
property Count: LongWord read FCount; property Count: LongWord read FCount;

View File

@ -142,10 +142,7 @@ interface
checkforwarddefs, checkforwarddefs,
deflist, deflist,
symlist : TFPObjectList; symlist : TFPObjectList;
ptrdefs : THashSet; { list of pointerdefs created in this module so we can reuse them (not saved/restored) } ptrdefs : tPtrDefHashSet; { list of pointerdefs created in this module so we can reuse them (not saved/restored) }
{$ifdef x86}
x86ptrdefs : array [tx86pointertyp] of THashSet;
{$endif x86}
arraydefs : THashSet; { list of single-element-arraydefs 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 } 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 } wpoinfo : tunitwpoinfobase; { whole program optimization-related information that is generated during the current run for this unit }
@ -517,9 +514,6 @@ implementation
var var
n:string; n:string;
fn:TPathStr; fn:TPathStr;
{$ifdef x86}
ptrtyp:tx86pointertyp;
{$endif x86}
begin begin
if amodulename='' then if amodulename='' then
n:=ChangeFileExt(ExtractFileName(afilename),'') n:=ChangeFileExt(ExtractFileName(afilename),'')
@ -573,13 +567,7 @@ implementation
derefdataintflen:=0; derefdataintflen:=0;
deflist:=TFPObjectList.Create(false); deflist:=TFPObjectList.Create(false);
symlist:=TFPObjectList.Create(false); symlist:=TFPObjectList.Create(false);
{$ifdef x86} ptrdefs:=cPtrDefHashSet.Create;
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}
arraydefs:=THashSet.Create(64,true,false); arraydefs:=THashSet.Create(64,true,false);
ansistrdef:=nil; ansistrdef:=nil;
wpoinfo:=nil; wpoinfo:=nil;
@ -622,9 +610,6 @@ implementation
var var
i : longint; i : longint;
current_debuginfo_reset : boolean; current_debuginfo_reset : boolean;
{$ifdef x86}
ptrtyp : tx86pointertyp;
{$endif x86}
begin begin
if assigned(unitmap) then if assigned(unitmap) then
freemem(unitmap); freemem(unitmap);
@ -696,13 +681,7 @@ implementation
derefdata.free; derefdata.free;
deflist.free; deflist.free;
symlist.free; symlist.free;
{$ifdef x86}
for ptrtyp in tx86pointertyp do
x86ptrdefs[ptrtyp].free;
ptrdefs:=nil;
{$else x86}
ptrdefs.free; ptrdefs.free;
{$endif x86}
arraydefs.free; arraydefs.free;
ansistrdef:=nil; ansistrdef:=nil;
wpoinfo.free; wpoinfo.free;
@ -722,9 +701,6 @@ implementation
var var
i : longint; i : longint;
current_debuginfo_reset : boolean; current_debuginfo_reset : boolean;
{$ifdef x86}
ptrtyp : tx86pointertyp;
{$endif x86}
begin begin
if assigned(scanner) then if assigned(scanner) then
begin begin
@ -767,17 +743,8 @@ implementation
deflist:=TFPObjectList.Create(false); deflist:=TFPObjectList.Create(false);
symlist.free; symlist.free;
symlist:=TFPObjectList.Create(false); 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.free;
ptrdefs:=THashSet.Create(64,true,false); ptrdefs:=cPtrDefHashSet.Create;
{$endif x86}
arraydefs.free; arraydefs.free;
arraydefs:=THashSet.Create(64,true,false); arraydefs:=THashSet.Create(64,true,false);
wpoinfo.free; wpoinfo.free;

View File

@ -207,5 +207,7 @@ begin
cconstsym:=tcpuconstsym; cconstsym:=tcpuconstsym;
cenumsym:=tcpuenumsym; cenumsym:=tcpuenumsym;
csyssym:=tcpusyssym; csyssym:=tcpusyssym;
cPtrDefHashSet:=tx86PtrDefHashSet;
end. end.

View File

@ -219,7 +219,7 @@ const
implementation implementation
uses uses
globals, cpuinfo, verbose; globals, cpuinfo, verbose, fmodule;
function is_proc_far(p: tabstractprocdef): boolean; function is_proc_far(p: tabstractprocdef): boolean;
@ -470,5 +470,7 @@ begin
cconstsym:=tcpuconstsym; cconstsym:=tcpuconstsym;
cenumsym:=tcpuenumsym; cenumsym:=tcpuenumsym;
csyssym:=tcpusyssym; csyssym:=tcpusyssym;
cPtrDefHashSet:=tx86PtrDefHashSet;
end. end.

View File

@ -435,6 +435,14 @@ interface
function GetCopy:tmacro; function GetCopy:tmacro;
end; end;
{ tPtrDefHashSet }
tPtrDefHashSet = class(THashSet)
public
constructor Create;virtual;
end;
tPtrDefHashSetClass = class of tPtrDefHashSet;
var var
generrorsym : tsym; generrorsym : tsym;
@ -452,6 +460,7 @@ interface
cconstsym: tconstsymclass; cconstsym: tconstsymclass;
cenumsym: tenumsymclass; cenumsym: tenumsymclass;
csyssym: tsyssymclass; csyssym: tsyssymclass;
cPtrDefHashSet : tPtrDefHashSetClass = tPtrDefHashSet;
{ generate internal static field name based on regular field name } { generate internal static field name based on regular field name }
function internal_static_field_name(const fieldname: TSymStr): TSymStr; function internal_static_field_name(const fieldname: TSymStr): TSymStr;
@ -2690,4 +2699,14 @@ implementation
Result:=p; Result:=p;
end; end;
{****************************************************************************
tPtrDefHashSet
****************************************************************************}
constructor tPtrDefHashSet.Create;
begin
inherited Create(64,true,false);
end;
end. end.

View File

@ -26,7 +26,7 @@ unit symx86;
interface interface
uses uses
globtype, globtype, cclasses,
symconst, symtype,symdef,symsym; symconst, symtype,symdef,symsym;
type type
@ -45,6 +45,24 @@ type
end; end;
tx86pointerdefclass = class of tx86pointerdef; 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 { returns a pointerdef for def, reusing an existing one in case it exists
in the current module } in the current module }
function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef; function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef;
@ -52,17 +70,20 @@ type
implementation implementation
uses uses
globals, verbose, cclasses, globals, verbose,
symbase, fmodule; symbase, fmodule;
function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef; function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef;
var var
res: PHashSetItem; res: PHashSetItem;
oldsymtablestack: tsymtablestack; oldsymtablestack: tsymtablestack;
key: tx86PtrDefKey;
begin begin
if not assigned(current_module) then if not assigned(current_module) then
internalerror(2011071101); 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 if not assigned(res^.Data) then
begin begin
{ since these pointerdefs can be reused anywhere in the current { since these pointerdefs can be reused anywhere in the current
@ -167,5 +188,69 @@ implementation
end; 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. end.

View File

@ -207,5 +207,7 @@ begin
cconstsym:=tcpuconstsym; cconstsym:=tcpuconstsym;
cenumsym:=tcpuenumsym; cenumsym:=tcpuenumsym;
csyssym:=tcpusyssym; csyssym:=tcpusyssym;
cPtrDefHashSet:=tx86PtrDefHashSet;
end. end.