//===- 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. CodeGenOpt::Level lld::args::getCGOptLevel(int optLevelLTO) { if (optLevelLTO == 3) return CodeGenOpt::Aggressive; assert(optLevelLTO < 3); return CodeGenOpt::Default; } 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.startswith("0x") || s.startswith("0X"))) s = s.drop_front(2); 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); } std::vector lld::args::getStrings(opt::InputArgList &args, int id) { std::vector 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 Default) { for (auto *arg : args.filtered_reverse(id)) { std::pair kv = StringRef(arg->getValue()).split('='); if (kv.first == key) { uint64_t result = Default; if (!to_integer(kv.second, result)) error("invalid " + key + ": " + kv.second); return result; } } return Default; } std::vector lld::args::getLines(MemoryBufferRef mb) { SmallVector arr; mb.getBuffer().split(arr, '\n'); std::vector 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.endswith_lower(".exe")) return sys::path::stem(path); return sys::path::filename(path); }