[ELF] Claim recognized -z options. NFC
... so that we can reimplement `checkZOptions` using https://reviews.llvm.org/D48433
This commit is contained in:
parent
890acf8d38
commit
2e30e31e1e
@ -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) {
|
||||
|
@ -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()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user