TEST(MultilibTest, Construction3) { Multilib M = Multilib().flag("+f1").flag("+f2").flag("-f3"); for (Multilib::flags_list::const_iterator I = M.flags().begin(), E = M.flags().end(); I != E; ++I) { ASSERT_TRUE(llvm::StringSwitch<bool>(*I) .Cases("+f1", "+f2", "-f3", true) .Default(false)); } }
static bool hasFlag(const Multilib &M, StringRef Flag) { for (Multilib::flags_list::const_iterator I = M.flags().begin(), E = M.flags().end(); I != E; ++I) { if (*I == Flag) return true; else if (StringRef(*I).substr(1) == Flag.substr(1)) return false; } return false; }
bool MultilibSet::select(const Multilib::flags_list &Flags, Multilib &M) const { llvm::StringMap<bool> FlagSet; // Stuff all of the flags into the FlagSet such that a true mappend indicates // the flag was enabled, and a false mappend indicates the flag was disabled. for (StringRef Flag : Flags) FlagSet[Flag.substr(1)] = isFlagEnabled(Flag); multilib_list Filtered = filterCopy([&FlagSet](const Multilib &M) { for (StringRef Flag : M.flags()) { llvm::StringMap<bool>::const_iterator SI = FlagSet.find(Flag.substr(1)); if (SI != FlagSet.end()) if (SI->getValue() != isFlagEnabled(Flag)) return true; } return false; }, Multilibs); if (Filtered.size() == 0) { return false; } else if (Filtered.size() == 1) { M = Filtered[0]; return true; } // TODO: pick the "best" multlib when more than one is suitable assert(false); return false; }
static Multilib compose(const Multilib &Base, const Multilib &New) { SmallString<128> GCCSuffix; llvm::sys::path::append(GCCSuffix, "/", Base.gccSuffix(), New.gccSuffix()); SmallString<128> OSSuffix; llvm::sys::path::append(OSSuffix, "/", Base.osSuffix(), New.osSuffix()); SmallString<128> IncludeSuffix; llvm::sys::path::append(IncludeSuffix, "/", Base.includeSuffix(), New.includeSuffix()); Multilib Composed(GCCSuffix, OSSuffix, IncludeSuffix); Multilib::flags_list &Flags = Composed.flags(); Flags.insert(Flags.end(), Base.flags().begin(), Base.flags().end()); Flags.insert(Flags.end(), New.flags().begin(), New.flags().end()); return Composed; }
MultilibSet &MultilibSet::Maybe(const Multilib &M) { Multilib Opposite; // Negate any '+' flags for (StringRef Flag : M.flags()) { if (Flag.front() == '+') Opposite.flags().push_back(("-" + Flag.substr(1)).str()); } return Either(M, Opposite); }
bool operator()(const Multilib &M) const override { for (StringRef Flag : M.flags()) { llvm::StringMap<bool>::const_iterator SI = FlagSet.find(Flag.substr(1)); if (SI != FlagSet.end()) if (SI->getValue() != isFlagEnabled(Flag)) return true; } return false; }