Author: Arthur Eubanks
Date: 2023-02-24T09:28:10-08:00
New Revision: dc07867dc9991c982bd3441da19d6fcc16ea54d6

URL: 
https://github.com/llvm/llvm-project/commit/dc07867dc9991c982bd3441da19d6fcc16ea54d6
DIFF: 
https://github.com/llvm/llvm-project/commit/dc07867dc9991c982bd3441da19d6fcc16ea54d6.diff

LOG: [clang][Driver] Pass /INFERASANLIBS:NO to link.exe under -fsanitize=address

With recent MSVC releases, STL headers will add /INFERASANLIBS to the drectve 
section of object files that are compiled with clang. With this flag, link.exe 
will automatically attempt to look for asan libs.

When using clang as the driver to invoke the linker, we want to disable this 
feature because we explicitly pass the proper asan libraries, otherwise we get 
symbols defined multiple times.

Reviewed By: hans

Differential Revision: https://reviews.llvm.org/D144684

Added: 
    

Modified: 
    clang/lib/Driver/ToolChains/MSVC.cpp
    clang/test/Driver/cl-link.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChains/MSVC.cpp 
b/clang/lib/Driver/ToolChains/MSVC.cpp
index 13a7a2f47cf49..6f7db528e23ae 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -336,6 +336,11 @@ void visualstudio::Linker::ConstructJob(Compilation &C, 
const JobAction &JA,
       }
     }
 
+    // Clang handles passing the proper asan libs to the linker, which goes
+    // against link.exe's /INFERASANLIBS which automatically finds asan libs.
+    if (TC.getSanitizerArgs(Args).needsAsanRt())
+      CmdArgs.push_back("/INFERASANLIBS:NO");
+
 #ifdef _WIN32
     // When cross-compiling with VS2017 or newer, link.exe expects to have
     // its containing bin directory at the top of PATH, followed by the

diff  --git a/clang/test/Driver/cl-link.c b/clang/test/Driver/cl-link.c
index dcb7801383bbf..21d8208b26310 100644
--- a/clang/test/Driver/cl-link.c
+++ b/clang/test/Driver/cl-link.c
@@ -65,3 +65,11 @@
 
 // RUN: %clang_cl /Tc%s -fuse-ld=lld -### 2>&1 | FileCheck 
--check-prefix=USE_LLD %s
 // USE_LLD: lld-link
+
+// RUN: %clang_cl -m32 -arch:IA32 --target=i386-pc-win32 /Tc%s -fuse-ld=link 
-### -fsanitize=address 2>&1 | FileCheck --check-prefix=INFER-LINK %s
+// INFER-LINK: link.exe
+// INFER-LINK: /INFERASANLIBS:NO
+
+// RUN: %clang_cl -m32 -arch:IA32 --target=i386-pc-win32 /Tc%s -fuse-ld=lld 
-### -fsanitize=address 2>&1 | FileCheck --check-prefix=INFER-LLD %s
+// INFER-LLD: lld-link
+// INFER-LLD-NOT: INFERASANLIBS


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to