From: Aaron Ballman Date: Fri, 24 May 2013 15:06:56 +0000 (+0000) Subject: Suffixing #pragma comment(lib) library names with .lib if necessary. This matches... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=89735b9516b1a378c6d33620a6c3a0d5705f9d04;p=clang Suffixing #pragma comment(lib) library names with .lib if necessary. This matches MSVC behavior, as well as allows us to properly link libraries such as the ones provided by the MSDN examples. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182647 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 45fc475e34..74db0e37a4 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -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); } }; diff --git a/lib/Sema/SemaAttr.cpp b/lib/Sema/SemaAttr.cpp index bc19b38298..943054be34 100644 --- a/lib/Sema/SemaAttr.cpp +++ b/lib/Sema/SemaAttr.cpp @@ -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: diff --git a/test/CodeGen/pragma-comment.c b/test/CodeGen/pragma-comment.c index fd6b91e467..30bf7b7d4e 100644 --- a/test/CodeGen/pragma-comment.c +++ b/test/CodeGen/pragma-comment.c @@ -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"} diff --git a/test/Modules/autolink.m b/test/Modules/autolink.m index 2b31fe5154..077aac5374 100644 --- a/test/Modules/autolink.m +++ b/test/Modules/autolink.m @@ -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"}