Index: cfe/trunk/include/clang/Driver/Options.td =================================================================== --- cfe/trunk/include/clang/Driver/Options.td +++ cfe/trunk/include/clang/Driver/Options.td @@ -2098,6 +2098,10 @@ def rpath : Separate<["-"], "rpath">, Flags<[LinkerInput]>, Group; def rtlib_EQ : Joined<["-", "--"], "rtlib=">, HelpText<"Compiler runtime library to use">; +def frtlib_add_rpath: Flag<["-"], "frtlib-add-rpath">, Flags<[NoArgumentUnused]>, + HelpText<"Add -rpath with architecture-specific resource directory to the linker flags">; +def fno_rtlib_add_rpath: Flag<["-"], "fno-rtlib-add-rpath">, Flags<[NoArgumentUnused]>, + HelpText<"Do not add -rpath with architecture-specific resource directory to the linker flags">; def r : Flag<["-"], "r">, Flags<[LinkerInput,NoArgumentUnused]>, Group; def save_temps_EQ : Joined<["-", "--"], "save-temps=">, Flags<[DriverOption]>, Index: cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp +++ cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp @@ -419,10 +419,6 @@ void tools::addArchSpecificRPath(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { - // In the cross-compilation case, arch-specific library path is likely - // unavailable at runtime. - if (TC.isCrossCompiling()) return; - std::string CandidateRPath = TC.getArchSpecificLibPath(); if (TC.getVFS().exists(CandidateRPath)) { CmdArgs.push_back("-rpath"); Index: cfe/trunk/test/Driver/arch-specific-libdir-rpath.c =================================================================== --- cfe/trunk/test/Driver/arch-specific-libdir-rpath.c +++ cfe/trunk/test/Driver/arch-specific-libdir-rpath.c @@ -1,50 +1,85 @@ // Test that the driver adds an arch-specific subdirectory in -// {RESOURCE_DIR}/lib/linux to the linker search path and to '-rpath' for native -// compilations. +// {RESOURCE_DIR}/lib/linux to the linker search path and to '-rpath' // -// -rpath only gets added during native compilation. To keep the test simple, -// just test for x86_64-linux native compilation. -// REQUIRES: x86_64-linux +// Test the default behavior when neither -frtlib-add-rpath nor +// -fno-rtlib-add-rpath is specified, which is to skip -rpath +// RUN: %clang %s -### 2>&1 -target x86_64-linux \ +// RUN: -fsanitize=address -shared-libasan \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH-X86_64 %s +// +// Test that -rpath is not added under -fno-rtlib-add-rpath even if other +// conditions are met. +// RUN: %clang %s -### 2>&1 -target x86_64-linux \ +// RUN: -fsanitize=address -shared-libasan \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH-X86_64 %s +// +// Test that -rpath is added only under the right circumstance even if +// -frtlib-add-rpath is specified. // // Add LIBPATH but no RPATH for -fsanitizer=address w/o -shared-libasan -// RUN: %clang %s -### 2>&1 -fsanitize=undefined \ +// RUN: %clang %s -### 2>&1 -target x86_64-linux -fsanitize=undefined \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH %s +// +// Add LIBPATH but no RPATH for -fsanitizer=address w/o -shared-libasan +// RUN: %clang %s -### 2>&1 -target x86_64-linux -fsanitize=undefined \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ -// RUN: | FileCheck --check-prefixes=FILEPATH,LIBPATH,NO-RPATH %s +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH %s // // Add LIBPATH, RPATH for -fsanitize=address -shared-libasan // RUN: %clang %s -### 2>&1 -target x86_64-linux \ // RUN: -fsanitize=address -shared-libasan \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ -// RUN: | FileCheck --check-prefixes=FILEPATH,LIBPATH,RPATH %s +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,RPATH-X86_64 %s +// +// Add LIBPATH, RPATH for -fsanitize=address -shared-libasan on aarch64 +// RUN: %clang %s -### 2>&1 -target aarch64-linux \ +// RUN: -fsanitize=address -shared-libasan \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-AArch64,RPATH-AArch64 %s // // Add LIBPATH, RPATH with -fsanitize=address for Android // RUN: %clang %s -### 2>&1 -target x86_64-linux-android -fsanitize=address \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ -// RUN: | FileCheck --check-prefixes=FILEPATH,LIBPATH,RPATH %s +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,RPATH-X86_64 %s // // Add LIBPATH, RPATH for OpenMP -// RUN: %clang %s -### 2>&1 -fopenmp \ +// RUN: %clang %s -### 2>&1 -target x86_64-linux -fopenmp \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ -// RUN: | FileCheck --check-prefixes=FILEPATH,LIBPATH,RPATH %s +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,RPATH-X86_64 %s // // Add LIBPATH but no RPATH for ubsan (or any other sanitizer) // RUN: %clang %s -### 2>&1 -fsanitize=undefined \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ -// RUN: | FileCheck --check-prefixes=FILEPATH,LIBPATH,NO-RPATH %s +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH %s // // Add LIBPATH but no RPATH if no sanitizer or runtime is specified // RUN: %clang %s -### 2>&1 \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ -// RUN: | FileCheck --check-prefixes=FILEPATH,LIBPATH,NO-RPATH %s +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH %s // // Do not add LIBPATH or RPATH if arch-specific subdir doesn't exist // RUN: %clang %s -### 2>&1 \ // RUN: -resource-dir=%S/Inputs/resource_dir \ -// RUN: | FileCheck --check-prefixes=FILEPATH,NO-LIBPATH,NO-RPATH %s -// +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,NO-LIBPATH,NO-RPATH %s // -// FILEPATH: "-x" "c" "[[FILE_PATH:.*]]/{{.*}}.c" -// LIBPATH: -L[[FILE_PATH]]/Inputs/resource_dir_with_arch_subdir/lib/linux/x86_64 -// RPATH: "-rpath" "[[FILE_PATH]]/Inputs/resource_dir_with_arch_subdir/lib/linux/x86_64" -// NO-LIBPATH-NOT: -L{{.*}}Inputs/resource_dir -// NO-RPATH-NOT: "-rpath" {{.*}}/Inputs/resource_dir +// RESDIR: "-resource-dir" "[[RESDIR:[^ ]*]]" +// LIBPATH-X86_64: -L[[RESDIR]]/lib/linux/x86_64 +// RPATH-X86_64: "-rpath" "[[RESDIR]]/lib/linux/x86_64" +// LIBPATH-AArch64: -L[[RESDIR]]/lib/linux/aarch64 +// RPATH-AArch64: "-rpath" "[[RESDIR]]/lib/linux/aarch64" +// NO-LIBPATH-NOT: -L{{.*}}Inputs/resource_dir +// NO-RPATH-NOT: "-rpath" {{.*}}/Inputs/resource_dir Index: cfe/trunk/test/Driver/arch-specific-libdir.c =================================================================== --- cfe/trunk/test/Driver/arch-specific-libdir.c +++ cfe/trunk/test/Driver/arch-specific-libdir.c @@ -1,8 +1,6 @@ // Test that the driver adds an arch-specific subdirectory in // {RESOURCE_DIR}/lib/linux to the search path. // -// REQUIRES: linux -// // RUN: %clang %s -### 2>&1 -target i386-unknown-linux \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ // RUN: | FileCheck --check-prefixes=FILEPATH,ARCHDIR-i386 %s Index: cfe/trunk/test/lit.cfg =================================================================== --- cfe/trunk/test/lit.cfg +++ cfe/trunk/test/lit.cfg @@ -397,10 +397,6 @@ if config.host_triple == config.target_triple: config.available_features.add("native") -# Test Driver/arch-specific-libdir-rpath.c is restricted to x86_64-linux -if re.match(r'^x86_64.*-linux', config.target_triple): - config.available_features.add("x86_64-linux") - # Case-insensitive file system def is_filesystem_case_insensitive(): handle, path = tempfile.mkstemp(prefix='case-test', dir=config.test_exec_root)