1
1
mirror of https://github.com/rui314/mold.git synced 2024-10-05 00:57:08 +03:00
This commit is contained in:
Rui Ueyama 2022-01-21 20:59:07 +09:00
parent d0c1c4db19
commit 3f4e570320
3 changed files with 26 additions and 51 deletions

View File

@ -266,8 +266,7 @@ static bool read_label(std::span<std::string_view> &tok,
template <typename E>
static void
read_version_script_commands(Context<E> &ctx, std::span<std::string_view> &tok,
VersionPattern &pat, VersionPattern &local_pat,
bool is_cpp) {
u16 ver_idx, bool is_cpp) {
bool is_global = true;
while (!tok.empty() && tok[0] != "}") {
@ -287,11 +286,11 @@ read_version_script_commands(Context<E> &ctx, std::span<std::string_view> &tok,
if (!tok.empty() && tok[0] == "\"C\"") {
tok = tok.subspan(1);
tok = skip(ctx, tok, "{");
read_version_script_commands(ctx, tok, pat, local_pat, false);
read_version_script_commands( ctx, tok, ver_idx, false);
} else {
tok = skip(ctx, tok, "\"C++\"");
tok = skip(ctx, tok, "{");
read_version_script_commands(ctx, tok, pat, local_pat, true);
read_version_script_commands(ctx, tok, ver_idx, true);
}
tok = skip(ctx, tok, "}");
@ -300,17 +299,11 @@ read_version_script_commands(Context<E> &ctx, std::span<std::string_view> &tok,
}
if (tok[0] == "*") {
ctx.default_version = (is_global ? pat.ver_idx : VER_NDX_LOCAL);
ctx.default_version = (is_global ? ver_idx : VER_NDX_LOCAL);
} else if (is_global) {
if (is_cpp)
pat.cpp_patterns.push_back(unquote(tok[0]));
else
pat.patterns.push_back(unquote(tok[0]));
ctx.version_patterns.push_back({unquote(tok[0]), ver_idx, is_cpp});
} else {
if (is_cpp)
local_pat.cpp_patterns.push_back(unquote(tok[0]));
else
local_pat.patterns.push_back(unquote(tok[0]));
ctx.version_patterns.push_back({unquote(tok[0]), VER_NDX_LOCAL, is_cpp});
}
tok = tok.subspan(1);
@ -326,30 +319,21 @@ void read_version_script(Context<E> &ctx, std::span<std::string_view> &tok) {
u16 next_ver = VER_NDX_LAST_RESERVED + ctx.arg.version_definitions.size() + 1;
while (!tok.empty() && tok[0] != "}") {
VersionPattern pat;
u16 ver_idx;
if (tok[0] == "{") {
pat.ver_idx = VER_NDX_GLOBAL;
ver_idx = VER_NDX_GLOBAL;
} else {
pat.ver_idx = next_ver++;
ver_idx = next_ver++;
ctx.arg.version_definitions.push_back(std::string(tok[0]));
tok = tok.subspan(1);
}
VersionPattern local_pat;
local_pat.ver_idx = VER_NDX_LOCAL;
tok = skip(ctx, tok, "{");
read_version_script_commands(ctx, tok, pat, local_pat, false);
read_version_script_commands(ctx, tok, ver_idx, false);
tok = skip(ctx, tok, "}");
if (!tok.empty() && tok[0] != ";")
tok = tok.subspan(1);
tok = skip(ctx, tok, ";");
ctx.version_patterns.push_back(pat);
if (!local_pat.patterns.empty() || !local_pat.cpp_patterns.empty())
ctx.version_patterns.push_back(local_pat);
}
}
@ -365,9 +349,7 @@ void parse_version_script(Context<E> &ctx, std::string path) {
}
template <typename E>
void read_dynamic_list_commands(Context<E> &ctx,
std::span<std::string_view> &tok,
VersionPattern &pat,
void read_dynamic_list_commands(Context<E> &ctx, std::span<std::string_view> &tok,
bool is_cpp) {
while (!tok.empty() && tok[0] != "}") {
if (tok[0] == "extern") {
@ -376,11 +358,11 @@ void read_dynamic_list_commands(Context<E> &ctx,
if (!tok.empty() && tok[0] == "\"C\"") {
tok = tok.subspan(1);
tok = skip(ctx, tok, "{");
read_dynamic_list_commands(ctx, tok, pat, false);
read_dynamic_list_commands(ctx, tok, false);
} else {
tok = skip(ctx, tok, "\"C++\"");
tok = skip(ctx, tok, "{");
read_dynamic_list_commands(ctx, tok, pat, true);
read_dynamic_list_commands(ctx, tok, true);
}
tok = skip(ctx, tok, "}");
@ -390,10 +372,8 @@ void read_dynamic_list_commands(Context<E> &ctx,
if (tok[0] == "*")
ctx.default_version = VER_NDX_GLOBAL;
else if (is_cpp)
pat.cpp_patterns.push_back(unquote(tok[0]));
else
pat.patterns.push_back(unquote(tok[0]));
ctx.version_patterns.push_back({unquote(tok[0]), VER_NDX_GLOBAL, is_cpp});
tok = skip(ctx, tok.subspan(1), ";");
}
@ -407,12 +387,7 @@ void parse_dynamic_list(Context<E> &ctx, std::string path) {
std::span<std::string_view> tok = vec;
tok = skip(ctx, tok, "{");
VersionPattern pat;
pat.ver_idx = VER_NDX_GLOBAL;
read_dynamic_list_commands(ctx, tok, pat, false);
ctx.version_patterns.push_back(pat);
read_dynamic_list_commands(ctx, tok, false);
tok = skip(ctx, tok, "}");
tok = skip(ctx, tok, ";");

View File

@ -1280,9 +1280,9 @@ typedef enum {
} CetReportKind;
struct VersionPattern {
u16 ver_idx;
std::vector<std::string_view> patterns;
std::vector<std::string_view> cpp_patterns;
std::string_view pattern;
u16 ver_idx = -1;
bool is_cpp = false;
};
template <typename E, typename T>

View File

@ -654,14 +654,14 @@ void apply_version_script(Context<E> &ctx) {
VersionMatcher matcher;
VersionMatcher cpp_matcher;
for (VersionPattern &elem : ctx.version_patterns) {
for (std::string_view pat : elem.patterns)
if (!matcher.add(pat, elem.ver_idx))
Fatal(ctx) << "invalid version pattern: " << pat;
for (std::string_view pat : elem.cpp_patterns)
if (!cpp_matcher.add(pat, elem.ver_idx))
Fatal(ctx) << "invalid version pattern: " << pat;
for (VersionPattern &v : ctx.version_patterns) {
if (v.is_cpp) {
if (!cpp_matcher.add(v.pattern, v.ver_idx))
Fatal(ctx) << "invalid version pattern: " << v.pattern;
} else {
if (!matcher.add(v.pattern, v.ver_idx))
Fatal(ctx) << "invalid version pattern: " << v.pattern;
}
}
tbb::parallel_for_each(ctx.objs, [&](ObjectFile<E> *file) {