Skip to content

Commit 9a68f59

Browse files
committed
- r127238 mingw-w64 should define __MINGW32__, too.
- r127329 declarations of __builtin_ia32_crc32**() - r127652 Tweak InitHeaderSearch.cpp for mingw-w64-gcc - r127654 _mm_malloc tweak - r127655 Tweak __declspec and __attribute__ for mingw --- Merging r127238 into '.': U lib/Basic/Targets.cpp --- Merging r127329 into '.': A test/Sema/builtins-decl.c U include/clang/Basic/BuiltinsX86.def --- Merging r127652 into '.': U lib/Frontend/InitHeaderSearch.cpp --- Merging r127654 into '.': U lib/Headers/mm_malloc.h --- Merging r127655 into '.': G lib/Basic/Targets.cpp llvm-svn: 128046
1 parent 59fb1a0 commit 9a68f59

File tree

5 files changed

+57
-18
lines changed

5 files changed

+57
-18
lines changed

clang/include/clang/Basic/BuiltinsX86.def

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,10 @@ BUILTIN(__builtin_ia32_pcmpestriz128, "iV16ciV16cic","")
342342

343343
BUILTIN(__builtin_ia32_pcmpgtq, "V2LLiV2LLiV2LLi", "")
344344

345-
BUILTIN(__builtin_ia32_crc32qi, "iic", "")
346-
BUILTIN(__builtin_ia32_crc32hi, "iis", "")
347-
BUILTIN(__builtin_ia32_crc32si, "iii", "")
348-
BUILTIN(__builtin_ia32_crc32di, "LLiLLiLLi", "")
345+
BUILTIN(__builtin_ia32_crc32qi, "UiUiUc", "")
346+
BUILTIN(__builtin_ia32_crc32hi, "UiUiUs", "")
347+
BUILTIN(__builtin_ia32_crc32si, "UiUiUi", "")
348+
BUILTIN(__builtin_ia32_crc32di, "ULLiULLiULLi", "")
349349

350350
// AES
351351
BUILTIN(__builtin_ia32_aesenc128, "V2LLiV2LLiV2LLi", "")

clang/lib/Basic/Targets.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1481,7 +1481,15 @@ class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
14811481
Builder.defineMacro("_X86_");
14821482
Builder.defineMacro("__MSVCRT__");
14831483
Builder.defineMacro("__MINGW32__");
1484-
Builder.defineMacro("__declspec", "__declspec");
1484+
1485+
// mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1486+
// In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1487+
if (Opts.Microsoft)
1488+
// Provide "as-is" __declspec.
1489+
Builder.defineMacro("__declspec", "__declspec");
1490+
else
1491+
// Provide alias of __attribute__ like mingw32-gcc.
1492+
Builder.defineMacro("__declspec(a)", "__attribute__((a))");
14851493
}
14861494
};
14871495
} // end anonymous namespace
@@ -1629,8 +1637,17 @@ class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
16291637
WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
16301638
DefineStd(Builder, "WIN64", Opts);
16311639
Builder.defineMacro("__MSVCRT__");
1640+
Builder.defineMacro("__MINGW32__");
16321641
Builder.defineMacro("__MINGW64__");
1633-
Builder.defineMacro("__declspec", "__declspec");
1642+
1643+
// mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1644+
// In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1645+
if (Opts.Microsoft)
1646+
// Provide "as-is" __declspec.
1647+
Builder.defineMacro("__declspec", "__declspec");
1648+
else
1649+
// Provide alias of __attribute__ like mingw32-gcc.
1650+
Builder.defineMacro("__declspec(a)", "__attribute__((a))");
16341651
}
16351652
};
16361653
} // end anonymous namespace

clang/lib/Frontend/InitHeaderSearch.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ class InitHeaderSearch {
7676
llvm::StringRef Arch,
7777
llvm::StringRef Version);
7878

79+
/// AddMinGW64CXXPaths - Add the necessary paths to support
80+
/// libstdc++ of x86_64-w64-mingw32 aka mingw-w64.
81+
void AddMinGW64CXXPaths(llvm::StringRef Base);
82+
7983
/// AddDelimitedPaths - Add a list of paths delimited by the system PATH
8084
/// separator. The processing follows that of the CPATH variable for gcc.
8185
void AddDelimitedPaths(llvm::StringRef String);
@@ -207,6 +211,15 @@ void InitHeaderSearch::AddMinGWCPlusPlusIncludePaths(llvm::StringRef Base,
207211
CXXSystem, true, false, false);
208212
}
209213

214+
void InitHeaderSearch::AddMinGW64CXXPaths(llvm::StringRef Base) {
215+
AddPath(Base,
216+
CXXSystem, true, false, false);
217+
AddPath(Base + "/x86_64-w64-mingw32",
218+
CXXSystem, true, false, false);
219+
AddPath(Base + "/backward",
220+
CXXSystem, true, false, false);
221+
}
222+
210223
// FIXME: This probably should goto to some platform utils place.
211224
#ifdef _MSC_VER
212225

@@ -534,6 +547,10 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
534547
AddPath("/usr/include/w32api", System, true, false, false);
535548
break;
536549
case llvm::Triple::MinGW32:
550+
// FIXME: We should be aware of i686-w64-mingw32.
551+
if (triple.getArch() == llvm::Triple::x86_64)
552+
AddPath("c:/mingw/x86_64-w64-mingw32/include",
553+
System, true, false, false);
537554
AddPath("/mingw/include", System, true, false, false);
538555
AddPath("c:/mingw/include", System, true, false, false);
539556
break;
@@ -571,18 +588,13 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple) {
571588
AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "3.4.4");
572589
break;
573590
case llvm::Triple::MinGW32:
574-
// mingw-w64-20110207
575-
AddPath("c:/MinGW/include/c++/4.5.3", CXXSystem, true, false, false);
576-
AddPath("c:/MinGW/include/c++/4.5.3/x86_64-w64-mingw32", CXXSystem, true,
577-
false, false);
578-
AddPath("c:/MinGW/include/c++/4.5.3/backward", CXXSystem, true, false,
579-
false);
580-
// mingw-w64-20101129
581-
AddPath("c:/MinGW/include/c++/4.5.2", CXXSystem, true, false, false);
582-
AddPath("c:/MinGW/include/c++/4.5.2/x86_64-w64-mingw32", CXXSystem, true,
583-
false, false);
584-
AddPath("c:/MinGW/include/c++/4.5.2/backward", CXXSystem, true, false,
585-
false);
591+
// FIXME: We should be aware of i686-w64-mingw32.
592+
if (triple.getArch() == llvm::Triple::x86_64) {
593+
// mingw-w64-20110207
594+
AddMinGW64CXXPaths("c:/mingw/x86_64-w64-mingw32/include/c++/4.5.3");
595+
// mingw-w64-20101129
596+
AddMinGW64CXXPaths("c:/mingw/x86_64-w64-mingw32/include/c++/4.5.2");
597+
}
586598
// Try gcc 4.5.2 (MSYS)
587599
AddMinGWCPlusPlusIncludePaths("/mingw/lib/gcc", "mingw32", "4.5.2");
588600
// Try gcc 4.5.0

clang/lib/Headers/mm_malloc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ extern "C" int posix_memalign(void **memptr, size_t alignment, size_t size);
4040
#endif
4141
#endif
4242

43+
#if !(defined(_WIN32) && defined(_mm_malloc))
4344
static __inline__ void *__attribute__((__always_inline__, __nodebug__,
4445
__malloc__))
4546
_mm_malloc(size_t size, size_t align)
@@ -67,5 +68,6 @@ _mm_free(void *p)
6768
{
6869
free(p);
6970
}
71+
#endif
7072

7173
#endif /* __MM_MALLOC_H */

clang/test/Sema/builtins-decl.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: %clang_cc1 %s -fsyntax-only -verify -triple=i686-mingw32
2+
// RUN: %clang_cc1 %s -fsyntax-only -verify -triple=x86_64-mingw32
3+
4+
// mingw-w64's intrin.h has decls below.
5+
// we should accept them.
6+
extern unsigned int __builtin_ia32_crc32qi (unsigned int, unsigned char);
7+
extern unsigned int __builtin_ia32_crc32hi (unsigned int, unsigned short);
8+
extern unsigned int __builtin_ia32_crc32si (unsigned int, unsigned int);

0 commit comments

Comments
 (0)