196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===--- Arg.h - Parsed Argument Classes ------------------------*- C++ -*-===//
296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//                     The LLVM Compiler Infrastructure
496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// This file is distributed under the University of Illinois Open Source
696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// License. See LICENSE.TXT for details.
796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===----------------------------------------------------------------------===//
996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer///
1096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// \file
1196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// \brief Defines the llvm::Arg class for parsed arguments.
1296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer///
1396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===----------------------------------------------------------------------===//
1496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_OPTION_ARG_H
16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_OPTION_ARG_H
1796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
1896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/SmallVector.h"
1996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/StringRef.h"
2096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Option.h"
2196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include <string>
2296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencernamespace llvm {
2496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencernamespace opt {
2596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerclass ArgList;
2696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// \brief A concrete instance of a particular driver option.
2896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer///
2996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// The Arg class encodes just enough information to be able to
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// derive the argument values efficiently.
3196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerclass Arg {
3296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Arg(const Arg &) LLVM_DELETED_FUNCTION;
3396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  void operator=(const Arg &) LLVM_DELETED_FUNCTION;
3496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerprivate:
3696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief The option this argument is an instance of.
3796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Option Opt;
3896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief The argument this argument was derived from (during tool chain
4096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// argument translation), if any.
4196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Arg *BaseArg;
4296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
4396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief How this instance of the option was spelled.
4496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  StringRef Spelling;
4596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
4696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief The index at which this argument appears in the containing
4796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// ArgList.
4896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index;
4996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
5096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Was this argument used to effect compilation?
5196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ///
5296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// This is used for generating "argument unused" diagnostics.
5396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  mutable unsigned Claimed : 1;
5496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
5596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Does this argument own its values?
5696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  mutable unsigned OwnsValues : 1;
5796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
5896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief The argument values, as C strings.
5996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  SmallVector<const char *, 2> Values;
6096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
6196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerpublic:
6296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Arg(const Option Opt, StringRef Spelling, unsigned Index,
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      const Arg *BaseArg = nullptr);
6496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Arg(const Option Opt, StringRef Spelling, unsigned Index,
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      const char *Value0, const Arg *BaseArg = nullptr);
6696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Arg(const Option Opt, StringRef Spelling, unsigned Index,
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      const char *Value0, const char *Value1, const Arg *BaseArg = nullptr);
6896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ~Arg();
6996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const Option &getOption() const { return Opt; }
7196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  StringRef getSpelling() const { return Spelling; }
7296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned getIndex() const { return Index; }
7396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
7496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Return the base argument which generated this arg.
7596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ///
7696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// This is either the argument itself or the argument it was
7796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// derived from during tool chain specific argument translation.
7896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Arg &getBaseArg() const {
7996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return BaseArg ? *BaseArg : *this;
8096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
8196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  void setBaseArg(const Arg *_BaseArg) {
8296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    BaseArg = _BaseArg;
8396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  bool getOwnsValues() const { return OwnsValues; }
8696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  void setOwnsValues(bool Value) const { OwnsValues = Value; }
8796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  bool isClaimed() const { return getBaseArg().Claimed; }
8996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Set the Arg claimed bit.
9196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  void claim() const { getBaseArg().Claimed = true; }
9296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned getNumValues() const { return Values.size(); }
9496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const char *getValue(unsigned N = 0) const {
9596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Values[N];
9696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
9796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  SmallVectorImpl<const char*> &getValues() {
9996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Values;
10096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
10196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
10296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  bool containsValue(StringRef Value) const {
10396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    for (unsigned i = 0, e = getNumValues(); i != e; ++i)
10496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      if (Values[i] == Value)
10596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        return true;
10696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return false;
10796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
10896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
10996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Append the argument onto the given array as strings.
11096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  void render(const ArgList &Args, ArgStringList &Output) const;
11196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
11296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Append the argument, render as an input, onto the given
11396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// array as strings.
11496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ///
11596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// The distinction is that some options only render their values
11696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// when rendered as a input (e.g., Xlinker).
11796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  void renderAsInput(const ArgList &Args, ArgStringList &Output) const;
11896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
11996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  void dump() const;
12096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
12196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Return a formatted version of the argument and
12296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// its values, for debugging and diagnostics.
12396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  std::string getAsString(const ArgList &Args) const;
12496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer};
12596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
12696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} // end namespace opt
12796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} // end namespace llvm
12896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
12996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#endif
130