[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cfe-commits
Subject:    Re: r243105 - Apparently some of the bots add .svn dirs inside the test/Driver/Inputs
From:       Richard Smith <richard () metafoo ! co ! uk>
Date:       2015-07-24 18:43:40
Message-ID: CAOfiQqkd7iFH_bckf-1-9Qo_GS47yJoSdO8ZT45c8nxHg9Oajw () mail ! gmail ! com
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


On Fri, Jul 24, 2015 at 4:01 AM, Yaron Keren <yaron.keren@gmail.com> wrote:

> Author: yrnkrn
> Date: Fri Jul 24 06:01:45 2015
> New Revision: 243105
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=243105&view=rev
> Log:
> Apparently some of the bots add .svn dirs inside the test/Driver/Inputs
> directory structure. Try to make mingw toolchain resilient to such
> surprises.
> 
> 
> Modified:
> cfe/trunk/lib/Driver/MinGWToolChain.cpp
> 
> Modified: cfe/trunk/lib/Driver/MinGWToolChain.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/MinGWToolChain.cpp?rev=243105&r1=243104&r2=243105&view=diff
>  
> ==============================================================================
> --- cfe/trunk/lib/Driver/MinGWToolChain.cpp (original)
> +++ cfe/trunk/lib/Driver/MinGWToolChain.cpp Fri Jul 24 06:01:45 2015
> @@ -20,28 +20,38 @@ using namespace clang::driver::toolchain
> using namespace clang;
> using namespace llvm::opt;
> 
> +namespace {
> +bool findGccVersion(StringRef LibDir, std::string &GccLibDir,
> +                    std::string &Ver) {
> +  std::error_code EC;
> +  llvm::sys::fs::directory_iterator Entry(LibDir, EC);
> +  while (!EC) {
> +    GccLibDir = Entry->path();
> +    Ver = llvm::sys::path::filename(GccLibDir);
> +    if (Ver.size() && isdigit(Ver[0]))
> +      return true;
> 

This seems like a very questionable approach. What if there are two such
directories? You appear to make an arbitrary choice between them. See
Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple for how other
toolchains handle this.

+    Entry.increment(EC);
> +  }
> +  return false;
> +}
> +}
> +
> void MinGW::findGccLibDir() {
> +  llvm::SmallVector<llvm::SmallString<32>, 2> Archs;
> +  Archs.emplace_back(getTriple().getArchName());
> +  Archs[0] += "-w64-mingw32";
> +  Archs.emplace_back("mingw32");
> +  Arch = "unknown";
> // lib: Arch Linux, Ubuntu, Windows
> // lib64: openSUSE Linux
> -  llvm::SmallString<1024> LibDir;
> for (StringRef Lib : {"lib", "lib64"}) {
> -    LibDir = Base;
> -    llvm::sys::path::append(LibDir, Lib, "gcc");
> -    LibDir += llvm::sys::path::get_separator();
> -    std::error_code EC;
> -    // First look for mingw-w64.
> -    llvm::sys::fs::directory_iterator MingW64Entry(LibDir + Arch, EC);
> -    if (!EC) {
> -      GccLibDir = MingW64Entry->path();
> -      break;
> -    }
> -    // If mingw-w64 not found, try looking for mingw.org.
> -    llvm::sys::fs::directory_iterator MingwOrgEntry(LibDir + "mingw32",
> EC);
> -    if (!EC) {
> -      GccLibDir = MingwOrgEntry->path();
> -      // Replace Arch with mingw32 arch.
> -      Arch = "mingw32";
> -      break;
> +    for (StringRef MaybeArch : Archs) {
> +      llvm::SmallString<1024> LibDir(Base);
> +      llvm::sys::path::append(LibDir, Lib, "gcc", MaybeArch);
> +      if (findGccVersion(LibDir, GccLibDir, Ver)) {
> +        Arch = MaybeArch;
> +        return;
> +      }
> }
> }
> }
> @@ -50,9 +60,6 @@ MinGW::MinGW(const Driver &D, const llvm
> > ToolChain(D, Triple, Args) {
> getProgramPaths().push_back(getDriver().getInstalledDir());
> 
> -  // Default Arch is mingw-w64.
> -  Arch = (getTriple().getArchName() + "-w64-mingw32").str();
> -
> // In Windows there aren't any standard install locations, we search
> // for gcc on the PATH. In Linux the base is always /usr.
> #ifdef LLVM_ON_WIN32
> @@ -73,7 +80,6 @@ MinGW::MinGW(const Driver &D, const llvm
> 
> Base += llvm::sys::path::get_separator();
> findGccLibDir();
> -  Ver = llvm::sys::path::filename(GccLibDir);
> // GccLibDir must precede Base/lib so that the
> // correct crtbegin.o ,cetend.o would be found.
> getFilePaths().push_back(GccLibDir);
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> 


[Attachment #5 (text/html)]

<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Jul 24, 2015 \
at 4:01 AM, Yaron Keren <span dir="ltr">&lt;<a href="mailto:yaron.keren@gmail.com" \
target="_blank">yaron.keren@gmail.com</a>&gt;</span> wrote:<br><blockquote \
class="gmail_quote" style="margin:0px 0px 0px \
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: \
                yrnkrn<br>
Date: Fri Jul 24 06:01:45 2015<br>
New Revision: 243105<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm \
-2Dproject-3Frev-3D243105-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW \
_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=gpED-aAMsfoGw2kFi8ItYuHU7LyhEnwJCzBlZv0kfcc&s=w_mAzPLNFDIvdbMPj1o7Zve6qLu7k-o8yPah0J3ie68&e=" \
rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=243105&amp;view=rev</a><br>
 Log:<br>
Apparently some of the bots add .svn dirs inside the test/Driver/Inputs<br>
directory structure. Try to make mingw toolchain resilient to such surprises.<br>
<br>
<br>
Modified:<br>
      cfe/trunk/lib/Driver/MinGWToolChain.cpp<br>
<br>
Modified: cfe/trunk/lib/Driver/MinGWToolChain.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm \
-2Dproject_cfe_trunk_lib_Driver_MinGWToolChain.cpp-3Frev-3D243105-26r1-3D243104-26r2-3 \
D243105-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM \
_ASROnREeq0cCxk&m=gpED-aAMsfoGw2kFi8ItYuHU7LyhEnwJCzBlZv0kfcc&s=EQaP4u_OHnHuPfLmgUNvcnkTmhiDEqOol1FPUudJ9k4&e=" \
rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Dri \
ver/MinGWToolChain.cpp?rev=243105&amp;r1=243104&amp;r2=243105&amp;view=diff</a><br> \
                ==============================================================================<br>
                
--- cfe/trunk/lib/Driver/MinGWToolChain.cpp (original)<br>
+++ cfe/trunk/lib/Driver/MinGWToolChain.cpp Fri Jul 24 06:01:45 2015<br>
@@ -20,28 +20,38 @@ using namespace clang::driver::toolchain<br>
  using namespace clang;<br>
  using namespace llvm::opt;<br>
<br>
+namespace {<br>
+bool findGccVersion(StringRef LibDir, std::string &amp;GccLibDir,<br>
+                              std::string &amp;Ver) {<br>
+   std::error_code EC;<br>
+   llvm::sys::fs::directory_iterator Entry(LibDir, EC);<br>
+   while (!EC) {<br>
+      GccLibDir = Entry-&gt;path();<br>
+      Ver = llvm::sys::path::filename(GccLibDir);<br>
+      if (Ver.size() &amp;&amp; isdigit(Ver[0]))<br>
+         return true;<br></blockquote><div><br></div><div>This seems like a very \
questionable approach. What if there are two such directories? You appear to make an \
arbitrary choice between them. See \
Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple for how other toolchains \
handle this.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px \
0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
 +      Entry.increment(EC);<br>
+   }<br>
+   return false;<br>
+}<br>
+}<br>
+<br>
  void MinGW::findGccLibDir() {<br>
+   llvm::SmallVector&lt;llvm::SmallString&lt;32&gt;, 2&gt; Archs;<br>
+   Archs.emplace_back(getTriple().getArchName());<br>
+   Archs[0] += &quot;-w64-mingw32&quot;;<br>
+   Archs.emplace_back(&quot;mingw32&quot;);<br>
+   Arch = &quot;unknown&quot;;<br>
     // lib: Arch Linux, Ubuntu, Windows<br>
     // lib64: openSUSE Linux<br>
-   llvm::SmallString&lt;1024&gt; LibDir;<br>
     for (StringRef Lib : {&quot;lib&quot;, &quot;lib64&quot;}) {<br>
-      LibDir = Base;<br>
-      llvm::sys::path::append(LibDir, Lib, &quot;gcc&quot;);<br>
-      LibDir += llvm::sys::path::get_separator();<br>
-      std::error_code EC;<br>
-      // First look for mingw-w64.<br>
-      llvm::sys::fs::directory_iterator MingW64Entry(LibDir + Arch, EC);<br>
-      if (!EC) {<br>
-         GccLibDir = MingW64Entry-&gt;path();<br>
-         break;<br>
-      }<br>
-      // If mingw-w64 not found, try looking for <a \
href="https://urldefense.proofpoint.com/v2/url?u=http-3A__mingw.org&d=AwMFaQ&c=8hUWFZc \
y2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=gpED-aAMsfoGw2kFi8ItYuHU7LyhEnwJCzBlZv0kfcc&s=rmvWcBmys9cfuWvLUVa7NgFV5lZV0KmVizcsNba1pM4&e=" \
                rel="noreferrer" target="_blank">mingw.org</a>.<br>
-      llvm::sys::fs::directory_iterator MingwOrgEntry(LibDir + &quot;mingw32&quot;, \
                EC);<br>
-      if (!EC) {<br>
-         GccLibDir = MingwOrgEntry-&gt;path();<br>
-         // Replace Arch with mingw32 arch.<br>
-         Arch = &quot;mingw32&quot;;<br>
-         break;<br>
+      for (StringRef MaybeArch : Archs) {<br>
+         llvm::SmallString&lt;1024&gt; LibDir(Base);<br>
+         llvm::sys::path::append(LibDir, Lib, &quot;gcc&quot;, MaybeArch);<br>
+         if (findGccVersion(LibDir, GccLibDir, Ver)) {<br>
+            Arch = MaybeArch;<br>
+            return;<br>
+         }<br>
        }<br>
     }<br>
  }<br>
@@ -50,9 +60,6 @@ MinGW::MinGW(const Driver &amp;D, const llvm<br>
        : ToolChain(D, Triple, Args) {<br>
     getProgramPaths().push_back(getDriver().getInstalledDir());<br>
<br>
-   // Default Arch is mingw-w64.<br>
-   Arch = (getTriple().getArchName() + &quot;-w64-mingw32&quot;).str();<br>
-<br>
  // In Windows there aren&#39;t any standard install locations, we search<br>
  // for gcc on the PATH. In Linux the base is always /usr.<br>
  #ifdef LLVM_ON_WIN32<br>
@@ -73,7 +80,6 @@ MinGW::MinGW(const Driver &amp;D, const llvm<br>
<br>
     Base += llvm::sys::path::get_separator();<br>
     findGccLibDir();<br>
-   Ver = llvm::sys::path::filename(GccLibDir);<br>
     // GccLibDir must precede Base/lib so that the<br>
     // correct crtbegin.o ,cetend.o would be found.<br>
     getFilePaths().push_back(GccLibDir);<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" \
target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br> \
</blockquote></div><br></div></div>



_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic