]> granicus.if.org Git - clang/commitdiff
Suffixing #pragma comment(lib) library names with .lib if necessary. This matches...
authorAaron Ballman <aaron@aaronballman.com>
Fri, 24 May 2013 15:06:56 +0000 (15:06 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Fri, 24 May 2013 15:06:56 +0000 (15:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182647 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TargetInfo.cpp
lib/Sema/SemaAttr.cpp
test/CodeGen/pragma-comment.c
test/Modules/autolink.m

index 45fc475e341bbb95529a55343617312fb2530f56..74db0e37a4da0d18b3a829affefe86ea4dbda775 100644 (file)
@@ -1266,6 +1266,17 @@ public:
 
 };
 
+static std::string qualifyWindowsLibrary(llvm::StringRef Lib) {
+  // If the argument does not end in .lib, automatically add the suffix. This
+  // matches the behavior of MSVC.
+  std::string ArgStr = Lib;
+  if (Lib.size() <= 4 ||
+      Lib.substr(Lib.size() - 4).compare_lower(".lib") != 0) {
+    ArgStr += ".lib";
+  }
+  return ArgStr;
+}
+
 class WinX86_32TargetCodeGenInfo : public X86_32TargetCodeGenInfo {
 public:
   WinX86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, unsigned RegParms)
@@ -1274,7 +1285,7 @@ public:
   void getDependentLibraryOption(llvm::StringRef Lib,
                                  llvm::SmallString<24> &Opt) const {
     Opt = "/DEFAULTLIB:";
-    Opt += Lib;
+    Opt += qualifyWindowsLibrary(Lib);
   }
 };
 
@@ -1300,7 +1311,7 @@ public:
   void getDependentLibraryOption(llvm::StringRef Lib,
                                  llvm::SmallString<24> &Opt) const {
     Opt = "/DEFAULTLIB:";
-    Opt += Lib;
+    Opt += qualifyWindowsLibrary(Lib);
   }
 };
 
index bc19b382989a48882f1768a35dc55718a59ed8cc..943054be340390488fcd4bbafc428b2d8b6fbc96 100644 (file)
@@ -272,10 +272,9 @@ void Sema::ActOnPragmaMSComment(PragmaMSCommentKind Kind, llvm::StringRef Arg) {
   case PCK_Linker:
     Consumer.HandleLinkerOptionPragma(Arg);
     return;
-  case PCK_Lib: {
+  case PCK_Lib:
     Consumer.HandleDependentLibrary(Arg);
     return;
-  }
   case PCK_Compiler:
   case PCK_ExeStr:
   case PCK_User:
index fd6b91e4679e30f85caf5ef52fe67987c6d6effd..30bf7b7d4e5bc19126501fe000dc7b022a8cb620 100644 (file)
@@ -3,15 +3,21 @@
 // RUN: %clang_cc1 %s -triple i686-pc-linux -fms-extensions -emit-llvm -o - | FileCheck -check-prefix LINUX %s
 
 #pragma comment(lib, "msvcrt.lib")
+#pragma comment(lib, "kernel32")
+#pragma comment(lib, "USER32.LIB")
 
 #define BAR "2"
 #pragma comment(linker," /bar=" BAR)
 
 // CHECK: !llvm.module.flags = !{!0}
 // CHECK: !0 = metadata !{i32 6, metadata !"Linker Options", metadata ![[link_opts:[0-9]+]]}
-// CHECK: ![[link_opts]] = metadata !{metadata ![[msvcrt:[0-9]+]], metadata ![[bar:[0-9]+]]}
+// CHECK: ![[link_opts]] = metadata !{metadata ![[msvcrt:[0-9]+]], metadata ![[kernel32:[0-9]+]], metadata ![[USER32:[0-9]+]], metadata ![[bar:[0-9]+]]}
 // CHECK: ![[msvcrt]] = metadata !{metadata !"/DEFAULTLIB:msvcrt.lib"}
+// CHECK: ![[kernel32]] = metadata !{metadata !"/DEFAULTLIB:kernel32.lib"}
+// CHECK: ![[USER32]] = metadata !{metadata !"/DEFAULTLIB:USER32.LIB"}
 // CHECK: ![[bar]] = metadata !{metadata !" /bar=2"}
 
 // LINUX: metadata !{metadata !"-lmsvcrt.lib"}
+// LINUX: metadata !{metadata !"-lkernel32"}
+// LINUX: metadata !{metadata !"-lUSER32.LIB"}
 // LINUX: metadata !{metadata !" /bar=2"}
index 2b31fe51542017ae77abb4e0b044d8fd0b6604fa..077aac5374a0eefd90d8304a61225535f25062b3 100644 (file)
@@ -35,7 +35,7 @@ int use_no_umbrella() {
 // CHECK: !4 = metadata !{i32 6, metadata !"Linker Options", metadata ![[AUTOLINK_OPTIONS:[0-9]+]]}
 // CHECK: ![[AUTOLINK_OPTIONS]] = metadata !{metadata ![[AUTOLINK_FRAMEWORK:[0-9]+]], metadata ![[AUTOLINK:[0-9]+]], metadata ![[DEPENDSONMODULE:[0-9]+]], metadata ![[MODULE:[0-9]+]], metadata ![[NOUMBRELLA:[0-9]+]]}
 // CHECK: ![[AUTOLINK_FRAMEWORK]] = metadata !{metadata !"-framework", metadata !"autolink_framework"}
-// CHECK: ![[AUTOLINK]] = metadata !{metadata !"{{(-l|/DEFAULTLIB:)}}autolink"}
+// CHECK: ![[AUTOLINK]] = metadata !{metadata !"{{(-l|/DEFAULTLIB:)}}autolink{{(\.lib)?}}"}
 // CHECK: ![[DEPENDSONMODULE]] = metadata !{metadata !"-framework", metadata !"DependsOnModule"}
 // CHECK: ![[MODULE]] = metadata !{metadata !"-framework", metadata !"Module"}
 // CHECK: ![[NOUMBRELLA]] = metadata !{metadata !"-framework", metadata !"NoUmbrella"}