mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-17 16:22:46 +02:00
codetools: h2p: removing redefiend macros
git-svn-id: trunk@14667 -
This commit is contained in:
parent
f02bfe9efa
commit
cf5329f598
@ -23,6 +23,7 @@ extern "C" {
|
|||||||
#define macro1 1
|
#define macro1 1
|
||||||
|
|
||||||
// empty macro
|
// empty macro
|
||||||
|
#define MPI_FILE_DEFINED // double definition, this one will be removed
|
||||||
#define MPI_FILE_DEFINED
|
#define MPI_FILE_DEFINED
|
||||||
// null pointer
|
// null pointer
|
||||||
#define MPI_BOTTOM (void *)0
|
#define MPI_BOTTOM (void *)0
|
||||||
|
@ -39,6 +39,8 @@
|
|||||||
-> const macroname = constant
|
-> const macroname = constant
|
||||||
|
|
||||||
ToDos:
|
ToDos:
|
||||||
|
add comments for skipped items
|
||||||
|
insert auto generated types in front of current node
|
||||||
c comments
|
c comments
|
||||||
const char a; -> const a: char;
|
const char a; -> const a: char;
|
||||||
simplify conditional directives (e.g. #ifdef)
|
simplify conditional directives (e.g. #ifdef)
|
||||||
@ -159,6 +161,8 @@ type
|
|||||||
Name: string;
|
Name: string;
|
||||||
Value: string;
|
Value: string;
|
||||||
Status: TH2PMacroStatus;
|
Status: TH2PMacroStatus;
|
||||||
|
LastDefineNode: TH2PNode;// define or undef node
|
||||||
|
LastReadNode: TH2PNode;// if node
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -225,6 +229,9 @@ type
|
|||||||
var Changed: boolean);
|
var Changed: boolean);
|
||||||
function MacroValueIsConstant(Node: TH2PDirectiveNode;
|
function MacroValueIsConstant(Node: TH2PDirectiveNode;
|
||||||
out PasType, PasExpression: string): boolean;
|
out PasType, PasExpression: string): boolean;
|
||||||
|
procedure SimplifyMacroRedefinition(var Node: TH2PDirectiveNode;
|
||||||
|
const NewValue: string; NewStatus: TH2PMacroStatus;
|
||||||
|
var NextNode: TH2PDirectiveNode; var Changed: boolean);
|
||||||
procedure DeleteDirectiveNode(Node: TH2PDirectiveNode;
|
procedure DeleteDirectiveNode(Node: TH2PDirectiveNode;
|
||||||
DeleteChilds: boolean;
|
DeleteChilds: boolean;
|
||||||
AdaptNeighborhood: boolean);
|
AdaptNeighborhood: boolean);
|
||||||
@ -290,8 +297,12 @@ type
|
|||||||
procedure InitMacros;
|
procedure InitMacros;
|
||||||
function FindMacro(const MacroName: string;
|
function FindMacro(const MacroName: string;
|
||||||
CreateIfNotExists: boolean = false): TH2PMacroStats;
|
CreateIfNotExists: boolean = false): TH2PMacroStats;
|
||||||
function DefineMacro(const MacroName, AValue: string): TH2PMacroStats;// use Defines instead
|
function DefineMacro(const MacroName, AValue: string;
|
||||||
function UndefineMacro(const MacroName: string): TH2PMacroStats;// use Undefines instead
|
DefineNode: TH2PNode): TH2PMacroStats;// use Defines instead
|
||||||
|
function UndefineMacro(const MacroName: string;
|
||||||
|
UndefineNode: TH2PNode): TH2PMacroStats;// use Undefines instead
|
||||||
|
function MarkMacroAsRead(const MacroName: string;
|
||||||
|
Node: TH2PNode): TH2PMacroStats;// use Undefines instead
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -1328,7 +1339,7 @@ begin
|
|||||||
h2pdnDefine:
|
h2pdnDefine:
|
||||||
if (DirNode.MacroParams='') then begin
|
if (DirNode.MacroParams='') then begin
|
||||||
SetPasSection(ctnNone);
|
SetPasSection(ctnNone);
|
||||||
if DirNode.Expression='' then begin
|
if ExtractCCode(DirNode.Expression)='' then begin
|
||||||
W('{$Define '+DirNode.MacroName+'}');
|
W('{$Define '+DirNode.MacroName+'}');
|
||||||
end else begin
|
end else begin
|
||||||
W('{$Define '+DirNode.MacroName+':='+CreateDirectiveValue(DirNode.Expression)+'}');
|
W('{$Define '+DirNode.MacroName+':='+CreateDirectiveValue(DirNode.Expression)+'}');
|
||||||
@ -1358,7 +1369,9 @@ end;
|
|||||||
procedure TH2PasTool.SimplifyUndefineDirective(Node: TH2PDirectiveNode;
|
procedure TH2PasTool.SimplifyUndefineDirective(Node: TH2PDirectiveNode;
|
||||||
var NextNode: TH2PDirectiveNode; var Changed: boolean);
|
var NextNode: TH2PDirectiveNode; var Changed: boolean);
|
||||||
begin
|
begin
|
||||||
UndefineMacro(Node.MacroName);
|
SimplifyMacroRedefinition(Node,'',hmsUndefined,NextNode,Changed);
|
||||||
|
if Node=nil then exit;
|
||||||
|
UndefineMacro(Node.MacroName,Node.H2PNode);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TH2PasTool.SimplifyDefineDirective(Node: TH2PDirectiveNode;
|
procedure TH2PasTool.SimplifyDefineDirective(Node: TH2PDirectiveNode;
|
||||||
@ -1411,10 +1424,12 @@ begin
|
|||||||
|
|
||||||
if Node.MacroParams='' then begin
|
if Node.MacroParams='' then begin
|
||||||
// a macro without parameters
|
// a macro without parameters
|
||||||
if Node.Expression='' then begin
|
if ExtractCCode(Node.Expression)='' then begin
|
||||||
// example: #define MPI_FILE_DEFINED
|
// example: #define MPI_FILE_DEFINED
|
||||||
// => simple macro flag
|
// => simple macro flag
|
||||||
DefineMacro(Node.MacroName,'');
|
SimplifyMacroRedefinition(Node,'',hmsDefined,NextNode,Changed);
|
||||||
|
if Node=nil then exit;
|
||||||
|
DefineMacro(Node.MacroName,'',Node.H2PNode);
|
||||||
end else if MacroValueIsConstant(Node,PasType,PasExpr) then begin
|
end else if MacroValueIsConstant(Node,PasType,PasExpr) then begin
|
||||||
// convert node to constant
|
// convert node to constant
|
||||||
H2PNode:=Node.H2PNode;
|
H2PNode:=Node.H2PNode;
|
||||||
@ -1426,6 +1441,7 @@ begin
|
|||||||
H2PNode.PascalCode:=': '+PasType+H2PNode.PascalCode;
|
H2PNode.PascalCode:=': '+PasType+H2PNode.PascalCode;
|
||||||
FPascalNames.Add(H2PNode);
|
FPascalNames.Add(H2PNode);
|
||||||
FCNames.Add(H2PNode);
|
FCNames.Add(H2PNode);
|
||||||
|
DefineMacro(H2PNode.CName,PasExpr,nil);
|
||||||
NextNode:=TH2PDirectiveNode(Node.NextSkipChilds);
|
NextNode:=TH2PDirectiveNode(Node.NextSkipChilds);
|
||||||
Node.H2PNode:=nil;
|
Node.H2PNode:=nil;
|
||||||
H2PNode.Directive:=nil;
|
H2PNode.Directive:=nil;
|
||||||
@ -1434,7 +1450,7 @@ begin
|
|||||||
Changed:=true;
|
Changed:=true;
|
||||||
end;
|
end;
|
||||||
end else begin
|
end else begin
|
||||||
|
DefineMacro(Node.MacroName,Node.Expression,Node.H2PNode);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1550,7 +1566,8 @@ begin
|
|||||||
// is multiplication
|
// is multiplication
|
||||||
end else begin
|
end else begin
|
||||||
// don't know
|
// don't know
|
||||||
exit;
|
// At the moment all constants are allowed,
|
||||||
|
// so it is most probable a multiplication
|
||||||
end;
|
end;
|
||||||
end else if (CurAtom='|') or (CurAtom='||') then begin
|
end else if (CurAtom='|') or (CurAtom='||') then begin
|
||||||
Replace('or');
|
Replace('or');
|
||||||
@ -1566,6 +1583,48 @@ begin
|
|||||||
Result:=true;
|
Result:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TH2PasTool.SimplifyMacroRedefinition(var Node: TH2PDirectiveNode;
|
||||||
|
const NewValue: string; NewStatus: TH2PMacroStatus;
|
||||||
|
var NextNode: TH2PDirectiveNode; var Changed: boolean);
|
||||||
|
var
|
||||||
|
Macro: TH2PMacroStats;
|
||||||
|
Parent: TH2PBaseNode;
|
||||||
|
begin
|
||||||
|
if Node.MacroName='' then exit;
|
||||||
|
Macro:=FindMacro(Node.MacroName);
|
||||||
|
if Macro=nil then exit;
|
||||||
|
if Macro.LastDefineNode=nil then exit;
|
||||||
|
if Macro.LastReadNode=nil then begin
|
||||||
|
// macro was read, so last define is needed
|
||||||
|
if (Node.H2PNode<>nil)
|
||||||
|
and (Macro.LastDefineNode.Parent=Node.H2PNode.Parent)
|
||||||
|
and (Macro.Status=NewStatus) and (Macro.Value=NewValue) then
|
||||||
|
begin
|
||||||
|
// value is kept => the new Node is a redefinition
|
||||||
|
if (NextNode=Node) or (Node.HasAsChild(NextNode)) then
|
||||||
|
NextNode:=TH2PDirectiveNode(Node.NextSkipChilds);
|
||||||
|
DebugLn(['TH2PasTool.SimplifyMacroRedefinition DELETE redefinition ',Node.DescAsString(CTool)]);
|
||||||
|
DeleteDirectiveNode(Node,false,false);
|
||||||
|
Node:=nil;
|
||||||
|
Changed:=true;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
// macro was not read since last write
|
||||||
|
Parent:=Macro.LastDefineNode.Parent;
|
||||||
|
repeat
|
||||||
|
if Parent=Node.Parent then begin
|
||||||
|
// last write was on same or lower level
|
||||||
|
// => last write is not needed
|
||||||
|
DebugLn(['TH2PasTool.SimplifyMacroRedefinition DELETE unused ',Macro.LastDefineNode.DescAsString(CTool)]);
|
||||||
|
DeleteH2PNode(Macro.LastDefineNode);
|
||||||
|
Changed:=true;
|
||||||
|
end;
|
||||||
|
if Parent=nil then break;
|
||||||
|
Parent:=Parent.Parent;
|
||||||
|
until false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TH2PasTool.DeleteDirectiveNode(Node: TH2PDirectiveNode;
|
procedure TH2PasTool.DeleteDirectiveNode(Node: TH2PDirectiveNode;
|
||||||
DeleteChilds: boolean; AdaptNeighborhood: boolean);
|
DeleteChilds: boolean; AdaptNeighborhood: boolean);
|
||||||
var
|
var
|
||||||
@ -1647,6 +1706,8 @@ end;
|
|||||||
procedure TH2PasTool.DeleteH2PNode(Node: TH2PNode);
|
procedure TH2PasTool.DeleteH2PNode(Node: TH2PNode);
|
||||||
var
|
var
|
||||||
DirNode: TH2PDirectiveNode;
|
DirNode: TH2PDirectiveNode;
|
||||||
|
AVLNode: TAVLTreeNode;
|
||||||
|
Macro: TH2PMacroStats;
|
||||||
begin
|
begin
|
||||||
if Node.PascalName<>'' then
|
if Node.PascalName<>'' then
|
||||||
FPascalNames.Remove(Node);
|
FPascalNames.Remove(Node);
|
||||||
@ -1662,6 +1723,18 @@ begin
|
|||||||
DirNode.H2PNode:=nil;
|
DirNode.H2PNode:=nil;
|
||||||
DeleteDirectiveNode(DirNode,false,true);
|
DeleteDirectiveNode(DirNode,false,true);
|
||||||
end;
|
end;
|
||||||
|
// check references
|
||||||
|
if Macros<>nil then begin
|
||||||
|
AVLNode:=Macros.FindLowest;
|
||||||
|
while AVLNode<>nil do begin
|
||||||
|
Macro:=TH2PMacroStats(AVLNode.Data);
|
||||||
|
if Macro.LastDefineNode=Node then
|
||||||
|
Macro.LastDefineNode:=nil;
|
||||||
|
if Macro.LastReadNode=Node then
|
||||||
|
Macro.LastReadNode:=nil;
|
||||||
|
AVLNode:=Macros.FindSuccessor(AVLNode);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
Tree.DeleteNode(Node);
|
Tree.DeleteNode(Node);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2371,7 +2444,7 @@ begin
|
|||||||
for i:=0 to List.Count-1 do begin
|
for i:=0 to List.Count-1 do begin
|
||||||
CurName:=List[i];
|
CurName:=List[i];
|
||||||
CurValue:=FDefines[CurName];
|
CurValue:=FDefines[CurName];
|
||||||
DefineMacro(CurName,CurValue);
|
DefineMacro(CurName,CurValue,nil);
|
||||||
end;
|
end;
|
||||||
List.Free;
|
List.Free;
|
||||||
end;
|
end;
|
||||||
@ -2380,7 +2453,7 @@ begin
|
|||||||
FUndefines.GetNames(List);
|
FUndefines.GetNames(List);
|
||||||
for i:=0 to List.Count-1 do begin
|
for i:=0 to List.Count-1 do begin
|
||||||
CurName:=List[i];
|
CurName:=List[i];
|
||||||
UndefineMacro(CurName);
|
UndefineMacro(CurName,nil);
|
||||||
end;
|
end;
|
||||||
List.Free;
|
List.Free;
|
||||||
end;
|
end;
|
||||||
@ -2409,18 +2482,31 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TH2PasTool.DefineMacro(const MacroName, AValue: string): TH2PMacroStats;
|
function TH2PasTool.DefineMacro(const MacroName, AValue: string;
|
||||||
|
DefineNode: TH2PNode): TH2PMacroStats;
|
||||||
begin
|
begin
|
||||||
Result:=FindMacro(MacroName,true);
|
Result:=FindMacro(MacroName,true);
|
||||||
Result.Value:=AValue;
|
Result.Value:=AValue;
|
||||||
Result.Status:=hmsDefined;
|
Result.Status:=hmsDefined;
|
||||||
|
Result.LastDefineNode:=DefineNode;
|
||||||
|
Result.LastReadNode:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TH2PasTool.UndefineMacro(const MacroName: string): TH2PMacroStats;
|
function TH2PasTool.UndefineMacro(const MacroName: string;
|
||||||
|
UndefineNode: TH2PNode): TH2PMacroStats;
|
||||||
begin
|
begin
|
||||||
Result:=FindMacro(MacroName,true);
|
Result:=FindMacro(MacroName,true);
|
||||||
Result.Value:='';
|
Result.Value:='';
|
||||||
Result.Status:=hmsUndefined;
|
Result.Status:=hmsUndefined;
|
||||||
|
Result.LastDefineNode:=UndefineNode;
|
||||||
|
Result.LastReadNode:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TH2PasTool.MarkMacroAsRead(const MacroName: string; Node: TH2PNode
|
||||||
|
): TH2PMacroStats;
|
||||||
|
begin
|
||||||
|
Result:=FindMacro(MacroName,true);
|
||||||
|
Result.LastReadNode:=Node;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TH2PNode }
|
{ TH2PNode }
|
||||||
|
Loading…
Reference in New Issue
Block a user