CommandLine.h revision de551f91d8816632a76a065084caab9fab6aacff
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===- llvm/Support/CommandLine.h - Command line handler --------*- C++ -*-===// 263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 3b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// The LLVM Compiler Infrastructure 4b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 8b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//===----------------------------------------------------------------------===// 9cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 10cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// This class implements a command line argument processor that is useful when 11cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// creating a tool. It provides a simple, minimalistic interface that is easily 12cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// extensible and supports nonlocal (library) command line options. 13cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 14331de23705a719514e37c211f327379688f81b0dChris Lattner// Note that rather than trying to figure out what this code does, you should 15331de23705a719514e37c211f327379688f81b0dChris Lattner// read the library documentation located in docs/CommandLine.html or looks at 16331de23705a719514e37c211f327379688f81b0dChris Lattner// the many example usages in tools/*/*.cpp 17cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 18cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 19cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef LLVM_SUPPORT_COMMANDLINE_H 21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LLVM_SUPPORT_COMMANDLINE_H 22cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 23551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/type_traits.h" 2466c5fd6c537269eaef0f630fa14360dcaff6a295Jeff Cohen#include "llvm/Support/DataTypes.h" 257422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner#include "llvm/Support/Compiler.h" 263b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner#include "llvm/ADT/SmallVector.h" 27630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <cassert> 28de551f91d8816632a76a065084caab9fab6aacffDan Gohman#include <climits> 29630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <cstdarg> 30cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include <string> 31cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include <utility> 32630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <vector> 33be583b914d8156b99d3da264d5adca37fee8dbc9John Criswell 34d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 357b3d73b7ecbecf423c3766e596b6086767444363Chris Lattner 36bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattner/// cl Namespace - This namespace contains all of the command line option 37bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattner/// processing machinery. It is intentionally a short name to make qualified 38bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattner/// usage concise. 39bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattnernamespace cl { 40cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 41cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 42331de23705a719514e37c211f327379688f81b0dChris Lattner// ParseCommandLineOptions - Command line option processing entry point. 43cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 449a5263241d40d493445d7f386b4d76be088c3ac1Dan Gohmanvoid ParseCommandLineOptions(int argc, char **argv, 45beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov const char *Overview = 0, 46beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov bool ReadResponseFiles = false); 47cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 48cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 4906b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke// ParseEnvironmentOptions - Environment variable option processing alternate 5006b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke// entry point. 5106b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke// 52c48ef2ae36e2169872a828a5399ccd1993837915Brian Gaekevoid ParseEnvironmentOptions(const char *progName, const char *envvar, 53beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov const char *Overview = 0, 54beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov bool ReadResponseFiles = false); 5506b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke 56515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer///===---------------------------------------------------------------------===// 57515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer/// SetVersionPrinter - Override the default (LLVM specific) version printer 58515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer/// used to print out the version when --version is given 593ab264a985de3d86e0d1f5716f6d633fd8538618Dan Gohman/// on the command line. This allows other systems using the 60515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer/// CommandLine utilities to print their own version string. 61515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencervoid SetVersionPrinter(void (*func)()); 62515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer 6369d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner 6469d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner// MarkOptionsChanged - Internal helper function. 6569d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattnervoid MarkOptionsChanged(); 6669d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner 6706b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke//===----------------------------------------------------------------------===// 68331de23705a719514e37c211f327379688f81b0dChris Lattner// Flags permitted to be passed to command line arguments 69331de23705a719514e37c211f327379688f81b0dChris Lattner// 70cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 711e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencerenum NumOccurrences { // Flags for the number of occurrences allowed 72b5c520bfb6505caaa6ad8468b372530d44c8b253Misha Brukman Optional = 0x01, // Zero or One occurrence 73b5c520bfb6505caaa6ad8468b372530d44c8b253Misha Brukman ZeroOrMore = 0x02, // Zero or more occurrences allowed 74b5c520bfb6505caaa6ad8468b372530d44c8b253Misha Brukman Required = 0x03, // One occurrence required 75b5c520bfb6505caaa6ad8468b372530d44c8b253Misha Brukman OneOrMore = 0x04, // One or more occurrences required 76cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 77331de23705a719514e37c211f327379688f81b0dChris Lattner // ConsumeAfter - Indicates that this option is fed anything that follows the 78331de23705a719514e37c211f327379688f81b0dChris Lattner // last positional argument required by the application (it is an error if 79331de23705a719514e37c211f327379688f81b0dChris Lattner // there are zero positional arguments, and a ConsumeAfter option is used). 80331de23705a719514e37c211f327379688f81b0dChris Lattner // Thus, for example, all arguments to LLI are processed until a filename is 81331de23705a719514e37c211f327379688f81b0dChris Lattner // found. Once a filename is found, all of the succeeding arguments are 82331de23705a719514e37c211f327379688f81b0dChris Lattner // passed, unprocessed, to the ConsumeAfter option. 83cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // 84cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner ConsumeAfter = 0x05, 85cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 8640f44f1f58f823994b7f4ec4005887c3955fb1e7Chris Lattner OccurrencesMask = 0x07 87cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 88cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 89cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerenum ValueExpected { // Is a value required for the option? 90b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner ValueOptional = 0x08, // The value can appear... or not 91cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner ValueRequired = 0x10, // The value is required to appear! 92cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner ValueDisallowed = 0x18, // A value may not be specified (for flags) 9340f44f1f58f823994b7f4ec4005887c3955fb1e7Chris Lattner ValueMask = 0x18 94cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 95cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 96cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerenum OptionHidden { // Control whether -help shows this option 97cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner NotHidden = 0x20, // Option included in --help & --help-hidden 98cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner Hidden = 0x40, // -help doesn't, but --help-hidden does 99cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner ReallyHidden = 0x60, // Neither --help nor --help-hidden show this arg 10040f44f1f58f823994b7f4ec4005887c3955fb1e7Chris Lattner HiddenMask = 0x60 101cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 102cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 103331de23705a719514e37c211f327379688f81b0dChris Lattner// Formatting flags - This controls special features that the option might have 104331de23705a719514e37c211f327379688f81b0dChris Lattner// that cause it to be parsed differently... 105331de23705a719514e37c211f327379688f81b0dChris Lattner// 106331de23705a719514e37c211f327379688f81b0dChris Lattner// Prefix - This option allows arguments that are otherwise unrecognized to be 107331de23705a719514e37c211f327379688f81b0dChris Lattner// matched by options that are a prefix of the actual value. This is useful for 108331de23705a719514e37c211f327379688f81b0dChris Lattner// cases like a linker, where options are typically of the form '-lfoo' or 109331de23705a719514e37c211f327379688f81b0dChris Lattner// '-L../../include' where -l or -L are the actual flags. When prefix is 110331de23705a719514e37c211f327379688f81b0dChris Lattner// enabled, and used, the value for the flag comes from the suffix of the 111331de23705a719514e37c211f327379688f81b0dChris Lattner// argument. 112331de23705a719514e37c211f327379688f81b0dChris Lattner// 113331de23705a719514e37c211f327379688f81b0dChris Lattner// Grouping - With this option enabled, multiple letter options are allowed to 114331de23705a719514e37c211f327379688f81b0dChris Lattner// bunch together with only a single hyphen for the whole group. This allows 115331de23705a719514e37c211f327379688f81b0dChris Lattner// emulation of the behavior that ls uses for example: ls -la === ls -l -a 116331de23705a719514e37c211f327379688f81b0dChris Lattner// 117331de23705a719514e37c211f327379688f81b0dChris Lattner 118331de23705a719514e37c211f327379688f81b0dChris Lattnerenum FormattingFlags { 119331de23705a719514e37c211f327379688f81b0dChris Lattner NormalFormatting = 0x000, // Nothing special 120331de23705a719514e37c211f327379688f81b0dChris Lattner Positional = 0x080, // Is a positional argument, no '-' required 121331de23705a719514e37c211f327379688f81b0dChris Lattner Prefix = 0x100, // Can this option directly prefix its value? 122331de23705a719514e37c211f327379688f81b0dChris Lattner Grouping = 0x180, // Can this option group with other options? 12340f44f1f58f823994b7f4ec4005887c3955fb1e7Chris Lattner FormattingMask = 0x180 // Union of the above flags. 124331de23705a719514e37c211f327379688f81b0dChris Lattner}; 125331de23705a719514e37c211f327379688f81b0dChris Lattner 1261e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencerenum MiscFlags { // Miscellaneous flags to adjust argument 1271e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer CommaSeparated = 0x200, // Should this cl::list split between commas? 1281e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer PositionalEatsArgs = 0x400, // Should this positional cl::list eat -args? 129d57160d097d6cdb966e5c851215acbd2bf1aa236Anton Korobeynikov Sink = 0x800, // Should this cl::list eat all unknown options? 130d64e0eb094a108bdcdf51328425904042aa6122bMike Stump AllowInverse = 0x1000, // Can this option take a -Xno- form? 131d64e0eb094a108bdcdf51328425904042aa6122bMike Stump MiscMask = 0x1E00 // Union of the above flags. 132b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner}; 133b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner 134b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner 135cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 136cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 137cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// Option Base class 138cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 139331de23705a719514e37c211f327379688f81b0dChris Lattnerclass alias; 140cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerclass Option { 141331de23705a719514e37c211f327379688f81b0dChris Lattner friend class alias; 142cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 143dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman // handleOccurrences - Overriden by subclasses to handle the value passed into 144cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // an argument. Should return true if there was an error processing the 145cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // argument and the program should exit. 146cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // 14763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman virtual bool handleOccurrence(unsigned pos, const char *ArgName, 1481e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer const std::string &Arg) = 0; 149cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 150cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner virtual enum ValueExpected getValueExpectedFlagDefault() const { 15163b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman return ValueOptional; 152cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 153beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 154433fd76e51e9bd9a4933e2c1775a7410928112c8Chris Lattner // Out of line virtual function to provide home for the class. 155433fd76e51e9bd9a4933e2c1775a7410928112c8Chris Lattner virtual void anchor(); 156beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1579878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner int NumOccurrences; // The number of times specified 1589878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner int Flags; // Flags for the argument 1599878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner unsigned Position; // Position of last occurrence of the option 1607059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov unsigned AdditionalVals;// Greater than 0 for multi-valued option. 1619878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner Option *NextRegistered; // Singly linked list of registered options. 162cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 1639878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner const char *ArgStr; // The argument string itself (ex: "help", "o") 1649878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner const char *HelpStr; // The descriptive text message for --help 1659878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner const char *ValueStr; // String describing what the value of this option is 166cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 167dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman inline enum NumOccurrences getNumOccurrencesFlag() const { 168f6143ef556ed01311d2043d38421302479f7866cChris Lattner return static_cast<enum NumOccurrences>(Flags & OccurrencesMask); 169cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 170cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner inline enum ValueExpected getValueExpectedFlag() const { 171cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner int VE = Flags & ValueMask; 1728b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner return VE ? static_cast<enum ValueExpected>(VE) 1738b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner : getValueExpectedFlagDefault(); 174cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 175cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner inline enum OptionHidden getOptionHiddenFlag() const { 176f6143ef556ed01311d2043d38421302479f7866cChris Lattner return static_cast<enum OptionHidden>(Flags & HiddenMask); 177cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 178331de23705a719514e37c211f327379688f81b0dChris Lattner inline enum FormattingFlags getFormattingFlag() const { 179f6143ef556ed01311d2043d38421302479f7866cChris Lattner return static_cast<enum FormattingFlags>(Flags & FormattingMask); 180331de23705a719514e37c211f327379688f81b0dChris Lattner } 181b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner inline unsigned getMiscFlags() const { 182b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner return Flags & MiscMask; 183b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner } 1841e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer inline unsigned getPosition() const { return Position; } 1857059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov inline unsigned getNumAdditionalVals() const { return AdditionalVals; } 186331de23705a719514e37c211f327379688f81b0dChris Lattner 187331de23705a719514e37c211f327379688f81b0dChris Lattner // hasArgStr - Return true if the argstr != "" 188331de23705a719514e37c211f327379688f81b0dChris Lattner bool hasArgStr() const { return ArgStr[0] != 0; } 189331de23705a719514e37c211f327379688f81b0dChris Lattner 190331de23705a719514e37c211f327379688f81b0dChris Lattner //-------------------------------------------------------------------------=== 191331de23705a719514e37c211f327379688f81b0dChris Lattner // Accessor functions set by OptionModifiers 192331de23705a719514e37c211f327379688f81b0dChris Lattner // 193331de23705a719514e37c211f327379688f81b0dChris Lattner void setArgStr(const char *S) { ArgStr = S; } 194331de23705a719514e37c211f327379688f81b0dChris Lattner void setDescription(const char *S) { HelpStr = S; } 195331de23705a719514e37c211f327379688f81b0dChris Lattner void setValueStr(const char *S) { ValueStr = S; } 196331de23705a719514e37c211f327379688f81b0dChris Lattner 197331de23705a719514e37c211f327379688f81b0dChris Lattner void setFlag(unsigned Flag, unsigned FlagMask) { 198f3799d6317e38a996dcea50143cbc15543d8f5c4Chris Lattner Flags &= ~FlagMask; 199331de23705a719514e37c211f327379688f81b0dChris Lattner Flags |= Flag; 200331de23705a719514e37c211f327379688f81b0dChris Lattner } 201331de23705a719514e37c211f327379688f81b0dChris Lattner 202dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman void setNumOccurrencesFlag(enum NumOccurrences Val) { 203dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman setFlag(Val, OccurrencesMask); 204331de23705a719514e37c211f327379688f81b0dChris Lattner } 205331de23705a719514e37c211f327379688f81b0dChris Lattner void setValueExpectedFlag(enum ValueExpected Val) { setFlag(Val, ValueMask); } 206331de23705a719514e37c211f327379688f81b0dChris Lattner void setHiddenFlag(enum OptionHidden Val) { setFlag(Val, HiddenMask); } 207331de23705a719514e37c211f327379688f81b0dChris Lattner void setFormattingFlag(enum FormattingFlags V) { setFlag(V, FormattingMask); } 208b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner void setMiscFlag(enum MiscFlags M) { setFlag(M, M); } 2091e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer void setPosition(unsigned pos) { Position = pos; } 210cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerprotected: 21127e9d457d4047cf0051e17d9ca39740875d11440Dan Gohman explicit Option(unsigned DefaultFlags) 212f6143ef556ed01311d2043d38421302479f7866cChris Lattner : NumOccurrences(0), Flags(DefaultFlags | NormalFormatting), Position(0), 2137059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov AdditionalVals(0), NextRegistered(0), 2147059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov ArgStr(""), HelpStr(""), ValueStr("") { 215f6143ef556ed01311d2043d38421302479f7866cChris Lattner assert(getNumOccurrencesFlag() != 0 && 216f6143ef556ed01311d2043d38421302479f7866cChris Lattner getOptionHiddenFlag() != 0 && "Not all default flags specified!"); 217f6143ef556ed01311d2043d38421302479f7866cChris Lattner } 218cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 2197059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov inline void setNumAdditionalVals(unsigned n) 2207059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov { AdditionalVals = n; } 221cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 2229878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner // addArgument - Register this argument with the commandline system. 223331de23705a719514e37c211f327379688f81b0dChris Lattner // 2249878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner void addArgument(); 225beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 2269878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner Option *getNextRegisteredOption() const { return NextRegistered; } 227331de23705a719514e37c211f327379688f81b0dChris Lattner 228cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // Return the width of the option tag for printing... 22934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const = 0; 230cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 23163b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman // printOptionInfo - Print out information about this option. The 232cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // to-be-maintained width is specified. 233cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // 23434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const = 0; 235cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 23613d57320bd212483463d4f8992d5787b29eda5dfBill Wendling virtual void getExtraOptionNames(std::vector<const char*> &) {} 237beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 238dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman // addOccurrence - Wrapper around handleOccurrence that enforces Flags 239cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // 24063b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman bool addOccurrence(unsigned pos, const char *ArgName, 2417059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov const std::string &Value, bool MultiArg = false); 242cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 243cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // Prints option name followed by message. Always returns true. 244697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner bool error(std::string Message, const char *ArgName = 0); 245cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 246cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 247dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman inline int getNumOccurrences() const { return NumOccurrences; } 248cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner virtual ~Option() {} 249cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 250cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 251cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 252cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 253331de23705a719514e37c211f327379688f81b0dChris Lattner// Command line option modifiers that can be used to modify the behavior of 254331de23705a719514e37c211f327379688f81b0dChris Lattner// command line option parsers... 255cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 256331de23705a719514e37c211f327379688f81b0dChris Lattner 257331de23705a719514e37c211f327379688f81b0dChris Lattner// desc - Modifier to set the description shown in the --help output... 258331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct desc { 259331de23705a719514e37c211f327379688f81b0dChris Lattner const char *Desc; 260331de23705a719514e37c211f327379688f81b0dChris Lattner desc(const char *Str) : Desc(Str) {} 261331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Option &O) const { O.setDescription(Desc); } 262331de23705a719514e37c211f327379688f81b0dChris Lattner}; 263331de23705a719514e37c211f327379688f81b0dChris Lattner 264331de23705a719514e37c211f327379688f81b0dChris Lattner// value_desc - Modifier to set the value description shown in the --help 265331de23705a719514e37c211f327379688f81b0dChris Lattner// output... 266331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct value_desc { 267331de23705a719514e37c211f327379688f81b0dChris Lattner const char *Desc; 268331de23705a719514e37c211f327379688f81b0dChris Lattner value_desc(const char *Str) : Desc(Str) {} 269331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Option &O) const { O.setValueStr(Desc); } 270331de23705a719514e37c211f327379688f81b0dChris Lattner}; 271331de23705a719514e37c211f327379688f81b0dChris Lattner 272331de23705a719514e37c211f327379688f81b0dChris Lattner// init - Specify a default (initial) value for the command line argument, if 273331de23705a719514e37c211f327379688f81b0dChris Lattner// the default constructor for the argument type does not give you what you 274331de23705a719514e37c211f327379688f81b0dChris Lattner// want. This is only valid on "opt" arguments, not on "list" arguments. 275331de23705a719514e37c211f327379688f81b0dChris Lattner// 276331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty> 277331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct initializer { 278331de23705a719514e37c211f327379688f81b0dChris Lattner const Ty &Init; 279331de23705a719514e37c211f327379688f81b0dChris Lattner initializer(const Ty &Val) : Init(Val) {} 280331de23705a719514e37c211f327379688f81b0dChris Lattner 281331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 282331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Opt &O) const { O.setInitialValue(Init); } 283cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 284cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 285331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty> 286331de23705a719514e37c211f327379688f81b0dChris Lattnerinitializer<Ty> init(const Ty &Val) { 287331de23705a719514e37c211f327379688f81b0dChris Lattner return initializer<Ty>(Val); 288331de23705a719514e37c211f327379688f81b0dChris Lattner} 289331de23705a719514e37c211f327379688f81b0dChris Lattner 290331de23705a719514e37c211f327379688f81b0dChris Lattner 291331de23705a719514e37c211f327379688f81b0dChris Lattner// location - Allow the user to specify which external variable they want to 292331de23705a719514e37c211f327379688f81b0dChris Lattner// store the results of the command line argument processing into, if they don't 293331de23705a719514e37c211f327379688f81b0dChris Lattner// want to store it in the option itself. 294331de23705a719514e37c211f327379688f81b0dChris Lattner// 295331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty> 296331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct LocationClass { 297331de23705a719514e37c211f327379688f81b0dChris Lattner Ty &Loc; 298331de23705a719514e37c211f327379688f81b0dChris Lattner LocationClass(Ty &L) : Loc(L) {} 299331de23705a719514e37c211f327379688f81b0dChris Lattner 300331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 301331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Opt &O) const { O.setLocation(O, Loc); } 302331de23705a719514e37c211f327379688f81b0dChris Lattner}; 303331de23705a719514e37c211f327379688f81b0dChris Lattner 304331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty> 305331de23705a719514e37c211f327379688f81b0dChris LattnerLocationClass<Ty> location(Ty &L) { return LocationClass<Ty>(L); } 306331de23705a719514e37c211f327379688f81b0dChris Lattner 307331de23705a719514e37c211f327379688f81b0dChris Lattner 308cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 309331de23705a719514e37c211f327379688f81b0dChris Lattner// Enum valued command line option 310cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 311f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer#define clEnumVal(ENUMVAL, DESC) #ENUMVAL, int(ENUMVAL), DESC 312f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer#define clEnumValN(ENUMVAL, FLAGNAME, DESC) FLAGNAME, int(ENUMVAL), DESC 313f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer#define clEnumValEnd (reinterpret_cast<void*>(0)) 314331de23705a719514e37c211f327379688f81b0dChris Lattner 315331de23705a719514e37c211f327379688f81b0dChris Lattner// values - For custom data types, allow specifying a group of values together 316331de23705a719514e37c211f327379688f81b0dChris Lattner// as the values that go into the mapping that the option handler uses. Note 317331de23705a719514e37c211f327379688f81b0dChris Lattner// that the values list must always have a 0 at the end of the list to indicate 318331de23705a719514e37c211f327379688f81b0dChris Lattner// that the list has ended. 319331de23705a719514e37c211f327379688f81b0dChris Lattner// 320331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 321331de23705a719514e37c211f327379688f81b0dChris Lattnerclass ValuesClass { 322331de23705a719514e37c211f327379688f81b0dChris Lattner // Use a vector instead of a map, because the lists should be short, 323331de23705a719514e37c211f327379688f81b0dChris Lattner // the overhead is less, and most importantly, it keeps them in the order 324331de23705a719514e37c211f327379688f81b0dChris Lattner // inserted so we can print our option out nicely. 3253b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner SmallVector<std::pair<const char *, std::pair<int, const char *> >,4> Values; 326331de23705a719514e37c211f327379688f81b0dChris Lattner void processValues(va_list Vals); 327cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 32863b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman ValuesClass(const char *EnumName, DataType Val, const char *Desc, 329331de23705a719514e37c211f327379688f81b0dChris Lattner va_list ValueArgs) { 330331de23705a719514e37c211f327379688f81b0dChris Lattner // Insert the first value, which is required. 331331de23705a719514e37c211f327379688f81b0dChris Lattner Values.push_back(std::make_pair(EnumName, std::make_pair(Val, Desc))); 332331de23705a719514e37c211f327379688f81b0dChris Lattner 333331de23705a719514e37c211f327379688f81b0dChris Lattner // Process the varargs portion of the values... 33413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling while (const char *enumName = va_arg(ValueArgs, const char *)) { 3358b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner DataType EnumVal = static_cast<DataType>(va_arg(ValueArgs, int)); 336331de23705a719514e37c211f327379688f81b0dChris Lattner const char *EnumDesc = va_arg(ValueArgs, const char *); 33713d57320bd212483463d4f8992d5787b29eda5dfBill Wendling Values.push_back(std::make_pair(enumName, // Add value to value map 338331de23705a719514e37c211f327379688f81b0dChris Lattner std::make_pair(EnumVal, EnumDesc))); 339331de23705a719514e37c211f327379688f81b0dChris Lattner } 34071fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner } 34171fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner 342331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 343331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Opt &O) const { 34434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng for (unsigned i = 0, e = static_cast<unsigned>(Values.size()); 34534cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng i != e; ++i) 346331de23705a719514e37c211f327379688f81b0dChris Lattner O.getParser().addLiteralOption(Values[i].first, Values[i].second.first, 347331de23705a719514e37c211f327379688f81b0dChris Lattner Values[i].second.second); 34871fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner } 349cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 350cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 351331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 352beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail GlushenkovValuesClass<DataType> END_WITH_NULL values(const char *Arg, DataType Val, 353a542b4c133de5da974632e9623ee4b426ebb3353Chris Lattner const char *Desc, ...) { 354331de23705a719514e37c211f327379688f81b0dChris Lattner va_list ValueArgs; 355331de23705a719514e37c211f327379688f81b0dChris Lattner va_start(ValueArgs, Desc); 356331de23705a719514e37c211f327379688f81b0dChris Lattner ValuesClass<DataType> Vals(Arg, Val, Desc, ValueArgs); 357331de23705a719514e37c211f327379688f81b0dChris Lattner va_end(ValueArgs); 358331de23705a719514e37c211f327379688f81b0dChris Lattner return Vals; 359331de23705a719514e37c211f327379688f81b0dChris Lattner} 360cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 361cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 362cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 363331de23705a719514e37c211f327379688f81b0dChris Lattner// parser class - Parameterizable parser for different data types. By default, 364331de23705a719514e37c211f327379688f81b0dChris Lattner// known data types (string, int, bool) have specialized parsers, that do what 365331de23705a719514e37c211f327379688f81b0dChris Lattner// you would expect. The default parser, used for data types that are not 366331de23705a719514e37c211f327379688f81b0dChris Lattner// built-in, uses a mapping table to map specific options to values, which is 367331de23705a719514e37c211f327379688f81b0dChris Lattner// used, among other things, to handle enum types. 368331de23705a719514e37c211f327379688f81b0dChris Lattner 369331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 370331de23705a719514e37c211f327379688f81b0dChris Lattner// generic_parser_base - This class holds all the non-generic code that we do 371331de23705a719514e37c211f327379688f81b0dChris Lattner// not need replicated for every instance of the generic parser. This also 372331de23705a719514e37c211f327379688f81b0dChris Lattner// allows us to put stuff into CommandLine.cpp 373cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 374331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct generic_parser_base { 375331de23705a719514e37c211f327379688f81b0dChris Lattner virtual ~generic_parser_base() {} // Base class should have virtual-dtor 376331de23705a719514e37c211f327379688f81b0dChris Lattner 377331de23705a719514e37c211f327379688f81b0dChris Lattner // getNumOptions - Virtual function implemented by generic subclass to 378331de23705a719514e37c211f327379688f81b0dChris Lattner // indicate how many entries are in Values. 379331de23705a719514e37c211f327379688f81b0dChris Lattner // 380331de23705a719514e37c211f327379688f81b0dChris Lattner virtual unsigned getNumOptions() const = 0; 381331de23705a719514e37c211f327379688f81b0dChris Lattner 382331de23705a719514e37c211f327379688f81b0dChris Lattner // getOption - Return option name N. 383331de23705a719514e37c211f327379688f81b0dChris Lattner virtual const char *getOption(unsigned N) const = 0; 38463b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 385331de23705a719514e37c211f327379688f81b0dChris Lattner // getDescription - Return description N 386331de23705a719514e37c211f327379688f81b0dChris Lattner virtual const char *getDescription(unsigned N) const = 0; 387331de23705a719514e37c211f327379688f81b0dChris Lattner 388331de23705a719514e37c211f327379688f81b0dChris Lattner // Return the width of the option tag for printing... 38934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth(const Option &O) const; 390331de23705a719514e37c211f327379688f81b0dChris Lattner 39163b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman // printOptionInfo - Print out information about this option. The 392331de23705a719514e37c211f327379688f81b0dChris Lattner // to-be-maintained width is specified. 393331de23705a719514e37c211f327379688f81b0dChris Lattner // 39434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(const Option &O, size_t GlobalWidth) const; 395331de23705a719514e37c211f327379688f81b0dChris Lattner 396331de23705a719514e37c211f327379688f81b0dChris Lattner void initialize(Option &O) { 397331de23705a719514e37c211f327379688f81b0dChris Lattner // All of the modifiers for the option have been processed by now, so the 398331de23705a719514e37c211f327379688f81b0dChris Lattner // argstr field should be stable, copy it down now. 399331de23705a719514e37c211f327379688f81b0dChris Lattner // 400331de23705a719514e37c211f327379688f81b0dChris Lattner hasArgStr = O.hasArgStr(); 4019878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner } 402beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 4039878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner void getExtraOptionNames(std::vector<const char*> &OptionNames) { 404331de23705a719514e37c211f327379688f81b0dChris Lattner // If there has been no argstr specified, that means that we need to add an 405331de23705a719514e37c211f327379688f81b0dChris Lattner // argument for every possible option. This ensures that our options are 406331de23705a719514e37c211f327379688f81b0dChris Lattner // vectored to us. 407331de23705a719514e37c211f327379688f81b0dChris Lattner if (!hasArgStr) 408331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) 4099878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner OptionNames.push_back(getOption(i)); 410cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 411cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 4129878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner 413331de23705a719514e37c211f327379688f81b0dChris Lattner enum ValueExpected getValueExpectedFlagDefault() const { 414331de23705a719514e37c211f327379688f81b0dChris Lattner // If there is an ArgStr specified, then we are of the form: 415331de23705a719514e37c211f327379688f81b0dChris Lattner // 416331de23705a719514e37c211f327379688f81b0dChris Lattner // -opt=O2 or -opt O2 or -optO2 417331de23705a719514e37c211f327379688f81b0dChris Lattner // 418331de23705a719514e37c211f327379688f81b0dChris Lattner // In which case, the value is required. Otherwise if an arg str has not 419331de23705a719514e37c211f327379688f81b0dChris Lattner // been specified, we are of the form: 420331de23705a719514e37c211f327379688f81b0dChris Lattner // 421bc0e998c497446f5448425b3cbd7f8f19a458764Misha Brukman // -O2 or O2 or -la (where -l and -a are separate options) 422331de23705a719514e37c211f327379688f81b0dChris Lattner // 423331de23705a719514e37c211f327379688f81b0dChris Lattner // If this is the case, we cannot allow a value. 424331de23705a719514e37c211f327379688f81b0dChris Lattner // 425331de23705a719514e37c211f327379688f81b0dChris Lattner if (hasArgStr) 426331de23705a719514e37c211f327379688f81b0dChris Lattner return ValueRequired; 427331de23705a719514e37c211f327379688f81b0dChris Lattner else 428331de23705a719514e37c211f327379688f81b0dChris Lattner return ValueDisallowed; 429331de23705a719514e37c211f327379688f81b0dChris Lattner } 430cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 431af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner // findOption - Return the option number corresponding to the specified 432af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner // argument string. If the option is not found, getNumOptions() is returned. 433af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner // 434af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner unsigned findOption(const char *Name); 435af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner 436331de23705a719514e37c211f327379688f81b0dChris Lattnerprotected: 437331de23705a719514e37c211f327379688f81b0dChris Lattner bool hasArgStr; 438331de23705a719514e37c211f327379688f81b0dChris Lattner}; 439331de23705a719514e37c211f327379688f81b0dChris Lattner 440331de23705a719514e37c211f327379688f81b0dChris Lattner// Default parser implementation - This implementation depends on having a 441331de23705a719514e37c211f327379688f81b0dChris Lattner// mapping of recognized options to values of some sort. In addition to this, 442331de23705a719514e37c211f327379688f81b0dChris Lattner// each entry in the mapping also tracks a help message that is printed with the 443331de23705a719514e37c211f327379688f81b0dChris Lattner// command line option for --help. Because this is a simple mapping parser, the 444331de23705a719514e37c211f327379688f81b0dChris Lattner// data type can be any unsupported type. 445cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 446331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate <class DataType> 447331de23705a719514e37c211f327379688f81b0dChris Lattnerclass parser : public generic_parser_base { 448af7e82184d7d77e426056c7c233e860baeebe80fChris Lattnerprotected: 4493b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner SmallVector<std::pair<const char *, 4503b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner std::pair<DataType, const char *> >, 8> Values; 451af7e82184d7d77e426056c7c233e860baeebe80fChris Lattnerpublic: 452d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner typedef DataType parser_data_type; 453331de23705a719514e37c211f327379688f81b0dChris Lattner 454331de23705a719514e37c211f327379688f81b0dChris Lattner // Implement virtual functions needed by generic_parser_base 455f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer unsigned getNumOptions() const { return unsigned(Values.size()); } 456331de23705a719514e37c211f327379688f81b0dChris Lattner const char *getOption(unsigned N) const { return Values[N].first; } 457331de23705a719514e37c211f327379688f81b0dChris Lattner const char *getDescription(unsigned N) const { 458331de23705a719514e37c211f327379688f81b0dChris Lattner return Values[N].second.second; 459cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 460331de23705a719514e37c211f327379688f81b0dChris Lattner 461d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // parse - Return true on error. 46263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman bool parse(Option &O, const char *ArgName, const std::string &Arg, 463d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner DataType &V) { 4647f4dd472e35569efefbeffef096c490075e3e824Chris Lattner std::string ArgVal; 465331de23705a719514e37c211f327379688f81b0dChris Lattner if (hasArgStr) 466331de23705a719514e37c211f327379688f81b0dChris Lattner ArgVal = Arg; 467331de23705a719514e37c211f327379688f81b0dChris Lattner else 468331de23705a719514e37c211f327379688f81b0dChris Lattner ArgVal = ArgName; 469331de23705a719514e37c211f327379688f81b0dChris Lattner 47034cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng for (unsigned i = 0, e = static_cast<unsigned>(Values.size()); 47134cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng i != e; ++i) 472331de23705a719514e37c211f327379688f81b0dChris Lattner if (ArgVal == Values[i].first) { 473d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner V = Values[i].second.first; 474331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 475331de23705a719514e37c211f327379688f81b0dChris Lattner } 476331de23705a719514e37c211f327379688f81b0dChris Lattner 477331de23705a719514e37c211f327379688f81b0dChris Lattner return O.error(": Cannot find option named '" + ArgVal + "'!"); 478331de23705a719514e37c211f327379688f81b0dChris Lattner } 479cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 4803b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner /// addLiteralOption - Add an entry to the mapping table. 4813b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner /// 482331de23705a719514e37c211f327379688f81b0dChris Lattner template <class DT> 483331de23705a719514e37c211f327379688f81b0dChris Lattner void addLiteralOption(const char *Name, const DT &V, const char *HelpStr) { 484af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner assert(findOption(Name) == Values.size() && "Option already exists!"); 4858b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner Values.push_back(std::make_pair(Name, 4868b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner std::make_pair(static_cast<DataType>(V),HelpStr))); 48769d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner MarkOptionsChanged(); 488cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 489af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner 4903b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner /// removeLiteralOption - Remove the specified option. 4913b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner /// 492af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner void removeLiteralOption(const char *Name) { 493af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner unsigned N = findOption(Name); 494af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner assert(N != Values.size() && "Option not found!"); 495af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner Values.erase(Values.begin()+N); 496af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner } 497cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 498cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 499331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 500d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// basic_parser - Super class of parsers to provide boilerplate code 501cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 502d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnerstruct basic_parser_impl { // non-template implementation of basic_parser<t> 503d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual ~basic_parser_impl() {} 504331de23705a719514e37c211f327379688f81b0dChris Lattner 505331de23705a719514e37c211f327379688f81b0dChris Lattner enum ValueExpected getValueExpectedFlagDefault() const { 506d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return ValueRequired; 507cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 50863b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 50913d57320bd212483463d4f8992d5787b29eda5dfBill Wendling void getExtraOptionNames(std::vector<const char*> &) {} 5109878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner 51113d57320bd212483463d4f8992d5787b29eda5dfBill Wendling void initialize(Option &) {} 51263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 513331de23705a719514e37c211f327379688f81b0dChris Lattner // Return the width of the option tag for printing... 51434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng size_t getOptionWidth(const Option &O) const; 51563b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 516d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // printOptionInfo - Print out information about this option. The 517331de23705a719514e37c211f327379688f81b0dChris Lattner // to-be-maintained width is specified. 518331de23705a719514e37c211f327379688f81b0dChris Lattner // 51934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng void printOptionInfo(const Option &O, size_t GlobalWidth) const; 520d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner 521d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 522d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "value"; } 5237422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 5247422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 5257422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 526d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner}; 527d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner 528d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// basic_parser - The real basic parser is just a template wrapper that provides 529d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// a typedef for the provided data type. 530d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// 531d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnertemplate<class DataType> 532d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnerstruct basic_parser : public basic_parser_impl { 533d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner typedef DataType parser_data_type; 534cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 535cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 536331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 537d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<bool> 538cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 539331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> 5401fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<bool> : public basic_parser<bool> { 541d485e885f04eaaafc9c0ce2555c6bd853b7c18a3Misha Brukman bool IsInvertible; // Should we synthesize a -xno- style option? 542d64e0eb094a108bdcdf51328425904042aa6122bMike Stump const char *ArgStr; 5431fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 544e8b64106ecf1057c7506d44ec8f64b5c83ee51c7Chris Lattner void getExtraOptionNames(std::vector<const char*> &OptionNames); 545e8b64106ecf1057c7506d44ec8f64b5c83ee51c7Chris Lattner 546331de23705a719514e37c211f327379688f81b0dChris Lattner // parse - Return true on error. 547d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner bool parse(Option &O, const char *ArgName, const std::string &Arg, bool &Val); 548cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 549d64e0eb094a108bdcdf51328425904042aa6122bMike Stump template <class Opt> 550d64e0eb094a108bdcdf51328425904042aa6122bMike Stump void initialize(Opt &O) { 551d485e885f04eaaafc9c0ce2555c6bd853b7c18a3Misha Brukman IsInvertible = (O.getMiscFlags() & llvm::cl::AllowInverse); 552d64e0eb094a108bdcdf51328425904042aa6122bMike Stump ArgStr = O.ArgStr; 553d64e0eb094a108bdcdf51328425904042aa6122bMike Stump } 554d64e0eb094a108bdcdf51328425904042aa6122bMike Stump 555331de23705a719514e37c211f327379688f81b0dChris Lattner enum ValueExpected getValueExpectedFlagDefault() const { 55663b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman return ValueOptional; 557331de23705a719514e37c211f327379688f81b0dChris Lattner } 558331de23705a719514e37c211f327379688f81b0dChris Lattner 5597422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // getValueName - Do not print =<value> at all. 560d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return 0; } 561beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 5627422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 5637422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 564331de23705a719514e37c211f327379688f81b0dChris Lattner}; 565cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 5667422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<bool>); 5677422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 56881da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen//-------------------------------------------------- 56981da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen// parser<boolOrDefault> 57081da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesenenum boolOrDefault { BOU_UNSET, BOU_TRUE, BOU_FALSE }; 57181da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesentemplate<> 57281da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesenclass parser<boolOrDefault> : public basic_parser<boolOrDefault> { 57381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesenpublic: 57481da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen // parse - Return true on error. 575beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov bool parse(Option &O, const char *ArgName, const std::string &Arg, 57681da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen boolOrDefault &Val); 57781da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 57881da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen enum ValueExpected getValueExpectedFlagDefault() const { 57981da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen return ValueOptional; 58081da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen } 58181da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 58281da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen // getValueName - Do not print =<value> at all. 58381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen virtual const char *getValueName() const { return 0; } 584beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 58581da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen // An out-of-line virtual method to provide a 'home' for this class. 58681da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen virtual void anchor(); 58781da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen}; 58881da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 58981da02b553b86868637f27b89c6e919c31ed5b51Dale JohannesenEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<boolOrDefault>); 590cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 591331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 592d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<int> 593331de23705a719514e37c211f327379688f81b0dChris Lattner// 594331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> 5951fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<int> : public basic_parser<int> { 5961fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 597331de23705a719514e37c211f327379688f81b0dChris Lattner // parse - Return true on error. 598d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner bool parse(Option &O, const char *ArgName, const std::string &Arg, int &Val); 599cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 600d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 601d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "int"; } 6027422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 6037422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 6047422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 605d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner}; 606cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 6077422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<int>); 6087422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 609cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 610d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner//-------------------------------------------------- 611d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner// parser<unsigned> 612d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner// 613d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattnertemplate<> 6141fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<unsigned> : public basic_parser<unsigned> { 6151fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 616d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner // parse - Return true on error. 6171e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer bool parse(Option &O, const char *AN, const std::string &Arg, unsigned &Val); 618d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner 619d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner // getValueName - Overload in subclass to provide a better default value. 620d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner virtual const char *getValueName() const { return "uint"; } 6217422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 6227422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 6237422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 624d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner}; 625d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner 6267422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<unsigned>); 627d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner 628d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner//-------------------------------------------------- 629d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<double> 630d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// 631d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnertemplate<> 6321fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<double> : public basic_parser<double> { 6331fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 634d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // parse - Return true on error. 635d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner bool parse(Option &O, const char *AN, const std::string &Arg, double &Val); 636cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 637d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 638d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "number"; } 6397422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 6407422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 6417422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 642cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 643cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 6447422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<double>); 645331de23705a719514e37c211f327379688f81b0dChris Lattner 646d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner//-------------------------------------------------- 647d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<float> 648d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// 649d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnertemplate<> 6501fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<float> : public basic_parser<float> { 6511fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 652d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // parse - Return true on error. 653d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner bool parse(Option &O, const char *AN, const std::string &Arg, float &Val); 654d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner 655d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 656d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "number"; } 6577422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 6587422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 6597422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 660d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner}; 661331de23705a719514e37c211f327379688f81b0dChris Lattner 6627422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<float>); 663331de23705a719514e37c211f327379688f81b0dChris Lattner 664331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 6657f4dd472e35569efefbeffef096c490075e3e824Chris Lattner// parser<std::string> 666331de23705a719514e37c211f327379688f81b0dChris Lattner// 667331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> 6681fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<std::string> : public basic_parser<std::string> { 6691fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 670331de23705a719514e37c211f327379688f81b0dChris Lattner // parse - Return true on error. 67113d57320bd212483463d4f8992d5787b29eda5dfBill Wendling bool parse(Option &, const char *, const std::string &Arg, 672d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner std::string &Value) { 673d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner Value = Arg; 674331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 675331de23705a719514e37c211f327379688f81b0dChris Lattner } 676331de23705a719514e37c211f327379688f81b0dChris Lattner 677d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 678d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "string"; } 6797422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 6807422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 6817422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 682331de23705a719514e37c211f327379688f81b0dChris Lattner}; 683331de23705a719514e37c211f327379688f81b0dChris Lattner 6847422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<std::string>); 6857422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 686331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 687331de23705a719514e37c211f327379688f81b0dChris Lattner// applicator class - This class is used because we must use partial 688331de23705a719514e37c211f327379688f81b0dChris Lattner// specialization to handle literal string arguments specially (const char* does 689331de23705a719514e37c211f327379688f81b0dChris Lattner// not correctly respond to the apply method). Because the syntax to use this 690331de23705a719514e37c211f327379688f81b0dChris Lattner// is a pain, we have the 'apply' method below to handle the nastiness... 691331de23705a719514e37c211f327379688f81b0dChris Lattner// 692331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Mod> struct applicator { 693331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 694331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(const Mod &M, Opt &O) { M.apply(O); } 695331de23705a719514e37c211f327379688f81b0dChris Lattner}; 696331de23705a719514e37c211f327379688f81b0dChris Lattner 697331de23705a719514e37c211f327379688f81b0dChris Lattner// Handle const char* as a special case... 698331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<unsigned n> struct applicator<char[n]> { 699331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 700331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(const char *Str, Opt &O) { O.setArgStr(Str); } 701331de23705a719514e37c211f327379688f81b0dChris Lattner}; 7024042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattnertemplate<unsigned n> struct applicator<const char[n]> { 7034042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattner template<class Opt> 7044042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattner static void opt(const char *Str, Opt &O) { O.setArgStr(Str); } 7054042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattner}; 706331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<const char*> { 707331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 708331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(const char *Str, Opt &O) { O.setArgStr(Str); } 709331de23705a719514e37c211f327379688f81b0dChris Lattner}; 710331de23705a719514e37c211f327379688f81b0dChris Lattner 711dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukmantemplate<> struct applicator<NumOccurrences> { 712dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman static void opt(NumOccurrences NO, Option &O) { O.setNumOccurrencesFlag(NO); } 713331de23705a719514e37c211f327379688f81b0dChris Lattner}; 714331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<ValueExpected> { 715331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(ValueExpected VE, Option &O) { O.setValueExpectedFlag(VE); } 716331de23705a719514e37c211f327379688f81b0dChris Lattner}; 717331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<OptionHidden> { 718331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(OptionHidden OH, Option &O) { O.setHiddenFlag(OH); } 719331de23705a719514e37c211f327379688f81b0dChris Lattner}; 720331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<FormattingFlags> { 721331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(FormattingFlags FF, Option &O) { O.setFormattingFlag(FF); } 722331de23705a719514e37c211f327379688f81b0dChris Lattner}; 723b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattnertemplate<> struct applicator<MiscFlags> { 724b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner static void opt(MiscFlags MF, Option &O) { O.setMiscFlag(MF); } 725b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner}; 726331de23705a719514e37c211f327379688f81b0dChris Lattner 727331de23705a719514e37c211f327379688f81b0dChris Lattner// apply method - Apply a modifier to an option in a type safe way. 728331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Mod, class Opt> 729331de23705a719514e37c211f327379688f81b0dChris Lattnervoid apply(const Mod &M, Opt *O) { 730331de23705a719514e37c211f327379688f81b0dChris Lattner applicator<Mod>::opt(M, *O); 731331de23705a719514e37c211f327379688f81b0dChris Lattner} 732331de23705a719514e37c211f327379688f81b0dChris Lattner 733331de23705a719514e37c211f327379688f81b0dChris Lattner 734331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 735331de23705a719514e37c211f327379688f81b0dChris Lattner// opt_storage class 736331de23705a719514e37c211f327379688f81b0dChris Lattner 737331de23705a719514e37c211f327379688f81b0dChris Lattner// Default storage class definition: external storage. This implementation 738331de23705a719514e37c211f327379688f81b0dChris Lattner// assumes the user will specify a variable to store the data into with the 739331de23705a719514e37c211f327379688f81b0dChris Lattner// cl::location(x) modifier. 740331de23705a719514e37c211f327379688f81b0dChris Lattner// 741331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType, bool ExternalStorage, bool isClass> 742331de23705a719514e37c211f327379688f81b0dChris Lattnerclass opt_storage { 743331de23705a719514e37c211f327379688f81b0dChris Lattner DataType *Location; // Where to store the object... 744331de23705a719514e37c211f327379688f81b0dChris Lattner 74531fd5a571eb8048a1084dd8e20a49dd0785de11aBill Wendling void check() const { 746331de23705a719514e37c211f327379688f81b0dChris Lattner assert(Location != 0 && "cl::location(...) not specified for a command " 7473c7eb1f2ea231c046367023576311fbc4b1270e3Chris Lattner "line option with external storage, " 7483c7eb1f2ea231c046367023576311fbc4b1270e3Chris Lattner "or cl::init specified before cl::location()!!"); 749331de23705a719514e37c211f327379688f81b0dChris Lattner } 750cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 751331de23705a719514e37c211f327379688f81b0dChris Lattner opt_storage() : Location(0) {} 752331de23705a719514e37c211f327379688f81b0dChris Lattner 753331de23705a719514e37c211f327379688f81b0dChris Lattner bool setLocation(Option &O, DataType &L) { 754331de23705a719514e37c211f327379688f81b0dChris Lattner if (Location) 755331de23705a719514e37c211f327379688f81b0dChris Lattner return O.error(": cl::location(x) specified more than once!"); 756331de23705a719514e37c211f327379688f81b0dChris Lattner Location = &L; 757331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 758cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 759cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 760331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 761331de23705a719514e37c211f327379688f81b0dChris Lattner void setValue(const T &V) { 762331de23705a719514e37c211f327379688f81b0dChris Lattner check(); 763331de23705a719514e37c211f327379688f81b0dChris Lattner *Location = V; 76471fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner } 76571fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner 766331de23705a719514e37c211f327379688f81b0dChris Lattner DataType &getValue() { check(); return *Location; } 767331de23705a719514e37c211f327379688f81b0dChris Lattner const DataType &getValue() const { check(); return *Location; } 768331de23705a719514e37c211f327379688f81b0dChris Lattner}; 769331de23705a719514e37c211f327379688f81b0dChris Lattner 770331de23705a719514e37c211f327379688f81b0dChris Lattner 771331de23705a719514e37c211f327379688f81b0dChris Lattner// Define how to hold a class type object, such as a string. Since we can 772331de23705a719514e37c211f327379688f81b0dChris Lattner// inherit from a class, we do so. This makes us exactly compatible with the 773331de23705a719514e37c211f327379688f81b0dChris Lattner// object in all cases that it is used. 774331de23705a719514e37c211f327379688f81b0dChris Lattner// 775331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 7761fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass opt_storage<DataType,false,true> : public DataType { 7771fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 778331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 779331de23705a719514e37c211f327379688f81b0dChris Lattner void setValue(const T &V) { DataType::operator=(V); } 780331de23705a719514e37c211f327379688f81b0dChris Lattner 781331de23705a719514e37c211f327379688f81b0dChris Lattner DataType &getValue() { return *this; } 782331de23705a719514e37c211f327379688f81b0dChris Lattner const DataType &getValue() const { return *this; } 783331de23705a719514e37c211f327379688f81b0dChris Lattner}; 784331de23705a719514e37c211f327379688f81b0dChris Lattner 785331de23705a719514e37c211f327379688f81b0dChris Lattner// Define a partial specialization to handle things we cannot inherit from. In 786331de23705a719514e37c211f327379688f81b0dChris Lattner// this case, we store an instance through containment, and overload operators 787331de23705a719514e37c211f327379688f81b0dChris Lattner// to get at the value. 788331de23705a719514e37c211f327379688f81b0dChris Lattner// 789331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 7901fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass opt_storage<DataType, false, false> { 7911fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 792331de23705a719514e37c211f327379688f81b0dChris Lattner DataType Value; 793331de23705a719514e37c211f327379688f81b0dChris Lattner 794331de23705a719514e37c211f327379688f81b0dChris Lattner // Make sure we initialize the value with the default constructor for the 795331de23705a719514e37c211f327379688f81b0dChris Lattner // type. 796331de23705a719514e37c211f327379688f81b0dChris Lattner opt_storage() : Value(DataType()) {} 797331de23705a719514e37c211f327379688f81b0dChris Lattner 798331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 799331de23705a719514e37c211f327379688f81b0dChris Lattner void setValue(const T &V) { Value = V; } 800331de23705a719514e37c211f327379688f81b0dChris Lattner DataType &getValue() { return Value; } 801331de23705a719514e37c211f327379688f81b0dChris Lattner DataType getValue() const { return Value; } 8026a4dd24a995072c9c6f1ae45f19f94010d8389fbChris Lattner 8036a4dd24a995072c9c6f1ae45f19f94010d8389fbChris Lattner // If the datatype is a pointer, support -> on it. 8046a4dd24a995072c9c6f1ae45f19f94010d8389fbChris Lattner DataType operator->() const { return Value; } 805cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 806cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 807cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 808cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 809331de23705a719514e37c211f327379688f81b0dChris Lattner// opt - A scalar command line option. 810cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 811331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate <class DataType, bool ExternalStorage = false, 812331de23705a719514e37c211f327379688f81b0dChris Lattner class ParserClass = parser<DataType> > 81363b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukmanclass opt : public Option, 814331de23705a719514e37c211f327379688f81b0dChris Lattner public opt_storage<DataType, ExternalStorage, 8157b3d73b7ecbecf423c3766e596b6086767444363Chris Lattner is_class<DataType>::value> { 816331de23705a719514e37c211f327379688f81b0dChris Lattner ParserClass Parser; 817331de23705a719514e37c211f327379688f81b0dChris Lattner 81863b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman virtual bool handleOccurrence(unsigned pos, const char *ArgName, 8191e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer const std::string &Arg) { 8209eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen typename ParserClass::parser_data_type Val = 821e6ad5ea996673f76b62e495d268c8bf7c9b0d205Chris Lattner typename ParserClass::parser_data_type(); 822d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner if (Parser.parse(*this, ArgName, Arg, Val)) 823d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return true; // Parse error! 82448fe63526e35ddaee7e98879596a569911f41319Sebastian Redl this->setValue(Val); 82548fe63526e35ddaee7e98879596a569911f41319Sebastian Redl this->setPosition(pos); 826d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return false; 827331de23705a719514e37c211f327379688f81b0dChris Lattner } 828331de23705a719514e37c211f327379688f81b0dChris Lattner 829cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner virtual enum ValueExpected getValueExpectedFlagDefault() const { 830331de23705a719514e37c211f327379688f81b0dChris Lattner return Parser.getValueExpectedFlagDefault(); 831cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 8329878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner virtual void getExtraOptionNames(std::vector<const char*> &OptionNames) { 8339878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner return Parser.getExtraOptionNames(OptionNames); 8349878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner } 835cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 836331de23705a719514e37c211f327379688f81b0dChris Lattner // Forward printing stuff to the parser... 83734cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const {return Parser.getOptionWidth(*this);} 83834cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const { 839331de23705a719514e37c211f327379688f81b0dChris Lattner Parser.printOptionInfo(*this, GlobalWidth); 840331de23705a719514e37c211f327379688f81b0dChris Lattner } 841cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 842331de23705a719514e37c211f327379688f81b0dChris Lattner void done() { 8439878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner addArgument(); 844331de23705a719514e37c211f327379688f81b0dChris Lattner Parser.initialize(*this); 845331de23705a719514e37c211f327379688f81b0dChris Lattner } 846331de23705a719514e37c211f327379688f81b0dChris Lattnerpublic: 847331de23705a719514e37c211f327379688f81b0dChris Lattner // setInitialValue - Used by the cl::init modifier... 84831a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner void setInitialValue(const DataType &V) { this->setValue(V); } 849331de23705a719514e37c211f327379688f81b0dChris Lattner 850331de23705a719514e37c211f327379688f81b0dChris Lattner ParserClass &getParser() { return Parser; } 851331de23705a719514e37c211f327379688f81b0dChris Lattner 85231a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner operator DataType() const { return this->getValue(); } 853331de23705a719514e37c211f327379688f81b0dChris Lattner 854331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 85531a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner DataType &operator=(const T &Val) { 85631a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner this->setValue(Val); 85731a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner return this->getValue(); 85831a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner } 859331de23705a719514e37c211f327379688f81b0dChris Lattner 860331de23705a719514e37c211f327379688f81b0dChris Lattner // One option... 861331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t> 862cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman explicit opt(const M0t &M0) : Option(Optional | NotHidden) { 863331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); 864331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 865331de23705a719514e37c211f327379688f81b0dChris Lattner } 866331de23705a719514e37c211f327379688f81b0dChris Lattner 867331de23705a719514e37c211f327379688f81b0dChris Lattner // Two options... 868331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t> 869f6143ef556ed01311d2043d38421302479f7866cChris Lattner opt(const M0t &M0, const M1t &M1) : Option(Optional | NotHidden) { 870331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); 871331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 872331de23705a719514e37c211f327379688f81b0dChris Lattner } 873331de23705a719514e37c211f327379688f81b0dChris Lattner 874331de23705a719514e37c211f327379688f81b0dChris Lattner // Three options... 875331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t> 876f6143ef556ed01311d2043d38421302479f7866cChris Lattner opt(const M0t &M0, const M1t &M1, 877f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M2t &M2) : Option(Optional | NotHidden) { 878331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); 879331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 880331de23705a719514e37c211f327379688f81b0dChris Lattner } 881331de23705a719514e37c211f327379688f81b0dChris Lattner // Four options... 882331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t> 8836e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, 884f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M3t &M3) : Option(Optional | NotHidden) { 885331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 886331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 887331de23705a719514e37c211f327379688f81b0dChris Lattner } 888331de23705a719514e37c211f327379688f81b0dChris Lattner // Five options... 889331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, class M4t> 890331de23705a719514e37c211f327379688f81b0dChris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 891f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4) : Option(Optional | NotHidden) { 892331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 893331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); 894331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 895331de23705a719514e37c211f327379688f81b0dChris Lattner } 896331de23705a719514e37c211f327379688f81b0dChris Lattner // Six options... 897331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 898331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t> 899331de23705a719514e37c211f327379688f81b0dChris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 900f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4, const M5t &M5) : Option(Optional | NotHidden) { 901331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 902331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); 903331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 904331de23705a719514e37c211f327379688f81b0dChris Lattner } 905331de23705a719514e37c211f327379688f81b0dChris Lattner // Seven options... 906331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 907331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t, class M6t> 908331de23705a719514e37c211f327379688f81b0dChris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 909f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4, const M5t &M5, 910f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M6t &M6) : Option(Optional | NotHidden) { 911331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 912331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); apply(M6, this); 913331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 914331de23705a719514e37c211f327379688f81b0dChris Lattner } 915331de23705a719514e37c211f327379688f81b0dChris Lattner // Eight options... 916331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 917331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t, class M6t, class M7t> 918331de23705a719514e37c211f327379688f81b0dChris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 9196e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner const M4t &M4, const M5t &M5, const M6t &M6, 920f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M7t &M7) : Option(Optional | NotHidden) { 921331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 922331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this); 923331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 924331de23705a719514e37c211f327379688f81b0dChris Lattner } 925cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 926cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 9277422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<unsigned>); 9287422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<int>); 9297422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<std::string>); 9307422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<bool>); 9317422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 932331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 933331de23705a719514e37c211f327379688f81b0dChris Lattner// list_storage class 934331de23705a719514e37c211f327379688f81b0dChris Lattner 935331de23705a719514e37c211f327379688f81b0dChris Lattner// Default storage class definition: external storage. This implementation 936331de23705a719514e37c211f327379688f81b0dChris Lattner// assumes the user will specify a variable to store the data into with the 937331de23705a719514e37c211f327379688f81b0dChris Lattner// cl::location(x) modifier. 938331de23705a719514e37c211f327379688f81b0dChris Lattner// 939331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType, class StorageClass> 940331de23705a719514e37c211f327379688f81b0dChris Lattnerclass list_storage { 941331de23705a719514e37c211f327379688f81b0dChris Lattner StorageClass *Location; // Where to store the object... 94271fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner 943cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 944331de23705a719514e37c211f327379688f81b0dChris Lattner list_storage() : Location(0) {} 945331de23705a719514e37c211f327379688f81b0dChris Lattner 946331de23705a719514e37c211f327379688f81b0dChris Lattner bool setLocation(Option &O, StorageClass &L) { 947331de23705a719514e37c211f327379688f81b0dChris Lattner if (Location) 948331de23705a719514e37c211f327379688f81b0dChris Lattner return O.error(": cl::location(x) specified more than once!"); 949331de23705a719514e37c211f327379688f81b0dChris Lattner Location = &L; 950331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 95171fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner } 952331de23705a719514e37c211f327379688f81b0dChris Lattner 953331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 954331de23705a719514e37c211f327379688f81b0dChris Lattner void addValue(const T &V) { 955331de23705a719514e37c211f327379688f81b0dChris Lattner assert(Location != 0 && "cl::location(...) not specified for a command " 956331de23705a719514e37c211f327379688f81b0dChris Lattner "line option with external storage!"); 957331de23705a719514e37c211f327379688f81b0dChris Lattner Location->push_back(V); 958cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 959331de23705a719514e37c211f327379688f81b0dChris Lattner}; 960331de23705a719514e37c211f327379688f81b0dChris Lattner 961331de23705a719514e37c211f327379688f81b0dChris Lattner 962331de23705a719514e37c211f327379688f81b0dChris Lattner// Define how to hold a class type object, such as a string. Since we can 963331de23705a719514e37c211f327379688f81b0dChris Lattner// inherit from a class, we do so. This makes us exactly compatible with the 964331de23705a719514e37c211f327379688f81b0dChris Lattner// object in all cases that it is used. 965331de23705a719514e37c211f327379688f81b0dChris Lattner// 966331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 9671fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass list_storage<DataType, bool> : public std::vector<DataType> { 9681fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 969331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 970331de23705a719514e37c211f327379688f81b0dChris Lattner void addValue(const T &V) { push_back(V); } 971cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 972cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 973cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 974cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 975331de23705a719514e37c211f327379688f81b0dChris Lattner// list - A list of command line options. 976cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 977331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate <class DataType, class Storage = bool, 978331de23705a719514e37c211f327379688f81b0dChris Lattner class ParserClass = parser<DataType> > 979331de23705a719514e37c211f327379688f81b0dChris Lattnerclass list : public Option, public list_storage<DataType, Storage> { 9801e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer std::vector<unsigned> Positions; 981331de23705a719514e37c211f327379688f81b0dChris Lattner ParserClass Parser; 982331de23705a719514e37c211f327379688f81b0dChris Lattner 983cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner virtual enum ValueExpected getValueExpectedFlagDefault() const { 984331de23705a719514e37c211f327379688f81b0dChris Lattner return Parser.getValueExpectedFlagDefault(); 985cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 9869878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner virtual void getExtraOptionNames(std::vector<const char*> &OptionNames) { 9879878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner return Parser.getExtraOptionNames(OptionNames); 9889878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner } 989beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 99063b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman virtual bool handleOccurrence(unsigned pos, const char *ArgName, 9911e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer const std::string &Arg) { 9928a207c16d2eb44ebcf94b13b0db047e46b7b0d30Reid Spencer typename ParserClass::parser_data_type Val = 9938a207c16d2eb44ebcf94b13b0db047e46b7b0d30Reid Spencer typename ParserClass::parser_data_type(); 994d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner if (Parser.parse(*this, ArgName, Arg, Val)) 995d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return true; // Parse Error! 996d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner addValue(Val); 9971e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer setPosition(pos); 9981e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer Positions.push_back(pos); 999d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return false; 1000331de23705a719514e37c211f327379688f81b0dChris Lattner } 1001cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1002331de23705a719514e37c211f327379688f81b0dChris Lattner // Forward printing stuff to the parser... 100334cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const {return Parser.getOptionWidth(*this);} 100434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const { 1005331de23705a719514e37c211f327379688f81b0dChris Lattner Parser.printOptionInfo(*this, GlobalWidth); 1006331de23705a719514e37c211f327379688f81b0dChris Lattner } 1007cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1008331de23705a719514e37c211f327379688f81b0dChris Lattner void done() { 10099878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner addArgument(); 1010331de23705a719514e37c211f327379688f81b0dChris Lattner Parser.initialize(*this); 1011331de23705a719514e37c211f327379688f81b0dChris Lattner } 1012cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 1013331de23705a719514e37c211f327379688f81b0dChris Lattner ParserClass &getParser() { return Parser; } 1014331de23705a719514e37c211f327379688f81b0dChris Lattner 101563b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman unsigned getPosition(unsigned optnum) const { 10161e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer assert(optnum < this->size() && "Invalid option index"); 101763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman return Positions[optnum]; 10181e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer } 10191e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer 10207059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov void setNumAdditionalVals(unsigned n) { 10217059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov Option::setNumAdditionalVals(n); 10227059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov } 10237059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov 1024331de23705a719514e37c211f327379688f81b0dChris Lattner // One option... 1025331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t> 1026cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman explicit list(const M0t &M0) : Option(ZeroOrMore | NotHidden) { 1027331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); 1028331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1029331de23705a719514e37c211f327379688f81b0dChris Lattner } 1030331de23705a719514e37c211f327379688f81b0dChris Lattner // Two options... 1031331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t> 1032f6143ef556ed01311d2043d38421302479f7866cChris Lattner list(const M0t &M0, const M1t &M1) : Option(ZeroOrMore | NotHidden) { 1033331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); 1034331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1035331de23705a719514e37c211f327379688f81b0dChris Lattner } 1036331de23705a719514e37c211f327379688f81b0dChris Lattner // Three options... 1037331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t> 1038f6143ef556ed01311d2043d38421302479f7866cChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2) 1039f6143ef556ed01311d2043d38421302479f7866cChris Lattner : Option(ZeroOrMore | NotHidden) { 1040331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); 1041331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1042331de23705a719514e37c211f327379688f81b0dChris Lattner } 1043331de23705a719514e37c211f327379688f81b0dChris Lattner // Four options... 1044331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t> 10456e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) 1046f6143ef556ed01311d2043d38421302479f7866cChris Lattner : Option(ZeroOrMore | NotHidden) { 1047331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1048331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1049331de23705a719514e37c211f327379688f81b0dChris Lattner } 1050331de23705a719514e37c211f327379688f81b0dChris Lattner // Five options... 1051331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, class M4t> 1052331de23705a719514e37c211f327379688f81b0dChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1053f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4) : Option(ZeroOrMore | NotHidden) { 1054331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1055331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); 1056331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1057331de23705a719514e37c211f327379688f81b0dChris Lattner } 1058331de23705a719514e37c211f327379688f81b0dChris Lattner // Six options... 1059331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 1060331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t> 1061331de23705a719514e37c211f327379688f81b0dChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1062f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4, const M5t &M5) : Option(ZeroOrMore | NotHidden) { 1063331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1064331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); 1065331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1066331de23705a719514e37c211f327379688f81b0dChris Lattner } 1067331de23705a719514e37c211f327379688f81b0dChris Lattner // Seven options... 1068331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 1069331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t, class M6t> 1070331de23705a719514e37c211f327379688f81b0dChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1071f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4, const M5t &M5, const M6t &M6) 1072f6143ef556ed01311d2043d38421302479f7866cChris Lattner : Option(ZeroOrMore | NotHidden) { 1073331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1074331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); apply(M6, this); 1075331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1076331de23705a719514e37c211f327379688f81b0dChris Lattner } 1077331de23705a719514e37c211f327379688f81b0dChris Lattner // Eight options... 1078331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 1079331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t, class M6t, class M7t> 1080331de23705a719514e37c211f327379688f81b0dChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 10816e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner const M4t &M4, const M5t &M5, const M6t &M6, 1082f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M7t &M7) : Option(ZeroOrMore | NotHidden) { 1083331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1084331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this); 1085331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1086331de23705a719514e37c211f327379688f81b0dChris Lattner } 1087cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 1088cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 10897059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov// multi_arg - Modifier to set the number of additional values. 10907059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkovstruct multi_val { 10917059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov unsigned AdditionalVals; 10927059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov explicit multi_val(unsigned N) : AdditionalVals(N) {} 10937059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov 10947059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov template <typename D, typename S, typename P> 10957059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov void apply(list<D, S, P> &L) const { L.setNumAdditionalVals(AdditionalVals); } 10967059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov}; 10977059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov 10987059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov 1099331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 1100eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// bits_storage class 1101eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1102eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// Default storage class definition: external storage. This implementation 1103eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// assumes the user will specify a variable to store the data into with the 1104eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// cl::location(x) modifier. 1105eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// 1106eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeytemplate<class DataType, class StorageClass> 1107eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeyclass bits_storage { 1108a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey unsigned *Location; // Where to store the bits... 1109beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1110eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1111eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey static unsigned Bit(const T &V) { 11123e41da29fb74a4f2a43a1539b612b2fb11bef375Reid Spencer unsigned BitPos = reinterpret_cast<unsigned>(V); 1113de551f91d8816632a76a065084caab9fab6aacffDan Gohman assert(BitPos < sizeof(unsigned) * CHAR_BIT && 1114eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey "enum exceeds width of bit vector!"); 1115eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return 1 << BitPos; 1116eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1117eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1118eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeypublic: 1119eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits_storage() : Location(0) {} 1120eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1121a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey bool setLocation(Option &O, unsigned &L) { 1122eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey if (Location) 1123eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return O.error(": cl::location(x) specified more than once!"); 1124eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Location = &L; 1125eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return false; 1126eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1127eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1128eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1129eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey void addValue(const T &V) { 1130eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey assert(Location != 0 && "cl::location(...) not specified for a command " 1131eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey "line option with external storage!"); 1132eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey *Location |= Bit(V); 1133eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1134beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1135a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey unsigned getBits() { return *Location; } 1136beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1137eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1138eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bool isSet(const T &V) { 1139eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return (*Location & Bit(V)) != 0; 1140eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1141eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey}; 1142eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1143eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1144beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov// Define how to hold bits. Since we can inherit from a class, we do so. 1145eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// This makes us exactly compatible with the bits in all cases that it is used. 1146eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// 1147eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeytemplate<class DataType> 1148eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeyclass bits_storage<DataType, bool> { 1149a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey unsigned Bits; // Where to store the bits... 1150beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1151eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1152eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey static unsigned Bit(const T &V) { 11533e41da29fb74a4f2a43a1539b612b2fb11bef375Reid Spencer unsigned BitPos = reinterpret_cast<unsigned>(V); 1154de551f91d8816632a76a065084caab9fab6aacffDan Gohman assert(BitPos < sizeof(unsigned) * CHAR_BIT && 1155eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey "enum exceeds width of bit vector!"); 1156eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return 1 << BitPos; 1157eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1158beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1159eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeypublic: 1160eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1161eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey void addValue(const T &V) { 1162eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Bits |= Bit(V); 1163eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1164beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1165a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey unsigned getBits() { return Bits; } 1166beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1167eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1168eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bool isSet(const T &V) { 1169eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return (Bits & Bit(V)) != 0; 1170eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1171eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey}; 1172eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1173eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1174eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey//===----------------------------------------------------------------------===// 1175eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// bits - A bit vector of command options. 1176eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// 1177eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeytemplate <class DataType, class Storage = bool, 1178eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey class ParserClass = parser<DataType> > 1179eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeyclass bits : public Option, public bits_storage<DataType, Storage> { 1180eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey std::vector<unsigned> Positions; 1181eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey ParserClass Parser; 1182eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1183eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey virtual enum ValueExpected getValueExpectedFlagDefault() const { 1184eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return Parser.getValueExpectedFlagDefault(); 1185eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 11869878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner virtual void getExtraOptionNames(std::vector<const char*> &OptionNames) { 11879878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner return Parser.getExtraOptionNames(OptionNames); 11889878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner } 1189beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1190eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey virtual bool handleOccurrence(unsigned pos, const char *ArgName, 1191eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey const std::string &Arg) { 1192eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey typename ParserClass::parser_data_type Val = 1193eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey typename ParserClass::parser_data_type(); 1194eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey if (Parser.parse(*this, ArgName, Arg, Val)) 1195eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return true; // Parse Error! 1196eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey addValue(Val); 1197eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey setPosition(pos); 1198eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Positions.push_back(pos); 1199eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return false; 1200eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1201eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1202eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Forward printing stuff to the parser... 120334cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const {return Parser.getOptionWidth(*this);} 120434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const { 1205eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Parser.printOptionInfo(*this, GlobalWidth); 1206eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1207eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1208eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey void done() { 12099878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner addArgument(); 1210eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Parser.initialize(*this); 1211eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1212eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeypublic: 1213eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey ParserClass &getParser() { return Parser; } 1214eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1215eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey unsigned getPosition(unsigned optnum) const { 1216eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey assert(optnum < this->size() && "Invalid option index"); 1217eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return Positions[optnum]; 1218eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1219eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1220eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // One option... 1221eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t> 1222cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman explicit bits(const M0t &M0) : Option(ZeroOrMore | NotHidden) { 1223eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); 1224eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1225eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1226eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Two options... 1227eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t> 1228f6143ef556ed01311d2043d38421302479f7866cChris Lattner bits(const M0t &M0, const M1t &M1) : Option(ZeroOrMore | NotHidden) { 1229eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); 1230eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1231eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1232eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Three options... 1233eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t> 1234f6143ef556ed01311d2043d38421302479f7866cChris Lattner bits(const M0t &M0, const M1t &M1, const M2t &M2) 1235f6143ef556ed01311d2043d38421302479f7866cChris Lattner : Option(ZeroOrMore | NotHidden) { 1236eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); 1237eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1238eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1239eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Four options... 1240eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t> 1241f6143ef556ed01311d2043d38421302479f7866cChris Lattner bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) 1242f6143ef556ed01311d2043d38421302479f7866cChris Lattner : Option(ZeroOrMore | NotHidden) { 1243eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1244eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1245eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1246eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Five options... 1247eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t, class M4t> 1248eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1249f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4) : Option(ZeroOrMore | NotHidden) { 1250eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1251eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M4, this); 1252eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1253eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1254eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Six options... 1255eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t, 1256eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey class M4t, class M5t> 1257eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1258f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4, const M5t &M5) : Option(ZeroOrMore | NotHidden) { 1259eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1260eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M4, this); apply(M5, this); 1261eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1262eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1263eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Seven options... 1264eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t, 1265eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey class M4t, class M5t, class M6t> 1266eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1267f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4, const M5t &M5, const M6t &M6) 1268f6143ef556ed01311d2043d38421302479f7866cChris Lattner : Option(ZeroOrMore | NotHidden) { 1269eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1270eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M4, this); apply(M5, this); apply(M6, this); 1271eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1272eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1273eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Eight options... 1274eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t, 1275eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey class M4t, class M5t, class M6t, class M7t> 1276eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 12776e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner const M4t &M4, const M5t &M5, const M6t &M6, 1278f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M7t &M7) : Option(ZeroOrMore | NotHidden) { 1279eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1280eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this); 1281eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1282eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1283eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey}; 1284eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1285eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey//===----------------------------------------------------------------------===// 1286331de23705a719514e37c211f327379688f81b0dChris Lattner// Aliased command line option (alias this name to a preexisting name) 1287331de23705a719514e37c211f327379688f81b0dChris Lattner// 1288331de23705a719514e37c211f327379688f81b0dChris Lattner 1289331de23705a719514e37c211f327379688f81b0dChris Lattnerclass alias : public Option { 1290331de23705a719514e37c211f327379688f81b0dChris Lattner Option *AliasFor; 12910008f654bf08dc631a1abaa175dd08f1fd1be75eSteve Naroff virtual bool handleOccurrence(unsigned pos, const char * /*ArgName*/, 12921e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer const std::string &Arg) { 12931e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer return AliasFor->handleOccurrence(pos, AliasFor->ArgStr, Arg); 1294331de23705a719514e37c211f327379688f81b0dChris Lattner } 1295331de23705a719514e37c211f327379688f81b0dChris Lattner // Handle printing stuff... 129634cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const; 129734cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const; 1298331de23705a719514e37c211f327379688f81b0dChris Lattner 1299331de23705a719514e37c211f327379688f81b0dChris Lattner void done() { 1300331de23705a719514e37c211f327379688f81b0dChris Lattner if (!hasArgStr()) 1301331de23705a719514e37c211f327379688f81b0dChris Lattner error(": cl::alias must have argument name specified!"); 1302331de23705a719514e37c211f327379688f81b0dChris Lattner if (AliasFor == 0) 1303331de23705a719514e37c211f327379688f81b0dChris Lattner error(": cl::alias must have an cl::aliasopt(option) specified!"); 13049878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner addArgument(); 1305331de23705a719514e37c211f327379688f81b0dChris Lattner } 1306cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 1307331de23705a719514e37c211f327379688f81b0dChris Lattner void setAliasFor(Option &O) { 1308331de23705a719514e37c211f327379688f81b0dChris Lattner if (AliasFor) 1309331de23705a719514e37c211f327379688f81b0dChris Lattner error(": cl::alias must only have one cl::aliasopt(...) specified!"); 1310331de23705a719514e37c211f327379688f81b0dChris Lattner AliasFor = &O; 1311331de23705a719514e37c211f327379688f81b0dChris Lattner } 1312331de23705a719514e37c211f327379688f81b0dChris Lattner 1313331de23705a719514e37c211f327379688f81b0dChris Lattner // One option... 1314331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t> 1315cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman explicit alias(const M0t &M0) : Option(Optional | Hidden), AliasFor(0) { 1316331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); 1317331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1318331de23705a719514e37c211f327379688f81b0dChris Lattner } 1319331de23705a719514e37c211f327379688f81b0dChris Lattner // Two options... 1320331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t> 1321f6143ef556ed01311d2043d38421302479f7866cChris Lattner alias(const M0t &M0, const M1t &M1) : Option(Optional | Hidden), AliasFor(0) { 1322331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); 1323331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1324331de23705a719514e37c211f327379688f81b0dChris Lattner } 1325331de23705a719514e37c211f327379688f81b0dChris Lattner // Three options... 1326331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t> 13276e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner alias(const M0t &M0, const M1t &M1, const M2t &M2) 1328f6143ef556ed01311d2043d38421302479f7866cChris Lattner : Option(Optional | Hidden), AliasFor(0) { 1329331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); 1330331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1331331de23705a719514e37c211f327379688f81b0dChris Lattner } 1332331de23705a719514e37c211f327379688f81b0dChris Lattner // Four options... 1333331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t> 1334331de23705a719514e37c211f327379688f81b0dChris Lattner alias(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) 1335f6143ef556ed01311d2043d38421302479f7866cChris Lattner : Option(Optional | Hidden), AliasFor(0) { 1336331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1337331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1338331de23705a719514e37c211f327379688f81b0dChris Lattner } 1339331de23705a719514e37c211f327379688f81b0dChris Lattner}; 1340331de23705a719514e37c211f327379688f81b0dChris Lattner 1341331de23705a719514e37c211f327379688f81b0dChris Lattner// aliasfor - Modifier to set the option an alias aliases. 1342331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct aliasopt { 1343331de23705a719514e37c211f327379688f81b0dChris Lattner Option &Opt; 1344cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman explicit aliasopt(Option &O) : Opt(O) {} 1345331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(alias &A) const { A.setAliasFor(Opt); } 1346cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 1347cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 13489bbba091396922093687d11a181e5886c42c5dfdReid Spencer// extrahelp - provide additional help at the end of the normal help 13499bbba091396922093687d11a181e5886c42c5dfdReid Spencer// output. All occurrences of cl::extrahelp will be accumulated and 13509bbba091396922093687d11a181e5886c42c5dfdReid Spencer// printed to std::cerr at the end of the regular help, just before 13519bbba091396922093687d11a181e5886c42c5dfdReid Spencer// exit is called. 13529bbba091396922093687d11a181e5886c42c5dfdReid Spencerstruct extrahelp { 13539bbba091396922093687d11a181e5886c42c5dfdReid Spencer const char * morehelp; 1354b5660dc8223bd5eb3d21d9855692617fcdec5663Dan Gohman explicit extrahelp(const char* help); 13559bbba091396922093687d11a181e5886c42c5dfdReid Spencer}; 13569bbba091396922093687d11a181e5886c42c5dfdReid Spencer 1357aed293dfba04b07a867491c11dfff4bf3eb6bdddDevang Patelvoid PrintVersionMessage(); 13589bbba091396922093687d11a181e5886c42c5dfdReid Spencer// This function just prints the help message, exactly the same way as if the 13599bbba091396922093687d11a181e5886c42c5dfdReid Spencer// --help option had been given on the command line. 13609bbba091396922093687d11a181e5886c42c5dfdReid Spencer// NOTE: THIS FUNCTION TERMINATES THE PROGRAM! 13619bbba091396922093687d11a181e5886c42c5dfdReid Spencervoid PrintHelpMessage(); 1362cc08ee507fc47d80a67c10a20b95587f7f06f0b7Reid Spencer 1363cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner} // End namespace cl 1364cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1365d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End namespace llvm 1366d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 1367cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#endif 1368