> On Jan 11, 2019, at 4:16 PM, Steven Wu via cfe-commits > <cfe-commits@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 > 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 > > 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@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
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits