[lld] 2e30e31 - [ELF] Claim recognized -z options. NFC
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 21 17:43:10 PST 2024
Author: Fangrui Song
Date: 2024-01-21T17:43:05-08:00
New Revision: 2e30e31e1e80184d9b2c8aa98f617b4d1cb56d55
URL: https://github.com/llvm/llvm-project/commit/2e30e31e1e80184d9b2c8aa98f617b4d1cb56d55
DIFF: https://github.com/llvm/llvm-project/commit/2e30e31e1e80184d9b2c8aa98f617b4d1cb56d55.diff
LOG: [ELF] Claim recognized -z options. NFC
... so that we can reimplement `checkZOptions` using
https://reviews.llvm.org/D48433
Added:
Modified:
lld/Common/Args.cpp
lld/ELF/Driver.cpp
Removed:
################################################################################
diff --git a/lld/Common/Args.cpp b/lld/Common/Args.cpp
index 67d7babc96fff9..5546b2aece641e 100644
--- a/lld/Common/Args.cpp
+++ b/lld/Common/Args.cpp
@@ -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) {
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 07f4263c90e62b..157f6ee5ceafc3 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -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()) {
More information about the llvm-commits
mailing list