r350970 - [Darwin][Driver] Don't pass a file as object_path_lto during ThinLTO

Steven Wu via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 29 12:13:05 PST 2019


r352537 should fix it.

Steven

> On Jan 29, 2019, at 11:36 AM, Matt Arsenault <arsenm2 at gmail.com> wrote:
> 
> 
> 
>> On Jan 11, 2019, at 4:16 PM, Steven Wu via cfe-commits <cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>> wrote:
>> 
>> Author: steven_wu
>> Date: Fri Jan 11 13:16:04 2019
>> New Revision: 350970
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=350970&view=rev <http://llvm.org/viewvc/llvm-project?rev=350970&view=rev>
>> Log:
>> [Darwin][Driver] Don't pass a file as object_path_lto during ThinLTO
>> 
>> Summary:
>> After r327851, Driver::GetTemporaryPath will create the file rather than
>> just create a potientially unqine filename. If clang driver pass the
>> file as parameter as -object_path_lto, ld64 will pass it back to libLTO
>> as GeneratedObjectsDirectory, which is going to cause a LLVM ERROR if it
>> is not a directory.
>> Now during thinLTO, pass a temp directory path to linker instread.
>> 
>> rdar://problem/47194182 <rdar://problem/47194182>
>> 
>> Reviewers: arphaman, dexonsmith
>> 
>> Reviewed By: arphaman
>> 
>> Subscribers: mehdi_amini, inglorion, jkorous, cfe-commits
>> 
>> Differential Revision: https://reviews.llvm.org/D56608
>> 
>> Modified:
>>    cfe/trunk/include/clang/Driver/Driver.h
>>    cfe/trunk/lib/Driver/Driver.cpp
>>    cfe/trunk/lib/Driver/ToolChains/Darwin.cpp
>>    cfe/trunk/test/Driver/darwin-ld-lto.c
>> 
>> Modified: cfe/trunk/include/clang/Driver/Driver.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Driver.h?rev=350970&r1=350969&r2=350970&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Driver/Driver.h (original)
>> +++ cfe/trunk/include/clang/Driver/Driver.h Fri Jan 11 13:16:04 2019
>> @@ -505,6 +505,10 @@ public:
>>   /// GCC goes to extra lengths here to be a bit more robust.
>>   std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const;
>> 
>> +  /// GetTemporaryDirectory - Return the pathname of a temporary directory to
>> +  /// use as part of compilation; the directory will have the given prefix.
>> +  std::string GetTemporaryDirectory(StringRef Prefix) const;
>> +
>>   /// Return the pathname of the pch file in clang-cl mode.
>>   std::string GetClPchPath(Compilation &C, StringRef BaseName) const;
>> 
>> 
>> Modified: cfe/trunk/lib/Driver/Driver.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=350970&r1=350969&r2=350970&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Driver.cpp (original)
>> +++ cfe/trunk/lib/Driver/Driver.cpp Fri Jan 11 13:16:04 2019
>> @@ -4478,6 +4478,17 @@ std::string Driver::GetTemporaryPath(Str
>>   return Path.str();
>> }
>> 
>> +std::string Driver::GetTemporaryDirectory(StringRef Prefix) const {
>> +  SmallString<128> Path;
>> +  std::error_code EC = llvm::sys::fs::createUniqueDirectory(Prefix, Path);
>> +  if (EC) {
>> +    Diag(clang::diag::err_unable_to_make_temp) << EC.message();
>> +    return "";
>> +  }
>> +
>> +  return Path.str();
>> +}
>> +
>> std::string Driver::GetClPchPath(Compilation &C, StringRef BaseName) const {
>>   SmallString<128> Output;
>>   if (Arg *FpArg = C.getArgs().getLastArg(options::OPT__SLASH_Fp)) {
>> 
>> Modified: cfe/trunk/lib/Driver/ToolChains/Darwin.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Darwin.cpp?rev=350970&r1=350969&r2=350970&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/ToolChains/Darwin.cpp (original)
>> +++ cfe/trunk/lib/Driver/ToolChains/Darwin.cpp Fri Jan 11 13:16:04 2019
>> @@ -224,13 +224,20 @@ void darwin::Linker::AddLinkArgs(Compila
>>                    options::OPT_fno_application_extension, false))
>>     CmdArgs.push_back("-application_extension");
>> 
>> -  if (D.isUsingLTO()) {
>> -    // If we are using LTO, then automatically create a temporary file path for
>> -    // the linker to use, so that it's lifetime will extend past a possible
>> -    // dsymutil step.
>> -    if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
>> -      const char *TmpPath = C.getArgs().MakeArgString(
>> -          D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
>> +  if (D.isUsingLTO() && Version[0] >= 116 && NeedsTempPath(Inputs)) {
>> +    std::string TmpPathName;
>> +    if (D.getLTOMode() == LTOK_Full) {
>> +      // If we are using full LTO, then automatically create a temporary file
>> +      // path for the linker to use, so that it's lifetime will extend past a
>> +      // possible dsymutil step.
>> +      TmpPathName =
>> +          D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object));
>> +    } else if (D.getLTOMode() == LTOK_Thin)
>> +      // If we are using thin LTO, then create a directory instead.
>> +      TmpPathName = D.GetTemporaryDirectory("thinlto");
>> +
>> +    if (!TmpPathName.empty()) {
>> +      auto *TmpPath = C.getArgs().MakeArgString(TmpPathName);
>>       C.addTempFile(TmpPath);
>>       CmdArgs.push_back("-object_path_lto");
>>       CmdArgs.push_back(TmpPath);
>> 
>> Modified: cfe/trunk/test/Driver/darwin-ld-lto.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/darwin-ld-lto.c?rev=350970&r1=350969&r2=350970&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/Driver/darwin-ld-lto.c (original)
>> +++ cfe/trunk/test/Driver/darwin-ld-lto.c Fri Jan 11 13:16:04 2019
>> @@ -17,3 +17,14 @@
>> // RUN: %clang -target x86_64-apple-darwin10 -### %s \
>> // RUN:   -ccc-install-dir %S/dummytestdir -mlinker-version=133 2> %t.log
>> // RUN: FileCheck -check-prefix=LINK_LTOLIB_PATH %s -input-file %t.log
>> +
>> +
>> +// Check that -object_lto_path is passed correctly to ld64
>> +// RUN: %clang -target x86_64-apple-darwin10 %s -flto=full -### 2>&1 | \
>> +// RUN:   FileCheck -check-prefix=FULL_LTO_OBJECT_PATH %s
>> +// FULL_LTO_OBJECT_PATH: /usr/bin/ld
>> +// FULL_LTO_OBJECT_PATH-SAME: "-object_path_lto" "{{[a-zA-Z0-9_\/]+\/cc\-[a-zA-Z0-9_]+.o}}"
>> +// RUN: %clang -target x86_64-apple-darwin10 %s -flto=thin -### 2>&1 | \
>> +// RUN:   FileCheck -check-prefix=THIN_LTO_OBJECT_PATH %s
>> +// THIN_LTO_OBJECT_PATH: /usr/bin/ld
>> +// THIN_LTO_OBJECT_PATH-SAME: "-object_path_lto" "{{[a-zA-Z0-9_\/]+\/thinlto\-[a-zA-Z0-9_]+}}"
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>
> 
> 
> Hi,
> 
> This test is failing on systems that have another ld installed (e.g. macports ld64):
> 
> $ ./bin/llvm-lit  -v ~/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c                     
> llvm-lit: /Users/matt/src/llvm/utils/lit/lit/llvm/config.py:337: note: using clang: /Users/matt/src/llvm/build_debug/bin/clang
> llvm-lit: /Users/matt/src/llvm/utils/lit/lit/util.py:381: note: using SDKROOT: '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk'
> -- Testing: 1 tests, 1 threads --
> FAIL: Clang :: Driver/darwin-ld-lto.c (1 of 1)
> ******************** TEST 'Clang :: Driver/darwin-ld-lto.c' FAILED ********************
> Script:
> --
> : 'RUN: at line 5';   mkdir -p /Users/matt/src/llvm/build_debug/tools/clang/test/Driver/Output/darwin-ld-lto.c.tmp/bin
> : 'RUN: at line 6';   mkdir -p /Users/matt/src/llvm/build_debug/tools/clang/test/Driver/Output/darwin-ld-lto.c.tmp/lib
> : 'RUN: at line 7';   touch /Users/matt/src/llvm/build_debug/tools/clang/test/Driver/Output/darwin-ld-lto.c.tmp/lib/libLTO.dylib
> : 'RUN: at line 8';   /Users/matt/src/llvm/build_debug/bin/clang -target x86_64-apple-darwin10 -### /Users/matt/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c    -ccc-install-dir /Users/matt/src/llvm/build_debug/tools/clang/test/Driver/Output/darwin-ld-lto.c.tmp/bin -mlinker-version=133 2> /Users/matt/src/llvm/build_debug/tools/clang/test/Driver/Output/darwin-ld-lto.c.tmp.log
> : 'RUN: at line 10';   /Users/matt/src/llvm/build_debug/bin/FileCheck -check-prefix=LINK_LTOLIB_PATH /Users/matt/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c -input-file /Users/matt/src/llvm/build_debug/tools/clang/test/Driver/Output/darwin-ld-lto.c.tmp.log
> : 'RUN: at line 17';   /Users/matt/src/llvm/build_debug/bin/clang -target x86_64-apple-darwin10 -### /Users/matt/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c    -ccc-install-dir /Users/matt/src/llvm/tools/clang/test/Driver/dummytestdir -mlinker-version=133 2> /Users/matt/src/llvm/build_debug/tools/clang/test/Driver/Output/darwin-ld-lto.c.tmp.log
> : 'RUN: at line 19';   /Users/matt/src/llvm/build_debug/bin/FileCheck -check-prefix=LINK_LTOLIB_PATH /Users/matt/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c -input-file /Users/matt/src/llvm/build_debug/tools/clang/test/Driver/Output/darwin-ld-lto.c.tmp.log
> : 'RUN: at line 23';   /Users/matt/src/llvm/build_debug/bin/clang -target x86_64-apple-darwin10 /Users/matt/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c -flto=full -### 2>&1 |    /Users/matt/src/llvm/build_debug/bin/FileCheck -check-prefix=FULL_LTO_OBJECT_PATH /Users/matt/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c
> : 'RUN: at line 27';   /Users/matt/src/llvm/build_debug/bin/clang -target x86_64-apple-darwin10 /Users/matt/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c -flto=thin -### 2>&1 |    /Users/matt/src/llvm/build_debug/bin/FileCheck -check-prefix=THIN_LTO_OBJECT_PATH /Users/matt/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c
> --
> Exit Code: 1
> 
> Command Output (stderr):
> --
> /Users/matt/src/llvm/tools/clang/test/Driver/darwin-ld-lto.c:25:26: error: FULL_LTO_OBJECT_PATH: expected string not found in input
> // FULL_LTO_OBJECT_PATH: /usr/bin/ld
>                          ^
> <stdin>:1:1: note: scanning from here
> clang version 9.0.0 (trunk 352514) (llvm/trunk 352520)
> ^
> <stdin>:6:9: note: possible intended match here
>  "/opt/local/bin/ld" "-demangle" "-object_path_lto" "/var/folders/5g/8bzrsr594pqb8hwn2bw55d7h0000gn/T/lit_tmp_5K80Fp/cc-5e3f63.o" "-lto_library" "/Users/matt/src/llvm/build_debug/lib/libLTO.dylib" "-no_deduplicate" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.6.0" "-o" "a.out" "-lcrt1.10.6.o" "/var/folders/5g/8bzrsr594pqb8hwn2bw55d7h0000gn/T/lit_tmp_5K80Fp/darwin-ld-lto-268cad.o" "-lSystem"
>         ^
> 
> --
> 
> ********************
> Testing Time: 0.32s
> ********************
> Failing Tests (1):
>     Clang :: Driver/darwin-ld-lto.c
> 
>   Unexpected Failures: 1
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190129/479306ee/attachment-0001.html>


More information about the cfe-commits mailing list