Path: blob/main/contrib/llvm-project/lld/Common/Args.cpp
34879 views
//===- Args.cpp -----------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lld/Common/Args.h"9#include "lld/Common/ErrorHandler.h"10#include "llvm/ADT/SmallVector.h"11#include "llvm/ADT/StringExtras.h"12#include "llvm/ADT/StringRef.h"13#include "llvm/Option/ArgList.h"14#include "llvm/Support/Path.h"1516using namespace llvm;17using namespace lld;1819// TODO(sbc): Remove this once CGOptLevel can be set completely based on bitcode20// function metadata.21int lld::args::getCGOptLevel(int optLevelLTO) {22return std::clamp(optLevelLTO, 2, 3);23}2425static int64_t getInteger(opt::InputArgList &args, unsigned key,26int64_t Default, unsigned base) {27auto *a = args.getLastArg(key);28if (!a)29return Default;3031int64_t v;32StringRef s = a->getValue();33if (base == 16)34s.consume_front_insensitive("0x");35if (to_integer(s, v, base))36return v;3738StringRef spelling = args.getArgString(a->getIndex());39error(spelling + ": number expected, but got '" + a->getValue() + "'");40return 0;41}4243int64_t lld::args::getInteger(opt::InputArgList &args, unsigned key,44int64_t Default) {45return ::getInteger(args, key, Default, 10);46}4748int64_t lld::args::getHex(opt::InputArgList &args, unsigned key,49int64_t Default) {50return ::getInteger(args, key, Default, 16);51}5253SmallVector<StringRef, 0> lld::args::getStrings(opt::InputArgList &args,54int id) {55SmallVector<StringRef, 0> v;56for (auto *arg : args.filtered(id))57v.push_back(arg->getValue());58return v;59}6061uint64_t lld::args::getZOptionValue(opt::InputArgList &args, int id,62StringRef key, uint64_t defaultValue) {63for (auto *arg : args.filtered(id)) {64std::pair<StringRef, StringRef> kv = StringRef(arg->getValue()).split('=');65if (kv.first == key) {66if (!to_integer(kv.second, defaultValue))67error("invalid " + key + ": " + kv.second);68arg->claim();69}70}71return defaultValue;72}7374std::vector<StringRef> lld::args::getLines(MemoryBufferRef mb) {75SmallVector<StringRef, 0> arr;76mb.getBuffer().split(arr, '\n');7778std::vector<StringRef> ret;79for (StringRef s : arr) {80s = s.trim();81if (!s.empty() && s[0] != '#')82ret.push_back(s);83}84return ret;85}8687StringRef lld::args::getFilenameWithoutExe(StringRef path) {88if (path.ends_with_insensitive(".exe"))89return sys::path::stem(path);90return sys::path::filename(path);91}929394