File 4341-Drop-support-for-code-compiled-before-R10.patch of Package erlang
From 37676a570d3abe7170c720d33d4c5353a9e17ec0 Mon Sep 17 00:00:00 2001
From: Richard Carlsson <carlsson.richard@gmail.com>
Date: Sat, 27 Dec 2025 18:25:38 +0100
Subject: [PATCH 1/2] Drop support for code compiled before R10
---
erts/doc/guides/absform.md | 4 -
lib/debugger/src/dbg_iload.erl | 10 +-
lib/stdlib/src/beam_lib.erl | 7 -
lib/tools/src/xref_base.erl | 12 --
lib/tools/src/xref_reader.erl | 12 --
lib/tools/test/xref_SUITE.erl | 123 +++---------------
lib/tools/test/xref_SUITE_data/depr_r9c.beam | Bin 1664 -> 0 bytes
.../test/xref_SUITE_data/read/read.beam.v1 | Bin 7160 -> 0 bytes
8 files changed, 20 insertions(+), 148 deletions(-)
delete mode 100644 lib/tools/test/xref_SUITE_data/depr_r9c.beam
delete mode 100644 lib/tools/test/xref_SUITE_data/read/read.beam.v1
diff --git a/erts/doc/src/absform.xml b/erts/doc/src/absform.xml
index 4d06e34379..1cbaa93e2f 100644
--- a/erts/doc/src/absform.xml
+++ b/erts/doc/src/absform.xml
@@ -1019,11 +1019,6 @@
<p>As from Erlang/OTP R9C, the <c>abstract_code</c> chunk contains
<c>{raw_abstract_v1,AbstractCode}</c>, where <c>AbstractCode</c> is the
abstract code as described in this section.</p>
-
- <p>In OTP releases before R9C, the abstract code after some more
- processing was stored in the Beam file. The first element of the
- tuple would be either <c>abstract_v1</c> (in OTP R7B) or
- <c>abstract_v2</c> (in OTP R8B).</p>
</section>
</chapter>
diff --git a/lib/debugger/src/dbg_iload.erl b/lib/debugger/src/dbg_iload.erl
index d58ea18445..71a26837c6 100644
--- a/lib/debugger/src/dbg_iload.erl
+++ b/lib/debugger/src/dbg_iload.erl
@@ -69,10 +69,6 @@ load_mod1(Mod, File, Binary, Db) ->
store_module(Mod, File, Binary, Db) ->
{interpreter_module, Exp, Abst, Src, MD5} = binary_to_term(Binary),
Forms0 = case abstr(Abst) of
- {abstract_v1,_} ->
- exit({Mod,too_old_beam_file});
- {abstract_v2,_} ->
- exit({Mod,too_old_beam_file});
{raw_abstract_v1,Code} ->
Code
end,
@@ -523,12 +519,12 @@ expr({'maybe',Anno,Es0,{'else',_ElseAnno,Cs0}}, Lc, St) ->
Cs1 = icr_clauses(Cs0, Lc, St),
{'maybe',ln(Anno),Es1,Cs1};
expr({'fun',Anno,{clauses,Cs0}}, _Lc, St) ->
- %% New R10B-2 format (abstract_v2).
+ %% New R10B-2 format
Cs = fun_clauses(Cs0, St),
Name = new_fun_name(),
{make_fun,ln(Anno),Name,Cs};
expr({'fun',Anno,{function,F,A}}, _Lc, _St) ->
- %% New R8 format (abstract_v2).
+ %% New R8 format
Line = ln(Anno),
case erl_internal:bif(F, A) of
true ->
@@ -589,7 +585,7 @@ expr({call,Anno,{remote,_,{atom,_,Mod},{atom,_,Func}},As0}, Lc, St) ->
end
end;
expr({call,Anno,{remote,_,Mod0,Func0},As0}, Lc, St) ->
- %% New R8 format (abstract_v2).
+ %% New R8 format
Mod = expr(Mod0, false, St),
Func = expr(Func0, false, St),
As = consify(expr_list(As0, St)),
diff --git a/lib/stdlib/src/beam_lib.erl b/lib/stdlib/src/beam_lib.erl
index 884ece0b48..ac425a63a0 100644
--- a/lib/stdlib/src/beam_lib.erl
+++ b/lib/stdlib/src/beam_lib.erl
@@ -1414,13 +1414,6 @@ decrypt_chunk(Type, Module, File, Id, Bin) ->
old_anno_from_term({raw_abstract_v1, Forms}) ->
{raw_abstract_v1, anno_from_forms(Forms)};
-old_anno_from_term({Tag, Forms}) when Tag =:= abstract_v1;
- Tag =:= abstract_v2 ->
- try {Tag, anno_from_forms(Forms)}
- catch
- _:_ ->
- {Tag, Forms}
- end;
old_anno_from_term(T) ->
T.
diff --git a/lib/tools/src/xref_base.erl b/lib/tools/src/xref_base.erl
index 1e9d4b527b..3071974430 100644
--- a/lib/tools/src/xref_base.erl
+++ b/lib/tools/src/xref_base.erl
@@ -798,18 +798,6 @@ abst(File, Builtins, _Mode = functions) ->
case beam_lib:chunks(File, [abstract_code, exports, attributes]) of
{ok, {M,[{abstract_code,NoA},_X,_A]}} when NoA =:= no_abstract_code ->
{ok, M, NoA};
- {ok, {M, [{abstract_code, {abstract_v1, Forms}},
- {exports,X0}, {attributes,A}]}} ->
- %% R7.
- X = xref_utils:fa_to_mfa(X0, M),
- D = deprecated(A, X, M),
- xref_reader:module(M, Forms, Builtins, X, D);
- {ok, {M, [{abstract_code, {abstract_v2, Forms}},
- {exports,X0}, {attributes,A}]}} ->
- %% R8-R9B.
- X = xref_utils:fa_to_mfa(X0, M),
- D = deprecated(A, X, M),
- xref_reader:module(M, Forms, Builtins, X, D);
{ok, {M, [{abstract_code, {raw_abstract_v1, Code}},
{exports,X0}, {attributes,A}]}} ->
%% R9C-
diff --git a/lib/tools/src/xref_reader.erl b/lib/tools/src/xref_reader.erl
index 1239740ef9..47eed9ce08 100644
--- a/lib/tools/src/xref_reader.erl
+++ b/lib/tools/src/xref_reader.erl
@@ -51,11 +51,6 @@
-include("xref.hrl").
-%% The versions of the abstract code are as follows:
-%% R7: abstract_v1
-%% R8: abstract_v2
-%% R9C: raw_abstract_v1
-
%% -> {ok, Module, {DefAt, LCallAt, XCallAt, LC, XC, X, Attrs, Depr, OL},
%% Unresolved}} | EXIT
%% Attrs = {ALC, AXC, Bad}
@@ -190,13 +185,6 @@ expr({'fun', Anno, {function, Mod, Name, _Arity}}, S) ->
%% New format in R15. M:F/A (one or more variables).
As = {var, Anno, '_'},
external_call(erlang, apply, [Mod, Name, As], Anno, true, S);
-%% Only abstract_v1 and abstract_v2.
-expr({'fun', Anno, {function, Name, Arity}, _Extra}, S) ->
- %% Added in R8.
- handle_call(local, S#xrefr.module, Name, Arity, Anno, S);
-expr({'fun', _Anno, {clauses, Cs}, _Extra}, S) ->
- clauses(Cs, S);
-%% End abstract_v1 and abstract_v2.
expr({'fun', Anno, {function, Name, Arity}}, S) ->
%% Added in OTP 20.
handle_call(local, S#xrefr.module, Name, Arity, Anno, S);
diff --git a/lib/tools/test/xref_SUITE.erl b/lib/tools/test/xref_SUITE.erl
index 1ee0dd1533..653c38acc7 100644
--- a/lib/tools/test/xref_SUITE.erl
+++ b/lib/tools/test/xref_SUITE.erl
@@ -942,18 +942,16 @@ read(Conf) when is_list(Conf) ->
File = fname(Dir, "read"),
Beam = fname(Dir, "read.beam"),
{ok, read} = compile:file(File, [debug_info,{outdir,Dir}]),
- do_read(File, abstract_v2),
- copy_file(fname(Dir, "read.beam.v1"), Beam),
- do_read(File, abstract_v1),
+ do_read(File),
ok = file:delete(Beam),
ok.
-do_read(File, Version) ->
+do_read(File) ->
{ok, _} = start(s),
ok = xref:set_default(s, [{verbose,false}, {warnings, false}]),
{ok, read} = xref:add_module(s, File),
- {U, OK, OKB} = read_expected(Version),
+ {U, OK, OKB} = read_expected(),
%% {ok, UC} = xref:q(s, "(Lin) UC"),
%% RR = to_external(converse(family_to_relation(family(UC)))),
@@ -1010,7 +1008,7 @@ do_read(File, Version) ->
xref:stop(s).
%% What is expected when xref_SUITE_data/read/read.erl is added:
-read_expected(Version) ->
+read_expected() ->
%% Line positions in xref_SUITE_data/read/read.erl:
POS1 = 28, POS2 = POS1+10, POS3 = POS2+6, POS4 = POS3+6, POS5 = POS4+10,
POS6 = POS5+5, POS7 = POS6+6, POS8 = POS7+6, POS9 = POS8+8,
@@ -1131,11 +1129,7 @@ read_expected(Version) ->
{POS14+17,{{read,bi,0},{read,bi,0}}}],
OK = case Version of
- abstract_v1 ->
- [{0,{FF,{read,'$F_EXPR',178}}},
- {0,{FF,{modul,'$F_EXPR',179}}}]
- ++ O1;
- _ ->
+ abstract_v2 ->
[{16,{FF,{read,'$F_EXPR',178}}},
{17,{FF,{modul,'$F_EXPR',179}}}]
++
@@ -1180,20 +1174,14 @@ read_expected(Version) ->
{POS14+3, {{read,bi,0},{erlang,length,1}}}],
%% Operators (OTP-8647):
- OKB = case Version of
- abstract_v1 ->
- [{POS8+3, {FF,{erlang,apply,3}}},
- {POS10+1, {FF,{erlang,apply,3}}},
- {POS10+6, {FF,{erlang,apply,3}}}];
- _ ->
- [{POS13+16, {{read,bi,0},{erlang,'!',2}}},
- {POS13+16, {{read,bi,0},{erlang,'-',1}}},
- {POS13+16, {{read,bi,0},{erlang,self,0}}},
- {POS15+1, {{read,bi,0},{erlang,'>',2}}},
- {POS15+2, {{read,bi,0},{erlang,'-',2}}},
- {POS15+2, {{read,bi,0},{erlang,'*',2}}},
- {POS15+8, {{read,bi,0},{erlang,'/',2}}}]
- end
+ OKB = [{POS13+16, {{read,bi,0},{erlang,'!',2}}},
+ {POS13+16, {{read,bi,0},{erlang,'-',1}}},
+ {POS13+16, {{read,bi,0},{erlang,self,0}}},
+ {POS15+1, {{read,bi,0},{erlang,'>',2}}},
+ {POS15+2, {{read,bi,0},{erlang,'-',2}}},
+ {POS15+2, {{read,bi,0},{erlang,'*',2}}},
+ {POS15+8, {{read,bi,0},{erlang,'/',2}}}]
+
++ [{POS14+19, {{read,bi,0},{erlang,'+',2}}},
{POS14+21, {{read,bi,0},{erlang,'+',2}}},
{POS13+16, {{read,bi,0},{erlang,'==',2}}},
@@ -1402,87 +1390,10 @@ update(Conf) when is_list(Conf) ->
deprecated(Conf) when is_list(Conf) ->
Dir = ?copydir,
File = fname(Dir, "depr.erl"),
- MFile_r9c = fname(Dir, "depr_r9c"),
MFile = fname(Dir, "depr"),
Beam = fname(Dir, "depr.beam"),
- %% This file has been compiled to ?datadir/depr_r9c.beam
- %% using the R9C compiler. From R10B and onwards the linter
- %% checks the 'deprecated' attribute as well.
- % Test = <<"-module(depr).
-
- % -export([t/0,f/1,bar/2,f/2,g/3]).
-
- % -deprecated([{f,1}, % DF
- % {bar,2,eventually}]). % DF_3
- % -deprecated([{f,1,next_major_release}]). % DF_2 (again)
- % -deprecated([{frutt,0,next_version}]). % message...
- % -deprecated([{f,2,next_major_release}, % DF_2
- % {g,3,next_version}, % DF_1
- % {ignored,10,100}]). % message...
- % -deprecated([{does_not_exist,1}]). % message...
-
- % -deprecated(foo). % message...
-
- % t() ->
- % frutt(1),
- % g(1,2, 3),
- % ?MODULE:f(10).
-
- % f(A) ->
- % ?MODULE:f(A,A).
- % f(X, Y) ->
- % ?MODULE:g(X, Y, X).
-
- % g(F, G, H) ->
- % ?MODULE:bar(F, {G,H}).
-
- % bar(_, _) ->
- % true.
-
- % frutt(_) ->
- % frutt().
-
- % frutt() ->
- % true.
- % ">>,
-
- % ok = file:write_file(File, Test),
- % {ok, depr_r9c} = compile:file(File, [debug_info,{outdir,Dir}]),
-
- {ok, _} = xref:start(s),
- {ok, depr_r9c} = xref:add_module(s, MFile_r9c),
- M9 = depr_r9c,
- DF_1 = usort([{{M9,f,2},{M9,g,3}}]),
- DF_2 = usort(DF_1++[{{M9,f,1},{M9,f,2}},{{M9,t,0},{M9,f,1}}]),
- DF_3 = usort(DF_2++[{{M9,g,3},{M9,bar,2}}]),
- DF = usort(DF_3++[{{M9,t,0},{M9,f,1}}]),
-
- {ok,DF} = xref:analyze(s, deprecated_function_calls),
- {ok,DF_1} =
- xref:analyze(s, {deprecated_function_calls,next_version}),
- {ok,DF_2} =
- xref:analyze(s, {deprecated_function_calls,next_major_release}),
- {ok,DF_3} =
- xref:analyze(s, {deprecated_function_calls,eventually}),
-
- D = to_external(range(from_term(DF))),
- D_1 = to_external(range(from_term(DF_1))),
- D_2 = to_external(range(from_term(DF_2))),
- D_3 = to_external(range(from_term(DF_3))),
-
- {ok,D} = xref:analyze(s, deprecated_functions),
- {ok,D_1} =
- xref:analyze(s, {deprecated_functions,next_version}),
- {ok,D_2} =
- xref:analyze(s, {deprecated_functions,next_major_release}),
- {ok,D_3} =
- xref:analyze(s, {deprecated_functions,eventually}),
-
- ok = check_state(s),
- xref:stop(s),
-
- Test2= <<"-module(depr).
+ Test = <<"-module(depr).
-export([t/0,f/1,bar/2,f/2,g/3,string/0]).
@@ -1512,7 +1423,7 @@ deprecated(Conf) when is_list(Conf) ->
?MODULE:t().
">>,
- ok = file:write_file(File, Test2),
+ ok = file:write_file(File, Test),
{ok, depr} = compile:file(File, [debug_info,{outdir,Dir}]),
{ok, _} = xref:start(s),
@@ -1537,7 +1448,7 @@ deprecated(Conf) when is_list(Conf) ->
xref:stop(s),
%% All of the module is deprecated.
- Test3= <<"-module(depr).
+ MTest= <<"-module(depr).
-export([t/0,f/1,bar/2,f/2,g/3]).
@@ -1562,7 +1473,7 @@ deprecated(Conf) when is_list(Conf) ->
?MODULE:t().
">>,
- ok = file:write_file(File, Test3),
+ ok = file:write_file(File, MTest),
{ok, depr} = compile:file(File, [debug_info,{outdir,Dir}]),
{ok, _} = xref:start(s),
diff --git a/lib/tools/test/xref_SUITE_data/depr_r9c.beam b/lib/tools/test/xref_SUITE_data/depr_r9c.beam
deleted file mode 100644
index 82f0eef5a1ef40af3c923c4c8c0d54b555370235..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1664
zcmZ`(3s4hB7~Z`LAtK_DFer*ODOyDs5)hrrNJ&76F`|e(B-Tlf+$AI?ck%85skV-f
z=~xRDrBe&OPzz&4u_|M!uMzMut<(oT$I(_QwOWc$t5rv_)7=zi+8NxLZ}$KH{l0(y
z{dey&=j9{<Aor)wG-Meh-U9$gKu{<c)+<<rX*MW9J9Lmmv>=lN9~)#Be3CTO!!tfN
zYjtvV9)Jv<VUcDp0)>FbTm%)u5J(ZqHvv?K0-z5kWz-qHMx{@T!M5%r{Z3MW6i`Pf
zlPIXyld8FD3T7iu4d2s~F>`fl=p~ftI=GV3=`z)mjVfb|ellX|;08jOqlP>5MWhNI
zAd~_Ho8{mhyo5{uI|AW92<2)36_lPp97Q<tD5y|kj|2-OAs5vLOdc<ulM!SH5P|HU
z2W+C>$Lj-YLC7X%`UBd9$PPwOAYhHM-$qlQ9|111Ll6dXU@p#ubIbc}ti|g%h6gc+
zx8d5Nv5kQDz#|L++n66}kR$<_@2+v<XfeS6vP9&t133!Jy9Ms2cpuvvFE}jSO}jpE
zVL}MLTGmEOEQ5IjjzK#Oi%BF#_e^6BTf%aZk9ND?A50VAVhsb79P5{?9@@pD=fb*K
zT4Z0V`1kS9fB~TaRS7GIPM#Z#PvUCO4ycwvb_gswXhiv6A{-8OIyhcn89Ib!21^X_
zal;s%6|EdESy{hRlxR386Sc$6^DbA0iL;}ADgr&0VSO;~l~Ca#?w=e7NLwkh1dPxY
z^Bz`POp79`Wd%3QIkbL(wPS{y_eqRXcs+>$R4FZRRv+gRS;ksI3nBwl{|z}kUS5zy
zoNZ_zZs!FLjj9jaX_3zn_#OjC3GQ$05)hP}kd%;&H8RQRVT<KO=$%}pL+J>5I6ak)
z4b&#`KEcK=0pnhC0PVovAOW4qWhfFQ^ll7mveD@q{98S_W^s#-itH$uUY-2Sgzf&;
z+RpM@w$#+8Rp!c?OIxd^SVALWDyaQ0d*h-WZ#ZqTIG-(#FDv?@QXBoZ{6L&+ZMJN8
zO_YX-96s>~)c6m@1+C8bUOhXh{Kqt=@za~IDKR35+vwQP+vHf^zUl79;J$+A8DmnW
zwmxVsuGWnIEal2~kC?FS73D+g=#l27>w!=hvu<Jm9~^!AchljX7W1$jn(+(HtkNiI
zLw@k+kB^%1YsV0Ae)^_Ylf%zOw$|lnvXd@8ieF9E&N<o~x>Mh{;<7cZ+#g#zem18a
zIpLR?twQ6Av-MB+cXQg8_k^!s>~5*=TzcqYlrdz%j<?QxDrT9y#;8ccg&8aF*HRr-
zzEaD!ZpZ0`@yp*?cW!z_<;b4B+5*G5E%U1kh3eb8o%b?{u=Jb$s@RPr)eRbtrez&F
zYfA7|MB59(^Ufb{sE+H*TC=%t+S{4kqYmC^S@hMzk2_bH#Inc_+Q(e$*`vCt9HGm)
zlFOgUn39-3`i;#(?>OW9x)b@^mRj=K_Sds*C%f|w@5?(fY+uT<Ycb}ZZBz0#wHn9F
zu6uQT*F1A?{oc}RlNSBewb(hfhd6e5R_>EMcM7{|>JK(uP5Z5R(!;E>pAJ7b_2=Ev
z6VDr5CvTKlQ)8F4^=+0Wp8K-T{Nc+Ni_2<5uG|q{<rjw4_>!w1$d=_Ucjd15d~}OB
z*>wGUBQw0qGWM!(#JA4t=C(&Uw!-|W4?7(P-SG`~EDc@l#>kduPtqn_ZpS~ee*k(y
B5p4hf
diff --git a/lib/tools/test/xref_SUITE_data/read/read.beam.v1 b/lib/tools/test/xref_SUITE_data/read/read.beam.v1
deleted file mode 100644
index 3b8e9c4c38939029a79aa9785cbce5edd05af250..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 7160
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
--
2.51.0