mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2024-06-08 10:35:18 +00:00
Optimize unused variable checks to only run on scopes with variables.
This reduces the overhead of them considerably.
This commit is contained in:
parent
09fbfb1905
commit
a7551d8c44
94
Symbol.pas
94
Symbol.pas
|
@ -68,6 +68,9 @@ uses CCommon, CGI, MM, Scanner;
|
||||||
|
|
||||||
{---------------------------------------------------------------}
|
{---------------------------------------------------------------}
|
||||||
|
|
||||||
|
const
|
||||||
|
staticNumLen = 5; {length of staticNum name prefix}
|
||||||
|
|
||||||
type
|
type
|
||||||
symbolTablePtr = ^symbolTable;
|
symbolTablePtr = ^symbolTable;
|
||||||
symbolTable = record {a symbol table}
|
symbolTable = record {a symbol table}
|
||||||
|
@ -76,6 +79,7 @@ type
|
||||||
next: symbolTablePtr; {next symbol table}
|
next: symbolTablePtr; {next symbol table}
|
||||||
staticNum: packed array[1..6] of char; {staticNum at start of table}
|
staticNum: packed array[1..6] of char; {staticNum at start of table}
|
||||||
isEmpty: boolean; {is the pool empty (nothing in buckets)?}
|
isEmpty: boolean; {is the pool empty (nothing in buckets)?}
|
||||||
|
noStatics: boolean; {no statics using this staticNum?}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
|
@ -478,6 +482,53 @@ for i := 0 to hashSize do begin
|
||||||
end; {CheckStaticFunctions}
|
end; {CheckStaticFunctions}
|
||||||
|
|
||||||
|
|
||||||
|
procedure CheckUnused {tPtr: symbolTablePtr};
|
||||||
|
|
||||||
|
{ check for unused variables in symbol table }
|
||||||
|
|
||||||
|
var
|
||||||
|
i: integer; {loop variable}
|
||||||
|
ip: identPtr; {current symbol}
|
||||||
|
nameStr: stringPtr;
|
||||||
|
|
||||||
|
begin {CheckUnused}
|
||||||
|
if not tPtr^.isEmpty or not tPtr^.noStatics then
|
||||||
|
for i := 0 to hashSize do begin {loop over all hash buckets}
|
||||||
|
if not tPtr^.isEmpty then begin
|
||||||
|
ip := tPtr^.buckets[i]; {trace through non-static symbols}
|
||||||
|
while ip <> nil do begin
|
||||||
|
if not ip^.used then
|
||||||
|
if ip^.itype <> nil then
|
||||||
|
if not (ip^.itype^.kind in [functionType,enumConst]) then
|
||||||
|
if ip^.storage in [stackFrame,private] then
|
||||||
|
if not (ip^.name^[1] in ['~','@']) then begin
|
||||||
|
new(nameStr);
|
||||||
|
nameStr^ := ip^.name^;
|
||||||
|
ErrorWithExtraString(185, nameStr);
|
||||||
|
end; {if}
|
||||||
|
ip := ip^.next;
|
||||||
|
end; {while}
|
||||||
|
end; {if}
|
||||||
|
if not tPtr^.noStatics then begin
|
||||||
|
ip := globalTable^.buckets[i]; {trace through static symbols}
|
||||||
|
while ip <> nil do begin
|
||||||
|
if not ip^.used then
|
||||||
|
if ip^.itype <> nil then
|
||||||
|
if not (ip^.itype^.kind in [functionType,enumConst]) then
|
||||||
|
if ip^.storage = private then
|
||||||
|
if copy(ip^.name^,1,staticNumLen) = tPtr^.staticNum then
|
||||||
|
begin
|
||||||
|
new(nameStr);
|
||||||
|
nameStr^ := copy(ip^.name^, staticNumLen+1, maxint);
|
||||||
|
ErrorWithExtraString(185, nameStr);
|
||||||
|
end; {if}
|
||||||
|
ip := ip^.next;
|
||||||
|
end; {while}
|
||||||
|
end; {if}
|
||||||
|
end; {for}
|
||||||
|
end; {CheckUnused}
|
||||||
|
|
||||||
|
|
||||||
function CompTypes {t1, t2: typePtr): boolean};
|
function CompTypes {t1, t2: typePtr): boolean};
|
||||||
|
|
||||||
{ Determine if the two types are compatible }
|
{ Determine if the two types are compatible }
|
||||||
|
@ -2384,6 +2435,7 @@ if needSymbol then begin
|
||||||
end {if}
|
end {if}
|
||||||
else begin
|
else begin
|
||||||
hashPtr := pointer(ord4(globalTable)+Hash(name));
|
hashPtr := pointer(ord4(globalTable)+Hash(name));
|
||||||
|
table^.noStatics := false;
|
||||||
end; {else}
|
end; {else}
|
||||||
if space = tagSpace then
|
if space = tagSpace then
|
||||||
hashPtr := pointer(ord4(hashPtr) + 4*(hashSize+1));
|
hashPtr := pointer(ord4(hashPtr) + 4*(hashSize+1));
|
||||||
|
@ -2427,47 +2479,6 @@ useGlobalPool := lUseGlobalPool; {restore the useGlobalPool variable}
|
||||||
end; {NewSymbol}
|
end; {NewSymbol}
|
||||||
|
|
||||||
|
|
||||||
procedure CheckUnused {tPtr: symbolTablePtr};
|
|
||||||
|
|
||||||
{ check for unused variables in symbol table }
|
|
||||||
|
|
||||||
var
|
|
||||||
i: integer; {loop variable}
|
|
||||||
ip: identPtr; {current symbol}
|
|
||||||
nameStr: stringPtr;
|
|
||||||
|
|
||||||
begin {CheckUnused}
|
|
||||||
for i := 0 to hashSize do begin {loop over all hash buckets}
|
|
||||||
ip := tPtr^.buckets[i]; {trace through non-static symbols}
|
|
||||||
while ip <> nil do begin
|
|
||||||
if not ip^.used then
|
|
||||||
if ip^.itype <> nil then
|
|
||||||
if not (ip^.itype^.kind in [functionType,enumConst]) then
|
|
||||||
if ip^.storage in [stackFrame,private] then
|
|
||||||
if not (ip^.name^[1] in ['~','@']) then begin
|
|
||||||
new(nameStr);
|
|
||||||
nameStr^ := ip^.name^;
|
|
||||||
ErrorWithExtraString(185, nameStr);
|
|
||||||
end; {if}
|
|
||||||
ip := ip^.next;
|
|
||||||
end; {while}
|
|
||||||
ip := globalTable^.buckets[i]; {trace through static symbols}
|
|
||||||
while ip <> nil do begin
|
|
||||||
if not ip^.used then
|
|
||||||
if ip^.itype <> nil then
|
|
||||||
if not (ip^.itype^.kind in [functionType,enumConst]) then
|
|
||||||
if ip^.storage = private then
|
|
||||||
if copy(ip^.name^,1,5) = tPtr^.staticNum then begin
|
|
||||||
new(nameStr);
|
|
||||||
nameStr^ := copy(ip^.name^, 6, maxint);
|
|
||||||
ErrorWithExtraString(185, nameStr);
|
|
||||||
end; {if}
|
|
||||||
ip := ip^.next;
|
|
||||||
end; {while}
|
|
||||||
end; {for}
|
|
||||||
end; {CheckUnused}
|
|
||||||
|
|
||||||
|
|
||||||
procedure PopTable;
|
procedure PopTable;
|
||||||
|
|
||||||
{ Pop a symbol table (remove definitions local to a block) }
|
{ Pop a symbol table (remove definitions local to a block) }
|
||||||
|
@ -2530,6 +2541,7 @@ else begin
|
||||||
tPtr^.next := table;
|
tPtr^.next := table;
|
||||||
table := tPtr;
|
table := tPtr;
|
||||||
tPtr^.staticNum := staticNum; {record the static symbol table number}
|
tPtr^.staticNum := staticNum; {record the static symbol table number}
|
||||||
|
tPtr^.noStatics := true;
|
||||||
end; {PushTable}
|
end; {PushTable}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user