mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-20 17:31:39 +02:00
* allow also smaller values for code alignment parameters than the current one, resolves #19463
* limit code alignment parameters to power of 2 up to 256 * give an error for an invalid code alignment directive git-svn-id: trunk@17659 -
This commit is contained in:
parent
e94da0b495
commit
93e53e1990
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -10672,6 +10672,7 @@ tests/webtbf/tw1905.pp svneol=native#text/plain
|
|||||||
tests/webtbf/tw1927.pp svneol=native#text/plain
|
tests/webtbf/tw1927.pp svneol=native#text/plain
|
||||||
tests/webtbf/tw1928.pp svneol=native#text/plain
|
tests/webtbf/tw1928.pp svneol=native#text/plain
|
||||||
tests/webtbf/tw1939.pp svneol=native#text/plain
|
tests/webtbf/tw1939.pp svneol=native#text/plain
|
||||||
|
tests/webtbf/tw19463.pp svneol=native#text/pascal
|
||||||
tests/webtbf/tw1949.pp svneol=native#text/plain
|
tests/webtbf/tw1949.pp svneol=native#text/plain
|
||||||
tests/webtbf/tw1969.pp svneol=native#text/plain
|
tests/webtbf/tw1969.pp svneol=native#text/plain
|
||||||
tests/webtbf/tw1995.pp svneol=native#text/plain
|
tests/webtbf/tw1995.pp svneol=native#text/plain
|
||||||
|
@ -1160,7 +1160,7 @@ implementation
|
|||||||
else { Error }
|
else { Error }
|
||||||
UpdateAlignmentStr:=false;
|
UpdateAlignmentStr:=false;
|
||||||
until false;
|
until false;
|
||||||
UpdateAlignment(a,b);
|
Result:=Result and UpdateAlignment(a,b);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
@ -364,6 +364,9 @@ scan_w_multiple_main_name_overrides=02086_W_Overriding name of "main" procedure
|
|||||||
% name will be used.
|
% name will be used.
|
||||||
scanner_w_illegal_warn_identifier=02087_W_Illegal identifier "$1" for $WARN directive
|
scanner_w_illegal_warn_identifier=02087_W_Illegal identifier "$1" for $WARN directive
|
||||||
% Identifier is not known by a \var{\{\$WARN\}} compiler directive.
|
% Identifier is not known by a \var{\{\$WARN\}} compiler directive.
|
||||||
|
scanner_e_illegal_alignment_directive=02088_E_Illegal alignment directive
|
||||||
|
% The alignment directive is not valid. Either the alignment type is not known or the alignment
|
||||||
|
% value is not a power of two.
|
||||||
% \end{description}
|
% \end{description}
|
||||||
#
|
#
|
||||||
# Parser
|
# Parser
|
||||||
|
@ -107,6 +107,7 @@ const
|
|||||||
scan_e_illegal_minfpconstprec=02085;
|
scan_e_illegal_minfpconstprec=02085;
|
||||||
scan_w_multiple_main_name_overrides=02086;
|
scan_w_multiple_main_name_overrides=02086;
|
||||||
scanner_w_illegal_warn_identifier=02087;
|
scanner_w_illegal_warn_identifier=02087;
|
||||||
|
scanner_e_illegal_alignment_directive=02088;
|
||||||
parser_e_syntax_error=03000;
|
parser_e_syntax_error=03000;
|
||||||
parser_e_dont_nest_interrupt=03004;
|
parser_e_dont_nest_interrupt=03004;
|
||||||
parser_w_proc_directive_ignored=03005;
|
parser_w_proc_directive_ignored=03005;
|
||||||
@ -893,9 +894,9 @@ const
|
|||||||
option_info=11024;
|
option_info=11024;
|
||||||
option_help_pages=11025;
|
option_help_pages=11025;
|
||||||
|
|
||||||
MsgTxtSize = 59465;
|
MsgTxtSize = 59501;
|
||||||
|
|
||||||
MsgIdxMax : array[1..20] of longint=(
|
MsgIdxMax : array[1..20] of longint=(
|
||||||
24,88,311,103,84,54,111,23,202,63,
|
24,89,311,103,84,54,111,23,202,63,
|
||||||
49,20,1,1,1,1,1,1,1,1
|
49,20,1,1,1,1,1,1,1,1
|
||||||
);
|
);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1330,7 +1330,8 @@ unit scandir;
|
|||||||
begin
|
begin
|
||||||
current_scanner.skipspace;
|
current_scanner.skipspace;
|
||||||
s:=current_scanner.readcomment;
|
s:=current_scanner.readcomment;
|
||||||
UpdateAlignmentStr(s,current_settings.alignment);
|
if not(UpdateAlignmentStr(s,current_settings.alignment)) then
|
||||||
|
message(scanner_e_illegal_alignment_directive);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure dir_codepage;
|
procedure dir_codepage;
|
||||||
|
@ -505,7 +505,7 @@ interface
|
|||||||
|
|
||||||
procedure set_source_info(const ti : tsysteminfo);
|
procedure set_source_info(const ti : tsysteminfo);
|
||||||
|
|
||||||
procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
|
function UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo) : boolean;
|
||||||
|
|
||||||
procedure RegisterTarget(const r:tsysteminfo);
|
procedure RegisterTarget(const r:tsysteminfo);
|
||||||
procedure RegisterRes(const r:tresinfo; rcf : TAbstractResourceFileClass);
|
procedure RegisterRes(const r:tresinfo; rcf : TAbstractResourceFileClass);
|
||||||
@ -697,19 +697,26 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
|
function UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo) : boolean;
|
||||||
begin
|
begin
|
||||||
|
result:=true;
|
||||||
with d do
|
with d do
|
||||||
begin
|
begin
|
||||||
|
if (s.procalign in [1,2,4,8,16,32,64,128]) or (s.procalign=256) then
|
||||||
|
procalign:=s.procalign
|
||||||
|
else
|
||||||
|
result:=false;
|
||||||
|
if (s.loopalign in [1,2,4,8,16,32,64,128]) or (s.loopalign=256) then
|
||||||
|
loopalign:=s.loopalign
|
||||||
|
else
|
||||||
|
result:=false;
|
||||||
|
if (s.jumpalign in [1,2,4,8,16,32,64,128]) or (s.jumpalign=256) then
|
||||||
|
jumpalign:=s.jumpalign
|
||||||
|
else
|
||||||
|
result:=false;
|
||||||
{ general update rules:
|
{ general update rules:
|
||||||
minimum: if higher then update
|
minimum: if higher then update
|
||||||
maximum: if lower then update or if undefined then update }
|
maximum: if lower then update or if undefined then update }
|
||||||
if s.procalign>procalign then
|
|
||||||
procalign:=s.procalign;
|
|
||||||
if s.loopalign>loopalign then
|
|
||||||
loopalign:=s.loopalign;
|
|
||||||
if s.jumpalign>jumpalign then
|
|
||||||
jumpalign:=s.jumpalign;
|
|
||||||
if s.constalignmin>constalignmin then
|
if s.constalignmin>constalignmin then
|
||||||
constalignmin:=s.constalignmin;
|
constalignmin:=s.constalignmin;
|
||||||
if (constalignmax=0) or
|
if (constalignmax=0) or
|
||||||
|
24
tests/webtbf/tw19463.pp
Normal file
24
tests/webtbf/tw19463.pp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{ %fail }
|
||||||
|
{$CODEALIGN 3}
|
||||||
|
{$CODEALIGN PROC=3}
|
||||||
|
|
||||||
|
program test1;
|
||||||
|
|
||||||
|
var
|
||||||
|
v: integer = 1;
|
||||||
|
|
||||||
|
procedure A;
|
||||||
|
begin
|
||||||
|
Inc(v);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure B;
|
||||||
|
begin
|
||||||
|
Dec(v);
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
A;
|
||||||
|
B;
|
||||||
|
end.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user