X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FCommandLine.cpp;h=2c56e0ffb87eb0fc5e12c06d1f924466a06fd56d;hb=2ec0dbf9616e91952c90ad1c7f7404d9d1ee053c;hp=3297810bce6926cb209546ce689ab53714b4c475;hpb=34283c8303d6ad506557198dce677a1d6610b31f;p=oota-llvm.git diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp index 3297810bce6..2c56e0ffb87 100644 --- a/lib/Support/CommandLine.cpp +++ b/lib/Support/CommandLine.cpp @@ -172,6 +172,9 @@ static Option *LookupOption(const char *&Arg, const char *&Value, static inline bool ProvideOption(Option *Handler, const char *ArgName, const char *Value, int argc, char **argv, int &i) { + // Is this a multi-argument option? + unsigned NumAdditionalVals = Handler->getNumAdditionalVals(); + // Enforce value requirements switch (Handler->getValueExpectedFlag()) { case ValueRequired: @@ -184,6 +187,10 @@ static inline bool ProvideOption(Option *Handler, const char *ArgName, } break; case ValueDisallowed: + if (NumAdditionalVals > 0) + return Handler->error(": multi-valued option specified" + " with ValueDisallowed modifier!"); + if (Value) return Handler->error(" does not allow a value! '" + std::string(Value) + "' specified."); @@ -198,8 +205,35 @@ static inline bool ProvideOption(Option *Handler, const char *ArgName, break; } - // Run the handler now! - return Handler->addOccurrence(i, ArgName, Value ? Value : ""); + // If this isn't a multi-arg option, just run the handler. + if (NumAdditionalVals == 0) { + return Handler->addOccurrence(i, ArgName, Value ? Value : ""); + } + // If it is, run the handle several times. + else { + bool MultiArg = false; + + if (Value) { + if (Handler->addOccurrence(i, ArgName, Value, MultiArg)) + return true; + --NumAdditionalVals; + MultiArg = true; + } + + while (NumAdditionalVals > 0) { + + if (i+1 < argc) { + Value = argv[++i]; + } else { + return Handler->error(": not enough values!"); + } + if (Handler->addOccurrence(i, ArgName, Value, MultiArg)) + return true; + MultiArg = true; + --NumAdditionalVals; + } + return false; + } } static bool ProvidePositionalOption(Option *Handler, const std::string &Arg, @@ -354,23 +388,27 @@ static void ExpandResponseFiles(int argc, char** argv, // Check that the response file is not empty (mmap'ing empty // files can be problematic). const sys::FileStatus *FileStat = respFile.getFileStatus(); - if (!FileStat) - continue; - if (FileStat->getSize() == 0) - continue; + if (FileStat && FileStat->getSize() != 0) { - // Mmap the response file into memory. - OwningPtr - respFilePtr(MemoryBuffer::getFile(respFile.c_str())); + // Mmap the response file into memory. + OwningPtr + respFilePtr(MemoryBuffer::getFile(respFile.c_str())); - if (respFilePtr == 0) - continue; + // If we could open the file, parse its contents, otherwise + // pass the @file option verbatim. - ParseCStringVector(newArgv, respFilePtr->getBufferStart()); - } - else { - newArgv.push_back(strdup(arg)); + // TODO: we should also support recursive loading of response files, + // since this is how gcc behaves. (From their man page: "The file may + // itself contain additional @file options; any such options will be + // processed recursively.") + + if (respFilePtr != 0) { + ParseCStringVector(newArgv, respFilePtr->getBufferStart()); + continue; + } + } } + newArgv.push_back(strdup(arg)); } } @@ -738,8 +776,10 @@ bool Option::error(std::string Message, const char *ArgName) { } bool Option::addOccurrence(unsigned pos, const char *ArgName, - const std::string &Value) { - NumOccurrences++; // Increment the number of times we have been seen + const std::string &Value, + bool MultiArg) { + if (!MultiArg) + NumOccurrences++; // Increment the number of times we have been seen switch (getNumOccurrencesFlag()) { case Optional: @@ -832,6 +872,8 @@ bool parser::parse(Option &O, const char *ArgName, return O.error(": '" + Arg + "' is invalid value for boolean argument! Try 0 or 1"); } + if (IsInvertable && strncmp(ArgName+1, "no-", 3) == 0) + Value = !Value; return false; } @@ -842,7 +884,8 @@ bool parser::parse(Option &O, const char *ArgName, if (Arg == "" || Arg == "true" || Arg == "TRUE" || Arg == "True" || Arg == "1") { Value = BOU_TRUE; - } else if (Arg == "false" || Arg == "FALSE" || Arg == "False" || Arg == "0") { + } else if (Arg == "false" || Arg == "FALSE" + || Arg == "False" || Arg == "0") { Value = BOU_FALSE; } else { return O.error(": '" + Arg + @@ -1095,6 +1138,7 @@ public: cout << " with assertions"; #endif cout << ".\n"; + cout << " Built " << __DATE__ << "(" << __TIME__ << ").\n"; } void operator=(bool OptionWasSpecified) { if (OptionWasSpecified) {