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" 247422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner#include "llvm/Support/Compiler.h" 253b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner#include "llvm/ADT/SmallVector.h" 26a460beb5cdc1cf05da3b22a39fd2b3107ea2e2feChris Lattner#include "llvm/ADT/Twine.h" 27630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <cassert> 28de551f91d8816632a76a065084caab9fab6aacffDan Gohman#include <climits> 29630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <cstdarg> 30cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include <utility> 31630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <vector> 32be583b914d8156b99d3da264d5adca37fee8dbc9John Criswell 33d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 341e67278dd53de90b0ea9d39c345383d5a9f2bf86Mikhail Glushenkov 35bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattner/// cl Namespace - This namespace contains all of the command line option 36bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattner/// processing machinery. It is intentionally a short name to make qualified 37bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattner/// usage concise. 38bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattnernamespace cl { 39cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 40cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 41331de23705a719514e37c211f327379688f81b0dChris Lattner// ParseCommandLineOptions - Command line option processing entry point. 42cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 43ebba0558c84b67f73989e174e4512f5af0c06cb1David Blaikievoid ParseCommandLineOptions(int argc, const char * const *argv, 44beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov const char *Overview = 0, 45beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov bool ReadResponseFiles = false); 46cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 47cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 4806b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke// ParseEnvironmentOptions - Environment variable option processing alternate 4906b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke// entry point. 5006b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke// 51c48ef2ae36e2169872a828a5399ccd1993837915Brian Gaekevoid ParseEnvironmentOptions(const char *progName, const char *envvar, 52beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov const char *Overview = 0, 53beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov bool ReadResponseFiles = false); 5406b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke 55515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer///===---------------------------------------------------------------------===// 56515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer/// SetVersionPrinter - Override the default (LLVM specific) version printer 57515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer/// used to print out the version when --version is given 583ab264a985de3d86e0d1f5716f6d633fd8538618Dan Gohman/// on the command line. This allows other systems using the 59515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer/// CommandLine utilities to print their own version string. 60515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencervoid SetVersionPrinter(void (*func)()); 61515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer 626d51d26a2479069f85a7676f664d6f998fc49a16Chandler Carruth///===---------------------------------------------------------------------===// 636d51d26a2479069f85a7676f664d6f998fc49a16Chandler Carruth/// AddExtraVersionPrinter - Add an extra printer to use in addition to the 646d51d26a2479069f85a7676f664d6f998fc49a16Chandler Carruth/// default one. This can be called multiple times, 656d51d26a2479069f85a7676f664d6f998fc49a16Chandler Carruth/// and each time it adds a new function to the list 666d51d26a2479069f85a7676f664d6f998fc49a16Chandler Carruth/// which will be called after the basic LLVM version 676d51d26a2479069f85a7676f664d6f998fc49a16Chandler Carruth/// printing is complete. Each can then add additional 686d51d26a2479069f85a7676f664d6f998fc49a16Chandler Carruth/// information specific to the tool. 696d51d26a2479069f85a7676f664d6f998fc49a16Chandler Carruthvoid AddExtraVersionPrinter(void (*func)()); 706d51d26a2479069f85a7676f664d6f998fc49a16Chandler Carruth 7169d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner 72ce96902d88d473697f05c0465952dae374be564eAndrew Trick// PrintOptionValues - Print option values. 73ce96902d88d473697f05c0465952dae374be564eAndrew Trick// With -print-options print the difference between option values and defaults. 74ce96902d88d473697f05c0465952dae374be564eAndrew Trick// With -print-all-options print all option values. 75ce96902d88d473697f05c0465952dae374be564eAndrew Trick// (Currently not perfect, but best-effort.) 76ce96902d88d473697f05c0465952dae374be564eAndrew Trickvoid PrintOptionValues(); 77ce96902d88d473697f05c0465952dae374be564eAndrew Trick 7869d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner// MarkOptionsChanged - Internal helper function. 7969d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattnervoid MarkOptionsChanged(); 8069d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner 8106b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke//===----------------------------------------------------------------------===// 82331de23705a719514e37c211f327379688f81b0dChris Lattner// Flags permitted to be passed to command line arguments 83331de23705a719514e37c211f327379688f81b0dChris Lattner// 84cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 85d113c6b601c778a85443cb4b4c80452e92c1fb8eEvan Chengenum NumOccurrencesFlag { // Flags for the number of occurrences allowed 86c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie Optional = 0x00, // Zero or One occurrence 87c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie ZeroOrMore = 0x01, // Zero or more occurrences allowed 88c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie Required = 0x02, // One occurrence required 89c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie OneOrMore = 0x03, // One or more occurrences required 90cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 91331de23705a719514e37c211f327379688f81b0dChris Lattner // ConsumeAfter - Indicates that this option is fed anything that follows the 92331de23705a719514e37c211f327379688f81b0dChris Lattner // last positional argument required by the application (it is an error if 93331de23705a719514e37c211f327379688f81b0dChris Lattner // there are zero positional arguments, and a ConsumeAfter option is used). 94331de23705a719514e37c211f327379688f81b0dChris Lattner // Thus, for example, all arguments to LLI are processed until a filename is 95331de23705a719514e37c211f327379688f81b0dChris Lattner // found. Once a filename is found, all of the succeeding arguments are 96331de23705a719514e37c211f327379688f81b0dChris Lattner // passed, unprocessed, to the ConsumeAfter option. 97cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // 98c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie ConsumeAfter = 0x04 99cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 100cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 101cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerenum ValueExpected { // Is a value required for the option? 102c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie // zero reserved for the unspecified value 103c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie ValueOptional = 0x01, // The value can appear... or not 104c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie ValueRequired = 0x02, // The value is required to appear! 105c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie ValueDisallowed = 0x03 // A value may not be specified (for flags) 106cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 107cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 108cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerenum OptionHidden { // Control whether -help shows this option 109c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie NotHidden = 0x00, // Option included in -help & -help-hidden 110c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie Hidden = 0x01, // -help doesn't, but -help-hidden does 111c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie ReallyHidden = 0x02 // Neither -help nor -help-hidden show this arg 112cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 113cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 114331de23705a719514e37c211f327379688f81b0dChris Lattner// Formatting flags - This controls special features that the option might have 115331de23705a719514e37c211f327379688f81b0dChris Lattner// that cause it to be parsed differently... 116331de23705a719514e37c211f327379688f81b0dChris Lattner// 117331de23705a719514e37c211f327379688f81b0dChris Lattner// Prefix - This option allows arguments that are otherwise unrecognized to be 118331de23705a719514e37c211f327379688f81b0dChris Lattner// matched by options that are a prefix of the actual value. This is useful for 119331de23705a719514e37c211f327379688f81b0dChris Lattner// cases like a linker, where options are typically of the form '-lfoo' or 120331de23705a719514e37c211f327379688f81b0dChris Lattner// '-L../../include' where -l or -L are the actual flags. When prefix is 121331de23705a719514e37c211f327379688f81b0dChris Lattner// enabled, and used, the value for the flag comes from the suffix of the 122331de23705a719514e37c211f327379688f81b0dChris Lattner// argument. 123331de23705a719514e37c211f327379688f81b0dChris Lattner// 124331de23705a719514e37c211f327379688f81b0dChris Lattner// Grouping - With this option enabled, multiple letter options are allowed to 125331de23705a719514e37c211f327379688f81b0dChris Lattner// bunch together with only a single hyphen for the whole group. This allows 126331de23705a719514e37c211f327379688f81b0dChris Lattner// emulation of the behavior that ls uses for example: ls -la === ls -l -a 127331de23705a719514e37c211f327379688f81b0dChris Lattner// 128331de23705a719514e37c211f327379688f81b0dChris Lattner 129331de23705a719514e37c211f327379688f81b0dChris Lattnerenum FormattingFlags { 130c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie NormalFormatting = 0x00, // Nothing special 131c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie Positional = 0x01, // Is a positional argument, no '-' required 132c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie Prefix = 0x02, // Can this option directly prefix its value? 133c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie Grouping = 0x03 // Can this option group with other options? 134331de23705a719514e37c211f327379688f81b0dChris Lattner}; 135331de23705a719514e37c211f327379688f81b0dChris Lattner 1361e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencerenum MiscFlags { // Miscellaneous flags to adjust argument 137c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie CommaSeparated = 0x01, // Should this cl::list split between commas? 138c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie PositionalEatsArgs = 0x02, // Should this positional cl::list eat -args? 139c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie Sink = 0x04 // Should this cl::list eat all unknown options? 140b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner}; 141b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner 142b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner 143cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 144cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 145cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// Option Base class 146cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 147331de23705a719514e37c211f327379688f81b0dChris Lattnerclass alias; 148cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerclass Option { 149331de23705a719514e37c211f327379688f81b0dChris Lattner friend class alias; 150cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 151dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman // handleOccurrences - Overriden by subclasses to handle the value passed into 152cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // an argument. Should return true if there was an error processing the 153cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // argument and the program should exit. 154cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // 15599c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner virtual bool handleOccurrence(unsigned pos, StringRef ArgName, 156a460beb5cdc1cf05da3b22a39fd2b3107ea2e2feChris Lattner StringRef Arg) = 0; 157cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 158cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner virtual enum ValueExpected getValueExpectedFlagDefault() const { 15963b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman return ValueOptional; 160cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 161beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 162433fd76e51e9bd9a4933e2c1775a7410928112c8Chris Lattner // Out of line virtual function to provide home for the class. 163433fd76e51e9bd9a4933e2c1775a7410928112c8Chris Lattner virtual void anchor(); 164beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1659878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner int NumOccurrences; // The number of times specified 166153c8adc496466972c5d742507156b0257078543David Blaikie // Occurrences, HiddenFlag, and Formatting are all enum types but to avoid 167b2b3d7d972f1a5aa5c96400ef036c520696b4e77David Blaikie // problems with signed enums in bitfields. 168153c8adc496466972c5d742507156b0257078543David Blaikie unsigned Occurrences : 3; // enum NumOccurrencesFlag 169c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie // not using the enum type for 'Value' because zero is an implementation 170c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie // detail representing the non-value 171c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie unsigned Value : 2; 172153c8adc496466972c5d742507156b0257078543David Blaikie unsigned HiddenFlag : 2; // enum OptionHidden 173153c8adc496466972c5d742507156b0257078543David Blaikie unsigned Formatting : 2; // enum FormattingFlags 174c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie unsigned Misc : 3; 1759878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner unsigned Position; // Position of last occurrence of the option 1767059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov unsigned AdditionalVals;// Greater than 0 for multi-valued option. 1779878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner Option *NextRegistered; // Singly linked list of registered options. 178cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 1799878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner const char *ArgStr; // The argument string itself (ex: "help", "o") 1807e7ae5ad692760aa8d97477f061a05b10948cf57Duncan Sands const char *HelpStr; // The descriptive text message for -help 1819878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner const char *ValueStr; // String describing what the value of this option is 182cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 183d113c6b601c778a85443cb4b4c80452e92c1fb8eEvan Cheng inline enum NumOccurrencesFlag getNumOccurrencesFlag() const { 184153c8adc496466972c5d742507156b0257078543David Blaikie return (enum NumOccurrencesFlag)Occurrences; 185cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 186cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner inline enum ValueExpected getValueExpectedFlag() const { 187153c8adc496466972c5d742507156b0257078543David Blaikie return Value ? ((enum ValueExpected)Value) 1888b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner : getValueExpectedFlagDefault(); 189cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 190cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner inline enum OptionHidden getOptionHiddenFlag() const { 191153c8adc496466972c5d742507156b0257078543David Blaikie return (enum OptionHidden)HiddenFlag; 192cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 193331de23705a719514e37c211f327379688f81b0dChris Lattner inline enum FormattingFlags getFormattingFlag() const { 194153c8adc496466972c5d742507156b0257078543David Blaikie return (enum FormattingFlags)Formatting; 195331de23705a719514e37c211f327379688f81b0dChris Lattner } 196b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner inline unsigned getMiscFlags() const { 197c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie return Misc; 198b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner } 1991e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer inline unsigned getPosition() const { return Position; } 2007059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov inline unsigned getNumAdditionalVals() const { return AdditionalVals; } 201331de23705a719514e37c211f327379688f81b0dChris Lattner 202331de23705a719514e37c211f327379688f81b0dChris Lattner // hasArgStr - Return true if the argstr != "" 203331de23705a719514e37c211f327379688f81b0dChris Lattner bool hasArgStr() const { return ArgStr[0] != 0; } 204331de23705a719514e37c211f327379688f81b0dChris Lattner 205331de23705a719514e37c211f327379688f81b0dChris Lattner //-------------------------------------------------------------------------=== 206331de23705a719514e37c211f327379688f81b0dChris Lattner // Accessor functions set by OptionModifiers 207331de23705a719514e37c211f327379688f81b0dChris Lattner // 208331de23705a719514e37c211f327379688f81b0dChris Lattner void setArgStr(const char *S) { ArgStr = S; } 209331de23705a719514e37c211f327379688f81b0dChris Lattner void setDescription(const char *S) { HelpStr = S; } 210331de23705a719514e37c211f327379688f81b0dChris Lattner void setValueStr(const char *S) { ValueStr = S; } 211d113c6b601c778a85443cb4b4c80452e92c1fb8eEvan Cheng void setNumOccurrencesFlag(enum NumOccurrencesFlag Val) { 212c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie Occurrences = Val; 213331de23705a719514e37c211f327379688f81b0dChris Lattner } 214c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie void setValueExpectedFlag(enum ValueExpected Val) { Value = Val; } 215c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie void setHiddenFlag(enum OptionHidden Val) { HiddenFlag = Val; } 216c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie void setFormattingFlag(enum FormattingFlags V) { Formatting = V; } 217c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie void setMiscFlag(enum MiscFlags M) { Misc |= M; } 2181e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer void setPosition(unsigned pos) { Position = pos; } 219cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerprotected: 220c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie explicit Option(enum NumOccurrencesFlag Occurrences, 221c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie enum OptionHidden Hidden) 222c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie : NumOccurrences(0), Occurrences(Occurrences), HiddenFlag(Hidden), 223c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie Formatting(NormalFormatting), Position(0), 2247059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov AdditionalVals(0), NextRegistered(0), 2257059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov ArgStr(""), HelpStr(""), ValueStr("") { 226f6143ef556ed01311d2043d38421302479f7866cChris Lattner } 227cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 228a460beb5cdc1cf05da3b22a39fd2b3107ea2e2feChris Lattner inline void setNumAdditionalVals(unsigned n) { AdditionalVals = n; } 229cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 2309878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner // addArgument - Register this argument with the commandline system. 231331de23705a719514e37c211f327379688f81b0dChris Lattner // 2329878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner void addArgument(); 233beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 2349878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner Option *getNextRegisteredOption() const { return NextRegistered; } 235331de23705a719514e37c211f327379688f81b0dChris Lattner 236cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // Return the width of the option tag for printing... 23734cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const = 0; 238cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 23963b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman // printOptionInfo - Print out information about this option. The 240cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // to-be-maintained width is specified. 241cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // 24234cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const = 0; 243cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 244ce96902d88d473697f05c0465952dae374be564eAndrew Trick virtual void printOptionValue(size_t GlobalWidth, bool Force) const = 0; 245ce96902d88d473697f05c0465952dae374be564eAndrew Trick 2461908aea3a64fa89a907317849cbff73789cdb89aChris Lattner virtual void getExtraOptionNames(SmallVectorImpl<const char*> &) {} 247beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 24899c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner // addOccurrence - Wrapper around handleOccurrence that enforces Flags. 249cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // 25099c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner bool addOccurrence(unsigned pos, StringRef ArgName, 251a460beb5cdc1cf05da3b22a39fd2b3107ea2e2feChris Lattner StringRef Value, bool MultiArg = false); 252cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 253cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner // Prints option name followed by message. Always returns true. 25499c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner bool error(const Twine &Message, StringRef ArgName = StringRef()); 255cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 256cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 257dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman inline int getNumOccurrences() const { return NumOccurrences; } 258cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner virtual ~Option() {} 259cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 260cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 261cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 262cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 263331de23705a719514e37c211f327379688f81b0dChris Lattner// Command line option modifiers that can be used to modify the behavior of 264331de23705a719514e37c211f327379688f81b0dChris Lattner// command line option parsers... 265cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 266331de23705a719514e37c211f327379688f81b0dChris Lattner 2677e7ae5ad692760aa8d97477f061a05b10948cf57Duncan Sands// desc - Modifier to set the description shown in the -help output... 268331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct desc { 269331de23705a719514e37c211f327379688f81b0dChris Lattner const char *Desc; 270331de23705a719514e37c211f327379688f81b0dChris Lattner desc(const char *Str) : Desc(Str) {} 271331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Option &O) const { O.setDescription(Desc); } 272331de23705a719514e37c211f327379688f81b0dChris Lattner}; 273331de23705a719514e37c211f327379688f81b0dChris Lattner 2747e7ae5ad692760aa8d97477f061a05b10948cf57Duncan Sands// value_desc - Modifier to set the value description shown in the -help 275331de23705a719514e37c211f327379688f81b0dChris Lattner// output... 276331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct value_desc { 277331de23705a719514e37c211f327379688f81b0dChris Lattner const char *Desc; 278331de23705a719514e37c211f327379688f81b0dChris Lattner value_desc(const char *Str) : Desc(Str) {} 279331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Option &O) const { O.setValueStr(Desc); } 280331de23705a719514e37c211f327379688f81b0dChris Lattner}; 281331de23705a719514e37c211f327379688f81b0dChris Lattner 282331de23705a719514e37c211f327379688f81b0dChris Lattner// init - Specify a default (initial) value for the command line argument, if 283331de23705a719514e37c211f327379688f81b0dChris Lattner// the default constructor for the argument type does not give you what you 284331de23705a719514e37c211f327379688f81b0dChris Lattner// want. This is only valid on "opt" arguments, not on "list" arguments. 285331de23705a719514e37c211f327379688f81b0dChris Lattner// 286331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty> 287331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct initializer { 288331de23705a719514e37c211f327379688f81b0dChris Lattner const Ty &Init; 289331de23705a719514e37c211f327379688f81b0dChris Lattner initializer(const Ty &Val) : Init(Val) {} 290331de23705a719514e37c211f327379688f81b0dChris Lattner 291331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 292331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Opt &O) const { O.setInitialValue(Init); } 293cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 294cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 295331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty> 296331de23705a719514e37c211f327379688f81b0dChris Lattnerinitializer<Ty> init(const Ty &Val) { 297331de23705a719514e37c211f327379688f81b0dChris Lattner return initializer<Ty>(Val); 298331de23705a719514e37c211f327379688f81b0dChris Lattner} 299331de23705a719514e37c211f327379688f81b0dChris Lattner 300331de23705a719514e37c211f327379688f81b0dChris Lattner 301331de23705a719514e37c211f327379688f81b0dChris Lattner// location - Allow the user to specify which external variable they want to 302331de23705a719514e37c211f327379688f81b0dChris Lattner// store the results of the command line argument processing into, if they don't 303331de23705a719514e37c211f327379688f81b0dChris Lattner// want to store it in the option itself. 304331de23705a719514e37c211f327379688f81b0dChris Lattner// 305331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty> 306331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct LocationClass { 307331de23705a719514e37c211f327379688f81b0dChris Lattner Ty &Loc; 308331de23705a719514e37c211f327379688f81b0dChris Lattner LocationClass(Ty &L) : Loc(L) {} 309331de23705a719514e37c211f327379688f81b0dChris Lattner 310331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 311331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Opt &O) const { O.setLocation(O, Loc); } 312331de23705a719514e37c211f327379688f81b0dChris Lattner}; 313331de23705a719514e37c211f327379688f81b0dChris Lattner 314331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty> 315331de23705a719514e37c211f327379688f81b0dChris LattnerLocationClass<Ty> location(Ty &L) { return LocationClass<Ty>(L); } 316331de23705a719514e37c211f327379688f81b0dChris Lattner 317331de23705a719514e37c211f327379688f81b0dChris Lattner 318cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 319ce96902d88d473697f05c0465952dae374be564eAndrew Trick// OptionValue class 320ce96902d88d473697f05c0465952dae374be564eAndrew Trick 321ce96902d88d473697f05c0465952dae374be564eAndrew Trick// Support value comparison outside the template. 322ce96902d88d473697f05c0465952dae374be564eAndrew Trickstruct GenericOptionValue { 323ce96902d88d473697f05c0465952dae374be564eAndrew Trick virtual ~GenericOptionValue() {} 324ce96902d88d473697f05c0465952dae374be564eAndrew Trick virtual bool compare(const GenericOptionValue &V) const = 0; 3250becc96b243da058f6d8901128b173d192db5148David Blaikieprivate: 3260becc96b243da058f6d8901128b173d192db5148David Blaikie virtual void anchor(); 327ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 328ce96902d88d473697f05c0465952dae374be564eAndrew Trick 329ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<class DataType> struct OptionValue; 330ce96902d88d473697f05c0465952dae374be564eAndrew Trick 331ce96902d88d473697f05c0465952dae374be564eAndrew Trick// The default value safely does nothing. Option value printing is only 332ce96902d88d473697f05c0465952dae374be564eAndrew Trick// best-effort. 333ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<class DataType, bool isClass> 334ce96902d88d473697f05c0465952dae374be564eAndrew Trickstruct OptionValueBase : public GenericOptionValue { 335ce96902d88d473697f05c0465952dae374be564eAndrew Trick // Temporary storage for argument passing. 336ce96902d88d473697f05c0465952dae374be564eAndrew Trick typedef OptionValue<DataType> WrapperType; 337ce96902d88d473697f05c0465952dae374be564eAndrew Trick 338ce96902d88d473697f05c0465952dae374be564eAndrew Trick bool hasValue() const { return false; } 339ce96902d88d473697f05c0465952dae374be564eAndrew Trick 340014bc6e3ceac59ea7d1d435cfb88642157c5270cTDYa const DataType &getValue() const { llvm_unreachable("no default value"); } 341ce96902d88d473697f05c0465952dae374be564eAndrew Trick 342ce96902d88d473697f05c0465952dae374be564eAndrew Trick // Some options may take their value from a different data type. 343ce96902d88d473697f05c0465952dae374be564eAndrew Trick template<class DT> 344eab631362d676c0113e052cc7e877eef4da544b8Frits van Bommel void setValue(const DT& /*V*/) {} 345ce96902d88d473697f05c0465952dae374be564eAndrew Trick 346eab631362d676c0113e052cc7e877eef4da544b8Frits van Bommel bool compare(const DataType &/*V*/) const { return false; } 347ce96902d88d473697f05c0465952dae374be564eAndrew Trick 348eab631362d676c0113e052cc7e877eef4da544b8Frits van Bommel virtual bool compare(const GenericOptionValue& /*V*/) const { return false; } 349ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 350ce96902d88d473697f05c0465952dae374be564eAndrew Trick 351ce96902d88d473697f05c0465952dae374be564eAndrew Trick// Simple copy of the option value. 352ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<class DataType> 353ce96902d88d473697f05c0465952dae374be564eAndrew Trickclass OptionValueCopy : public GenericOptionValue { 354ce96902d88d473697f05c0465952dae374be564eAndrew Trick DataType Value; 355ce96902d88d473697f05c0465952dae374be564eAndrew Trick bool Valid; 356ce96902d88d473697f05c0465952dae374be564eAndrew Trickpublic: 357ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValueCopy() : Valid(false) {} 358ce96902d88d473697f05c0465952dae374be564eAndrew Trick 359ce96902d88d473697f05c0465952dae374be564eAndrew Trick bool hasValue() const { return Valid; } 360ce96902d88d473697f05c0465952dae374be564eAndrew Trick 361ce96902d88d473697f05c0465952dae374be564eAndrew Trick const DataType &getValue() const { 362ce96902d88d473697f05c0465952dae374be564eAndrew Trick assert(Valid && "invalid option value"); 363ce96902d88d473697f05c0465952dae374be564eAndrew Trick return Value; 364ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 365ce96902d88d473697f05c0465952dae374be564eAndrew Trick 366ce96902d88d473697f05c0465952dae374be564eAndrew Trick void setValue(const DataType &V) { Valid = true; Value = V; } 367ce96902d88d473697f05c0465952dae374be564eAndrew Trick 368ce96902d88d473697f05c0465952dae374be564eAndrew Trick bool compare(const DataType &V) const { 369ce96902d88d473697f05c0465952dae374be564eAndrew Trick return Valid && (Value != V); 370ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 371ce96902d88d473697f05c0465952dae374be564eAndrew Trick 372ce96902d88d473697f05c0465952dae374be564eAndrew Trick virtual bool compare(const GenericOptionValue &V) const { 373ce96902d88d473697f05c0465952dae374be564eAndrew Trick const OptionValueCopy<DataType> &VC = 374ce96902d88d473697f05c0465952dae374be564eAndrew Trick static_cast< const OptionValueCopy<DataType>& >(V); 37540f16cf91d8469b8198990d2649a8cc81b558277Andrew Trick if (!VC.hasValue()) return false; 376ce96902d88d473697f05c0465952dae374be564eAndrew Trick return compare(VC.getValue()); 377ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 378ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 379ce96902d88d473697f05c0465952dae374be564eAndrew Trick 380ce96902d88d473697f05c0465952dae374be564eAndrew Trick// Non-class option values. 381ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<class DataType> 382ce96902d88d473697f05c0465952dae374be564eAndrew Trickstruct OptionValueBase<DataType, false> : OptionValueCopy<DataType> { 383ce96902d88d473697f05c0465952dae374be564eAndrew Trick typedef DataType WrapperType; 384ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 385ce96902d88d473697f05c0465952dae374be564eAndrew Trick 386ce96902d88d473697f05c0465952dae374be564eAndrew Trick// Top-level option class. 387ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<class DataType> 388ce96902d88d473697f05c0465952dae374be564eAndrew Trickstruct OptionValue : OptionValueBase<DataType, is_class<DataType>::value> { 389ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue() {} 390ce96902d88d473697f05c0465952dae374be564eAndrew Trick 391ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue(const DataType& V) { 392ce96902d88d473697f05c0465952dae374be564eAndrew Trick this->setValue(V); 393ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 394ce96902d88d473697f05c0465952dae374be564eAndrew Trick // Some options may take their value from a different data type. 395ce96902d88d473697f05c0465952dae374be564eAndrew Trick template<class DT> 396ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue<DataType> &operator=(const DT& V) { 397ce96902d88d473697f05c0465952dae374be564eAndrew Trick this->setValue(V); 398ce96902d88d473697f05c0465952dae374be564eAndrew Trick return *this; 399ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 400ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 401ce96902d88d473697f05c0465952dae374be564eAndrew Trick 402ce96902d88d473697f05c0465952dae374be564eAndrew Trick// Other safe-to-copy-by-value common option types. 403ce96902d88d473697f05c0465952dae374be564eAndrew Trickenum boolOrDefault { BOU_UNSET, BOU_TRUE, BOU_FALSE }; 404ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<> 405ce96902d88d473697f05c0465952dae374be564eAndrew Trickstruct OptionValue<cl::boolOrDefault> : OptionValueCopy<cl::boolOrDefault> { 406ce96902d88d473697f05c0465952dae374be564eAndrew Trick typedef cl::boolOrDefault WrapperType; 407ce96902d88d473697f05c0465952dae374be564eAndrew Trick 408ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue() {} 409ce96902d88d473697f05c0465952dae374be564eAndrew Trick 410ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue(const cl::boolOrDefault& V) { 411ce96902d88d473697f05c0465952dae374be564eAndrew Trick this->setValue(V); 412ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 413ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue<cl::boolOrDefault> &operator=(const cl::boolOrDefault& V) { 414ce96902d88d473697f05c0465952dae374be564eAndrew Trick setValue(V); 415ce96902d88d473697f05c0465952dae374be564eAndrew Trick return *this; 416ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 4170becc96b243da058f6d8901128b173d192db5148David Blaikieprivate: 4180becc96b243da058f6d8901128b173d192db5148David Blaikie virtual void anchor(); 419ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 420ce96902d88d473697f05c0465952dae374be564eAndrew Trick 421ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<> 422ce96902d88d473697f05c0465952dae374be564eAndrew Trickstruct OptionValue<std::string> : OptionValueCopy<std::string> { 423ce96902d88d473697f05c0465952dae374be564eAndrew Trick typedef StringRef WrapperType; 424ce96902d88d473697f05c0465952dae374be564eAndrew Trick 425ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue() {} 426ce96902d88d473697f05c0465952dae374be564eAndrew Trick 427ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue(const std::string& V) { 428ce96902d88d473697f05c0465952dae374be564eAndrew Trick this->setValue(V); 429ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 430ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue<std::string> &operator=(const std::string& V) { 431ce96902d88d473697f05c0465952dae374be564eAndrew Trick setValue(V); 432ce96902d88d473697f05c0465952dae374be564eAndrew Trick return *this; 433ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 4340becc96b243da058f6d8901128b173d192db5148David Blaikieprivate: 4350becc96b243da058f6d8901128b173d192db5148David Blaikie virtual void anchor(); 436ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 437ce96902d88d473697f05c0465952dae374be564eAndrew Trick 438ce96902d88d473697f05c0465952dae374be564eAndrew Trick//===----------------------------------------------------------------------===// 439331de23705a719514e37c211f327379688f81b0dChris Lattner// Enum valued command line option 440cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 441f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer#define clEnumVal(ENUMVAL, DESC) #ENUMVAL, int(ENUMVAL), DESC 442f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer#define clEnumValN(ENUMVAL, FLAGNAME, DESC) FLAGNAME, int(ENUMVAL), DESC 443f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer#define clEnumValEnd (reinterpret_cast<void*>(0)) 444331de23705a719514e37c211f327379688f81b0dChris Lattner 445331de23705a719514e37c211f327379688f81b0dChris Lattner// values - For custom data types, allow specifying a group of values together 446331de23705a719514e37c211f327379688f81b0dChris Lattner// as the values that go into the mapping that the option handler uses. Note 447331de23705a719514e37c211f327379688f81b0dChris Lattner// that the values list must always have a 0 at the end of the list to indicate 448331de23705a719514e37c211f327379688f81b0dChris Lattner// that the list has ended. 449331de23705a719514e37c211f327379688f81b0dChris Lattner// 450331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 451331de23705a719514e37c211f327379688f81b0dChris Lattnerclass ValuesClass { 452331de23705a719514e37c211f327379688f81b0dChris Lattner // Use a vector instead of a map, because the lists should be short, 453331de23705a719514e37c211f327379688f81b0dChris Lattner // the overhead is less, and most importantly, it keeps them in the order 454331de23705a719514e37c211f327379688f81b0dChris Lattner // inserted so we can print our option out nicely. 4553b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner SmallVector<std::pair<const char *, std::pair<int, const char *> >,4> Values; 456331de23705a719514e37c211f327379688f81b0dChris Lattner void processValues(va_list Vals); 457cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 45863b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman ValuesClass(const char *EnumName, DataType Val, const char *Desc, 459331de23705a719514e37c211f327379688f81b0dChris Lattner va_list ValueArgs) { 460331de23705a719514e37c211f327379688f81b0dChris Lattner // Insert the first value, which is required. 461331de23705a719514e37c211f327379688f81b0dChris Lattner Values.push_back(std::make_pair(EnumName, std::make_pair(Val, Desc))); 462331de23705a719514e37c211f327379688f81b0dChris Lattner 463331de23705a719514e37c211f327379688f81b0dChris Lattner // Process the varargs portion of the values... 46413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling while (const char *enumName = va_arg(ValueArgs, const char *)) { 4658b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner DataType EnumVal = static_cast<DataType>(va_arg(ValueArgs, int)); 466331de23705a719514e37c211f327379688f81b0dChris Lattner const char *EnumDesc = va_arg(ValueArgs, const char *); 46713d57320bd212483463d4f8992d5787b29eda5dfBill Wendling Values.push_back(std::make_pair(enumName, // Add value to value map 468331de23705a719514e37c211f327379688f81b0dChris Lattner std::make_pair(EnumVal, EnumDesc))); 469331de23705a719514e37c211f327379688f81b0dChris Lattner } 47071fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner } 47171fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner 472331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 473331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(Opt &O) const { 47434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng for (unsigned i = 0, e = static_cast<unsigned>(Values.size()); 47534cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng i != e; ++i) 476331de23705a719514e37c211f327379688f81b0dChris Lattner O.getParser().addLiteralOption(Values[i].first, Values[i].second.first, 477331de23705a719514e37c211f327379688f81b0dChris Lattner Values[i].second.second); 47871fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner } 479cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 480cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 481331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 482beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail GlushenkovValuesClass<DataType> END_WITH_NULL values(const char *Arg, DataType Val, 483a542b4c133de5da974632e9623ee4b426ebb3353Chris Lattner const char *Desc, ...) { 484331de23705a719514e37c211f327379688f81b0dChris Lattner va_list ValueArgs; 485331de23705a719514e37c211f327379688f81b0dChris Lattner va_start(ValueArgs, Desc); 486331de23705a719514e37c211f327379688f81b0dChris Lattner ValuesClass<DataType> Vals(Arg, Val, Desc, ValueArgs); 487331de23705a719514e37c211f327379688f81b0dChris Lattner va_end(ValueArgs); 488331de23705a719514e37c211f327379688f81b0dChris Lattner return Vals; 489331de23705a719514e37c211f327379688f81b0dChris Lattner} 490cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 491cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 492331de23705a719514e37c211f327379688f81b0dChris Lattner// parser class - Parameterizable parser for different data types. By default, 493331de23705a719514e37c211f327379688f81b0dChris Lattner// known data types (string, int, bool) have specialized parsers, that do what 494331de23705a719514e37c211f327379688f81b0dChris Lattner// you would expect. The default parser, used for data types that are not 495331de23705a719514e37c211f327379688f81b0dChris Lattner// built-in, uses a mapping table to map specific options to values, which is 496331de23705a719514e37c211f327379688f81b0dChris Lattner// used, among other things, to handle enum types. 497331de23705a719514e37c211f327379688f81b0dChris Lattner 498331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 499331de23705a719514e37c211f327379688f81b0dChris Lattner// generic_parser_base - This class holds all the non-generic code that we do 500331de23705a719514e37c211f327379688f81b0dChris Lattner// not need replicated for every instance of the generic parser. This also 501331de23705a719514e37c211f327379688f81b0dChris Lattner// allows us to put stuff into CommandLine.cpp 502cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 503ce96902d88d473697f05c0465952dae374be564eAndrew Trickclass generic_parser_base { 504ce96902d88d473697f05c0465952dae374be564eAndrew Trickprotected: 505ce96902d88d473697f05c0465952dae374be564eAndrew Trick class GenericOptionInfo { 506ce96902d88d473697f05c0465952dae374be564eAndrew Trick public: 507ce96902d88d473697f05c0465952dae374be564eAndrew Trick GenericOptionInfo(const char *name, const char *helpStr) : 508ce96902d88d473697f05c0465952dae374be564eAndrew Trick Name(name), HelpStr(helpStr) {} 509ce96902d88d473697f05c0465952dae374be564eAndrew Trick const char *Name; 510ce96902d88d473697f05c0465952dae374be564eAndrew Trick const char *HelpStr; 511ce96902d88d473697f05c0465952dae374be564eAndrew Trick }; 512ce96902d88d473697f05c0465952dae374be564eAndrew Trickpublic: 513331de23705a719514e37c211f327379688f81b0dChris Lattner virtual ~generic_parser_base() {} // Base class should have virtual-dtor 514331de23705a719514e37c211f327379688f81b0dChris Lattner 515331de23705a719514e37c211f327379688f81b0dChris Lattner // getNumOptions - Virtual function implemented by generic subclass to 516331de23705a719514e37c211f327379688f81b0dChris Lattner // indicate how many entries are in Values. 517331de23705a719514e37c211f327379688f81b0dChris Lattner // 518331de23705a719514e37c211f327379688f81b0dChris Lattner virtual unsigned getNumOptions() const = 0; 519331de23705a719514e37c211f327379688f81b0dChris Lattner 520331de23705a719514e37c211f327379688f81b0dChris Lattner // getOption - Return option name N. 521331de23705a719514e37c211f327379688f81b0dChris Lattner virtual const char *getOption(unsigned N) const = 0; 52263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 523331de23705a719514e37c211f327379688f81b0dChris Lattner // getDescription - Return description N 524331de23705a719514e37c211f327379688f81b0dChris Lattner virtual const char *getDescription(unsigned N) const = 0; 525331de23705a719514e37c211f327379688f81b0dChris Lattner 526331de23705a719514e37c211f327379688f81b0dChris Lattner // Return the width of the option tag for printing... 52734cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth(const Option &O) const; 528331de23705a719514e37c211f327379688f81b0dChris Lattner 529ce96902d88d473697f05c0465952dae374be564eAndrew Trick virtual const GenericOptionValue &getOptionValue(unsigned N) const = 0; 530ce96902d88d473697f05c0465952dae374be564eAndrew Trick 53163b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman // printOptionInfo - Print out information about this option. The 532331de23705a719514e37c211f327379688f81b0dChris Lattner // to-be-maintained width is specified. 533331de23705a719514e37c211f327379688f81b0dChris Lattner // 53434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(const Option &O, size_t GlobalWidth) const; 535331de23705a719514e37c211f327379688f81b0dChris Lattner 536ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printGenericOptionDiff(const Option &O, const GenericOptionValue &V, 537ce96902d88d473697f05c0465952dae374be564eAndrew Trick const GenericOptionValue &Default, 538ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const; 539ce96902d88d473697f05c0465952dae374be564eAndrew Trick 540ce96902d88d473697f05c0465952dae374be564eAndrew Trick // printOptionDiff - print the value of an option and it's default. 541ce96902d88d473697f05c0465952dae374be564eAndrew Trick // 542ce96902d88d473697f05c0465952dae374be564eAndrew Trick // Template definition ensures that the option and default have the same 543ce96902d88d473697f05c0465952dae374be564eAndrew Trick // DataType (via the same AnyOptionValue). 544ce96902d88d473697f05c0465952dae374be564eAndrew Trick template<class AnyOptionValue> 545ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionDiff(const Option &O, const AnyOptionValue &V, 546ce96902d88d473697f05c0465952dae374be564eAndrew Trick const AnyOptionValue &Default, 547ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const { 548ce96902d88d473697f05c0465952dae374be564eAndrew Trick printGenericOptionDiff(O, V, Default, GlobalWidth); 549ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 550ce96902d88d473697f05c0465952dae374be564eAndrew Trick 551331de23705a719514e37c211f327379688f81b0dChris Lattner void initialize(Option &O) { 552331de23705a719514e37c211f327379688f81b0dChris Lattner // All of the modifiers for the option have been processed by now, so the 553331de23705a719514e37c211f327379688f81b0dChris Lattner // argstr field should be stable, copy it down now. 554331de23705a719514e37c211f327379688f81b0dChris Lattner // 555331de23705a719514e37c211f327379688f81b0dChris Lattner hasArgStr = O.hasArgStr(); 5569878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner } 557beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 5581908aea3a64fa89a907317849cbff73789cdb89aChris Lattner void getExtraOptionNames(SmallVectorImpl<const char*> &OptionNames) { 559331de23705a719514e37c211f327379688f81b0dChris Lattner // If there has been no argstr specified, that means that we need to add an 560331de23705a719514e37c211f327379688f81b0dChris Lattner // argument for every possible option. This ensures that our options are 561331de23705a719514e37c211f327379688f81b0dChris Lattner // vectored to us. 562331de23705a719514e37c211f327379688f81b0dChris Lattner if (!hasArgStr) 563331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) 5649878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner OptionNames.push_back(getOption(i)); 565cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 566cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 5679878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner 568331de23705a719514e37c211f327379688f81b0dChris Lattner enum ValueExpected getValueExpectedFlagDefault() const { 569331de23705a719514e37c211f327379688f81b0dChris Lattner // If there is an ArgStr specified, then we are of the form: 570331de23705a719514e37c211f327379688f81b0dChris Lattner // 571331de23705a719514e37c211f327379688f81b0dChris Lattner // -opt=O2 or -opt O2 or -optO2 572331de23705a719514e37c211f327379688f81b0dChris Lattner // 573331de23705a719514e37c211f327379688f81b0dChris Lattner // In which case, the value is required. Otherwise if an arg str has not 574331de23705a719514e37c211f327379688f81b0dChris Lattner // been specified, we are of the form: 575331de23705a719514e37c211f327379688f81b0dChris Lattner // 576bc0e998c497446f5448425b3cbd7f8f19a458764Misha Brukman // -O2 or O2 or -la (where -l and -a are separate options) 577331de23705a719514e37c211f327379688f81b0dChris Lattner // 578331de23705a719514e37c211f327379688f81b0dChris Lattner // If this is the case, we cannot allow a value. 579331de23705a719514e37c211f327379688f81b0dChris Lattner // 580331de23705a719514e37c211f327379688f81b0dChris Lattner if (hasArgStr) 581331de23705a719514e37c211f327379688f81b0dChris Lattner return ValueRequired; 582331de23705a719514e37c211f327379688f81b0dChris Lattner else 583331de23705a719514e37c211f327379688f81b0dChris Lattner return ValueDisallowed; 584331de23705a719514e37c211f327379688f81b0dChris Lattner } 585cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 586af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner // findOption - Return the option number corresponding to the specified 587af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner // argument string. If the option is not found, getNumOptions() is returned. 588af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner // 589af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner unsigned findOption(const char *Name); 590af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner 591331de23705a719514e37c211f327379688f81b0dChris Lattnerprotected: 592331de23705a719514e37c211f327379688f81b0dChris Lattner bool hasArgStr; 593331de23705a719514e37c211f327379688f81b0dChris Lattner}; 594331de23705a719514e37c211f327379688f81b0dChris Lattner 595331de23705a719514e37c211f327379688f81b0dChris Lattner// Default parser implementation - This implementation depends on having a 596331de23705a719514e37c211f327379688f81b0dChris Lattner// mapping of recognized options to values of some sort. In addition to this, 597331de23705a719514e37c211f327379688f81b0dChris Lattner// each entry in the mapping also tracks a help message that is printed with the 5987e7ae5ad692760aa8d97477f061a05b10948cf57Duncan Sands// command line option for -help. Because this is a simple mapping parser, the 599331de23705a719514e37c211f327379688f81b0dChris Lattner// data type can be any unsupported type. 600cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 601331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate <class DataType> 602331de23705a719514e37c211f327379688f81b0dChris Lattnerclass parser : public generic_parser_base { 603af7e82184d7d77e426056c7c233e860baeebe80fChris Lattnerprotected: 604ce96902d88d473697f05c0465952dae374be564eAndrew Trick class OptionInfo : public GenericOptionInfo { 605565aafc997ee08803e2a6f7544f183b9e796ba94Rafael Espindola public: 606565aafc997ee08803e2a6f7544f183b9e796ba94Rafael Espindola OptionInfo(const char *name, DataType v, const char *helpStr) : 607ce96902d88d473697f05c0465952dae374be564eAndrew Trick GenericOptionInfo(name, helpStr), V(v) {} 608ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue<DataType> V; 609565aafc997ee08803e2a6f7544f183b9e796ba94Rafael Espindola }; 610565aafc997ee08803e2a6f7544f183b9e796ba94Rafael Espindola SmallVector<OptionInfo, 8> Values; 611af7e82184d7d77e426056c7c233e860baeebe80fChris Lattnerpublic: 612d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner typedef DataType parser_data_type; 613331de23705a719514e37c211f327379688f81b0dChris Lattner 614331de23705a719514e37c211f327379688f81b0dChris Lattner // Implement virtual functions needed by generic_parser_base 615f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer unsigned getNumOptions() const { return unsigned(Values.size()); } 616565aafc997ee08803e2a6f7544f183b9e796ba94Rafael Espindola const char *getOption(unsigned N) const { return Values[N].Name; } 617331de23705a719514e37c211f327379688f81b0dChris Lattner const char *getDescription(unsigned N) const { 618565aafc997ee08803e2a6f7544f183b9e796ba94Rafael Espindola return Values[N].HelpStr; 619cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 620331de23705a719514e37c211f327379688f81b0dChris Lattner 621ce96902d88d473697f05c0465952dae374be564eAndrew Trick // getOptionValue - Return the value of option name N. 622ce96902d88d473697f05c0465952dae374be564eAndrew Trick virtual const GenericOptionValue &getOptionValue(unsigned N) const { 623ce96902d88d473697f05c0465952dae374be564eAndrew Trick return Values[N].V; 624ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 625ce96902d88d473697f05c0465952dae374be564eAndrew Trick 626d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // parse - Return true on error. 62799c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner bool parse(Option &O, StringRef ArgName, StringRef Arg, DataType &V) { 628a460beb5cdc1cf05da3b22a39fd2b3107ea2e2feChris Lattner StringRef ArgVal; 629331de23705a719514e37c211f327379688f81b0dChris Lattner if (hasArgStr) 630331de23705a719514e37c211f327379688f81b0dChris Lattner ArgVal = Arg; 631331de23705a719514e37c211f327379688f81b0dChris Lattner else 632331de23705a719514e37c211f327379688f81b0dChris Lattner ArgVal = ArgName; 633331de23705a719514e37c211f327379688f81b0dChris Lattner 63434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng for (unsigned i = 0, e = static_cast<unsigned>(Values.size()); 63534cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng i != e; ++i) 636565aafc997ee08803e2a6f7544f183b9e796ba94Rafael Espindola if (Values[i].Name == ArgVal) { 637ce96902d88d473697f05c0465952dae374be564eAndrew Trick V = Values[i].V.getValue(); 638331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 639331de23705a719514e37c211f327379688f81b0dChris Lattner } 640331de23705a719514e37c211f327379688f81b0dChris Lattner 641e6864c1d355c4ec1156b956c1dd548682ad3e6b1Benjamin Kramer return O.error("Cannot find option named '" + ArgVal + "'!"); 642331de23705a719514e37c211f327379688f81b0dChris Lattner } 643cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 6443b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner /// addLiteralOption - Add an entry to the mapping table. 6453b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner /// 646331de23705a719514e37c211f327379688f81b0dChris Lattner template <class DT> 647331de23705a719514e37c211f327379688f81b0dChris Lattner void addLiteralOption(const char *Name, const DT &V, const char *HelpStr) { 648af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner assert(findOption(Name) == Values.size() && "Option already exists!"); 649565aafc997ee08803e2a6f7544f183b9e796ba94Rafael Espindola OptionInfo X(Name, static_cast<DataType>(V), HelpStr); 650565aafc997ee08803e2a6f7544f183b9e796ba94Rafael Espindola Values.push_back(X); 65169d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner MarkOptionsChanged(); 652cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 653af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner 6543b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner /// removeLiteralOption - Remove the specified option. 6553b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner /// 656af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner void removeLiteralOption(const char *Name) { 657af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner unsigned N = findOption(Name); 658af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner assert(N != Values.size() && "Option not found!"); 659af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner Values.erase(Values.begin()+N); 660af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner } 661cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 662cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 663331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 664d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// basic_parser - Super class of parsers to provide boilerplate code 665cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 6660ff290615f7675e42111fd907f7b457f08f06747Chris Lattnerclass basic_parser_impl { // non-template implementation of basic_parser<t> 6670ff290615f7675e42111fd907f7b457f08f06747Chris Lattnerpublic: 668d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual ~basic_parser_impl() {} 669331de23705a719514e37c211f327379688f81b0dChris Lattner 670331de23705a719514e37c211f327379688f81b0dChris Lattner enum ValueExpected getValueExpectedFlagDefault() const { 671d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return ValueRequired; 672cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 67363b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 6741908aea3a64fa89a907317849cbff73789cdb89aChris Lattner void getExtraOptionNames(SmallVectorImpl<const char*> &) {} 6759878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner 67613d57320bd212483463d4f8992d5787b29eda5dfBill Wendling void initialize(Option &) {} 67763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 678331de23705a719514e37c211f327379688f81b0dChris Lattner // Return the width of the option tag for printing... 67934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng size_t getOptionWidth(const Option &O) const; 68063b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 681d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // printOptionInfo - Print out information about this option. The 682331de23705a719514e37c211f327379688f81b0dChris Lattner // to-be-maintained width is specified. 683331de23705a719514e37c211f327379688f81b0dChris Lattner // 68434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng void printOptionInfo(const Option &O, size_t GlobalWidth) const; 685d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner 686ce96902d88d473697f05c0465952dae374be564eAndrew Trick // printOptionNoValue - Print a placeholder for options that don't yet support 687ce96902d88d473697f05c0465952dae374be564eAndrew Trick // printOptionDiff(). 688ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionNoValue(const Option &O, size_t GlobalWidth) const; 689ce96902d88d473697f05c0465952dae374be564eAndrew Trick 690d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 691d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "value"; } 6927422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 6937422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 6947422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 695ce96902d88d473697f05c0465952dae374be564eAndrew Trick 696ce96902d88d473697f05c0465952dae374be564eAndrew Trickprotected: 697ce96902d88d473697f05c0465952dae374be564eAndrew Trick // A helper for basic_parser::printOptionDiff. 698ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionName(const Option &O, size_t GlobalWidth) const; 699d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner}; 700d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner 701d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// basic_parser - The real basic parser is just a template wrapper that provides 702d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// a typedef for the provided data type. 703d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// 704d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnertemplate<class DataType> 7050ff290615f7675e42111fd907f7b457f08f06747Chris Lattnerclass basic_parser : public basic_parser_impl { 7060ff290615f7675e42111fd907f7b457f08f06747Chris Lattnerpublic: 707d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner typedef DataType parser_data_type; 708ce96902d88d473697f05c0465952dae374be564eAndrew Trick typedef OptionValue<DataType> OptVal; 709cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 710cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 711331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 712d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<bool> 713cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 714331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> 7151fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<bool> : public basic_parser<bool> { 716d64e0eb094a108bdcdf51328425904042aa6122bMike Stump const char *ArgStr; 7171fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 71871c767b4e30ad9fb3286664528cb2d6abccf2676Mikhail Glushenkov 719331de23705a719514e37c211f327379688f81b0dChris Lattner // parse - Return true on error. 72099c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner bool parse(Option &O, StringRef ArgName, StringRef Arg, bool &Val); 721cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 722d64e0eb094a108bdcdf51328425904042aa6122bMike Stump template <class Opt> 723d64e0eb094a108bdcdf51328425904042aa6122bMike Stump void initialize(Opt &O) { 724d64e0eb094a108bdcdf51328425904042aa6122bMike Stump ArgStr = O.ArgStr; 725d64e0eb094a108bdcdf51328425904042aa6122bMike Stump } 726d64e0eb094a108bdcdf51328425904042aa6122bMike Stump 727331de23705a719514e37c211f327379688f81b0dChris Lattner enum ValueExpected getValueExpectedFlagDefault() const { 72863b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman return ValueOptional; 729331de23705a719514e37c211f327379688f81b0dChris Lattner } 730331de23705a719514e37c211f327379688f81b0dChris Lattner 7317422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // getValueName - Do not print =<value> at all. 732d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return 0; } 733beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 734ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionDiff(const Option &O, bool V, OptVal Default, 735ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const; 736ce96902d88d473697f05c0465952dae374be564eAndrew Trick 7377422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 7387422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 739331de23705a719514e37c211f327379688f81b0dChris Lattner}; 740cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 7417422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<bool>); 7427422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 74381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen//-------------------------------------------------- 74481da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen// parser<boolOrDefault> 74581da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesentemplate<> 74681da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesenclass parser<boolOrDefault> : public basic_parser<boolOrDefault> { 74781da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesenpublic: 74881da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen // parse - Return true on error. 74999c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner bool parse(Option &O, StringRef ArgName, StringRef Arg, boolOrDefault &Val); 75081da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 75181da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen enum ValueExpected getValueExpectedFlagDefault() const { 75281da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen return ValueOptional; 75381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen } 75481da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 75581da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen // getValueName - Do not print =<value> at all. 75681da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen virtual const char *getValueName() const { return 0; } 757beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 758ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionDiff(const Option &O, boolOrDefault V, OptVal Default, 759ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const; 760ce96902d88d473697f05c0465952dae374be564eAndrew Trick 76181da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen // An out-of-line virtual method to provide a 'home' for this class. 76281da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen virtual void anchor(); 76381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen}; 76481da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen 76581da02b553b86868637f27b89c6e919c31ed5b51Dale JohannesenEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<boolOrDefault>); 766cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 767331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 768d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<int> 769331de23705a719514e37c211f327379688f81b0dChris Lattner// 770331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> 7711fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<int> : public basic_parser<int> { 7721fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 773331de23705a719514e37c211f327379688f81b0dChris Lattner // parse - Return true on error. 77499c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner bool parse(Option &O, StringRef ArgName, StringRef Arg, int &Val); 775cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 776d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 777d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "int"; } 7787422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 779ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionDiff(const Option &O, int V, OptVal Default, 780ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const; 781ce96902d88d473697f05c0465952dae374be564eAndrew Trick 7827422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 7837422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 784d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner}; 785cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 7867422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<int>); 7877422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 788cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 789d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner//-------------------------------------------------- 790d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner// parser<unsigned> 791d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner// 792d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattnertemplate<> 7931fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<unsigned> : public basic_parser<unsigned> { 7941fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 795d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner // parse - Return true on error. 79699c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner bool parse(Option &O, StringRef ArgName, StringRef Arg, unsigned &Val); 797d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner 798d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner // getValueName - Overload in subclass to provide a better default value. 799d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner virtual const char *getValueName() const { return "uint"; } 8007422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 801ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionDiff(const Option &O, unsigned V, OptVal Default, 802ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const; 803ce96902d88d473697f05c0465952dae374be564eAndrew Trick 8047422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 8057422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 806d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner}; 807d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner 8087422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<unsigned>); 809d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner 810d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner//-------------------------------------------------- 811b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer// parser<unsigned long long> 812b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer// 813b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramertemplate<> 814b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramerclass parser<unsigned long long> : public basic_parser<unsigned long long> { 815b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramerpublic: 816b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer // parse - Return true on error. 817b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer bool parse(Option &O, StringRef ArgName, StringRef Arg, 818b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer unsigned long long &Val); 819b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer 820b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer // getValueName - Overload in subclass to provide a better default value. 821b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer virtual const char *getValueName() const { return "uint"; } 822b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer 823b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer void printOptionDiff(const Option &O, unsigned long long V, OptVal Default, 824b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer size_t GlobalWidth) const; 825b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer 826b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer // An out-of-line virtual method to provide a 'home' for this class. 827b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer virtual void anchor(); 828b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer}; 829b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer 830b3514569d078065ced56562e01fd5a39e01543daBenjamin KramerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<unsigned long long>); 831b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer 832b3514569d078065ced56562e01fd5a39e01543daBenjamin Kramer//-------------------------------------------------- 833d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<double> 834d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// 835d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnertemplate<> 8361fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<double> : public basic_parser<double> { 8371fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 838d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // parse - Return true on error. 83999c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner bool parse(Option &O, StringRef ArgName, StringRef Arg, double &Val); 840cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 841d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 842d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "number"; } 8437422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 844ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionDiff(const Option &O, double V, OptVal Default, 845ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const; 846ce96902d88d473697f05c0465952dae374be564eAndrew Trick 8477422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 8487422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 849cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 850cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 8517422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<double>); 852331de23705a719514e37c211f327379688f81b0dChris Lattner 853d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner//-------------------------------------------------- 854d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<float> 855d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// 856d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnertemplate<> 8571fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<float> : public basic_parser<float> { 8581fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 859d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // parse - Return true on error. 86099c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner bool parse(Option &O, StringRef ArgName, StringRef Arg, float &Val); 861d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner 862d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 863d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "number"; } 8647422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 865ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionDiff(const Option &O, float V, OptVal Default, 866ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const; 867ce96902d88d473697f05c0465952dae374be564eAndrew Trick 8687422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 8697422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 870d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner}; 871331de23705a719514e37c211f327379688f81b0dChris Lattner 8727422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<float>); 873331de23705a719514e37c211f327379688f81b0dChris Lattner 874331de23705a719514e37c211f327379688f81b0dChris Lattner//-------------------------------------------------- 8757f4dd472e35569efefbeffef096c490075e3e824Chris Lattner// parser<std::string> 876331de23705a719514e37c211f327379688f81b0dChris Lattner// 877331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> 8781fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<std::string> : public basic_parser<std::string> { 8791fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 880331de23705a719514e37c211f327379688f81b0dChris Lattner // parse - Return true on error. 88141b5adf20208f46e4b1104d6d473710fbfa61eb9Eric Christopher bool parse(Option &, StringRef, StringRef Arg, std::string &Value) { 882a460beb5cdc1cf05da3b22a39fd2b3107ea2e2feChris Lattner Value = Arg.str(); 883331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 884331de23705a719514e37c211f327379688f81b0dChris Lattner } 885331de23705a719514e37c211f327379688f81b0dChris Lattner 886d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner // getValueName - Overload in subclass to provide a better default value. 887d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner virtual const char *getValueName() const { return "string"; } 8887422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 889ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionDiff(const Option &O, StringRef V, OptVal Default, 890ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const; 891ce96902d88d473697f05c0465952dae374be564eAndrew Trick 8927422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner // An out-of-line virtual method to provide a 'home' for this class. 8937422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner virtual void anchor(); 894331de23705a719514e37c211f327379688f81b0dChris Lattner}; 895331de23705a719514e37c211f327379688f81b0dChris Lattner 8967422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<std::string>); 8977422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 898b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling//-------------------------------------------------- 899b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling// parser<char> 900b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling// 901b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendlingtemplate<> 902b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendlingclass parser<char> : public basic_parser<char> { 903b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendlingpublic: 904b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling // parse - Return true on error. 90541b5adf20208f46e4b1104d6d473710fbfa61eb9Eric Christopher bool parse(Option &, StringRef, StringRef Arg, char &Value) { 906b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling Value = Arg[0]; 907b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling return false; 908b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling } 909b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling 910b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling // getValueName - Overload in subclass to provide a better default value. 911b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling virtual const char *getValueName() const { return "char"; } 912b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling 913ce96902d88d473697f05c0465952dae374be564eAndrew Trick void printOptionDiff(const Option &O, char V, OptVal Default, 914ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) const; 915ce96902d88d473697f05c0465952dae374be564eAndrew Trick 916b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling // An out-of-line virtual method to provide a 'home' for this class. 917b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling virtual void anchor(); 918b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling}; 919b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling 920b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill WendlingEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<char>); 921b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill Wendling 922ce96902d88d473697f05c0465952dae374be564eAndrew Trick//-------------------------------------------------- 923ce96902d88d473697f05c0465952dae374be564eAndrew Trick// PrintOptionDiff 924ce96902d88d473697f05c0465952dae374be564eAndrew Trick// 925ce96902d88d473697f05c0465952dae374be564eAndrew Trick// This collection of wrappers is the intermediary between class opt and class 926ce96902d88d473697f05c0465952dae374be564eAndrew Trick// parser to handle all the template nastiness. 927ce96902d88d473697f05c0465952dae374be564eAndrew Trick 928ce96902d88d473697f05c0465952dae374be564eAndrew Trick// This overloaded function is selected by the generic parser. 929ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<class ParserClass, class DT> 930ce96902d88d473697f05c0465952dae374be564eAndrew Trickvoid printOptionDiff(const Option &O, const generic_parser_base &P, const DT &V, 931ce96902d88d473697f05c0465952dae374be564eAndrew Trick const OptionValue<DT> &Default, size_t GlobalWidth) { 932ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue<DT> OV = V; 933ce96902d88d473697f05c0465952dae374be564eAndrew Trick P.printOptionDiff(O, OV, Default, GlobalWidth); 934ce96902d88d473697f05c0465952dae374be564eAndrew Trick} 935ce96902d88d473697f05c0465952dae374be564eAndrew Trick 936ce96902d88d473697f05c0465952dae374be564eAndrew Trick// This is instantiated for basic parsers when the parsed value has a different 937ce96902d88d473697f05c0465952dae374be564eAndrew Trick// type than the option value. e.g. HelpPrinter. 938ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<class ParserDT, class ValDT> 939ce96902d88d473697f05c0465952dae374be564eAndrew Trickstruct OptionDiffPrinter { 940eab631362d676c0113e052cc7e877eef4da544b8Frits van Bommel void print(const Option &O, const parser<ParserDT> P, const ValDT &/*V*/, 941eab631362d676c0113e052cc7e877eef4da544b8Frits van Bommel const OptionValue<ValDT> &/*Default*/, size_t GlobalWidth) { 942ce96902d88d473697f05c0465952dae374be564eAndrew Trick P.printOptionNoValue(O, GlobalWidth); 943ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 944ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 945ce96902d88d473697f05c0465952dae374be564eAndrew Trick 946ce96902d88d473697f05c0465952dae374be564eAndrew Trick// This is instantiated for basic parsers when the parsed value has the same 947ce96902d88d473697f05c0465952dae374be564eAndrew Trick// type as the option value. 948ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<class DT> 949ce96902d88d473697f05c0465952dae374be564eAndrew Trickstruct OptionDiffPrinter<DT, DT> { 950ce96902d88d473697f05c0465952dae374be564eAndrew Trick void print(const Option &O, const parser<DT> P, const DT &V, 951ce96902d88d473697f05c0465952dae374be564eAndrew Trick const OptionValue<DT> &Default, size_t GlobalWidth) { 952ce96902d88d473697f05c0465952dae374be564eAndrew Trick P.printOptionDiff(O, V, Default, GlobalWidth); 953ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 954ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 955ce96902d88d473697f05c0465952dae374be564eAndrew Trick 956ce96902d88d473697f05c0465952dae374be564eAndrew Trick// This overloaded function is selected by the basic parser, which may parse a 957ce96902d88d473697f05c0465952dae374be564eAndrew Trick// different type than the option type. 958ce96902d88d473697f05c0465952dae374be564eAndrew Tricktemplate<class ParserClass, class ValDT> 959ce96902d88d473697f05c0465952dae374be564eAndrew Trickvoid printOptionDiff( 960ce96902d88d473697f05c0465952dae374be564eAndrew Trick const Option &O, 961ce96902d88d473697f05c0465952dae374be564eAndrew Trick const basic_parser<typename ParserClass::parser_data_type> &P, 962ce96902d88d473697f05c0465952dae374be564eAndrew Trick const ValDT &V, const OptionValue<ValDT> &Default, 963ce96902d88d473697f05c0465952dae374be564eAndrew Trick size_t GlobalWidth) { 964ce96902d88d473697f05c0465952dae374be564eAndrew Trick 965ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionDiffPrinter<typename ParserClass::parser_data_type, ValDT> printer; 966ce96902d88d473697f05c0465952dae374be564eAndrew Trick printer.print(O, static_cast<const ParserClass&>(P), V, Default, 967ce96902d88d473697f05c0465952dae374be564eAndrew Trick GlobalWidth); 968ce96902d88d473697f05c0465952dae374be564eAndrew Trick} 969ce96902d88d473697f05c0465952dae374be564eAndrew Trick 970331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 971331de23705a719514e37c211f327379688f81b0dChris Lattner// applicator class - This class is used because we must use partial 972331de23705a719514e37c211f327379688f81b0dChris Lattner// specialization to handle literal string arguments specially (const char* does 973331de23705a719514e37c211f327379688f81b0dChris Lattner// not correctly respond to the apply method). Because the syntax to use this 974331de23705a719514e37c211f327379688f81b0dChris Lattner// is a pain, we have the 'apply' method below to handle the nastiness... 975331de23705a719514e37c211f327379688f81b0dChris Lattner// 976331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Mod> struct applicator { 977331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 978331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(const Mod &M, Opt &O) { M.apply(O); } 979331de23705a719514e37c211f327379688f81b0dChris Lattner}; 980331de23705a719514e37c211f327379688f81b0dChris Lattner 981331de23705a719514e37c211f327379688f81b0dChris Lattner// Handle const char* as a special case... 982331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<unsigned n> struct applicator<char[n]> { 983331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 984331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(const char *Str, Opt &O) { O.setArgStr(Str); } 985331de23705a719514e37c211f327379688f81b0dChris Lattner}; 9864042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattnertemplate<unsigned n> struct applicator<const char[n]> { 9874042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattner template<class Opt> 9884042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattner static void opt(const char *Str, Opt &O) { O.setArgStr(Str); } 9894042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattner}; 990331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<const char*> { 991331de23705a719514e37c211f327379688f81b0dChris Lattner template<class Opt> 992331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(const char *Str, Opt &O) { O.setArgStr(Str); } 993331de23705a719514e37c211f327379688f81b0dChris Lattner}; 994331de23705a719514e37c211f327379688f81b0dChris Lattner 995d113c6b601c778a85443cb4b4c80452e92c1fb8eEvan Chengtemplate<> struct applicator<NumOccurrencesFlag> { 996d113c6b601c778a85443cb4b4c80452e92c1fb8eEvan Cheng static void opt(NumOccurrencesFlag NO, Option &O) { 997d113c6b601c778a85443cb4b4c80452e92c1fb8eEvan Cheng O.setNumOccurrencesFlag(NO); 998d113c6b601c778a85443cb4b4c80452e92c1fb8eEvan Cheng } 999331de23705a719514e37c211f327379688f81b0dChris Lattner}; 1000331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<ValueExpected> { 1001331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(ValueExpected VE, Option &O) { O.setValueExpectedFlag(VE); } 1002331de23705a719514e37c211f327379688f81b0dChris Lattner}; 1003331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<OptionHidden> { 1004331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(OptionHidden OH, Option &O) { O.setHiddenFlag(OH); } 1005331de23705a719514e37c211f327379688f81b0dChris Lattner}; 1006331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<FormattingFlags> { 1007331de23705a719514e37c211f327379688f81b0dChris Lattner static void opt(FormattingFlags FF, Option &O) { O.setFormattingFlag(FF); } 1008331de23705a719514e37c211f327379688f81b0dChris Lattner}; 1009b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattnertemplate<> struct applicator<MiscFlags> { 1010b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner static void opt(MiscFlags MF, Option &O) { O.setMiscFlag(MF); } 1011b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner}; 1012331de23705a719514e37c211f327379688f81b0dChris Lattner 1013331de23705a719514e37c211f327379688f81b0dChris Lattner// apply method - Apply a modifier to an option in a type safe way. 1014331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Mod, class Opt> 1015331de23705a719514e37c211f327379688f81b0dChris Lattnervoid apply(const Mod &M, Opt *O) { 1016331de23705a719514e37c211f327379688f81b0dChris Lattner applicator<Mod>::opt(M, *O); 1017331de23705a719514e37c211f327379688f81b0dChris Lattner} 1018331de23705a719514e37c211f327379688f81b0dChris Lattner 1019331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 1020331de23705a719514e37c211f327379688f81b0dChris Lattner// opt_storage class 1021331de23705a719514e37c211f327379688f81b0dChris Lattner 1022331de23705a719514e37c211f327379688f81b0dChris Lattner// Default storage class definition: external storage. This implementation 1023331de23705a719514e37c211f327379688f81b0dChris Lattner// assumes the user will specify a variable to store the data into with the 1024331de23705a719514e37c211f327379688f81b0dChris Lattner// cl::location(x) modifier. 1025331de23705a719514e37c211f327379688f81b0dChris Lattner// 1026331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType, bool ExternalStorage, bool isClass> 1027331de23705a719514e37c211f327379688f81b0dChris Lattnerclass opt_storage { 1028331de23705a719514e37c211f327379688f81b0dChris Lattner DataType *Location; // Where to store the object... 1029ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue<DataType> Default; 1030331de23705a719514e37c211f327379688f81b0dChris Lattner 103131fd5a571eb8048a1084dd8e20a49dd0785de11aBill Wendling void check() const { 1032331de23705a719514e37c211f327379688f81b0dChris Lattner assert(Location != 0 && "cl::location(...) not specified for a command " 10333c7eb1f2ea231c046367023576311fbc4b1270e3Chris Lattner "line option with external storage, " 10343c7eb1f2ea231c046367023576311fbc4b1270e3Chris Lattner "or cl::init specified before cl::location()!!"); 1035331de23705a719514e37c211f327379688f81b0dChris Lattner } 1036cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 1037331de23705a719514e37c211f327379688f81b0dChris Lattner opt_storage() : Location(0) {} 1038331de23705a719514e37c211f327379688f81b0dChris Lattner 1039331de23705a719514e37c211f327379688f81b0dChris Lattner bool setLocation(Option &O, DataType &L) { 1040331de23705a719514e37c211f327379688f81b0dChris Lattner if (Location) 1041e6864c1d355c4ec1156b956c1dd548682ad3e6b1Benjamin Kramer return O.error("cl::location(x) specified more than once!"); 1042331de23705a719514e37c211f327379688f81b0dChris Lattner Location = &L; 1043ce96902d88d473697f05c0465952dae374be564eAndrew Trick Default = L; 1044331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 1045cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 1046cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1047331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 1048ce96902d88d473697f05c0465952dae374be564eAndrew Trick void setValue(const T &V, bool initial = false) { 1049331de23705a719514e37c211f327379688f81b0dChris Lattner check(); 1050331de23705a719514e37c211f327379688f81b0dChris Lattner *Location = V; 1051ce96902d88d473697f05c0465952dae374be564eAndrew Trick if (initial) 1052ce96902d88d473697f05c0465952dae374be564eAndrew Trick Default = V; 105371fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner } 105471fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner 1055331de23705a719514e37c211f327379688f81b0dChris Lattner DataType &getValue() { check(); return *Location; } 1056331de23705a719514e37c211f327379688f81b0dChris Lattner const DataType &getValue() const { check(); return *Location; } 10571e67278dd53de90b0ea9d39c345383d5a9f2bf86Mikhail Glushenkov 10589ed0d92e9460ce4f3bbb72734a09c0d6fc9a5c97Douglas Gregor operator DataType() const { return this->getValue(); } 1059331de23705a719514e37c211f327379688f81b0dChris Lattner 1060ce96902d88d473697f05c0465952dae374be564eAndrew Trick const OptionValue<DataType> &getDefault() const { return Default; } 1061ce96902d88d473697f05c0465952dae374be564eAndrew Trick}; 1062331de23705a719514e37c211f327379688f81b0dChris Lattner 1063331de23705a719514e37c211f327379688f81b0dChris Lattner// Define how to hold a class type object, such as a string. Since we can 1064331de23705a719514e37c211f327379688f81b0dChris Lattner// inherit from a class, we do so. This makes us exactly compatible with the 1065331de23705a719514e37c211f327379688f81b0dChris Lattner// object in all cases that it is used. 1066331de23705a719514e37c211f327379688f81b0dChris Lattner// 1067331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 10681fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass opt_storage<DataType,false,true> : public DataType { 10691fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 1070ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue<DataType> Default; 1071ce96902d88d473697f05c0465952dae374be564eAndrew Trick 1072331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 1073ce96902d88d473697f05c0465952dae374be564eAndrew Trick void setValue(const T &V, bool initial = false) { 1074ce96902d88d473697f05c0465952dae374be564eAndrew Trick DataType::operator=(V); 1075ce96902d88d473697f05c0465952dae374be564eAndrew Trick if (initial) 1076ce96902d88d473697f05c0465952dae374be564eAndrew Trick Default = V; 1077ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 1078331de23705a719514e37c211f327379688f81b0dChris Lattner 1079331de23705a719514e37c211f327379688f81b0dChris Lattner DataType &getValue() { return *this; } 1080331de23705a719514e37c211f327379688f81b0dChris Lattner const DataType &getValue() const { return *this; } 1081ce96902d88d473697f05c0465952dae374be564eAndrew Trick 1082ce96902d88d473697f05c0465952dae374be564eAndrew Trick const OptionValue<DataType> &getDefault() const { return Default; } 1083331de23705a719514e37c211f327379688f81b0dChris Lattner}; 1084331de23705a719514e37c211f327379688f81b0dChris Lattner 1085331de23705a719514e37c211f327379688f81b0dChris Lattner// Define a partial specialization to handle things we cannot inherit from. In 1086331de23705a719514e37c211f327379688f81b0dChris Lattner// this case, we store an instance through containment, and overload operators 1087331de23705a719514e37c211f327379688f81b0dChris Lattner// to get at the value. 1088331de23705a719514e37c211f327379688f81b0dChris Lattner// 1089331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 10901fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass opt_storage<DataType, false, false> { 10911fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 1092331de23705a719514e37c211f327379688f81b0dChris Lattner DataType Value; 1093ce96902d88d473697f05c0465952dae374be564eAndrew Trick OptionValue<DataType> Default; 1094331de23705a719514e37c211f327379688f81b0dChris Lattner 1095331de23705a719514e37c211f327379688f81b0dChris Lattner // Make sure we initialize the value with the default constructor for the 1096331de23705a719514e37c211f327379688f81b0dChris Lattner // type. 1097331de23705a719514e37c211f327379688f81b0dChris Lattner opt_storage() : Value(DataType()) {} 1098331de23705a719514e37c211f327379688f81b0dChris Lattner 1099331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 1100ce96902d88d473697f05c0465952dae374be564eAndrew Trick void setValue(const T &V, bool initial = false) { 1101ce96902d88d473697f05c0465952dae374be564eAndrew Trick Value = V; 1102ce96902d88d473697f05c0465952dae374be564eAndrew Trick if (initial) 1103ce96902d88d473697f05c0465952dae374be564eAndrew Trick Default = V; 1104ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 1105331de23705a719514e37c211f327379688f81b0dChris Lattner DataType &getValue() { return Value; } 1106331de23705a719514e37c211f327379688f81b0dChris Lattner DataType getValue() const { return Value; } 11076a4dd24a995072c9c6f1ae45f19f94010d8389fbChris Lattner 1108ce96902d88d473697f05c0465952dae374be564eAndrew Trick const OptionValue<DataType> &getDefault() const { return Default; } 1109ce96902d88d473697f05c0465952dae374be564eAndrew Trick 11109ed0d92e9460ce4f3bbb72734a09c0d6fc9a5c97Douglas Gregor operator DataType() const { return getValue(); } 11119ed0d92e9460ce4f3bbb72734a09c0d6fc9a5c97Douglas Gregor 11126a4dd24a995072c9c6f1ae45f19f94010d8389fbChris Lattner // If the datatype is a pointer, support -> on it. 11136a4dd24a995072c9c6f1ae45f19f94010d8389fbChris Lattner DataType operator->() const { return Value; } 1114cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 1115cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1116cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1117cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 1118331de23705a719514e37c211f327379688f81b0dChris Lattner// opt - A scalar command line option. 1119cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 1120331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate <class DataType, bool ExternalStorage = false, 1121331de23705a719514e37c211f327379688f81b0dChris Lattner class ParserClass = parser<DataType> > 112263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukmanclass opt : public Option, 1123331de23705a719514e37c211f327379688f81b0dChris Lattner public opt_storage<DataType, ExternalStorage, 11247b3d73b7ecbecf423c3766e596b6086767444363Chris Lattner is_class<DataType>::value> { 1125331de23705a719514e37c211f327379688f81b0dChris Lattner ParserClass Parser; 1126331de23705a719514e37c211f327379688f81b0dChris Lattner 112799c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner virtual bool handleOccurrence(unsigned pos, StringRef ArgName, 1128a460beb5cdc1cf05da3b22a39fd2b3107ea2e2feChris Lattner StringRef Arg) { 11299eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen typename ParserClass::parser_data_type Val = 1130e6ad5ea996673f76b62e495d268c8bf7c9b0d205Chris Lattner typename ParserClass::parser_data_type(); 1131d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner if (Parser.parse(*this, ArgName, Arg, Val)) 1132d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return true; // Parse error! 113348fe63526e35ddaee7e98879596a569911f41319Sebastian Redl this->setValue(Val); 113448fe63526e35ddaee7e98879596a569911f41319Sebastian Redl this->setPosition(pos); 1135d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return false; 1136331de23705a719514e37c211f327379688f81b0dChris Lattner } 1137331de23705a719514e37c211f327379688f81b0dChris Lattner 1138cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner virtual enum ValueExpected getValueExpectedFlagDefault() const { 1139331de23705a719514e37c211f327379688f81b0dChris Lattner return Parser.getValueExpectedFlagDefault(); 1140cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 11411908aea3a64fa89a907317849cbff73789cdb89aChris Lattner virtual void getExtraOptionNames(SmallVectorImpl<const char*> &OptionNames) { 11429878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner return Parser.getExtraOptionNames(OptionNames); 11439878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner } 1144cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1145331de23705a719514e37c211f327379688f81b0dChris Lattner // Forward printing stuff to the parser... 114634cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const {return Parser.getOptionWidth(*this);} 114734cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const { 1148331de23705a719514e37c211f327379688f81b0dChris Lattner Parser.printOptionInfo(*this, GlobalWidth); 1149331de23705a719514e37c211f327379688f81b0dChris Lattner } 1150cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1151ce96902d88d473697f05c0465952dae374be564eAndrew Trick virtual void printOptionValue(size_t GlobalWidth, bool Force) const { 1152ce96902d88d473697f05c0465952dae374be564eAndrew Trick if (Force || this->getDefault().compare(this->getValue())) { 1153ce96902d88d473697f05c0465952dae374be564eAndrew Trick cl::printOptionDiff<ParserClass>( 1154ce96902d88d473697f05c0465952dae374be564eAndrew Trick *this, Parser, this->getValue(), this->getDefault(), GlobalWidth); 1155ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 1156ce96902d88d473697f05c0465952dae374be564eAndrew Trick } 1157ce96902d88d473697f05c0465952dae374be564eAndrew Trick 1158331de23705a719514e37c211f327379688f81b0dChris Lattner void done() { 11599878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner addArgument(); 1160331de23705a719514e37c211f327379688f81b0dChris Lattner Parser.initialize(*this); 1161331de23705a719514e37c211f327379688f81b0dChris Lattner } 1162331de23705a719514e37c211f327379688f81b0dChris Lattnerpublic: 1163331de23705a719514e37c211f327379688f81b0dChris Lattner // setInitialValue - Used by the cl::init modifier... 1164ce96902d88d473697f05c0465952dae374be564eAndrew Trick void setInitialValue(const DataType &V) { this->setValue(V, true); } 1165331de23705a719514e37c211f327379688f81b0dChris Lattner 1166331de23705a719514e37c211f327379688f81b0dChris Lattner ParserClass &getParser() { return Parser; } 1167331de23705a719514e37c211f327379688f81b0dChris Lattner 1168331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 116931a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner DataType &operator=(const T &Val) { 117031a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner this->setValue(Val); 117131a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner return this->getValue(); 117231a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner } 1173331de23705a719514e37c211f327379688f81b0dChris Lattner 1174331de23705a719514e37c211f327379688f81b0dChris Lattner // One option... 1175331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t> 1176c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie explicit opt(const M0t &M0) : Option(Optional, NotHidden) { 1177331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); 1178331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1179331de23705a719514e37c211f327379688f81b0dChris Lattner } 1180331de23705a719514e37c211f327379688f81b0dChris Lattner 1181331de23705a719514e37c211f327379688f81b0dChris Lattner // Two options... 1182331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t> 1183c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie opt(const M0t &M0, const M1t &M1) : Option(Optional, NotHidden) { 1184331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); 1185331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1186331de23705a719514e37c211f327379688f81b0dChris Lattner } 1187331de23705a719514e37c211f327379688f81b0dChris Lattner 1188331de23705a719514e37c211f327379688f81b0dChris Lattner // Three options... 1189331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t> 1190f6143ef556ed01311d2043d38421302479f7866cChris Lattner opt(const M0t &M0, const M1t &M1, 1191c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M2t &M2) : Option(Optional, NotHidden) { 1192331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); 1193331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1194331de23705a719514e37c211f327379688f81b0dChris Lattner } 1195331de23705a719514e37c211f327379688f81b0dChris Lattner // Four options... 1196331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t> 11976e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, 1198c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M3t &M3) : Option(Optional, NotHidden) { 1199331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1200331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1201331de23705a719514e37c211f327379688f81b0dChris Lattner } 1202331de23705a719514e37c211f327379688f81b0dChris Lattner // Five options... 1203331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, class M4t> 1204331de23705a719514e37c211f327379688f81b0dChris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1205c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M4t &M4) : Option(Optional, NotHidden) { 1206331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1207331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); 1208331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1209331de23705a719514e37c211f327379688f81b0dChris Lattner } 1210331de23705a719514e37c211f327379688f81b0dChris Lattner // Six options... 1211331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 1212331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t> 1213331de23705a719514e37c211f327379688f81b0dChris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1214c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M4t &M4, const M5t &M5) : Option(Optional, NotHidden) { 1215331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1216331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); 1217331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1218331de23705a719514e37c211f327379688f81b0dChris Lattner } 1219331de23705a719514e37c211f327379688f81b0dChris Lattner // Seven options... 1220331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 1221331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t, class M6t> 1222331de23705a719514e37c211f327379688f81b0dChris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1223f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4, const M5t &M5, 1224c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M6t &M6) : Option(Optional, NotHidden) { 1225331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1226331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); apply(M6, this); 1227331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1228331de23705a719514e37c211f327379688f81b0dChris Lattner } 1229331de23705a719514e37c211f327379688f81b0dChris Lattner // Eight options... 1230331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 1231331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t, class M6t, class M7t> 1232331de23705a719514e37c211f327379688f81b0dChris Lattner opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 12336e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner const M4t &M4, const M5t &M5, const M6t &M6, 1234c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M7t &M7) : Option(Optional, NotHidden) { 1235331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1236331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this); 1237331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1238331de23705a719514e37c211f327379688f81b0dChris Lattner } 1239cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 1240cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 12417422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<unsigned>); 12427422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<int>); 12437422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<std::string>); 1244b587f9662a7b6f00f9ce48ddf2dea1a4fb18a6dbBill WendlingEXTERN_TEMPLATE_INSTANTIATION(class opt<char>); 12457422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<bool>); 12467422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner 1247331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 1248331de23705a719514e37c211f327379688f81b0dChris Lattner// list_storage class 1249331de23705a719514e37c211f327379688f81b0dChris Lattner 1250331de23705a719514e37c211f327379688f81b0dChris Lattner// Default storage class definition: external storage. This implementation 1251331de23705a719514e37c211f327379688f81b0dChris Lattner// assumes the user will specify a variable to store the data into with the 1252331de23705a719514e37c211f327379688f81b0dChris Lattner// cl::location(x) modifier. 1253331de23705a719514e37c211f327379688f81b0dChris Lattner// 1254331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType, class StorageClass> 1255331de23705a719514e37c211f327379688f81b0dChris Lattnerclass list_storage { 1256331de23705a719514e37c211f327379688f81b0dChris Lattner StorageClass *Location; // Where to store the object... 125771fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner 1258cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 1259331de23705a719514e37c211f327379688f81b0dChris Lattner list_storage() : Location(0) {} 1260331de23705a719514e37c211f327379688f81b0dChris Lattner 1261331de23705a719514e37c211f327379688f81b0dChris Lattner bool setLocation(Option &O, StorageClass &L) { 1262331de23705a719514e37c211f327379688f81b0dChris Lattner if (Location) 1263e6864c1d355c4ec1156b956c1dd548682ad3e6b1Benjamin Kramer return O.error("cl::location(x) specified more than once!"); 1264331de23705a719514e37c211f327379688f81b0dChris Lattner Location = &L; 1265331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 126671fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner } 1267331de23705a719514e37c211f327379688f81b0dChris Lattner 1268331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 1269331de23705a719514e37c211f327379688f81b0dChris Lattner void addValue(const T &V) { 1270331de23705a719514e37c211f327379688f81b0dChris Lattner assert(Location != 0 && "cl::location(...) not specified for a command " 1271331de23705a719514e37c211f327379688f81b0dChris Lattner "line option with external storage!"); 1272331de23705a719514e37c211f327379688f81b0dChris Lattner Location->push_back(V); 1273cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 1274331de23705a719514e37c211f327379688f81b0dChris Lattner}; 1275331de23705a719514e37c211f327379688f81b0dChris Lattner 1276331de23705a719514e37c211f327379688f81b0dChris Lattner 1277331de23705a719514e37c211f327379688f81b0dChris Lattner// Define how to hold a class type object, such as a string. Since we can 1278331de23705a719514e37c211f327379688f81b0dChris Lattner// inherit from a class, we do so. This makes us exactly compatible with the 1279331de23705a719514e37c211f327379688f81b0dChris Lattner// object in all cases that it is used. 1280331de23705a719514e37c211f327379688f81b0dChris Lattner// 1281331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType> 12821fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass list_storage<DataType, bool> : public std::vector<DataType> { 12831fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 1284331de23705a719514e37c211f327379688f81b0dChris Lattner template<class T> 1285da920fa4f985ce5d7b56652587d3451ca483e3d6Anders Carlsson void addValue(const T &V) { std::vector<DataType>::push_back(V); } 1286cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 1287cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1288cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1289cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===// 1290331de23705a719514e37c211f327379688f81b0dChris Lattner// list - A list of command line options. 1291cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// 1292331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate <class DataType, class Storage = bool, 1293331de23705a719514e37c211f327379688f81b0dChris Lattner class ParserClass = parser<DataType> > 1294331de23705a719514e37c211f327379688f81b0dChris Lattnerclass list : public Option, public list_storage<DataType, Storage> { 12951e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer std::vector<unsigned> Positions; 1296331de23705a719514e37c211f327379688f81b0dChris Lattner ParserClass Parser; 1297331de23705a719514e37c211f327379688f81b0dChris Lattner 1298cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner virtual enum ValueExpected getValueExpectedFlagDefault() const { 1299331de23705a719514e37c211f327379688f81b0dChris Lattner return Parser.getValueExpectedFlagDefault(); 1300cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner } 13011908aea3a64fa89a907317849cbff73789cdb89aChris Lattner virtual void getExtraOptionNames(SmallVectorImpl<const char*> &OptionNames) { 13029878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner return Parser.getExtraOptionNames(OptionNames); 13039878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner } 1304beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 130599c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner virtual bool handleOccurrence(unsigned pos, StringRef ArgName, StringRef Arg){ 13068a207c16d2eb44ebcf94b13b0db047e46b7b0d30Reid Spencer typename ParserClass::parser_data_type Val = 13078a207c16d2eb44ebcf94b13b0db047e46b7b0d30Reid Spencer typename ParserClass::parser_data_type(); 1308d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner if (Parser.parse(*this, ArgName, Arg, Val)) 1309d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return true; // Parse Error! 1310da920fa4f985ce5d7b56652587d3451ca483e3d6Anders Carlsson list_storage<DataType, Storage>::addValue(Val); 13111e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer setPosition(pos); 13121e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer Positions.push_back(pos); 1313d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner return false; 1314331de23705a719514e37c211f327379688f81b0dChris Lattner } 1315cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1316331de23705a719514e37c211f327379688f81b0dChris Lattner // Forward printing stuff to the parser... 131734cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const {return Parser.getOptionWidth(*this);} 131834cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const { 1319331de23705a719514e37c211f327379688f81b0dChris Lattner Parser.printOptionInfo(*this, GlobalWidth); 1320331de23705a719514e37c211f327379688f81b0dChris Lattner } 1321cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1322ce96902d88d473697f05c0465952dae374be564eAndrew Trick // Unimplemented: list options don't currently store their default value. 1323eab631362d676c0113e052cc7e877eef4da544b8Frits van Bommel virtual void printOptionValue(size_t /*GlobalWidth*/, bool /*Force*/) const {} 1324ce96902d88d473697f05c0465952dae374be564eAndrew Trick 1325331de23705a719514e37c211f327379688f81b0dChris Lattner void done() { 13269878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner addArgument(); 1327331de23705a719514e37c211f327379688f81b0dChris Lattner Parser.initialize(*this); 1328331de23705a719514e37c211f327379688f81b0dChris Lattner } 1329cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 1330331de23705a719514e37c211f327379688f81b0dChris Lattner ParserClass &getParser() { return Parser; } 1331331de23705a719514e37c211f327379688f81b0dChris Lattner 133263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman unsigned getPosition(unsigned optnum) const { 13331e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer assert(optnum < this->size() && "Invalid option index"); 133463b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman return Positions[optnum]; 13351e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer } 13361e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer 13377059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov void setNumAdditionalVals(unsigned n) { 13387059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov Option::setNumAdditionalVals(n); 13397059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov } 13407059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov 1341331de23705a719514e37c211f327379688f81b0dChris Lattner // One option... 1342331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t> 1343c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie explicit list(const M0t &M0) : Option(ZeroOrMore, NotHidden) { 1344331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); 1345331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1346331de23705a719514e37c211f327379688f81b0dChris Lattner } 1347331de23705a719514e37c211f327379688f81b0dChris Lattner // Two options... 1348331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t> 1349c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie list(const M0t &M0, const M1t &M1) : Option(ZeroOrMore, NotHidden) { 1350331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); 1351331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1352331de23705a719514e37c211f327379688f81b0dChris Lattner } 1353331de23705a719514e37c211f327379688f81b0dChris Lattner // Three options... 1354331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t> 1355f6143ef556ed01311d2043d38421302479f7866cChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2) 1356c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie : Option(ZeroOrMore, NotHidden) { 1357331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); 1358331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1359331de23705a719514e37c211f327379688f81b0dChris Lattner } 1360331de23705a719514e37c211f327379688f81b0dChris Lattner // Four options... 1361331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t> 13626e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) 1363c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie : Option(ZeroOrMore, NotHidden) { 1364331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1365331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1366331de23705a719514e37c211f327379688f81b0dChris Lattner } 1367331de23705a719514e37c211f327379688f81b0dChris Lattner // Five options... 1368331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, class M4t> 1369331de23705a719514e37c211f327379688f81b0dChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1370c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M4t &M4) : Option(ZeroOrMore, NotHidden) { 1371331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1372331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); 1373331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1374331de23705a719514e37c211f327379688f81b0dChris Lattner } 1375331de23705a719514e37c211f327379688f81b0dChris Lattner // Six options... 1376331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 1377331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t> 1378331de23705a719514e37c211f327379688f81b0dChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1379c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M4t &M4, const M5t &M5) : Option(ZeroOrMore, NotHidden) { 1380331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1381331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); 1382331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1383331de23705a719514e37c211f327379688f81b0dChris Lattner } 1384331de23705a719514e37c211f327379688f81b0dChris Lattner // Seven options... 1385331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 1386331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t, class M6t> 1387331de23705a719514e37c211f327379688f81b0dChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1388f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4, const M5t &M5, const M6t &M6) 1389c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie : Option(ZeroOrMore, NotHidden) { 1390331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1391331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); apply(M6, this); 1392331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1393331de23705a719514e37c211f327379688f81b0dChris Lattner } 1394331de23705a719514e37c211f327379688f81b0dChris Lattner // Eight options... 1395331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t, 1396331de23705a719514e37c211f327379688f81b0dChris Lattner class M4t, class M5t, class M6t, class M7t> 1397331de23705a719514e37c211f327379688f81b0dChris Lattner list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 13986e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner const M4t &M4, const M5t &M5, const M6t &M6, 1399c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M7t &M7) : Option(ZeroOrMore, NotHidden) { 1400331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1401331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this); 1402331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1403331de23705a719514e37c211f327379688f81b0dChris Lattner } 1404cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 1405cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 140671c767b4e30ad9fb3286664528cb2d6abccf2676Mikhail Glushenkov// multi_val - Modifier to set the number of additional values. 14077059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkovstruct multi_val { 14087059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov unsigned AdditionalVals; 14097059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov explicit multi_val(unsigned N) : AdditionalVals(N) {} 14107059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov 14117059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov template <typename D, typename S, typename P> 14127059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov void apply(list<D, S, P> &L) const { L.setNumAdditionalVals(AdditionalVals); } 14137059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov}; 14147059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov 14157059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov 1416331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 1417eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// bits_storage class 1418eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1419eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// Default storage class definition: external storage. This implementation 1420eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// assumes the user will specify a variable to store the data into with the 1421eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// cl::location(x) modifier. 1422eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// 1423eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeytemplate<class DataType, class StorageClass> 1424eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeyclass bits_storage { 1425a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey unsigned *Location; // Where to store the bits... 1426beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1427eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1428eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey static unsigned Bit(const T &V) { 14293e41da29fb74a4f2a43a1539b612b2fb11bef375Reid Spencer unsigned BitPos = reinterpret_cast<unsigned>(V); 1430de551f91d8816632a76a065084caab9fab6aacffDan Gohman assert(BitPos < sizeof(unsigned) * CHAR_BIT && 1431eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey "enum exceeds width of bit vector!"); 1432eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return 1 << BitPos; 1433eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1434eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1435eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeypublic: 1436eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits_storage() : Location(0) {} 1437eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1438a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey bool setLocation(Option &O, unsigned &L) { 1439eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey if (Location) 1440e6864c1d355c4ec1156b956c1dd548682ad3e6b1Benjamin Kramer return O.error("cl::location(x) specified more than once!"); 1441eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Location = &L; 1442eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return false; 1443eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1444eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1445eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1446eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey void addValue(const T &V) { 1447eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey assert(Location != 0 && "cl::location(...) not specified for a command " 1448eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey "line option with external storage!"); 1449eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey *Location |= Bit(V); 1450eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1451beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1452a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey unsigned getBits() { return *Location; } 1453beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1454eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1455eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bool isSet(const T &V) { 1456eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return (*Location & Bit(V)) != 0; 1457eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1458eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey}; 1459eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1460eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1461beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov// Define how to hold bits. Since we can inherit from a class, we do so. 1462eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// This makes us exactly compatible with the bits in all cases that it is used. 1463eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// 1464eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeytemplate<class DataType> 1465eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeyclass bits_storage<DataType, bool> { 1466a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey unsigned Bits; // Where to store the bits... 1467beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1468eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1469eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey static unsigned Bit(const T &V) { 147047afe4e806eb16dd3d90670adf3ea5f9bca72132Chris Lattner unsigned BitPos = (unsigned)V; 1471de551f91d8816632a76a065084caab9fab6aacffDan Gohman assert(BitPos < sizeof(unsigned) * CHAR_BIT && 1472eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey "enum exceeds width of bit vector!"); 1473eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return 1 << BitPos; 1474eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1475beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1476eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeypublic: 1477eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1478eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey void addValue(const T &V) { 1479eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Bits |= Bit(V); 1480eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1481beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1482a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey unsigned getBits() { return Bits; } 1483beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 1484eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class T> 1485eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bool isSet(const T &V) { 1486eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return (Bits & Bit(V)) != 0; 1487eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1488eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey}; 1489eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1490eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1491eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey//===----------------------------------------------------------------------===// 1492eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// bits - A bit vector of command options. 1493eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// 1494eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeytemplate <class DataType, class Storage = bool, 1495eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey class ParserClass = parser<DataType> > 1496eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeyclass bits : public Option, public bits_storage<DataType, Storage> { 1497eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey std::vector<unsigned> Positions; 1498eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey ParserClass Parser; 1499eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1500eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey virtual enum ValueExpected getValueExpectedFlagDefault() const { 1501eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return Parser.getValueExpectedFlagDefault(); 1502eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 15031908aea3a64fa89a907317849cbff73789cdb89aChris Lattner virtual void getExtraOptionNames(SmallVectorImpl<const char*> &OptionNames) { 15049878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner return Parser.getExtraOptionNames(OptionNames); 15059878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner } 1506beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov 150799c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner virtual bool handleOccurrence(unsigned pos, StringRef ArgName, StringRef Arg){ 1508eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey typename ParserClass::parser_data_type Val = 1509eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey typename ParserClass::parser_data_type(); 1510eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey if (Parser.parse(*this, ArgName, Arg, Val)) 1511eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return true; // Parse Error! 1512eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey addValue(Val); 1513eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey setPosition(pos); 1514eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Positions.push_back(pos); 1515eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return false; 1516eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1517eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1518eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Forward printing stuff to the parser... 151934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const {return Parser.getOptionWidth(*this);} 152034cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const { 1521eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Parser.printOptionInfo(*this, GlobalWidth); 1522eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1523eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1524ce96902d88d473697f05c0465952dae374be564eAndrew Trick // Unimplemented: bits options don't currently store their default values. 1525eab631362d676c0113e052cc7e877eef4da544b8Frits van Bommel virtual void printOptionValue(size_t /*GlobalWidth*/, bool /*Force*/) const {} 1526ce96902d88d473697f05c0465952dae374be564eAndrew Trick 1527eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey void done() { 15289878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner addArgument(); 1529eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey Parser.initialize(*this); 1530eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1531eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeypublic: 1532eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey ParserClass &getParser() { return Parser; } 1533eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1534eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey unsigned getPosition(unsigned optnum) const { 1535eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey assert(optnum < this->size() && "Invalid option index"); 1536eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey return Positions[optnum]; 1537eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1538eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1539eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // One option... 1540eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t> 1541c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie explicit bits(const M0t &M0) : Option(ZeroOrMore, NotHidden) { 1542eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); 1543eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1544eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1545eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Two options... 1546eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t> 1547c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie bits(const M0t &M0, const M1t &M1) : Option(ZeroOrMore, NotHidden) { 1548eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); 1549eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1550eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1551eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Three options... 1552eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t> 1553f6143ef556ed01311d2043d38421302479f7866cChris Lattner bits(const M0t &M0, const M1t &M1, const M2t &M2) 1554c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie : Option(ZeroOrMore, NotHidden) { 1555eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); 1556eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1557eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1558eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Four options... 1559eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t> 1560f6143ef556ed01311d2043d38421302479f7866cChris Lattner bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) 1561c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie : Option(ZeroOrMore, NotHidden) { 1562eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1563eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1564eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1565eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Five options... 1566eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t, class M4t> 1567eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1568c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M4t &M4) : Option(ZeroOrMore, NotHidden) { 1569eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1570eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M4, this); 1571eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1572eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1573eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Six options... 1574eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t, 1575eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey class M4t, class M5t> 1576eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1577c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M4t &M4, const M5t &M5) : Option(ZeroOrMore, NotHidden) { 1578eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1579eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M4, this); apply(M5, this); 1580eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1581eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1582eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Seven options... 1583eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t, 1584eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey class M4t, class M5t, class M6t> 1585eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 1586f6143ef556ed01311d2043d38421302479f7866cChris Lattner const M4t &M4, const M5t &M5, const M6t &M6) 1587c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie : Option(ZeroOrMore, NotHidden) { 1588eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1589eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M4, this); apply(M5, this); apply(M6, this); 1590eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1591eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1592eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey // Eight options... 1593eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey template<class M0t, class M1t, class M2t, class M3t, 1594eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey class M4t, class M5t, class M6t, class M7t> 1595eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, 15966e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner const M4t &M4, const M5t &M5, const M6t &M6, 1597c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie const M7t &M7) : Option(ZeroOrMore, NotHidden) { 1598eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1599eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this); 1600eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey done(); 1601eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey } 1602eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey}; 1603eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey 1604eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey//===----------------------------------------------------------------------===// 1605331de23705a719514e37c211f327379688f81b0dChris Lattner// Aliased command line option (alias this name to a preexisting name) 1606331de23705a719514e37c211f327379688f81b0dChris Lattner// 1607331de23705a719514e37c211f327379688f81b0dChris Lattner 1608331de23705a719514e37c211f327379688f81b0dChris Lattnerclass alias : public Option { 1609331de23705a719514e37c211f327379688f81b0dChris Lattner Option *AliasFor; 161099c5c7b7df4fe44d54cd680e7878c44789e6e057Chris Lattner virtual bool handleOccurrence(unsigned pos, StringRef /*ArgName*/, 1611a460beb5cdc1cf05da3b22a39fd2b3107ea2e2feChris Lattner StringRef Arg) { 16121e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer return AliasFor->handleOccurrence(pos, AliasFor->ArgStr, Arg); 1613331de23705a719514e37c211f327379688f81b0dChris Lattner } 1614331de23705a719514e37c211f327379688f81b0dChris Lattner // Handle printing stuff... 161534cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual size_t getOptionWidth() const; 161634cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng virtual void printOptionInfo(size_t GlobalWidth) const; 1617331de23705a719514e37c211f327379688f81b0dChris Lattner 1618ce96902d88d473697f05c0465952dae374be564eAndrew Trick // Aliases do not need to print their values. 1619eab631362d676c0113e052cc7e877eef4da544b8Frits van Bommel virtual void printOptionValue(size_t /*GlobalWidth*/, bool /*Force*/) const {} 1620ce96902d88d473697f05c0465952dae374be564eAndrew Trick 1621331de23705a719514e37c211f327379688f81b0dChris Lattner void done() { 1622331de23705a719514e37c211f327379688f81b0dChris Lattner if (!hasArgStr()) 1623e6864c1d355c4ec1156b956c1dd548682ad3e6b1Benjamin Kramer error("cl::alias must have argument name specified!"); 1624331de23705a719514e37c211f327379688f81b0dChris Lattner if (AliasFor == 0) 1625e6864c1d355c4ec1156b956c1dd548682ad3e6b1Benjamin Kramer error("cl::alias must have an cl::aliasopt(option) specified!"); 16269878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner addArgument(); 1627331de23705a719514e37c211f327379688f81b0dChris Lattner } 1628cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic: 1629331de23705a719514e37c211f327379688f81b0dChris Lattner void setAliasFor(Option &O) { 1630331de23705a719514e37c211f327379688f81b0dChris Lattner if (AliasFor) 1631e6864c1d355c4ec1156b956c1dd548682ad3e6b1Benjamin Kramer error("cl::alias must only have one cl::aliasopt(...) specified!"); 1632331de23705a719514e37c211f327379688f81b0dChris Lattner AliasFor = &O; 1633331de23705a719514e37c211f327379688f81b0dChris Lattner } 1634331de23705a719514e37c211f327379688f81b0dChris Lattner 1635331de23705a719514e37c211f327379688f81b0dChris Lattner // One option... 1636331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t> 1637c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie explicit alias(const M0t &M0) : Option(Optional, Hidden), AliasFor(0) { 1638331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); 1639331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1640331de23705a719514e37c211f327379688f81b0dChris Lattner } 1641331de23705a719514e37c211f327379688f81b0dChris Lattner // Two options... 1642331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t> 1643c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie alias(const M0t &M0, const M1t &M1) : Option(Optional, Hidden), AliasFor(0) { 1644331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); 1645331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1646331de23705a719514e37c211f327379688f81b0dChris Lattner } 1647331de23705a719514e37c211f327379688f81b0dChris Lattner // Three options... 1648331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t> 16496e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner alias(const M0t &M0, const M1t &M1, const M2t &M2) 1650c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie : Option(Optional, Hidden), AliasFor(0) { 1651331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); 1652331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1653331de23705a719514e37c211f327379688f81b0dChris Lattner } 1654331de23705a719514e37c211f327379688f81b0dChris Lattner // Four options... 1655331de23705a719514e37c211f327379688f81b0dChris Lattner template<class M0t, class M1t, class M2t, class M3t> 1656331de23705a719514e37c211f327379688f81b0dChris Lattner alias(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) 1657c1bddefc56cd1db30326d6464f50db3dae6061ebDavid Blaikie : Option(Optional, Hidden), AliasFor(0) { 1658331de23705a719514e37c211f327379688f81b0dChris Lattner apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); 1659331de23705a719514e37c211f327379688f81b0dChris Lattner done(); 1660331de23705a719514e37c211f327379688f81b0dChris Lattner } 1661331de23705a719514e37c211f327379688f81b0dChris Lattner}; 1662331de23705a719514e37c211f327379688f81b0dChris Lattner 1663331de23705a719514e37c211f327379688f81b0dChris Lattner// aliasfor - Modifier to set the option an alias aliases. 1664331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct aliasopt { 1665331de23705a719514e37c211f327379688f81b0dChris Lattner Option &Opt; 1666cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman explicit aliasopt(Option &O) : Opt(O) {} 1667331de23705a719514e37c211f327379688f81b0dChris Lattner void apply(alias &A) const { A.setAliasFor(Opt); } 1668cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}; 1669cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 16709bbba091396922093687d11a181e5886c42c5dfdReid Spencer// extrahelp - provide additional help at the end of the normal help 16719bbba091396922093687d11a181e5886c42c5dfdReid Spencer// output. All occurrences of cl::extrahelp will be accumulated and 1672275872e79950dafc6699f6502cee52f74b84a22aDaniel Dunbar// printed to stderr at the end of the regular help, just before 16739bbba091396922093687d11a181e5886c42c5dfdReid Spencer// exit is called. 16749bbba091396922093687d11a181e5886c42c5dfdReid Spencerstruct extrahelp { 16759bbba091396922093687d11a181e5886c42c5dfdReid Spencer const char * morehelp; 1676b5660dc8223bd5eb3d21d9855692617fcdec5663Dan Gohman explicit extrahelp(const char* help); 16779bbba091396922093687d11a181e5886c42c5dfdReid Spencer}; 16789bbba091396922093687d11a181e5886c42c5dfdReid Spencer 1679aed293dfba04b07a867491c11dfff4bf3eb6bdddDevang Patelvoid PrintVersionMessage(); 16809bbba091396922093687d11a181e5886c42c5dfdReid Spencer// This function just prints the help message, exactly the same way as if the 16817e7ae5ad692760aa8d97477f061a05b10948cf57Duncan Sands// -help option had been given on the command line. 16829bbba091396922093687d11a181e5886c42c5dfdReid Spencer// NOTE: THIS FUNCTION TERMINATES THE PROGRAM! 16839bbba091396922093687d11a181e5886c42c5dfdReid Spencervoid PrintHelpMessage(); 1684cc08ee507fc47d80a67c10a20b95587f7f06f0b7Reid Spencer 1685cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner} // End namespace cl 1686cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner 1687d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End namespace llvm 1688d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 1689cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#endif 1690