| //===- Args.cpp -----------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "lld/Common/Args.h" |
| #include "lld/Common/ErrorHandler.h" |
| #include "llvm/ADT/SmallVector.h" |
| #include "llvm/ADT/StringExtras.h" |
| #include "llvm/ADT/StringRef.h" |
| #include "llvm/Option/ArgList.h" |
| #include "llvm/Support/Path.h" |
| |
| using namespace llvm; |
| using namespace lld; |
| |
| // TODO(sbc): Remove this once CGOptLevel can be set completely based on bitcode |
| // function metadata. |
| int lld::args::getCGOptLevel(int optLevelLTO) { |
| return std::clamp(optLevelLTO, 2, 3); |
| } |
| |
| static int64_t getInteger(opt::InputArgList &args, unsigned key, |
| int64_t Default, unsigned base) { |
| auto *a = args.getLastArg(key); |
| if (!a) |
| return Default; |
| |
| int64_t v; |
| StringRef s = a->getValue(); |
| if (base == 16) |
| s.consume_front_insensitive("0x"); |
| if (to_integer(s, v, base)) |
| return v; |
| |
| StringRef spelling = args.getArgString(a->getIndex()); |
| error(spelling + ": number expected, but got '" + a->getValue() + "'"); |
| return 0; |
| } |
| |
| int64_t lld::args::getInteger(opt::InputArgList &args, unsigned key, |
| int64_t Default) { |
| return ::getInteger(args, key, Default, 10); |
| } |
| |
| int64_t lld::args::getHex(opt::InputArgList &args, unsigned key, |
| int64_t Default) { |
| return ::getInteger(args, key, Default, 16); |
| } |
| |
| SmallVector<StringRef, 0> lld::args::getStrings(opt::InputArgList &args, |
| int id) { |
| SmallVector<StringRef, 0> v; |
| for (auto *arg : args.filtered(id)) |
| v.push_back(arg->getValue()); |
| return v; |
| } |
| |
| uint64_t lld::args::getZOptionValue(opt::InputArgList &args, int 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) { |
| if (!to_integer(kv.second, defaultValue)) |
| error("invalid " + key + ": " + kv.second); |
| arg->claim(); |
| } |
| } |
| return defaultValue; |
| } |
| |
| std::vector<StringRef> lld::args::getLines(MemoryBufferRef mb) { |
| SmallVector<StringRef, 0> arr; |
| mb.getBuffer().split(arr, '\n'); |
| |
| std::vector<StringRef> ret; |
| for (StringRef s : arr) { |
| s = s.trim(); |
| if (!s.empty() && s[0] != '#') |
| ret.push_back(s); |
| } |
| return ret; |
| } |
| |
| StringRef lld::args::getFilenameWithoutExe(StringRef path) { |
| if (path.ends_with_insensitive(".exe")) |
| return sys::path::stem(path); |
| return sys::path::filename(path); |
| } |