Index: lib/CodeGen/TargetInfo.cpp
===================================================================
--- lib/CodeGen/TargetInfo.cpp
+++ lib/CodeGen/TargetInfo.cpp
@@ -2330,15 +2330,27 @@
   }
 };
 
-static std::string qualifyWindowsLibrary(llvm::StringRef Lib) {
+static std::string qualifyWindowsLibrary(llvm::StringRef Lib,
+                                         bool MinGWLibraryNames) {
   // If the argument does not end in .lib, automatically add the suffix.
   // If the argument contains a space, enclose it in quotes.
   // This matches the behavior of MSVC.
   bool Quote = (Lib.find(" ") != StringRef::npos);
   std::string ArgStr = Quote ? "\"" : "";
-  ArgStr += Lib;
-  if (!Lib.endswith_lower(".lib"))
-    ArgStr += ".lib";
+  if (MinGWLibraryNames) {
+    if (!Lib.endswith_lower(".a") && !Lib.startswith_lower("lib") &&
+        !Lib.contains('/') && !Lib.contains('\\')) {
+      ArgStr += "lib";
+      ArgStr += Lib;
+      ArgStr += ".a";
+    } else {
+      ArgStr += Lib;
+    }
+  } else {
+    ArgStr += Lib;
+    if (!Lib.endswith_lower(".lib"))
+      ArgStr += ".lib";
+  }
   ArgStr += Quote ? "\"" : "";
   return ArgStr;
 }
@@ -2347,9 +2359,10 @@
 public:
   WinX86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
         bool DarwinVectorABI, bool RetSmallStructInRegABI, bool Win32StructABI,
-        unsigned NumRegisterParameters)
+        unsigned NumRegisterParameters, bool MinGWLibraryNames)
     : X86_32TargetCodeGenInfo(CGT, DarwinVectorABI, RetSmallStructInRegABI,
-        Win32StructABI, NumRegisterParameters, false) {}
+        Win32StructABI, NumRegisterParameters, false),
+      MinGWLibraryNames(MinGWLibraryNames) {}
 
   void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
                            CodeGen::CodeGenModule &CGM) const override;
@@ -2357,7 +2370,7 @@
   void getDependentLibraryOption(llvm::StringRef Lib,
                                  llvm::SmallString<24> &Opt) const override {
     Opt = "/DEFAULTLIB:";
-    Opt += qualifyWindowsLibrary(Lib);
+    Opt += qualifyWindowsLibrary(Lib, MinGWLibraryNames);
   }
 
   void getDetectMismatchOption(llvm::StringRef Name,
@@ -2365,6 +2378,8 @@
                                llvm::SmallString<32> &Opt) const override {
     Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
   }
+
+  bool MinGWLibraryNames;
 };
 
 static void addStackProbeTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
@@ -2390,8 +2405,9 @@
 class WinX86_64TargetCodeGenInfo : public TargetCodeGenInfo {
 public:
   WinX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
-                             X86AVXABILevel AVXLevel)
-      : TargetCodeGenInfo(new WinX86_64ABIInfo(CGT)) {}
+                             X86AVXABILevel AVXLevel, bool MinGWLibraryNames)
+      : TargetCodeGenInfo(new WinX86_64ABIInfo(CGT)),
+        MinGWLibraryNames(MinGWLibraryNames) {}
 
   void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
                            CodeGen::CodeGenModule &CGM) const override;
@@ -2413,7 +2429,7 @@
   void getDependentLibraryOption(llvm::StringRef Lib,
                                  llvm::SmallString<24> &Opt) const override {
     Opt = "/DEFAULTLIB:";
-    Opt += qualifyWindowsLibrary(Lib);
+    Opt += qualifyWindowsLibrary(Lib, MinGWLibraryNames);
   }
 
   void getDetectMismatchOption(llvm::StringRef Name,
@@ -2421,6 +2437,8 @@
                                llvm::SmallString<32> &Opt) const override {
     Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
   }
+
+  bool MinGWLibraryNames;
 };
 
 void WinX86_64TargetCodeGenInfo::setTargetAttributes(
@@ -4990,18 +5008,22 @@
 
 class WindowsAArch64TargetCodeGenInfo : public AArch64TargetCodeGenInfo {
 public:
-  WindowsAArch64TargetCodeGenInfo(CodeGenTypes &CGT, AArch64ABIInfo::ABIKind K)
-      : AArch64TargetCodeGenInfo(CGT, K) {}
+  WindowsAArch64TargetCodeGenInfo(CodeGenTypes &CGT, AArch64ABIInfo::ABIKind K,
+                                  bool MinGWLibraryNames)
+      : AArch64TargetCodeGenInfo(CGT, K), MinGWLibraryNames(MinGWLibraryNames) {
+  }
 
   void getDependentLibraryOption(llvm::StringRef Lib,
                                  llvm::SmallString<24> &Opt) const override {
-    Opt = "/DEFAULTLIB:" + qualifyWindowsLibrary(Lib);
+    Opt = "/DEFAULTLIB:" + qualifyWindowsLibrary(Lib, MinGWLibraryNames);
   }
 
   void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value,
                                llvm::SmallString<32> &Opt) const override {
     Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
   }
+
+  bool MinGWLibraryNames;
 };
 }
 
@@ -5650,21 +5672,24 @@
 
 class WindowsARMTargetCodeGenInfo : public ARMTargetCodeGenInfo {
 public:
-  WindowsARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K)
-      : ARMTargetCodeGenInfo(CGT, K) {}
+  WindowsARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K,
+                              bool MinGWLibraryNames)
+      : ARMTargetCodeGenInfo(CGT, K), MinGWLibraryNames(MinGWLibraryNames) {}
 
   void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
                            CodeGen::CodeGenModule &CGM) const override;
 
   void getDependentLibraryOption(llvm::StringRef Lib,
                                  llvm::SmallString<24> &Opt) const override {
-    Opt = "/DEFAULTLIB:" + qualifyWindowsLibrary(Lib);
+    Opt = "/DEFAULTLIB:" + qualifyWindowsLibrary(Lib, MinGWLibraryNames);
   }
 
   void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value,
                                llvm::SmallString<32> &Opt) const override {
     Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
   }
+
+  bool MinGWLibraryNames;
 };
 
 void WindowsARMTargetCodeGenInfo::setTargetAttributes(
@@ -9099,8 +9124,8 @@
     if (getTarget().getABI() == "darwinpcs")
       Kind = AArch64ABIInfo::DarwinPCS;
     else if (Triple.isOSWindows())
-      return SetCGInfo(
-          new WindowsAArch64TargetCodeGenInfo(Types, AArch64ABIInfo::Win64));
+      return SetCGInfo(new WindowsAArch64TargetCodeGenInfo(
+          Types, AArch64ABIInfo::Win64, Triple.isOSCygMing()));
 
     return SetCGInfo(new AArch64TargetCodeGenInfo(Types, Kind));
   }
@@ -9114,8 +9139,8 @@
   case llvm::Triple::thumb:
   case llvm::Triple::thumbeb: {
     if (Triple.getOS() == llvm::Triple::Win32) {
-      return SetCGInfo(
-          new WindowsARMTargetCodeGenInfo(Types, ARMABIInfo::AAPCS_VFP));
+      return SetCGInfo(new WindowsARMTargetCodeGenInfo(
+          Types, ARMABIInfo::AAPCS_VFP, Triple.isOSCygMing()));
     }
 
     ARMABIInfo::ABIKind Kind = ARMABIInfo::AAPCS;
@@ -9187,11 +9212,13 @@
     bool RetSmallStructInRegABI =
         X86_32TargetCodeGenInfo::isStructReturnInRegABI(Triple, CodeGenOpts);
     bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
+    bool MinGWLibraryNames = Triple.isOSCygMing();
 
     if (Triple.getOS() == llvm::Triple::Win32) {
       return SetCGInfo(new WinX86_32TargetCodeGenInfo(
           Types, IsDarwinVectorABI, RetSmallStructInRegABI,
-          IsWin32FloatStructABI, CodeGenOpts.NumRegisterParameters));
+          IsWin32FloatStructABI, CodeGenOpts.NumRegisterParameters,
+          MinGWLibraryNames));
     } else {
       return SetCGInfo(new X86_32TargetCodeGenInfo(
           Types, IsDarwinVectorABI, RetSmallStructInRegABI,
@@ -9209,7 +9236,8 @@
 
     switch (Triple.getOS()) {
     case llvm::Triple::Win32:
-      return SetCGInfo(new WinX86_64TargetCodeGenInfo(Types, AVXLevel));
+      return SetCGInfo(new WinX86_64TargetCodeGenInfo(Types, AVXLevel,
+                                                      Triple.isOSCygMing()));
     case llvm::Triple::PS4:
       return SetCGInfo(new PS4TargetCodeGenInfo(Types, AVXLevel));
     default:
Index: test/CodeGen/dependent-lib.c
===================================================================
--- test/CodeGen/dependent-lib.c
+++ test/CodeGen/dependent-lib.c
@@ -1,11 +1,15 @@
 // RUN: %clang_cc1 %s --dependent-lib=msvcrt -triple thumbv7-windows -emit-llvm -o - | FileCheck %s
 // RUN: %clang_cc1 %s --dependent-lib=msvcrt -triple i686-pc-win32 -emit-llvm -o - | FileCheck %s
 // RUN: %clang_cc1 %s --dependent-lib=msvcrt -triple x86_64-pc-win32 -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 %s --dependent-lib=msvcrt -triple x86_64-w64-mingw32 -emit-llvm -o - | FileCheck -check-prefix MINGW %s
 // RUN: %clang_cc1 %s --dependent-lib=msvcrt -triple i686-pc-linux -emit-llvm -o - | FileCheck -check-prefix LINUX %s
 
 // CHECK: !llvm.linker.options = !{![[msvcrt:[0-9]+]]}
 // CHECK: ![[msvcrt]] = !{!"/DEFAULTLIB:msvcrt.lib"}
 
+// MINGW: !llvm.linker.options = !{![[msvcrt:[0-9]+]]}
+// MINGW: ![[msvcrt]] = !{!"/DEFAULTLIB:libmsvcrt.a"}
+
 // LINUX: !llvm.linker.options = !{![[msvcrt:[0-9]+]]}
 // LINUX: ![[msvcrt]] = !{!"-lmsvcrt"}
 
Index: test/Driver/fsanitize.c
===================================================================
--- test/Driver/fsanitize.c
+++ test/Driver/fsanitize.c
@@ -17,9 +17,11 @@
 // RUN: %clang -target i386-pc-win32 -fsanitize=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-WIN --check-prefix=CHECK-UNDEFINED-WIN32
 // RUN: %clang -target i386-pc-win32 -fsanitize=undefined -x c++ %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-WIN --check-prefix=CHECK-UNDEFINED-WIN32 --check-prefix=CHECK-UNDEFINED-WIN-CXX
 // RUN: %clang -target x86_64-pc-win32 -fsanitize=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-WIN --check-prefix=CHECK-UNDEFINED-WIN64
+// RUN: %clang -target x86_64-w64-mingw32 -fsanitize=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-WIN --check-prefix=CHECK-UNDEFINED-WIN64-MINGW
 // RUN: %clang -target x86_64-pc-win32 -fsanitize=undefined -x c++ %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-WIN --check-prefix=CHECK-UNDEFINED-WIN64 --check-prefix=CHECK-UNDEFINED-WIN-CXX
 // CHECK-UNDEFINED-WIN32: "--dependent-lib={{[^"]*}}ubsan_standalone-i386.lib"
 // CHECK-UNDEFINED-WIN64: "--dependent-lib={{[^"]*}}ubsan_standalone-x86_64.lib"
+// CHECK-UNDEFINED-WIN64-MINGW: "--dependent-lib={{[^"]*}}libclang_rt.ubsan_standalone-x86_64.a"
 // CHECK-UNDEFINED-WIN-CXX: "--dependent-lib={{[^"]*}}ubsan_standalone_cxx{{[^"]*}}.lib"
 // CHECK-UNDEFINED-WIN-SAME: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|pointer-overflow|float-cast-overflow|array-bounds|enum|bool|builtin|returns-nonnull-attribute|nonnull-attribute),?){18}"}}