blob: 583650f63ba393ab7a16d89e9c98863e6bbfd048 [file] [log] [blame]
Daniel Dunbar16090d42009-03-03 05:55:11 +00001//===--- Option.cpp - Abstract Driver Options ---------------------------*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "clang/Driver/Option.h"
Daniel Dunbara5aa4b02009-03-04 08:33:23 +000011#include "llvm/Support/raw_ostream.h"
Daniel Dunbar16090d42009-03-03 05:55:11 +000012#include <cassert>
13using namespace clang;
14using namespace clang::driver;
15
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +000016Option::Option(OptionClass _Kind, options::ID _ID, const char *_Name,
Daniel Dunbara5aa4b02009-03-04 08:33:23 +000017 const OptionGroup *_Group, const Option *_Alias)
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +000018 : Kind(_Kind), ID(_ID), Name(_Name), Group(_Group), Alias(_Alias),
Daniel Dunbarec0f2fa2009-03-04 21:05:23 +000019 Unsupported(false), LinkerInput(false), NoOptAsInput(false),
20 ForceSeparateRender(false), ForceJoinedRender(false)
21{
Daniel Dunbar16090d42009-03-03 05:55:11 +000022
23 // Multi-level aliases are not supported, and alias options cannot
24 // have groups. This just simplifies option tracking, it is not an
25 // inherent limitation.
26 assert((!Alias || (!Alias->Alias && !Group)) &&
27 "Multi-level aliases and aliases with groups are unsupported.");
28}
29
Daniel Dunbara5aa4b02009-03-04 08:33:23 +000030Option::~Option() {
31}
32
33void Option::dump() const {
34 llvm::errs() << "<";
35 switch (Kind) {
36 default:
37 assert(0 && "Invalid kind");
38#define P(N) case N: llvm::errs() << #N; break
39 P(GroupClass);
40 P(InputClass);
41 P(UnknownClass);
42 P(FlagClass);
43 P(JoinedClass);
44 P(SeparateClass);
45 P(CommaJoinedClass);
46 P(MultiArgClass);
47 P(JoinedOrSeparateClass);
48 P(JoinedAndSeparateClass);
49#undef P
50 }
51
52 llvm::errs() << " Name:\"" << Name << '"';
53
54 if (Group) {
55 llvm::errs() << " Group:";
56 Group->dump();
57 }
58
59 if (Alias) {
60 llvm::errs() << " Alias:";
61 Alias->dump();
62 }
63
64 if (const MultiArgOption *MOA = dyn_cast<MultiArgOption>(this))
65 llvm::errs() << " NumArgs:" << MOA->getNumArgs();
66
67 llvm::errs() << ">\n";
68}
69
Daniel Dunbar16090d42009-03-03 05:55:11 +000070bool Option::matches(const Option *Opt) const {
71 // Aliases are never considered in matching.
72 if (Opt->getAlias())
73 return matches(Opt->getAlias());
74 if (Alias)
75 return Alias->matches(Opt);
76
77 if (this == Opt)
78 return true;
79
80 if (Group)
81 return Group->matches(Opt);
82 return false;
83}
84
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +000085OptionGroup::OptionGroup(options::ID ID, const char *Name,
86 const OptionGroup *Group)
87 : Option(Option::GroupClass, ID, Name, Group, 0) {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +000088}
89
Daniel Dunbar0119ee42009-03-04 20:53:00 +000090Arg *OptionGroup::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +000091 assert(0 && "FIXME");
92 return 0;
Daniel Dunbar16090d42009-03-03 05:55:11 +000093}
94
95InputOption::InputOption()
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +000096 : Option(Option::InputClass, options::InputOpt, "<input>", 0, 0) {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +000097}
98
Daniel Dunbar0119ee42009-03-04 20:53:00 +000099Arg *InputOption::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000100 assert(0 && "FIXME");
101 return 0;
Daniel Dunbar16090d42009-03-03 05:55:11 +0000102}
103
104UnknownOption::UnknownOption()
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000105 : Option(Option::UnknownClass, options::UnknownOpt, "<unknown>", 0, 0) {
Daniel Dunbar16090d42009-03-03 05:55:11 +0000106}
107
Daniel Dunbar0119ee42009-03-04 20:53:00 +0000108Arg *UnknownOption::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000109 assert(0 && "FIXME");
110 return 0;
Daniel Dunbar16090d42009-03-03 05:55:11 +0000111}
112
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000113FlagOption::FlagOption(options::ID ID, const char *Name,
114 const OptionGroup *Group, const Option *Alias)
115 : Option(Option::FlagClass, ID, Name, Group, Alias) {
Daniel Dunbar16090d42009-03-03 05:55:11 +0000116}
117
Daniel Dunbar0119ee42009-03-04 20:53:00 +0000118Arg *FlagOption::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000119 assert(0 && "FIXME");
120 return 0;
Daniel Dunbar16090d42009-03-03 05:55:11 +0000121}
122
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000123JoinedOption::JoinedOption(options::ID ID, const char *Name,
124 const OptionGroup *Group, const Option *Alias)
125 : Option(Option::JoinedClass, ID, Name, Group, Alias) {
Daniel Dunbar16090d42009-03-03 05:55:11 +0000126}
127
Daniel Dunbar0119ee42009-03-04 20:53:00 +0000128Arg *JoinedOption::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000129 assert(0 && "FIXME");
130 return 0;
131}
132
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000133CommaJoinedOption::CommaJoinedOption(options::ID ID, const char *Name,
134 const OptionGroup *Group,
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000135 const Option *Alias)
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000136 : Option(Option::CommaJoinedClass, ID, Name, Group, Alias) {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000137}
138
Daniel Dunbar0119ee42009-03-04 20:53:00 +0000139Arg *CommaJoinedOption::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000140 assert(0 && "FIXME");
141 return 0;
142}
143
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000144SeparateOption::SeparateOption(options::ID ID, const char *Name,
145 const OptionGroup *Group, const Option *Alias)
146 : Option(Option::SeparateClass, ID, Name, Group, Alias) {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000147}
148
Daniel Dunbar0119ee42009-03-04 20:53:00 +0000149Arg *SeparateOption::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000150 assert(0 && "FIXME");
151 return 0;
152}
153
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000154MultiArgOption::MultiArgOption(options::ID ID, const char *Name,
155 const OptionGroup *Group, const Option *Alias,
156 unsigned _NumArgs)
157 : Option(Option::MultiArgClass, ID, Name, Group, Alias), NumArgs(_NumArgs) {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000158}
159
Daniel Dunbar0119ee42009-03-04 20:53:00 +0000160Arg *MultiArgOption::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000161 assert(0 && "FIXME");
162 return 0;
Daniel Dunbar16090d42009-03-03 05:55:11 +0000163}
164
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000165JoinedOrSeparateOption::JoinedOrSeparateOption(options::ID ID, const char *Name,
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000166 const OptionGroup *Group,
167 const Option *Alias)
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000168 : Option(Option::JoinedOrSeparateClass, ID, Name, Group, Alias) {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000169}
170
Daniel Dunbar0119ee42009-03-04 20:53:00 +0000171Arg *JoinedOrSeparateOption::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000172 assert(0 && "FIXME");
173 return 0;
Daniel Dunbar16090d42009-03-03 05:55:11 +0000174}
175
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000176JoinedAndSeparateOption::JoinedAndSeparateOption(options::ID ID,
177 const char *Name,
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000178 const OptionGroup *Group,
179 const Option *Alias)
Daniel Dunbar0d96a83b2009-03-04 21:53:04 +0000180 : Option(Option::JoinedAndSeparateClass, ID, Name, Group, Alias) {
Daniel Dunbar16090d42009-03-03 05:55:11 +0000181}
182
Daniel Dunbar0119ee42009-03-04 20:53:00 +0000183Arg *JoinedAndSeparateOption::accept(const ArgList &Args, unsigned &Index) const {
Daniel Dunbara5aa4b02009-03-04 08:33:23 +0000184 assert(0 && "FIXME");
185 return 0;
186}
Daniel Dunbar16090d42009-03-03 05:55:11 +0000187