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