Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -1772,7 +1772,11 @@ static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) { // The runtimes are located in the OS-specific resource directory. SmallString<128> Res(TC.getDriver().ResourceDir); - llvm::sys::path::append(Res, "lib", TC.getOS()); + const llvm::Triple &Triple = TC.getTriple(); + llvm::sys::path::append(Res, "lib", + Triple.getOS() == llvm::Triple::FreeBSD ? + Triple.getOSTypeName(Triple.getOS()) : + TC.getOS()); return Res; } @@ -1833,9 +1837,12 @@ CmdArgs.push_back("-lpthread"); CmdArgs.push_back("-lrt"); - CmdArgs.push_back("-ldl"); CmdArgs.push_back("-lm"); + // There's no libdl on FreeBSD. + if (TC.getTriple().getOS() != llvm::Triple::FreeBSD) + CmdArgs.push_back("-ldl"); + // If possible, use a dynamic symbols file to export the symbols from the // runtime library. If we can't do so, use -export-dynamic instead to export // all symbols from the binary. @@ -6230,6 +6237,8 @@ CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); } + addSanitizerRuntimes(getToolChain(), Args, CmdArgs); + addProfileRT(ToolChain, Args, CmdArgs); const char *Exec = Index: test/Driver/sanitizer-ld.c =================================================================== --- test/Driver/sanitizer-ld.c +++ test/Driver/sanitizer-ld.c @@ -15,6 +15,21 @@ // CHECK-ASAN-LINUX-NOT: "-export-dynamic" // CHECK-ASAN-LINUX: "--dynamic-list={{.*}}libclang_rt.asan-i386.a.syms" +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target i386-unknown-freebsd -fsanitize=address \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --sysroot=%S/Inputs/basic_freebsd_tree \ +// RUN: | FileCheck --check-prefix=CHECK-ASAN-FREEBSD %s +// +// CHECK-ASAN-FREEBSD: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" +// CHECK-ASAN-FREEBSD-NOT: "-lc" +// CHECK-ASAN-FREEBSD-NOT: "-ldl" +// CHECK-ASAN-FREEBSD: libclang_rt.asan-i386.a" +// CHECK-ASAN-FREEBSD: "-lpthread" +// CHECK-ASAN-FREEBSD: "-lrt" +// CHECK-ASAN-FREEBSD: "-export-dynamic" +// CHECK-ASAN-FREEBSD-NOT: "--dynamic-list" + // RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target i386-unknown-linux -fsanitize=address \ // RUN: -resource-dir=%S/Inputs/empty_resource_dir \ @@ -31,6 +46,22 @@ // CHECK-ASAN-LINUX-CXX-NOT: "--dynamic-list" // CHECK-ASAN-LINUX-CXX: stdc++ +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target i386-unknown-freebsd -fsanitize=address \ +// RUN: -resource-dir=%S/Inputs/empty_resource_dir \ +// RUN: --sysroot=%S/Inputs/basic_freebsd_tree \ +// RUN: | FileCheck --check-prefix=CHECK-ASAN-FREEBSD-CXX %s +// +// CHECK-ASAN-FREEBSD-CXX: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" +// CHECK-ASAN-FREEBSD-CXX-NOT: "-lc" +// CHECK-ASAN-FREEBSD-CXX: "-whole-archive" "{{.*}}libclang_rt.asan-i386.a" "-no-whole-archive" +// CHECK-ASAN-FREEBSD-CXX: stdc++ +// CHECK-ASAN-FREEBSD-CXX: "-lpthread" +// CHECK-ASAN-FREEBSD-CXX: "-lrt" +// CHECK-ASAN-FREEBSD-CXX-NOT: "-ldl" +// CHECK-ASAN-FREEBSD-CXX: "-export-dynamic" +// CHECK-ASAN-FREEBSD-CXX-NOT: "--dynamic-list" + // RUN: %clang -no-canonical-prefixes %s -### -o /dev/null -fsanitize=address \ // RUN: -target i386-unknown-linux --sysroot=%S/Inputs/basic_linux_tree \ // RUN: -lstdc++ -static 2>&1 \ @@ -41,6 +72,16 @@ // CHECK-ASAN-LINUX-CXX-STATIC: "-whole-archive" "{{.*}}libclang_rt.asan-i386.a" "-no-whole-archive" // CHECK-ASAN-LINUX-CXX-STATIC: stdc++ +// RUN: %clang -no-canonical-prefixes %s -### -o /dev/null -fsanitize=address \ +// RUN: -target i386-unknown-freebsd --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: -lstdc++ -static 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-ASAN-FREEBSD-CXX-STATIC %s +// +// CHECK-ASAN-FREEBSD-CXX-STATIC: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" +// CHECK-ASAN-FREEBSD-CXX-STATIC-NOT: stdc++ +// CHECK-ASAN-FREEBSD-CXX-STATIC: "-whole-archive" "{{.*}}libclang_rt.asan-i386.a" "-no-whole-archive" +// CHECK-ASAN-FREEBSD-CXX-STATIC: stdc++ + // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-gnueabi -fsanitize=address \ // RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \