Todd Mortimer <[email protected]> writes: > I am fine with this, especially since it helps you with the lang/ghc > port. I am not a fan of the code duplication, but this also code that > doesn't change much, so I don't see it too much of a burden.
Maybe I can bribe somebody to get an OK before 7.1 then? It'd be convenient if I could tell GHC people that most tests will pass in this release rather than pointing at an arbitrary snapshot... > If it were > to be shared, it would be somewhere in one of the llvm libs that is > shared between clang and lld. Looking at LLVM_LIBDEPS in these files, I see LLVM as the only one in common between /usr/src/gnu/usr.bin/clang/lld/Makefile /usr/src/gnu/usr.bin/clang/clang/Makefile LLVM seems like a dubious place for such adhoc code sharing. Thanks Greg > > > Todd > > On Fri, Feb 25, 2022 at 07:27:08PM -0800, Greg Steuck wrote: >> No opinions? >> >> Greg Steuck <[email protected]> writes: >> >> > LLVM OpenBSD guardians, >> > >> > I want to get a closure on "Power-up cc --print-file-name for .so names" >> > thread on tech@. I care because it helps me with lang/ghc port. >> > >> > Here's a is fairly finished diff. I'll be taking it through the >> > make-build-twice dance (because I can). If somebody has a good idea >> > where the identical code could live, I'm open to not duplicating >> > it. Otherwise, OK? >> > >> > Thanks >> > Greg >> > >> >> From 447d158494ce4a1b4986f16e3bc2ef057712fe27 Mon Sep 17 00:00:00 2001 >> > From: Greg Steuck <[email protected]> >> > Date: Sun, 13 Feb 2022 22:28:43 -0800 >> > Subject: [PATCH] Report versioned lib.so in cc --print-file-name given >> > short >> > name >> > >> > E.g. `cc --print-file-name libc.so` reports /usr/lib/libc.so.96.1 >> > >> > This is a complement of the major.minor finding logic in DriverUtils. >> > `ld -lc -L/usr/lib` currently finds the libraries with this logic. >> > >> > To make things more obviously related the code was extracted into a >> > function which was copied over verbatim. >> > --- >> > gnu/llvm/clang/lib/Driver/Driver.cpp | 54 +++++++++++++++++++++++-- >> > gnu/llvm/lld/ELF/DriverUtils.cpp | 60 ++++++++++++++++------------ >> > 2 files changed, 85 insertions(+), 29 deletions(-) >> > >> > diff --git a/gnu/llvm/clang/lib/Driver/Driver.cpp >> > b/gnu/llvm/clang/lib/Driver/Driver.cpp >> > index 94a7553e273..399c37d15ab 100644 >> > --- a/gnu/llvm/clang/lib/Driver/Driver.cpp >> > +++ b/gnu/llvm/clang/lib/Driver/Driver.cpp >> > @@ -5089,7 +5089,50 @@ const char *Driver::GetNamedOutputPath(Compilation >> > &C, const JobAction &JA, >> > } >> > } >> > >> > + >> > +namespace { >> > +static Optional<std::string> findFile(StringRef path1, const Twine >> > &path2) { >> > + SmallString<128> s; >> > + llvm::sys::path::append(s, path1, path2); >> > + >> > + if (llvm::sys::fs::exists(s)) >> > + return std::string(s); >> > + return None; >> > +} >> > + >> > +// Must be in sync with findMajMinShlib in lld/ELF/DriverUtils.cpp. >> > +llvm::Optional<std::string> findMajMinShlib(StringRef dir, const Twine& >> > libNameSo) { >> > + // Handle OpenBSD-style maj/min shlib scheme >> > + llvm::SmallString<128> Scratch; >> > + const StringRef LibName = (libNameSo + ".").toStringRef(Scratch); >> > + int MaxMaj = -1, MaxMin = -1; >> > + std::error_code EC; >> > + for (llvm::sys::fs::directory_iterator LI(dir, EC), LE; >> > + LI != LE; LI = LI.increment(EC)) { >> > + StringRef FilePath = LI->path(); >> > + StringRef FileName = llvm::sys::path::filename(FilePath); >> > + if (!(FileName.startswith(LibName))) >> > + continue; >> > + std::pair<StringRef, StringRef> MajMin = >> > + FileName.substr(LibName.size()).split('.'); >> > + int Maj, Min; >> > + if (MajMin.first.getAsInteger(10, Maj) || Maj < 0) >> > + continue; >> > + if (MajMin.second.getAsInteger(10, Min) || Min < 0) >> > + continue; >> > + if (Maj > MaxMaj) >> > + MaxMaj = Maj, MaxMin = Min; >> > + if (MaxMaj == Maj && Min > MaxMin) >> > + MaxMin = Min; >> > + } >> > + if (MaxMaj >= 0) >> > + return findFile(dir, LibName + Twine(MaxMaj) + "." + Twine(MaxMin)); >> > + return None; >> > +} >> > +} // namespace >> > + >> > std::string Driver::GetFilePath(StringRef Name, const ToolChain &TC) >> > const { >> > + const bool lookForLibDotSo = Name.startswith("lib") && >> > Name.endswith(".so"); >> > // Search for Name in a list of paths. >> > auto SearchPaths = [&](const llvm::SmallVectorImpl<std::string> &P) >> > -> llvm::Optional<std::string> { >> > @@ -5099,9 +5142,14 @@ std::string Driver::GetFilePath(StringRef Name, >> > const ToolChain &TC) const { >> > if (Dir.empty()) >> > continue; >> > SmallString<128> P(Dir[0] == '=' ? SysRoot + Dir.substr(1) : Dir); >> > - llvm::sys::path::append(P, Name); >> > - if (llvm::sys::fs::exists(Twine(P))) >> > - return std::string(P); >> > + if (!lookForLibDotSo) { >> > + llvm::sys::path::append(P, Name); >> > + if (llvm::sys::fs::exists(Twine(P))) >> > + return std::string(P); >> > + } else { >> > + if (auto s = findMajMinShlib(P, Name)) >> > + return std::string(*s); >> > + } >> > } >> > return None; >> > }; >> > diff --git a/gnu/llvm/lld/ELF/DriverUtils.cpp >> > b/gnu/llvm/lld/ELF/DriverUtils.cpp >> > index 6b164e30677..2fee8538913 100644 >> > --- a/gnu/llvm/lld/ELF/DriverUtils.cpp >> > +++ b/gnu/llvm/lld/ELF/DriverUtils.cpp >> > @@ -230,6 +230,38 @@ Optional<std::string> >> > elf::findFromSearchPaths(StringRef path) { >> > return None; >> > } >> > >> > +namespace { >> > +// Must be in sync with findMajMinShlib in clang/lib/Driver/Driver.cpp. >> > +llvm::Optional<std::string> findMajMinShlib(StringRef dir, const Twine& >> > libNameSo) { >> > + // Handle OpenBSD-style maj/min shlib scheme >> > + llvm::SmallString<128> Scratch; >> > + const StringRef LibName = (libNameSo + ".").toStringRef(Scratch); >> > + int MaxMaj = -1, MaxMin = -1; >> > + std::error_code EC; >> > + for (llvm::sys::fs::directory_iterator LI(dir, EC), LE; >> > + LI != LE; LI = LI.increment(EC)) { >> > + StringRef FilePath = LI->path(); >> > + StringRef FileName = llvm::sys::path::filename(FilePath); >> > + if (!(FileName.startswith(LibName))) >> > + continue; >> > + std::pair<StringRef, StringRef> MajMin = >> > + FileName.substr(LibName.size()).split('.'); >> > + int Maj, Min; >> > + if (MajMin.first.getAsInteger(10, Maj) || Maj < 0) >> > + continue; >> > + if (MajMin.second.getAsInteger(10, Min) || Min < 0) >> > + continue; >> > + if (Maj > MaxMaj) >> > + MaxMaj = Maj, MaxMin = Min; >> > + if (MaxMaj == Maj && Min > MaxMin) >> > + MaxMin = Min; >> > + } >> > + if (MaxMaj >= 0) >> > + return findFile(dir, LibName + Twine(MaxMaj) + "." + Twine(MaxMin)); >> > + return None; >> > +} >> > +} // namespace >> > + >> > // This is for -l<basename>. We'll look for lib<basename>.so or >> > lib<basename>.a from >> > // search paths. >> > Optional<std::string> elf::searchLibraryBaseName(StringRef name) { >> > @@ -237,32 +269,8 @@ Optional<std::string> >> > elf::searchLibraryBaseName(StringRef name) { >> > if (!config->isStatic) { >> > if (Optional<std::string> s = findFile(dir, "lib" + name + ".so")) >> > return s; >> > - >> > - // Handle OpenBSD-style maj/min shlib scheme >> > - llvm::SmallString<128> Scratch; >> > - const StringRef LibName = ("lib" + name + >> > ".so.").toStringRef(Scratch); >> > - int MaxMaj = -1, MaxMin = -1; >> > - std::error_code EC; >> > - for (fs::directory_iterator LI(dir, EC), LE; >> > - LI != LE; LI = LI.increment(EC)) { >> > - StringRef FilePath = LI->path(); >> > - StringRef FileName = path::filename(FilePath); >> > - if (!(FileName.startswith(LibName))) >> > - continue; >> > - std::pair<StringRef, StringRef> MajMin = >> > - FileName.substr(LibName.size()).split('.'); >> > - int Maj, Min; >> > - if (MajMin.first.getAsInteger(10, Maj) || Maj < 0) >> > - continue; >> > - if (MajMin.second.getAsInteger(10, Min) || Min < 0) >> > - continue; >> > - if (Maj > MaxMaj) >> > - MaxMaj = Maj, MaxMin = Min; >> > - if (MaxMaj == Maj && Min > MaxMin) >> > - MaxMin = Min; >> > - } >> > - if (MaxMaj >= 0) >> > - return findFile(dir, LibName + Twine(MaxMaj) + "." + >> > Twine(MaxMin)); >> > + if (Optional<std::string> s = findMajMinShlib(dir, "lib" + name + >> > ".so")) >> > + return s; >> > } >> > if (Optional<std::string> s = findFile(dir, "lib" + name + ".a")) >> > return s;
