13e03944fSRui Ueyama //===- Args.cpp -----------------------------------------------------------===//
23e03944fSRui Ueyama //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63e03944fSRui Ueyama //
73e03944fSRui Ueyama //===----------------------------------------------------------------------===//
83e03944fSRui Ueyama
93e03944fSRui Ueyama #include "lld/Common/Args.h"
103e03944fSRui Ueyama #include "lld/Common/ErrorHandler.h"
113e03944fSRui Ueyama #include "llvm/ADT/SmallVector.h"
123e03944fSRui Ueyama #include "llvm/ADT/StringExtras.h"
133e03944fSRui Ueyama #include "llvm/ADT/StringRef.h"
143e03944fSRui Ueyama #include "llvm/Option/ArgList.h"
15386bf121SNico Weber #include "llvm/Support/Path.h"
163e03944fSRui Ueyama
173e03944fSRui Ueyama using namespace llvm;
183e03944fSRui Ueyama using namespace lld;
193e03944fSRui Ueyama
205cdc91d0SSam Clegg // TODO(sbc): Remove this once CGOptLevel can be set completely based on bitcode
215cdc91d0SSam Clegg // function metadata.
getCGOptLevel(int optLevelLTO)2245ee0a9aSScott Linder int lld::args::getCGOptLevel(int optLevelLTO) {
2345ee0a9aSScott Linder return std::clamp(optLevelLTO, 2, 3);
245cdc91d0SSam Clegg }
255cdc91d0SSam Clegg
getInteger(opt::InputArgList & args,unsigned key,int64_t Default,unsigned base)2622e6648aSJez Ng static int64_t getInteger(opt::InputArgList &args, unsigned key,
2722e6648aSJez Ng int64_t Default, unsigned base) {
28136d27abSRui Ueyama auto *a = args.getLastArg(key);
29136d27abSRui Ueyama if (!a)
300dd56dcdSRui Ueyama return Default;
310dd56dcdSRui Ueyama
32136d27abSRui Ueyama int64_t v;
33703d3f25SGreg McGary StringRef s = a->getValue();
3451fb76ffSKazu Hirata if (base == 16)
3551fb76ffSKazu Hirata s.consume_front_insensitive("0x");
36703d3f25SGreg McGary if (to_integer(s, v, base))
37136d27abSRui Ueyama return v;
380dd56dcdSRui Ueyama
39136d27abSRui Ueyama StringRef spelling = args.getArgString(a->getIndex());
40136d27abSRui Ueyama error(spelling + ": number expected, but got '" + a->getValue() + "'");
410dd56dcdSRui Ueyama return 0;
423e03944fSRui Ueyama }
433e03944fSRui Ueyama
getInteger(opt::InputArgList & args,unsigned key,int64_t Default)4422e6648aSJez Ng int64_t lld::args::getInteger(opt::InputArgList &args, unsigned key,
4522e6648aSJez Ng int64_t Default) {
4622e6648aSJez Ng return ::getInteger(args, key, Default, 10);
4722e6648aSJez Ng }
4822e6648aSJez Ng
getHex(opt::InputArgList & args,unsigned key,int64_t Default)4922e6648aSJez Ng int64_t lld::args::getHex(opt::InputArgList &args, unsigned key,
5022e6648aSJez Ng int64_t Default) {
5122e6648aSJez Ng return ::getInteger(args, key, Default, 16);
5222e6648aSJez Ng }
5322e6648aSJez Ng
getStrings(opt::InputArgList & args,int id)544b2b68d5SFangrui Song SmallVector<StringRef, 0> lld::args::getStrings(opt::InputArgList &args,
554b2b68d5SFangrui Song int id) {
564b2b68d5SFangrui Song SmallVector<StringRef, 0> v;
57136d27abSRui Ueyama for (auto *arg : args.filtered(id))
58136d27abSRui Ueyama v.push_back(arg->getValue());
59136d27abSRui Ueyama return v;
603e03944fSRui Ueyama }
613e03944fSRui Ueyama
getZOptionValue(opt::InputArgList & args,int id,StringRef key,uint64_t defaultValue)62136d27abSRui Ueyama uint64_t lld::args::getZOptionValue(opt::InputArgList &args, int id,
63*2e30e31eSFangrui Song StringRef key, uint64_t defaultValue) {
64*2e30e31eSFangrui Song for (auto *arg : args.filtered(id)) {
65136d27abSRui Ueyama std::pair<StringRef, StringRef> kv = StringRef(arg->getValue()).split('=');
66136d27abSRui Ueyama if (kv.first == key) {
67*2e30e31eSFangrui Song if (!to_integer(kv.second, defaultValue))
68136d27abSRui Ueyama error("invalid " + key + ": " + kv.second);
69*2e30e31eSFangrui Song arg->claim();
703e03944fSRui Ueyama }
713e03944fSRui Ueyama }
72*2e30e31eSFangrui Song return defaultValue;
733e03944fSRui Ueyama }
743e03944fSRui Ueyama
getLines(MemoryBufferRef mb)75136d27abSRui Ueyama std::vector<StringRef> lld::args::getLines(MemoryBufferRef mb) {
76136d27abSRui Ueyama SmallVector<StringRef, 0> arr;
77136d27abSRui Ueyama mb.getBuffer().split(arr, '\n');
783e03944fSRui Ueyama
79136d27abSRui Ueyama std::vector<StringRef> ret;
80136d27abSRui Ueyama for (StringRef s : arr) {
81136d27abSRui Ueyama s = s.trim();
82136d27abSRui Ueyama if (!s.empty() && s[0] != '#')
83136d27abSRui Ueyama ret.push_back(s);
843e03944fSRui Ueyama }
85136d27abSRui Ueyama return ret;
863e03944fSRui Ueyama }
87386bf121SNico Weber
getFilenameWithoutExe(StringRef path)88136d27abSRui Ueyama StringRef lld::args::getFilenameWithoutExe(StringRef path) {
89ed1539c6SKazu Hirata if (path.ends_with_insensitive(".exe"))
90136d27abSRui Ueyama return sys::path::stem(path);
91136d27abSRui Ueyama return sys::path::filename(path);
92386bf121SNico Weber }
93