1c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//===- Option.h - Abstract Driver Options -----------------------*- C++ -*-===//
2c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//
3c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//                     The LLVM Compiler Infrastructure
4c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//
5c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// This file is distributed under the University of Illinois Open Source
6c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// License. See LICENSE.TXT for details.
7c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//
8c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//===----------------------------------------------------------------------===//
9c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
10c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#ifndef LLVM_OPTION_OPTION_H
11c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#define LLVM_OPTION_OPTION_H
12c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
13c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/ADT/SmallVector.h"
14c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/ADT/StringRef.h"
15c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/Option/OptSpecifier.h"
16c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/Option/OptTable.h"
17c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/Support/ErrorHandling.h"
18c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include <cassert>
19c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include <string>
20c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
21c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace llvm {
22c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
23c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass raw_ostream;
24c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
25c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace opt {
26c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
27c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass Arg;
28c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass ArgList;
29c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
30c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// ArgStringList - Type used for constructing argv lists for subprocesses.
31c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotusing ArgStringList = SmallVector<const char *, 16>;
32c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
33c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// Base flags for all options. Custom flags may be added after.
34c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotenum DriverFlag {
35c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  HelpHidden       = (1 << 0),
36c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  RenderAsInput    = (1 << 1),
37c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  RenderJoined     = (1 << 2),
38c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  RenderSeparate   = (1 << 3)
39c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot};
40c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
41c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// Option - Abstract representation for a single form of driver
42c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// argument.
43c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot///
44c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// An Option class represents a form of option that the driver
45c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// takes, for example how many arguments the option has and how
46c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// they can be provided. Individual option instances store
47c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// additional information about what group the option is a member
48c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// of (if any), if the option is an alias, and a number of
49c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// flags. At runtime the driver parses the command line into
50c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// concrete Arg instances, each of which corresponds to a
51c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// particular Option instance.
52c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass Option {
53c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotpublic:
54c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  enum OptionClass {
55c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    GroupClass = 0,
56c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    InputClass,
57c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    UnknownClass,
58c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    FlagClass,
59c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    JoinedClass,
60c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    ValuesClass,
61c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SeparateClass,
62c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    RemainingArgsClass,
63c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    RemainingArgsJoinedClass,
64c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    CommaJoinedClass,
65c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    MultiArgClass,
66c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    JoinedOrSeparateClass,
67c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    JoinedAndSeparateClass
68c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  };
69c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
70c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  enum RenderStyleKind {
71c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    RenderCommaJoinedStyle,
72c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    RenderJoinedStyle,
73c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    RenderSeparateStyle,
74c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    RenderValuesStyle
75c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  };
76c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
77c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotprotected:
78c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const OptTable::Info *Info;
79c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const OptTable *Owner;
80c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
81c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotpublic:
82c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  Option(const OptTable::Info *Info, const OptTable *Owner);
83c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
84c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  bool isValid() const {
85c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Info != nullptr;
86c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
87c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
88c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  unsigned getID() const {
89c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    assert(Info && "Must have a valid info!");
90c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Info->ID;
91c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
92c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
93c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  OptionClass getKind() const {
94c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    assert(Info && "Must have a valid info!");
95c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return OptionClass(Info->Kind);
96c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
97c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
98c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// \brief Get the name of this option without any prefix.
99c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  StringRef getName() const {
100c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    assert(Info && "Must have a valid info!");
101c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Info->Name;
102c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
103c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
104c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const Option getGroup() const {
105c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    assert(Info && "Must have a valid info!");
106c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    assert(Owner && "Must have a valid owner!");
107c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Owner->getOption(Info->GroupID);
108c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
109c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
110c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const Option getAlias() const {
111c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    assert(Info && "Must have a valid info!");
112c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    assert(Owner && "Must have a valid owner!");
113c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Owner->getOption(Info->AliasID);
114c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
115c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
116c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// \brief Get the alias arguments as a \0 separated list.
117c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// E.g. ["foo", "bar"] would be returned as "foo\0bar\0".
118c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const char *getAliasArgs() const {
119c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    assert(Info && "Must have a valid info!");
120c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    assert((!Info->AliasArgs || Info->AliasArgs[0] != 0) &&
121c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot           "AliasArgs should be either 0 or non-empty.");
122c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
123c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Info->AliasArgs;
124c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
125c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
126c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// \brief Get the default prefix for this option.
127c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  StringRef getPrefix() const {
128c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    const char *Prefix = *Info->Prefixes;
129c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Prefix ? Prefix : StringRef();
130c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
131c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
132c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// \brief Get the name of this option with the default prefix.
133c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  std::string getPrefixedName() const {
134c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    std::string Ret = getPrefix();
135c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    Ret += getName();
136c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Ret;
137c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
138c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
139c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  unsigned getNumArgs() const { return Info->Param; }
140c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
141c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  bool hasNoOptAsInput() const { return Info->Flags & RenderAsInput;}
142c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
143c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  RenderStyleKind getRenderStyle() const {
144c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    if (Info->Flags & RenderJoined)
145c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot      return RenderJoinedStyle;
146c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    if (Info->Flags & RenderSeparate)
147c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot      return RenderSeparateStyle;
148c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    switch (getKind()) {
149c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case GroupClass:
150c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case InputClass:
151c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case UnknownClass:
152c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot      return RenderValuesStyle;
153c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case JoinedClass:
154c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case JoinedAndSeparateClass:
155c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot      return RenderJoinedStyle;
156c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case CommaJoinedClass:
157c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot      return RenderCommaJoinedStyle;
158c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case FlagClass:
159c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case ValuesClass:
160c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case SeparateClass:
161c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case MultiArgClass:
162c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case JoinedOrSeparateClass:
163c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case RemainingArgsClass:
164c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    case RemainingArgsJoinedClass:
165c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot      return RenderSeparateStyle;
166c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    }
167c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    llvm_unreachable("Unexpected kind!");
168c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
169c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
170c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// Test if this option has the flag \a Val.
171c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  bool hasFlag(unsigned Val) const {
172c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Info->Flags & Val;
173c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
174c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
175c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// getUnaliasedOption - Return the final option this option
176c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// aliases (itself, if the option has no alias).
177c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const Option getUnaliasedOption() const {
178c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    const Option Alias = getAlias();
179c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    if (Alias.isValid()) return Alias.getUnaliasedOption();
180c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return *this;
181c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
182c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
183c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// getRenderName - Return the name to use when rendering this
184c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// option.
185c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  StringRef getRenderName() const {
186c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return getUnaliasedOption().getName();
187c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
188c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
189c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// matches - Predicate for whether this option is part of the
190c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// given option (which may be a group).
191c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  ///
192c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// Note that matches against options which are an alias should never be
193c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// done -- aliases do not participate in matching and so such a query will
194c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// always be false.
195c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  bool matches(OptSpecifier ID) const;
196c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
197c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// accept - Potentially accept the current argument, returning a
198c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// new Arg instance, or 0 if the option does not accept this
199c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// argument (or the argument is missing values).
200c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  ///
201c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// If the option accepts the current argument, accept() sets
202c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// Index to the position where argument parsing should resume
203c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// (even if the argument is missing values).
204c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  ///
205c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// \param ArgSize The number of bytes taken up by the matched Option prefix
206c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  ///                and name. This is used to determine where joined values
207c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  ///                start.
208c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  Arg *accept(const ArgList &Args, unsigned &Index, unsigned ArgSize) const;
209c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
210c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  void print(raw_ostream &O) const;
211c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  void dump() const;
212c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot};
213c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
214c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} // end namespace opt
215c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
216c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} // end namespace llvm
217c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
218c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#endif // LLVM_OPTION_OPTION_H
219