diff options
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 15 | ||||
-rw-r--r-- | clang/lib/Sema/SemaAttr.cpp | 3 | ||||
-rw-r--r-- | clang/test/CodeGen/pragma-comment.c | 8 | ||||
-rw-r--r-- | clang/test/Modules/autolink.m | 2 |
4 files changed, 22 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 45fc475e341..74db0e37a4d 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/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/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp index bc19b382989..943054be340 100644 --- a/clang/lib/Sema/SemaAttr.cpp +++ b/clang/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/clang/test/CodeGen/pragma-comment.c b/clang/test/CodeGen/pragma-comment.c index fd6b91e4679..30bf7b7d4e5 100644 --- a/clang/test/CodeGen/pragma-comment.c +++ b/clang/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/clang/test/Modules/autolink.m b/clang/test/Modules/autolink.m index 2b31fe51542..077aac5374a 100644 --- a/clang/test/Modules/autolink.m +++ b/clang/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"} |