diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index 3cdb400e423fd..f132b11b20c63 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -411,7 +411,7 @@ struct Config { StringRef thinLTOJobs; unsigned timeTraceGranularity; int32_t splitStackAdjustSize; - StringRef packageMetadata; + SmallVector packageMetadata; // The following config options do not directly correspond to any // particular command line options. diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 3d6e022a89e5f..7d14180a49926 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -816,6 +816,26 @@ static ICFLevel getICF(opt::InputArgList &args) { return ICFLevel::All; } +static void parsePackageMetadata(Ctx &ctx, const opt::Arg &arg) { + unsigned c0, c1; + SmallVector decoded; + StringRef s = arg.getValue(); + for (size_t i = 0, e = s.size(); i != e; ++i) { + if (s[i] != '%') { + decoded.push_back(s[i]); + } else if (i + 2 < e && (c1 = hexDigitValue(s[i + 1])) != -1u && + (c0 = hexDigitValue(s[i + 2])) != -1u) { + decoded.push_back(uint8_t(c1 * 16 + c0)); + i += 2; + } else { + ErrAlways(ctx) << arg.getSpelling() << ": invalid % escape at byte " << i + << "; supports only %[0-9a-fA-F][0-9a-fA-F]"; + return; + } + } + ctx.arg.packageMetadata = std::move(decoded); +} + static StripPolicy getStrip(Ctx &ctx, opt::InputArgList &args) { if (args.hasArg(OPT_relocatable)) return StripPolicy::None; @@ -1425,7 +1445,8 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) { ctx.arg.optimize = args::getInteger(args, OPT_O, 1); ctx.arg.orphanHandling = getOrphanHandling(ctx, args); ctx.arg.outputFile = args.getLastArgValue(OPT_o); - ctx.arg.packageMetadata = args.getLastArgValue(OPT_package_metadata); + if (auto *arg = args.getLastArg(OPT_package_metadata)) + parsePackageMetadata(ctx, *arg); ctx.arg.pie = args.hasFlag(OPT_pie, OPT_no_pie, false); ctx.arg.printIcfSections = args.hasFlag(OPT_print_icf_sections, OPT_no_print_icf_sections, false); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 80032490da0de..b3b12a0646875 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -578,7 +578,7 @@ def z: JoinedOrSeparate<["-"], "z">, MetaVarName<"