llvm-project

Форк
0
92 строки · 2.7 Кб
1
//===- Args.cpp -----------------------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8

9
#include "lld/Common/Args.h"
10
#include "lld/Common/ErrorHandler.h"
11
#include "llvm/ADT/SmallVector.h"
12
#include "llvm/ADT/StringExtras.h"
13
#include "llvm/ADT/StringRef.h"
14
#include "llvm/Option/ArgList.h"
15
#include "llvm/Support/Path.h"
16

17
using namespace llvm;
18
using namespace lld;
19

20
// TODO(sbc): Remove this once CGOptLevel can be set completely based on bitcode
21
// function metadata.
22
int lld::args::getCGOptLevel(int optLevelLTO) {
23
  return std::clamp(optLevelLTO, 2, 3);
24
}
25

26
static int64_t getInteger(opt::InputArgList &args, unsigned key,
27
                          int64_t Default, unsigned base) {
28
  auto *a = args.getLastArg(key);
29
  if (!a)
30
    return Default;
31

32
  int64_t v;
33
  StringRef s = a->getValue();
34
  if (base == 16)
35
    s.consume_front_insensitive("0x");
36
  if (to_integer(s, v, base))
37
    return v;
38

39
  StringRef spelling = args.getArgString(a->getIndex());
40
  error(spelling + ": number expected, but got '" + a->getValue() + "'");
41
  return 0;
42
}
43

44
int64_t lld::args::getInteger(opt::InputArgList &args, unsigned key,
45
                              int64_t Default) {
46
  return ::getInteger(args, key, Default, 10);
47
}
48

49
int64_t lld::args::getHex(opt::InputArgList &args, unsigned key,
50
                          int64_t Default) {
51
  return ::getInteger(args, key, Default, 16);
52
}
53

54
SmallVector<StringRef, 0> lld::args::getStrings(opt::InputArgList &args,
55
                                                int id) {
56
  SmallVector<StringRef, 0> v;
57
  for (auto *arg : args.filtered(id))
58
    v.push_back(arg->getValue());
59
  return v;
60
}
61

62
uint64_t lld::args::getZOptionValue(opt::InputArgList &args, int id,
63
                                    StringRef key, uint64_t defaultValue) {
64
  for (auto *arg : args.filtered(id)) {
65
    std::pair<StringRef, StringRef> kv = StringRef(arg->getValue()).split('=');
66
    if (kv.first == key) {
67
      if (!to_integer(kv.second, defaultValue))
68
        error("invalid " + key + ": " + kv.second);
69
      arg->claim();
70
    }
71
  }
72
  return defaultValue;
73
}
74

75
std::vector<StringRef> lld::args::getLines(MemoryBufferRef mb) {
76
  SmallVector<StringRef, 0> arr;
77
  mb.getBuffer().split(arr, '\n');
78

79
  std::vector<StringRef> ret;
80
  for (StringRef s : arr) {
81
    s = s.trim();
82
    if (!s.empty() && s[0] != '#')
83
      ret.push_back(s);
84
  }
85
  return ret;
86
}
87

88
StringRef lld::args::getFilenameWithoutExe(StringRef path) {
89
  if (path.ends_with_insensitive(".exe"))
90
    return sys::path::stem(path);
91
  return sys::path::filename(path);
92
}
93

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.