|  | //===- 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); | 
|  | } |