[PATCH] D139749: Headers: use C++ inline semantics in C++ mode
rnk added a subscriber: hans. rnk added a comment. This feels to me like we are still working around some incompatibilities between the MSVC intrin.h / intrin0.h model. I would prefer it if we could always use `static inline` consistently in our intrinsic headers so we don't have to worry about ODR violation problems. However, we're using always_inline so there's not much to worry about anyway. Anyway, if it comes up again, we should try to come up with a better fix. +@hans Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D139749/new/ https://reviews.llvm.org/D139749 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D139749: Headers: use C++ inline semantics in C++ mode
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG3b0677964c46: Headers: use C++ inline semantics in C++ mode (authored by compnerd). Changed prior to commit: https://reviews.llvm.org/D139749?vs=483081=515351#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D139749/new/ https://reviews.llvm.org/D139749 Files: clang/lib/Headers/adxintrin.h Index: clang/lib/Headers/adxintrin.h === --- clang/lib/Headers/adxintrin.h +++ clang/lib/Headers/adxintrin.h @@ -17,56 +17,69 @@ /* Define the default attributes for the functions in this file. */ #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__)) +/* Use C++ inline semantics in C++, GNU inline for C mode. */ +#if defined(__cplusplus) +#define __INLINE __inline +#else +#define __INLINE static __inline +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + /* Intrinsics that are available only if __ADX__ defined */ -static __inline unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) -_addcarryx_u32(unsigned char __cf, unsigned int __x, unsigned int __y, - unsigned int *__p) -{ +__INLINE unsigned char +__attribute__((__always_inline__, __nodebug__, __target__("adx"))) +_addcarryx_u32(unsigned char __cf, unsigned int __x, unsigned int __y, + unsigned int *__p) { return __builtin_ia32_addcarryx_u32(__cf, __x, __y, __p); } #ifdef __x86_64__ -static __inline unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) -_addcarryx_u64(unsigned char __cf, unsigned long long __x, - unsigned long long __y, unsigned long long *__p) -{ +__INLINE unsigned char +__attribute__((__always_inline__, __nodebug__, __target__("adx"))) +_addcarryx_u64(unsigned char __cf, unsigned long long __x, + unsigned long long __y, unsigned long long *__p) { return __builtin_ia32_addcarryx_u64(__cf, __x, __y, __p); } #endif /* Intrinsics that are also available if __ADX__ undefined */ -static __inline unsigned char __DEFAULT_FN_ATTRS -_addcarry_u32(unsigned char __cf, unsigned int __x, unsigned int __y, - unsigned int *__p) -{ +__INLINE unsigned char __DEFAULT_FN_ATTRS _addcarry_u32(unsigned char __cf, +unsigned int __x, +unsigned int __y, +unsigned int *__p) { return __builtin_ia32_addcarryx_u32(__cf, __x, __y, __p); } #ifdef __x86_64__ -static __inline unsigned char __DEFAULT_FN_ATTRS +__INLINE unsigned char __DEFAULT_FN_ATTRS _addcarry_u64(unsigned char __cf, unsigned long long __x, - unsigned long long __y, unsigned long long *__p) -{ + unsigned long long __y, unsigned long long *__p) { return __builtin_ia32_addcarryx_u64(__cf, __x, __y, __p); } #endif -static __inline unsigned char __DEFAULT_FN_ATTRS -_subborrow_u32(unsigned char __cf, unsigned int __x, unsigned int __y, - unsigned int *__p) -{ +__INLINE unsigned char __DEFAULT_FN_ATTRS _subborrow_u32(unsigned char __cf, + unsigned int __x, + unsigned int __y, + unsigned int *__p) { return __builtin_ia32_subborrow_u32(__cf, __x, __y, __p); } #ifdef __x86_64__ -static __inline unsigned char __DEFAULT_FN_ATTRS +__INLINE unsigned char __DEFAULT_FN_ATTRS _subborrow_u64(unsigned char __cf, unsigned long long __x, - unsigned long long __y, unsigned long long *__p) -{ + unsigned long long __y, unsigned long long *__p) { return __builtin_ia32_subborrow_u64(__cf, __x, __y, __p); } #endif +#if defined(__cplusplus) +} +#endif + #undef __DEFAULT_FN_ATTRS #endif /* __ADXINTRIN_H */ Index: clang/lib/Headers/adxintrin.h === --- clang/lib/Headers/adxintrin.h +++ clang/lib/Headers/adxintrin.h @@ -17,56 +17,69 @@ /* Define the default attributes for the functions in this file. */ #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__)) +/* Use C++ inline semantics in C++, GNU inline for C mode. */ +#if defined(__cplusplus) +#define __INLINE __inline +#else +#define __INLINE static __inline +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + /* Intrinsics that are available only if __ADX__ defined */ -static __inline unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) -_addcarryx_u32(unsigned char __cf, unsigned int __x, unsigned int __y, - unsigned int *__p) -{ +__INLINE unsigned char +
[PATCH] D139749: Headers: use C++ inline semantics in C++ mode
compnerd added a comment. Thanks @fsb4000 (and @CaseyCarter)! I think that due to the shipped version, it makes sense to do this still. Using standard semantics in general I think is preferable, since nothing prevents another compiler implementation to still do something similar. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D139749/new/ https://reviews.llvm.org/D139749 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D139749: Headers: use C++ inline semantics in C++ mode
fsb4000 added a subscriber: CaseyCarter. fsb4000 added a comment. @CaseyCarter created https://github.com/microsoft/STL/pull/3285 So MSVC STL don't use with Clang now. It should fix the issues too because Clang overrides (and doesn't override) CHANGES SINCE LAST ACTION https://reviews.llvm.org/D139749/new/ https://reviews.llvm.org/D139749 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D139749: Headers: use C++ inline semantics in C++ mode
compnerd updated this revision to Diff 483081. compnerd retitled this revision from "Headers: make a couple of builtins non-static" to "Headers: use C++ inline semantics in C++ mode". compnerd edited the summary of this revision. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D139749/new/ https://reviews.llvm.org/D139749 Files: clang/lib/Headers/adxintrin.h Index: clang/lib/Headers/adxintrin.h === --- clang/lib/Headers/adxintrin.h +++ clang/lib/Headers/adxintrin.h @@ -17,8 +17,19 @@ /* Define the default attributes for the functions in this file. */ #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__)) +/* Use C++ inline semantics in C++, GNU inline for C mode. */ +#if defined(__cplusplus) +#define __INLINE __inline +#else +#define __INLINE static __inline +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + /* Intrinsics that are available only if __ADX__ defined */ -static __inline unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) +__INLINE unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) _addcarryx_u32(unsigned char __cf, unsigned int __x, unsigned int __y, unsigned int *__p) { @@ -26,7 +37,7 @@ } #ifdef __x86_64__ -static __inline unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) +__INLINE unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) _addcarryx_u64(unsigned char __cf, unsigned long long __x, unsigned long long __y, unsigned long long *__p) { @@ -35,7 +46,7 @@ #endif /* Intrinsics that are also available if __ADX__ undefined */ -static __inline unsigned char __DEFAULT_FN_ATTRS +__INLINE unsigned char __DEFAULT_FN_ATTRS _addcarry_u32(unsigned char __cf, unsigned int __x, unsigned int __y, unsigned int *__p) { @@ -43,7 +54,7 @@ } #ifdef __x86_64__ -static __inline unsigned char __DEFAULT_FN_ATTRS +__INLINE unsigned char __DEFAULT_FN_ATTRS _addcarry_u64(unsigned char __cf, unsigned long long __x, unsigned long long __y, unsigned long long *__p) { @@ -51,7 +62,7 @@ } #endif -static __inline unsigned char __DEFAULT_FN_ATTRS +__INLINE unsigned char __DEFAULT_FN_ATTRS _subborrow_u32(unsigned char __cf, unsigned int __x, unsigned int __y, unsigned int *__p) { @@ -59,7 +70,7 @@ } #ifdef __x86_64__ -static __inline unsigned char __DEFAULT_FN_ATTRS +__INLINE unsigned char __DEFAULT_FN_ATTRS _subborrow_u64(unsigned char __cf, unsigned long long __x, unsigned long long __y, unsigned long long *__p) { @@ -67,6 +78,11 @@ } #endif +#if defined(__cplusplus) +} +#endif + #undef __DEFAULT_FN_ATTRS +#undef __INLINE #endif /* __ADXINTRIN_H */ Index: clang/lib/Headers/adxintrin.h === --- clang/lib/Headers/adxintrin.h +++ clang/lib/Headers/adxintrin.h @@ -17,8 +17,19 @@ /* Define the default attributes for the functions in this file. */ #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__)) +/* Use C++ inline semantics in C++, GNU inline for C mode. */ +#if defined(__cplusplus) +#define __INLINE __inline +#else +#define __INLINE static __inline +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + /* Intrinsics that are available only if __ADX__ defined */ -static __inline unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) +__INLINE unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) _addcarryx_u32(unsigned char __cf, unsigned int __x, unsigned int __y, unsigned int *__p) { @@ -26,7 +37,7 @@ } #ifdef __x86_64__ -static __inline unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) +__INLINE unsigned char __attribute__((__always_inline__, __nodebug__, __target__("adx"))) _addcarryx_u64(unsigned char __cf, unsigned long long __x, unsigned long long __y, unsigned long long *__p) { @@ -35,7 +46,7 @@ #endif /* Intrinsics that are also available if __ADX__ undefined */ -static __inline unsigned char __DEFAULT_FN_ATTRS +__INLINE unsigned char __DEFAULT_FN_ATTRS _addcarry_u32(unsigned char __cf, unsigned int __x, unsigned int __y, unsigned int *__p) { @@ -43,7 +54,7 @@ } #ifdef __x86_64__ -static __inline unsigned char __DEFAULT_FN_ATTRS +__INLINE unsigned char __DEFAULT_FN_ATTRS _addcarry_u64(unsigned char __cf, unsigned long long __x, unsigned long long __y, unsigned long long *__p) { @@ -51,7 +62,7 @@ } #endif -static __inline unsigned char __DEFAULT_FN_ATTRS +__INLINE unsigned char __DEFAULT_FN_ATTRS _subborrow_u32(unsigned char __cf, unsigned int __x, unsigned int __y, unsigned int *__p) { @@ -59,7 +70,7 @@ } #ifdef __x86_64__ -static __inline unsigned char