1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
//===--- Option.cpp - Abstract Driver Options ---------------------------*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "clang/Driver/Option.h"
#include <cassert>
using namespace clang;
using namespace clang::driver;
Option::Option(OptionClass _Kind, const char *_Name,
OptionGroup *_Group, Option *_Alias)
: Kind(_Kind), Name(_Name), Group(_Group), Alias(_Alias) {
// Multi-level aliases are not supported, and alias options cannot
// have groups. This just simplifies option tracking, it is not an
// inherent limitation.
assert((!Alias || (!Alias->Alias && !Group)) &&
"Multi-level aliases and aliases with groups are unsupported.");
}
bool Option::matches(const Option *Opt) const {
// Aliases are never considered in matching.
if (Opt->getAlias())
return matches(Opt->getAlias());
if (Alias)
return Alias->matches(Opt);
if (this == Opt)
return true;
if (Group)
return Group->matches(Opt);
return false;
}
OptionGroup::OptionGroup(const char *Name, OptionGroup *Group)
: Option(Option::GroupOption, Name, Group, 0) {
}
InputOption::InputOption()
: Option(Option::InputOption, "<input>", 0, 0) {
}
UnknownOption::UnknownOption()
: Option(Option::UnknownOption, "<unknown>", 0, 0) {
}
FlagOption::FlagOption(const char *Name, OptionGroup *Group, Option *Alias)
: Option(Option::FlagOption, Name, Group, Alias) {
}
JoinedOption::JoinedOption(const char *Name, OptionGroup *Group, Option *Alias)
: Option(Option::JoinedOption, Name, Group, Alias) {
}
CommaJoinedOption::CommaJoinedOption(const char *Name, OptionGroup *Group,
Option *Alias)
: Option(Option::CommaJoinedOption, Name, Group, Alias) {
}
SeparateOption::SeparateOption(const char *Name, OptionGroup *Group,
Option *Alias)
: Option(Option::SeparateOption, Name, Group, Alias) {
}
MultiArgOption::MultiArgOption(const char *Name, OptionGroup *Group,
Option *Alias, unsigned _NumArgs)
: Option(Option::MultiArgOption, Name, Group, Alias), NumArgs(_NumArgs) {
}
JoinedOrSeparateOption::JoinedOrSeparateOption(const char *Name,
OptionGroup *Group,
Option *Alias)
: Option(Option::JoinedOrSeparateOption, Name, Group, Alias) {
}
JoinedAndSeparateOption::JoinedAndSeparateOption(const char *Name,
OptionGroup *Group,
Option *Alias)
: Option(Option::JoinedAndSeparateOption, Name, Group, Alias) {
}
|