diff options
author | rdivacky <rdivacky@FreeBSD.org> | 2009-12-01 11:07:05 +0000 |
---|---|---|
committer | rdivacky <rdivacky@FreeBSD.org> | 2009-12-01 11:07:05 +0000 |
commit | e7908924d847e63b02bc82bfaa1709ab9c774dcd (patch) | |
tree | ffe0478472eaa0686f11cb02c6df7d257b8719b0 /lib/Support | |
parent | bf68f1ea49e39c4194f339ddd4421b0c3a31988b (diff) | |
download | FreeBSD-src-e7908924d847e63b02bc82bfaa1709ab9c774dcd.zip FreeBSD-src-e7908924d847e63b02bc82bfaa1709ab9c774dcd.tar.gz |
Update LLVM to r90226.
Diffstat (limited to 'lib/Support')
-rw-r--r-- | lib/Support/CommandLine.cpp | 108 | ||||
-rw-r--r-- | lib/Support/SourceMgr.cpp | 35 | ||||
-rw-r--r-- | lib/Support/StringRef.cpp | 10 | ||||
-rw-r--r-- | lib/Support/Triple.cpp | 5 |
4 files changed, 88 insertions, 70 deletions
diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp index 59340d4..9cf9c89 100644 --- a/lib/Support/CommandLine.cpp +++ b/lib/Support/CommandLine.cpp @@ -39,6 +39,7 @@ using namespace cl; //===----------------------------------------------------------------------===// // Template instantiations and anchors. // +namespace llvm { namespace cl { TEMPLATE_INSTANTIATION(class basic_parser<bool>); TEMPLATE_INSTANTIATION(class basic_parser<boolOrDefault>); TEMPLATE_INSTANTIATION(class basic_parser<int>); @@ -53,6 +54,7 @@ TEMPLATE_INSTANTIATION(class opt<int>); TEMPLATE_INSTANTIATION(class opt<std::string>); TEMPLATE_INSTANTIATION(class opt<char>); TEMPLATE_INSTANTIATION(class opt<bool>); +} } // end namespace llvm::cl void Option::anchor() {} void basic_parser_impl::anchor() {} @@ -156,9 +158,9 @@ static Option *LookupOption(StringRef &Arg, StringRef &Value, const StringMap<Option*> &OptionsMap) { // Reject all dashes. if (Arg.empty()) return 0; - + size_t EqualPos = Arg.find('='); - + // If we have an equals sign, remember the value. if (EqualPos == StringRef::npos) { // Look up the option. @@ -171,13 +173,43 @@ static Option *LookupOption(StringRef &Arg, StringRef &Value, StringMap<Option*>::const_iterator I = OptionsMap.find(Arg.substr(0, EqualPos)); if (I == OptionsMap.end()) return 0; - + Value = Arg.substr(EqualPos+1); Arg = Arg.substr(0, EqualPos); return I->second; } +/// CommaSeparateAndAddOccurence - A wrapper around Handler->addOccurence() that +/// does special handling of cl::CommaSeparated options. +static bool CommaSeparateAndAddOccurence(Option *Handler, unsigned pos, + StringRef ArgName, + StringRef Value, bool MultiArg = false) +{ + // Check to see if this option accepts a comma separated list of values. If + // it does, we have to split up the value into multiple values. + if (Handler->getMiscFlags() & CommaSeparated) { + StringRef Val(Value); + StringRef::size_type Pos = Val.find(','); + + while (Pos != StringRef::npos) { + // Process the portion before the comma. + if (Handler->addOccurrence(pos, ArgName, Val.substr(0, Pos), MultiArg)) + return true; + // Erase the portion before the comma, AND the comma. + Val = Val.substr(Pos+1); + Value.substr(Pos+1); // Increment the original value pointer as well. + // Check for another comma. + Pos = Val.find(','); + } + Value = Val; + } + + if (Handler->addOccurrence(pos, ArgName, Value, MultiArg)) + return true; + + return false; +} /// ProvideOption - For Value, this differentiates between an empty value ("") /// and a null value (StringRef()). The later is accepted for arguments that @@ -209,7 +241,7 @@ static inline bool ProvideOption(Option *Handler, StringRef ArgName, break; case ValueOptional: break; - + default: errs() << ProgramName << ": Bad ValueMask flag! CommandLine usage error:" @@ -219,13 +251,13 @@ static inline bool ProvideOption(Option *Handler, StringRef ArgName, // If this isn't a multi-arg option, just run the handler. if (NumAdditionalVals == 0) - return Handler->addOccurrence(i, ArgName, Value); + return CommaSeparateAndAddOccurence(Handler, i, ArgName, Value); // If it is, run the handle several times. bool MultiArg = false; if (Value.data()) { - if (Handler->addOccurrence(i, ArgName, Value, MultiArg)) + if (CommaSeparateAndAddOccurence(Handler, i, ArgName, Value, MultiArg)) return true; --NumAdditionalVals; MultiArg = true; @@ -235,8 +267,8 @@ static inline bool ProvideOption(Option *Handler, StringRef ArgName, if (i+1 >= argc) return Handler->error("not enough values!"); Value = argv[++i]; - - if (Handler->addOccurrence(i, ArgName, Value, MultiArg)) + + if (CommaSeparateAndAddOccurence(Handler, i, ArgName, Value, MultiArg)) return true; MultiArg = true; --NumAdditionalVals; @@ -298,7 +330,7 @@ static Option *HandlePrefixedOrGroupedOption(StringRef &Arg, StringRef &Value, size_t Length = 0; Option *PGOpt = getOptionPred(Arg, Length, isPrefixedOrGrouping, OptionsMap); if (PGOpt == 0) return 0; - + // If the option is a prefixed option, then the value is simply the // rest of the name... so fall through to later processing, by // setting up the argument name flags and value fields. @@ -308,16 +340,16 @@ static Option *HandlePrefixedOrGroupedOption(StringRef &Arg, StringRef &Value, assert(OptionsMap.count(Arg) && OptionsMap.find(Arg)->second == PGOpt); return PGOpt; } - + // This must be a grouped option... handle them now. Grouping options can't // have values. assert(isGrouping(PGOpt) && "Broken getOptionPred!"); - + do { // Move current arg name out of Arg into OneArgName. StringRef OneArgName = Arg.substr(0, Length); Arg = Arg.substr(Length); - + // Because ValueRequired is an invalid flag for grouped arguments, // we don't need to pass argc/argv in. assert(PGOpt->getValueExpectedFlag() != cl::ValueRequired && @@ -325,11 +357,11 @@ static Option *HandlePrefixedOrGroupedOption(StringRef &Arg, StringRef &Value, int Dummy; ErrorParsing |= ProvideOption(PGOpt, OneArgName, StringRef(), 0, 0, Dummy); - + // Get the next grouping option. PGOpt = getOptionPred(Arg, Length, isGrouping, OptionsMap); } while (PGOpt && Length != Arg.size()); - + // Return the last option with Arg cut down to just the last one. return PGOpt; } @@ -366,17 +398,17 @@ static void ParseCStringVector(std::vector<char *> &OutputVector, WorkStr = WorkStr.substr(Pos); continue; } - + // Find position of first delimiter. size_t Pos = WorkStr.find_first_of(Delims); if (Pos == StringRef::npos) Pos = WorkStr.size(); - + // Everything from 0 to Pos is the next word to copy. char *NewStr = (char*)malloc(Pos+1); memcpy(NewStr, WorkStr.data(), Pos); NewStr[Pos] = 0; OutputVector.push_back(NewStr); - + WorkStr = WorkStr.substr(Pos); } } @@ -563,7 +595,7 @@ void cl::ParseCommandLineOptions(int argc, char **argv, ProvidePositionalOption(ActivePositionalArg, argv[i], i); continue; // We are done! } - + if (!PositionalOpts.empty()) { PositionalVals.push_back(std::make_pair(argv[i],i)); @@ -593,7 +625,7 @@ void cl::ParseCommandLineOptions(int argc, char **argv, // Eat leading dashes. while (!ArgName.empty() && ArgName[0] == '-') ArgName = ArgName.substr(1); - + Handler = LookupOption(ArgName, Value, Opts); if (!Handler || Handler->getFormattingFlag() != cl::Positional) { ProvidePositionalOption(ActivePositionalArg, argv[i], i); @@ -605,7 +637,7 @@ void cl::ParseCommandLineOptions(int argc, char **argv, // Eat leading dashes. while (!ArgName.empty() && ArgName[0] == '-') ArgName = ArgName.substr(1); - + Handler = LookupOption(ArgName, Value, Opts); // Check to see if this "option" is really a prefixed or grouped argument. @@ -627,26 +659,6 @@ void cl::ParseCommandLineOptions(int argc, char **argv, continue; } - // Check to see if this option accepts a comma separated list of values. If - // it does, we have to split up the value into multiple values. - if (Handler->getMiscFlags() & CommaSeparated) { - StringRef Val(Value); - StringRef::size_type Pos = Val.find(','); - - while (Pos != StringRef::npos) { - // Process the portion before the comma. - ErrorParsing |= ProvideOption(Handler, ArgName, Val.substr(0, Pos), - argc, argv, i); - // Erase the portion before the comma, AND the comma. - Val = Val.substr(Pos+1); - Value.substr(Pos+1); // Increment the original value pointer as well. - - // Check for another comma. - Pos = Val.find(','); - } - Value = Val; - } - // If this is a named positional argument, just remember that it is the // active one... if (Handler->getFormattingFlag() == cl::Positional) @@ -881,7 +893,7 @@ bool parser<bool>::parse(Option &O, StringRef ArgName, Value = true; return false; } - + if (Arg == "false" || Arg == "FALSE" || Arg == "False" || Arg == "0") { Value = false; return false; @@ -903,7 +915,7 @@ bool parser<boolOrDefault>::parse(Option &O, StringRef ArgName, Value = BOU_FALSE; return false; } - + return O.error("'" + Arg + "' is invalid value for boolean argument! Try 0 or 1"); } @@ -1020,7 +1032,7 @@ void generic_parser_base::printOptionInfo(const Option &O, static int OptNameCompare(const void *LHS, const void *RHS) { typedef std::pair<const char *, Option*> pair_ty; - + return strcmp(((pair_ty*)LHS)->first, ((pair_ty*)RHS)->first); } @@ -1054,11 +1066,11 @@ public: // Ignore really-hidden options. if (I->second->getOptionHiddenFlag() == ReallyHidden) continue; - + // Unless showhidden is set, ignore hidden flags. if (I->second->getOptionHiddenFlag() == Hidden && !ShowHidden) continue; - + // If we've already seen this option, don't add it to the list again. if (!OptionSet.insert(I->second)) continue; @@ -1066,7 +1078,7 @@ public: Opts.push_back(std::pair<const char *, Option*>(I->getKey().data(), I->second)); } - + // Sort the options list alphabetically. qsort(Opts.data(), Opts.size(), sizeof(Opts[0]), OptNameCompare); @@ -1164,7 +1176,7 @@ public: std::vector<std::pair<const char *, const Target*> > Targets; size_t Width = 0; - for (TargetRegistry::iterator it = TargetRegistry::begin(), + for (TargetRegistry::iterator it = TargetRegistry::begin(), ie = TargetRegistry::end(); it != ie; ++it) { Targets.push_back(std::make_pair(it->getName(), &*it)); Width = std::max(Width, strlen(Targets.back().first)); @@ -1183,7 +1195,7 @@ public: } void operator=(bool OptionWasSpecified) { if (!OptionWasSpecified) return; - + if (OverrideVersionPrinter == 0) { print(); exit(1); diff --git a/lib/Support/SourceMgr.cpp b/lib/Support/SourceMgr.cpp index 4b93f7f..7dd42f4 100644 --- a/lib/Support/SourceMgr.cpp +++ b/lib/Support/SourceMgr.cpp @@ -136,7 +136,7 @@ void SourceMgr::PrintIncludeStack(SMLoc IncludeLoc, raw_ostream &OS) const { /// @param Type - If non-null, the kind of message (e.g., "error") which is /// prefixed to the message. SMDiagnostic SourceMgr::GetMessage(SMLoc Loc, const std::string &Msg, - const char *Type) const { + const char *Type, bool ShowLine) const { // First thing to do: find the current buffer containing the specified // location. @@ -144,18 +144,22 @@ SMDiagnostic SourceMgr::GetMessage(SMLoc Loc, const std::string &Msg, assert(CurBuf != -1 && "Invalid or unspecified location!"); MemoryBuffer *CurMB = getBufferInfo(CurBuf).Buffer; - - + // Scan backward to find the start of the line. const char *LineStart = Loc.getPointer(); - while (LineStart != CurMB->getBufferStart() && + while (LineStart != CurMB->getBufferStart() && LineStart[-1] != '\n' && LineStart[-1] != '\r') --LineStart; - // Get the end of the line. - const char *LineEnd = Loc.getPointer(); - while (LineEnd != CurMB->getBufferEnd() && - LineEnd[0] != '\n' && LineEnd[0] != '\r') - ++LineEnd; + + std::string LineStr; + if (ShowLine) { + // Get the end of the line. + const char *LineEnd = Loc.getPointer(); + while (LineEnd != CurMB->getBufferEnd() && + LineEnd[0] != '\n' && LineEnd[0] != '\r') + ++LineEnd; + LineStr = std::string(LineStart, LineEnd); + } std::string PrintedMsg; if (Type) { @@ -163,22 +167,21 @@ SMDiagnostic SourceMgr::GetMessage(SMLoc Loc, const std::string &Msg, PrintedMsg += ": "; } PrintedMsg += Msg; - - // Print out the line. + return SMDiagnostic(CurMB->getBufferIdentifier(), FindLineNumber(Loc, CurBuf), Loc.getPointer()-LineStart, PrintedMsg, - std::string(LineStart, LineEnd)); + LineStr, ShowLine); } void SourceMgr::PrintMessage(SMLoc Loc, const std::string &Msg, - const char *Type) const { + const char *Type, bool ShowLine) const { raw_ostream &OS = errs(); int CurBuf = FindBufferContainingLoc(Loc); assert(CurBuf != -1 && "Invalid or unspecified location!"); PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc, OS); - GetMessage(Loc, Msg, Type).Print(0, OS); + GetMessage(Loc, Msg, Type, ShowLine).Print(0, OS); } //===----------------------------------------------------------------------===// @@ -201,8 +204,8 @@ void SMDiagnostic::Print(const char *ProgName, raw_ostream &S) { } S << ": " << Message << '\n'; - - if (LineNo != -1 && ColumnNo != -1) { + + if (LineNo != -1 && ColumnNo != -1 && ShowLine) { S << LineContents << '\n'; // Print out spaces/tabs before the caret. diff --git a/lib/Support/StringRef.cpp b/lib/Support/StringRef.cpp index 51e1100..2d023e4 100644 --- a/lib/Support/StringRef.cpp +++ b/lib/Support/StringRef.cpp @@ -23,7 +23,7 @@ static char ascii_tolower(char x) { /// compare_lower - Compare strings, ignoring case. int StringRef::compare_lower(StringRef RHS) const { - for (size_t I = 0, E = std::min(Length, RHS.Length); I != E; ++I) { + for (size_t I = 0, E = min(Length, RHS.Length); I != E; ++I) { char LHC = ascii_tolower(Data[I]); char RHC = ascii_tolower(RHS.Data[I]); if (LHC != RHC) @@ -48,7 +48,7 @@ size_t StringRef::find(StringRef Str, size_t From) const { size_t N = Str.size(); if (N > Length) return npos; - for (size_t e = Length - N + 1, i = std::min(From, e); i != e; ++i) + for (size_t e = Length - N + 1, i = min(From, e); i != e; ++i) if (substr(i, N).equals(Str)) return i; return npos; @@ -76,7 +76,7 @@ size_t StringRef::rfind(StringRef Str) const { /// Note: O(size() * Chars.size()) StringRef::size_type StringRef::find_first_of(StringRef Chars, size_t From) const { - for (size_type i = std::min(From, Length), e = Length; i != e; ++i) + for (size_type i = min(From, Length), e = Length; i != e; ++i) if (Chars.find(Data[i]) != npos) return i; return npos; @@ -85,7 +85,7 @@ StringRef::size_type StringRef::find_first_of(StringRef Chars, /// find_first_not_of - Find the first character in the string that is not /// \arg C or npos if not found. StringRef::size_type StringRef::find_first_not_of(char C, size_t From) const { - for (size_type i = std::min(From, Length), e = Length; i != e; ++i) + for (size_type i = min(From, Length), e = Length; i != e; ++i) if (Data[i] != C) return i; return npos; @@ -97,7 +97,7 @@ StringRef::size_type StringRef::find_first_not_of(char C, size_t From) const { /// Note: O(size() * Chars.size()) StringRef::size_type StringRef::find_first_not_of(StringRef Chars, size_t From) const { - for (size_type i = std::min(From, Length), e = Length; i != e; ++i) + for (size_type i = min(From, Length), e = Length; i != e; ++i) if (Chars.find(Data[i]) == npos) return i; return npos; diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp index 840fb98..2fec094 100644 --- a/lib/Support/Triple.cpp +++ b/lib/Support/Triple.cpp @@ -90,6 +90,7 @@ const char *Triple::getOSTypeName(OSType Kind) { case DragonFly: return "dragonfly"; case FreeBSD: return "freebsd"; case Linux: return "linux"; + case Lv2: return "lv2"; case MinGW32: return "mingw32"; case MinGW64: return "mingw64"; case NetBSD: return "netbsd"; @@ -227,7 +228,7 @@ void Triple::Parse() const { Arch = pic16; else if (ArchName == "powerpc") Arch = ppc; - else if (ArchName == "powerpc64") + else if ((ArchName == "powerpc64") || (ArchName == "ppu")) Arch = ppc64; else if (ArchName == "arm" || ArchName.startswith("armv") || @@ -293,6 +294,8 @@ void Triple::Parse() const { OS = FreeBSD; else if (OSName.startswith("linux")) OS = Linux; + else if (OSName.startswith("lv2")) + OS = Lv2; else if (OSName.startswith("mingw32")) OS = MinGW32; else if (OSName.startswith("mingw64")) |