[ELF] Claim recognized -z options. NFC

... so that we can reimplement `checkZOptions` using
https://reviews.llvm.org/D48433
This commit is contained in:
Fangrui Song 2024-01-21 17:43:05 -08:00
parent 890acf8d38
commit 2e30e31e1e
2 changed files with 76 additions and 51 deletions

View File

@ -60,17 +60,16 @@ SmallVector<StringRef, 0> lld::args::getStrings(opt::InputArgList &args,
}
uint64_t lld::args::getZOptionValue(opt::InputArgList &args, int id,
StringRef key, uint64_t Default) {
for (auto *arg : args.filtered_reverse(id)) {
StringRef key, uint64_t defaultValue) {
for (auto *arg : args.filtered(id)) {
std::pair<StringRef, StringRef> kv = StringRef(arg->getValue()).split('=');
if (kv.first == key) {
uint64_t result = Default;
if (!to_integer(kv.second, result))
if (!to_integer(kv.second, defaultValue))
error("invalid " + key + ": " + kv.second);
return result;
arg->claim();
}
}
return Default;
return defaultValue;
}
std::vector<StringRef> lld::args::getLines(MemoryBufferRef mb) {

View File

@ -473,65 +473,84 @@ static const char *getReproduceOption(opt::InputArgList &args) {
}
static bool hasZOption(opt::InputArgList &args, StringRef key) {
bool ret = false;
for (auto *arg : args.filtered(OPT_z))
if (key == arg->getValue())
return true;
return false;
if (key == arg->getValue()) {
ret = true;
arg->claim();
}
return ret;
}
static bool getZFlag(opt::InputArgList &args, StringRef k1, StringRef k2,
bool Default) {
for (auto *arg : args.filtered_reverse(OPT_z)) {
if (k1 == arg->getValue())
return true;
if (k2 == arg->getValue())
return false;
bool defaultValue) {
for (auto *arg : args.filtered(OPT_z)) {
StringRef v = arg->getValue();
if (k1 == v)
defaultValue = true;
else if (k2 == v)
defaultValue = false;
else
continue;
arg->claim();
}
return Default;
return defaultValue;
}
static SeparateSegmentKind getZSeparate(opt::InputArgList &args) {
for (auto *arg : args.filtered_reverse(OPT_z)) {
auto ret = SeparateSegmentKind::None;
for (auto *arg : args.filtered(OPT_z)) {
StringRef v = arg->getValue();
if (v == "noseparate-code")
return SeparateSegmentKind::None;
if (v == "separate-code")
return SeparateSegmentKind::Code;
if (v == "separate-loadable-segments")
return SeparateSegmentKind::Loadable;
ret = SeparateSegmentKind::None;
else if (v == "separate-code")
ret = SeparateSegmentKind::Code;
else if (v == "separate-loadable-segments")
ret = SeparateSegmentKind::Loadable;
else
continue;
arg->claim();
}
return SeparateSegmentKind::None;
return ret;
}
static GnuStackKind getZGnuStack(opt::InputArgList &args) {
for (auto *arg : args.filtered_reverse(OPT_z)) {
if (StringRef("execstack") == arg->getValue())
return GnuStackKind::Exec;
if (StringRef("noexecstack") == arg->getValue())
return GnuStackKind::NoExec;
if (StringRef("nognustack") == arg->getValue())
return GnuStackKind::None;
auto ret = GnuStackKind::NoExec;
for (auto *arg : args.filtered(OPT_z)) {
StringRef v = arg->getValue();
if (v == "execstack")
ret = GnuStackKind::Exec;
else if (v == "noexecstack")
ret = GnuStackKind::NoExec;
else if (v == "nognustack")
ret = GnuStackKind::None;
else
continue;
arg->claim();
}
return GnuStackKind::NoExec;
return ret;
}
static uint8_t getZStartStopVisibility(opt::InputArgList &args) {
for (auto *arg : args.filtered_reverse(OPT_z)) {
uint8_t ret = STV_PROTECTED;
for (auto *arg : args.filtered(OPT_z)) {
std::pair<StringRef, StringRef> kv = StringRef(arg->getValue()).split('=');
if (kv.first == "start-stop-visibility") {
arg->claim();
if (kv.second == "default")
return STV_DEFAULT;
ret = STV_DEFAULT;
else if (kv.second == "internal")
return STV_INTERNAL;
ret = STV_INTERNAL;
else if (kv.second == "hidden")
return STV_HIDDEN;
ret = STV_HIDDEN;
else if (kv.second == "protected")
return STV_PROTECTED;
error("unknown -z start-stop-visibility= value: " + StringRef(kv.second));
ret = STV_PROTECTED;
else
error("unknown -z start-stop-visibility= value: " +
StringRef(kv.second));
}
}
return STV_PROTECTED;
return ret;
}
constexpr const char *knownZFlags[] = {
@ -734,6 +753,9 @@ static void setUnresolvedSymbolPolicy(opt::InputArgList &args) {
diagRegular = true;
else if (StringRef(arg->getValue()) == "undefs")
diagRegular = false;
else
break;
arg->claim();
break;
case OPT_allow_shlib_undefined:
diagShlib = false;
@ -1162,20 +1184,22 @@ static SmallVector<StringRef, 0> getSymbolOrderingFile(MemoryBufferRef mb) {
}
static bool getIsRela(opt::InputArgList &args) {
// The psABI specifies the default relocation entry format.
bool rela = is_contained({EM_AARCH64, EM_AMDGPU, EM_HEXAGON, EM_LOONGARCH,
EM_PPC, EM_PPC64, EM_RISCV, EM_X86_64},
config->emachine);
// If -z rel or -z rela is specified, use the last option.
for (auto *arg : args.filtered_reverse(OPT_z)) {
for (auto *arg : args.filtered(OPT_z)) {
StringRef s(arg->getValue());
if (s == "rel")
return false;
if (s == "rela")
return true;
rela = false;
else if (s == "rela")
rela = true;
else
continue;
arg->claim();
}
// Otherwise use the psABI defined relocation entry format.
uint16_t m = config->emachine;
return m == EM_AARCH64 || m == EM_AMDGPU || m == EM_HEXAGON ||
m == EM_LOONGARCH || m == EM_PPC || m == EM_PPC64 || m == EM_RISCV ||
m == EM_X86_64;
return rela;
}
static void parseClangOption(StringRef opt, const Twine &msg) {
@ -1220,9 +1244,9 @@ static void readConfigs(opt::InputArgList &args) {
args.hasArg(OPT_visual_studio_diagnostics_format, false);
config->allowMultipleDefinition =
hasZOption(args, "muldefs") ||
args.hasFlag(OPT_allow_multiple_definition,
OPT_no_allow_multiple_definition, false) ||
hasZOption(args, "muldefs");
OPT_no_allow_multiple_definition, false);
config->androidMemtagHeap =
args.hasFlag(OPT_android_memtag_heap, OPT_no_android_memtag_heap, false);
config->androidMemtagStack = args.hasFlag(OPT_android_memtag_stack,
@ -1525,6 +1549,7 @@ static void readConfigs(opt::InputArgList &args) {
for (auto reportArg : reports) {
if (option.first != reportArg.first)
continue;
arg->claim();
if (!isValidReportString(option.second)) {
error(Twine("-z ") + reportArg.first + "= parameter " + option.second +
" is not recognized");
@ -1539,6 +1564,7 @@ static void readConfigs(opt::InputArgList &args) {
StringRef(arg->getValue()).split('=');
if (option.first != "dead-reloc-in-nonalloc")
continue;
arg->claim();
constexpr StringRef errPrefix = "-z dead-reloc-in-nonalloc=: ";
std::pair<StringRef, StringRef> kv = option.second.split('=');
if (kv.first.empty() || kv.second.empty()) {