static void handleHVXWarnings(const Driver &D, const ArgList &Args) { // Handle the unsupported values passed to mhvx-length. if (Arg *A = Args.getLastArg(options::OPT_mhexagon_hvx_length_EQ)) { StringRef Val = A->getValue(); if (!Val.equals_lower("64b") && !Val.equals_lower("128b")) D.Diag(diag::err_drv_unsupported_option_argument) << A->getOption().getName() << Val; } }
// Check for header file extension. // If the file extension is .h, .inc, or missing, it's // assumed to be a header. // \param FileName The file name. Must not be a directory. // \returns true if it has a header extension or no extension. bool ModuleMapChecker::isHeader(StringRef FileName) { StringRef Extension = sys::path::extension(FileName); if (Extension.size() == 0) return false; if (Extension.equals_lower(".h")) return true; if (Extension.equals_lower(".inc")) return true; return false; }
// Check for header file extension. // If the file extension is .h, .inc, or missing, it's // assumed to be a header. // \param FileName The file name. Must not be a directory. // \returns true if it has a header extension or no extension. bool ModularizeUtilities::isHeader(StringRef FileName) { StringRef Extension = llvm::sys::path::extension(FileName); if (Extension.size() == 0) return true; if (Extension.equals_lower(".h")) return true; if (Extension.equals_lower(".inc")) return true; return false; }
StringRef HeaderMapImpl::lookupFilename(StringRef Filename, SmallVectorImpl<char> &DestPath) const { const HMapHeader &Hdr = getHeader(); unsigned NumBuckets = getEndianAdjustedWord(Hdr.NumBuckets); // Don't probe infinitely. This should be checked before constructing. assert(llvm::isPowerOf2_32(NumBuckets) && "Expected power of 2"); // Linearly probe the hash table. for (unsigned Bucket = HashHMapKey(Filename);; ++Bucket) { HMapBucket B = getBucket(Bucket & (NumBuckets-1)); if (B.Key == HMAP_EmptyBucketKey) return StringRef(); // Hash miss. // See if the key matches. If not, probe on. Optional<StringRef> Key = getString(B.Key); if (LLVM_UNLIKELY(!Key)) continue; if (!Filename.equals_lower(*Key)) continue; // If so, we have a match in the hash table. Construct the destination // path. Optional<StringRef> Prefix = getString(B.Prefix); Optional<StringRef> Suffix = getString(B.Suffix); DestPath.clear(); if (LLVM_LIKELY(Prefix && Suffix)) { DestPath.append(Prefix->begin(), Prefix->end()); DestPath.append(Suffix->begin(), Suffix->end()); } return StringRef(DestPath.begin(), DestPath.size()); } }
StringRef HeaderMap::lookupFilename(StringRef Filename, SmallVectorImpl<char> &DestPath) const { const HMapHeader &Hdr = getHeader(); unsigned NumBuckets = getEndianAdjustedWord(Hdr.NumBuckets); // If the number of buckets is not a power of two, the headermap is corrupt. // Don't probe infinitely. if (NumBuckets & (NumBuckets-1)) return StringRef(); // Linearly probe the hash table. for (unsigned Bucket = HashHMapKey(Filename);; ++Bucket) { HMapBucket B = getBucket(Bucket & (NumBuckets-1)); if (B.Key == HMAP_EmptyBucketKey) return StringRef(); // Hash miss. // See if the key matches. If not, probe on. if (!Filename.equals_lower(getString(B.Key))) continue; // If so, we have a match in the hash table. Construct the destination // path. StringRef Prefix = getString(B.Prefix); StringRef Suffix = getString(B.Suffix); DestPath.clear(); DestPath.append(Prefix.begin(), Prefix.end()); DestPath.append(Suffix.begin(), Suffix.end()); return StringRef(DestPath.begin(), DestPath.size()); } }
// Read the profile variant flag from the header: ":FE" means this is a FE // generated profile. ":IR" means this is an IR level profile. Other strings // with a leading ':' will be reported an error format. std::error_code TextInstrProfReader::readHeader() { Symtab.reset(new InstrProfSymtab()); bool IsIRInstr = false; if (!Line->startswith(":")) { IsIRLevelProfile = false; return success(); } StringRef Str = (Line)->substr(1); if (Str.equals_lower("ir")) IsIRInstr = true; else if (Str.equals_lower("fe")) IsIRInstr = false; else return instrprof_error::bad_header; ++Line; IsIRLevelProfile = IsIRInstr; return success(); }
/// Match a word within a name to a word within a type. static bool matchNameWordToTypeWord(StringRef nameWord, StringRef typeWord) { // If the name word is longer, there's no match. if (nameWord.size() > typeWord.size()) return false; // If the name word is shorter, try for a partial match. if (nameWord.size() < typeWord.size()) { // We can match the suffix of the type so long as everything preceding the // match is neither a lowercase letter nor a '_'. This ignores type // prefixes for acronyms, e.g., the 'NS' in 'NSURL'. if (typeWord.endswith_lower(nameWord) && !clang::isLowercase(typeWord[typeWord.size()-nameWord.size()])) { // Check that everything preceding the match is neither a lowercase letter // nor a '_'. for (unsigned i = 0, n = nameWord.size(); i != n; ++i) { if (clang::isLowercase(typeWord[i]) || typeWord[i] == '_') return false; } return true; } // We can match a prefix so long as everything following the match is // a number. if (typeWord.startswith_lower(nameWord)) { for (unsigned i = nameWord.size(), n = typeWord.size(); i != n; ++i) { if (!clang::isDigit(typeWord[i])) return false; } return true; } return false; } // Check for an exact match. return nameWord.equals_lower(typeWord); }
virtual bool equivalent(StringRef FileA, StringRef FileB) const { return FileA.equals_lower(FileB); }
FormatStyle getStyle(StringRef StyleName, StringRef FileName) { FormatStyle Style; getPredefinedStyle(FallbackStyle, &Style); if (StyleName.startswith("{")) { // Parse YAML/JSON style from the command line. if (error_code ec = parseConfiguration(StyleName, &Style)) { llvm::errs() << "Error parsing -style: " << ec.message() << ", using " << FallbackStyle << " style\n"; } return Style; } if (!StyleName.equals_lower("file")) { if (!getPredefinedStyle(StyleName, &Style)) llvm::errs() << "Invalid value for -style, using " << FallbackStyle << " style\n"; return Style; } if (FileName == "-") FileName = AssumeFilename; SmallString<128> Path(FileName); llvm::sys::fs::make_absolute(Path); for (StringRef Directory = Path; !Directory.empty(); Directory = llvm::sys::path::parent_path(Directory)) { if (!llvm::sys::fs::is_directory(Directory)) continue; SmallString<128> ConfigFile(Directory); llvm::sys::path::append(ConfigFile, ".clang-format"); DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n"); bool IsFile = false; // Ignore errors from is_regular_file: we only need to know if we can read // the file or not. llvm::sys::fs::is_regular_file(Twine(ConfigFile), IsFile); if (!IsFile) { // Try _clang-format too, since dotfiles are not commonly used on Windows. ConfigFile = Directory; llvm::sys::path::append(ConfigFile, "_clang-format"); DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n"); llvm::sys::fs::is_regular_file(Twine(ConfigFile), IsFile); } if (IsFile) { OwningPtr<MemoryBuffer> Text; if (error_code ec = MemoryBuffer::getFile(ConfigFile, Text)) { llvm::errs() << ec.message() << "\n"; continue; } if (error_code ec = parseConfiguration(Text->getBuffer(), &Style)) { llvm::errs() << "Error reading " << ConfigFile << ": " << ec.message() << "\n"; continue; } DEBUG(llvm::dbgs() << "Using configuration file " << ConfigFile << "\n"); return Style; } } llvm::errs() << "Can't find usable .clang-format, using " << FallbackStyle << " style\n"; return Style; }