Vendor import of clang release_50 branch r310316:
https://llvm.org/svn/llvm-project/cfe/branches/release_50@310316
This commit is contained in:
parent
104a02fb6c
commit
ffe56ea4c3
@ -317,6 +317,7 @@ class CoroutineBodyStmt final
|
||||
unsigned NumParams;
|
||||
|
||||
friend class ASTStmtReader;
|
||||
friend class ASTReader;
|
||||
friend TrailingObjects;
|
||||
|
||||
Stmt **getStoredStmts() { return getTrailingObjects<Stmt *>(); }
|
||||
@ -347,6 +348,8 @@ class CoroutineBodyStmt final
|
||||
|
||||
public:
|
||||
static CoroutineBodyStmt *Create(const ASTContext &C, CtorArgs const &Args);
|
||||
static CoroutineBodyStmt *Create(const ASTContext &C, EmptyShell,
|
||||
unsigned NumParams);
|
||||
|
||||
bool hasDependentPromiseType() const {
|
||||
return getPromiseDecl()->getType()->isDependentType();
|
||||
@ -444,6 +447,8 @@ class CoreturnStmt : public Stmt {
|
||||
SubStmts[SubStmt::PromiseCall] = PromiseCall;
|
||||
}
|
||||
|
||||
CoreturnStmt(EmptyShell) : CoreturnStmt({}, {}, {}) {}
|
||||
|
||||
SourceLocation getKeywordLoc() const { return CoreturnLoc; }
|
||||
|
||||
/// \brief Retrieve the operand of the 'co_return' statement. Will be nullptr
|
||||
|
@ -338,8 +338,8 @@ TARGET_BUILTIN(__builtin_ia32_lfence, "v", "", "sse2")
|
||||
TARGET_HEADER_BUILTIN(_mm_lfence, "v", "h", "emmintrin.h", ALL_LANGUAGES, "sse2")
|
||||
TARGET_BUILTIN(__builtin_ia32_mfence, "v", "", "sse2")
|
||||
TARGET_HEADER_BUILTIN(_mm_mfence, "v", "h", "emmintrin.h", ALL_LANGUAGES, "sse2")
|
||||
TARGET_BUILTIN(__builtin_ia32_pause, "v", "", "sse2")
|
||||
TARGET_HEADER_BUILTIN(_mm_pause, "v", "h", "emmintrin.h", ALL_LANGUAGES, "sse2")
|
||||
TARGET_BUILTIN(__builtin_ia32_pause, "v", "", "")
|
||||
TARGET_HEADER_BUILTIN(_mm_pause, "v", "h", "emmintrin.h", ALL_LANGUAGES, "")
|
||||
TARGET_BUILTIN(__builtin_ia32_pmuludq128, "V2LLiV4iV4i", "", "sse2")
|
||||
TARGET_BUILTIN(__builtin_ia32_psraw128, "V8sV8sV8s", "", "sse2")
|
||||
TARGET_BUILTIN(__builtin_ia32_psrad128, "V4iV4iV4i", "", "sse2")
|
||||
|
@ -2019,10 +2019,6 @@ def mdspr2 : Flag<["-"], "mdspr2">, Group<m_Group>;
|
||||
def mno_dspr2 : Flag<["-"], "mno-dspr2">, Group<m_Group>;
|
||||
def msingle_float : Flag<["-"], "msingle-float">, Group<m_Group>;
|
||||
def mdouble_float : Flag<["-"], "mdouble-float">, Group<m_Group>;
|
||||
def mmadd4 : Flag<["-"], "mmadd4">, Group<m_Group>,
|
||||
HelpText<"Enable the generation of 4-operand madd.s, madd.d and related instructions.">;
|
||||
def mno_madd4 : Flag<["-"], "mno-madd4">, Group<m_Group>,
|
||||
HelpText<"Disable the generation of 4-operand madd.s, madd.d and related instructions.">;
|
||||
def mmsa : Flag<["-"], "mmsa">, Group<m_Group>,
|
||||
HelpText<"Enable MSA ASE (MIPS only)">;
|
||||
def mno_msa : Flag<["-"], "mno-msa">, Group<m_Group>,
|
||||
|
@ -1545,9 +1545,14 @@ namespace clang {
|
||||
|
||||
// ARC
|
||||
EXPR_OBJC_BRIDGED_CAST, // ObjCBridgedCastExpr
|
||||
|
||||
|
||||
STMT_MS_DEPENDENT_EXISTS, // MSDependentExistsStmt
|
||||
EXPR_LAMBDA // LambdaExpr
|
||||
EXPR_LAMBDA, // LambdaExpr
|
||||
STMT_COROUTINE_BODY,
|
||||
STMT_CORETURN,
|
||||
EXPR_COAWAIT,
|
||||
EXPR_COYIELD,
|
||||
EXPR_DEPENDENT_COAWAIT,
|
||||
};
|
||||
|
||||
/// \brief The kinds of designators that can occur in a
|
||||
|
@ -378,8 +378,12 @@ void ODRHash::AddCXXRecordDecl(const CXXRecordDecl *Record) {
|
||||
assert(Record && Record->hasDefinition() &&
|
||||
"Expected non-null record to be a definition.");
|
||||
|
||||
if (isa<ClassTemplateSpecializationDecl>(Record)) {
|
||||
return;
|
||||
const DeclContext *DC = Record;
|
||||
while (DC) {
|
||||
if (isa<ClassTemplateSpecializationDecl>(DC)) {
|
||||
return;
|
||||
}
|
||||
DC = DC->getParent();
|
||||
}
|
||||
|
||||
AddDecl(Record);
|
||||
|
@ -96,6 +96,20 @@ CoroutineBodyStmt *CoroutineBodyStmt::Create(
|
||||
return new (Mem) CoroutineBodyStmt(Args);
|
||||
}
|
||||
|
||||
CoroutineBodyStmt *CoroutineBodyStmt::Create(const ASTContext &C, EmptyShell,
|
||||
unsigned NumParams) {
|
||||
std::size_t Size = totalSizeToAlloc<Stmt *>(
|
||||
CoroutineBodyStmt::FirstParamMove + NumParams);
|
||||
|
||||
void *Mem = C.Allocate(Size, alignof(CoroutineBodyStmt));
|
||||
auto *Result = new (Mem) CoroutineBodyStmt(CtorArgs());
|
||||
Result->NumParams = NumParams;
|
||||
auto *ParamBegin = Result->getStoredStmts() + SubStmt::FirstParamMove;
|
||||
std::uninitialized_fill(ParamBegin, ParamBegin + NumParams,
|
||||
static_cast<Stmt *>(nullptr));
|
||||
return Result;
|
||||
}
|
||||
|
||||
CoroutineBodyStmt::CoroutineBodyStmt(CoroutineBodyStmt::CtorArgs const &Args)
|
||||
: Stmt(CoroutineBodyStmtClass), NumParams(Args.ParamMoves.size()) {
|
||||
Stmt **SubStmts = getStoredStmts();
|
||||
|
@ -8050,7 +8050,6 @@ class MipsTargetInfo : public TargetInfo {
|
||||
NoDSP, DSP1, DSP2
|
||||
} DspRev;
|
||||
bool HasMSA;
|
||||
bool DisableMadd4;
|
||||
|
||||
protected:
|
||||
bool HasFP64;
|
||||
@ -8061,7 +8060,7 @@ class MipsTargetInfo : public TargetInfo {
|
||||
: TargetInfo(Triple), IsMips16(false), IsMicromips(false),
|
||||
IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
|
||||
CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
|
||||
HasMSA(false), DisableMadd4(false), HasFP64(false) {
|
||||
HasMSA(false), HasFP64(false) {
|
||||
TheCXXABI.set(TargetCXXABI::GenericMIPS);
|
||||
|
||||
setABI((getTriple().getArch() == llvm::Triple::mips ||
|
||||
@ -8307,9 +8306,6 @@ class MipsTargetInfo : public TargetInfo {
|
||||
if (HasMSA)
|
||||
Builder.defineMacro("__mips_msa", Twine(1));
|
||||
|
||||
if (DisableMadd4)
|
||||
Builder.defineMacro("__mips_no_madd4", Twine(1));
|
||||
|
||||
Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
|
||||
Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
|
||||
Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
|
||||
@ -8472,8 +8468,6 @@ class MipsTargetInfo : public TargetInfo {
|
||||
DspRev = std::max(DspRev, DSP2);
|
||||
else if (Feature == "+msa")
|
||||
HasMSA = true;
|
||||
else if (Feature == "+nomadd4")
|
||||
DisableMadd4 = true;
|
||||
else if (Feature == "+fp64")
|
||||
HasFP64 = true;
|
||||
else if (Feature == "-fp64")
|
||||
|
@ -297,8 +297,6 @@ void mips::getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
|
||||
|
||||
AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
|
||||
options::OPT_modd_spreg, "nooddspreg");
|
||||
AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
|
||||
"nomadd4");
|
||||
AddTargetFeature(Args, Features, options::OPT_mlong_calls,
|
||||
options::OPT_mno_long_calls, "long-calls");
|
||||
AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,"mt");
|
||||
|
@ -133,6 +133,8 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
}
|
||||
}
|
||||
|
||||
if (Args.hasArg(options::OPT_pie))
|
||||
CmdArgs.push_back("-pie");
|
||||
if (Args.hasArg(options::OPT_nopie))
|
||||
CmdArgs.push_back("-nopie");
|
||||
|
||||
|
@ -832,7 +832,8 @@ _mm256_xor_si256(__m256i __a, __m256i __b)
|
||||
static __inline__ __m256i __DEFAULT_FN_ATTRS
|
||||
_mm256_stream_load_si256(__m256i const *__V)
|
||||
{
|
||||
return (__m256i)__builtin_nontemporal_load((const __v4di *)__V);
|
||||
typedef __v4di __v4di_aligned __attribute__((aligned(32)));
|
||||
return (__m256i)__builtin_nontemporal_load((const __v4di_aligned *)__V);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __DEFAULT_FN_ATTRS
|
||||
|
@ -4289,7 +4289,7 @@ static __inline__ __m512i __DEFAULT_FN_ATTRS
|
||||
_mm512_maskz_cvtps_epu32 ( __mmask16 __U, __m512 __A)
|
||||
{
|
||||
return (__m512i) __builtin_ia32_cvtps2udq512_mask ((__v16sf) __A,
|
||||
(__v16si)
|
||||
(__v16si)
|
||||
_mm512_setzero_si512 (),
|
||||
(__mmask16) __U ,
|
||||
_MM_FROUND_CUR_DIRECTION);
|
||||
@ -9035,25 +9035,29 @@ _mm512_kxor (__mmask16 __A, __mmask16 __B)
|
||||
static __inline__ void __DEFAULT_FN_ATTRS
|
||||
_mm512_stream_si512 (__m512i * __P, __m512i __A)
|
||||
{
|
||||
__builtin_nontemporal_store((__v8di)__A, (__v8di*)__P);
|
||||
typedef __v8di __v8di_aligned __attribute__((aligned(64)));
|
||||
__builtin_nontemporal_store((__v8di_aligned)__A, (__v8di_aligned*)__P);
|
||||
}
|
||||
|
||||
static __inline__ __m512i __DEFAULT_FN_ATTRS
|
||||
_mm512_stream_load_si512 (void *__P)
|
||||
{
|
||||
return (__m512i) __builtin_nontemporal_load((const __v8di *)__P);
|
||||
typedef __v8di __v8di_aligned __attribute__((aligned(64)));
|
||||
return (__m512i) __builtin_nontemporal_load((const __v8di_aligned *)__P);
|
||||
}
|
||||
|
||||
static __inline__ void __DEFAULT_FN_ATTRS
|
||||
_mm512_stream_pd (double *__P, __m512d __A)
|
||||
{
|
||||
__builtin_nontemporal_store((__v8df)__A, (__v8df*)__P);
|
||||
typedef __v8df __v8df_aligned __attribute__((aligned(64)));
|
||||
__builtin_nontemporal_store((__v8df_aligned)__A, (__v8df_aligned*)__P);
|
||||
}
|
||||
|
||||
static __inline__ void __DEFAULT_FN_ATTRS
|
||||
_mm512_stream_ps (float *__P, __m512 __A)
|
||||
{
|
||||
__builtin_nontemporal_store((__v16sf)__A, (__v16sf*)__P);
|
||||
typedef __v16sf __v16sf_aligned __attribute__((aligned(64)));
|
||||
__builtin_nontemporal_store((__v16sf_aligned)__A, (__v16sf_aligned*)__P);
|
||||
}
|
||||
|
||||
static __inline__ __m512d __DEFAULT_FN_ATTRS
|
||||
@ -9217,39 +9221,39 @@ _mm512_maskz_moveldup_ps (__mmask16 __U, __m512 __A)
|
||||
static __inline__ __m128 __DEFAULT_FN_ATTRS
|
||||
_mm_mask_move_ss (__m128 __W, __mmask8 __U, __m128 __A, __m128 __B)
|
||||
{
|
||||
__m128 res = __A;
|
||||
__m128 res = __A;
|
||||
res[0] = (__U & 1) ? __B[0] : __W[0];
|
||||
return res;
|
||||
return res;
|
||||
}
|
||||
|
||||
static __inline__ __m128 __DEFAULT_FN_ATTRS
|
||||
_mm_maskz_move_ss (__mmask8 __U, __m128 __A, __m128 __B)
|
||||
{
|
||||
__m128 res = __A;
|
||||
res[0] = (__U & 1) ? __B[0] : 0;
|
||||
return res;
|
||||
__m128 res = __A;
|
||||
res[0] = (__U & 1) ? __B[0] : 0;
|
||||
return res;
|
||||
}
|
||||
|
||||
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
||||
_mm_mask_move_sd (__m128d __W, __mmask8 __U, __m128d __A, __m128d __B)
|
||||
{
|
||||
__m128d res = __A;
|
||||
__m128d res = __A;
|
||||
res[0] = (__U & 1) ? __B[0] : __W[0];
|
||||
return res;
|
||||
return res;
|
||||
}
|
||||
|
||||
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
||||
_mm_maskz_move_sd (__mmask8 __U, __m128d __A, __m128d __B)
|
||||
{
|
||||
__m128d res = __A;
|
||||
res[0] = (__U & 1) ? __B[0] : 0;
|
||||
return res;
|
||||
__m128d res = __A;
|
||||
res[0] = (__U & 1) ? __B[0] : 0;
|
||||
return res;
|
||||
}
|
||||
|
||||
static __inline__ void __DEFAULT_FN_ATTRS
|
||||
_mm_mask_store_ss (float * __W, __mmask8 __U, __m128 __A)
|
||||
{
|
||||
__builtin_ia32_storess128_mask ((__v16sf *)__W,
|
||||
__builtin_ia32_storess128_mask ((__v16sf *)__W,
|
||||
(__v16sf) _mm512_castps128_ps512(__A),
|
||||
(__mmask16) __U & (__mmask16)1);
|
||||
}
|
||||
@ -9257,7 +9261,7 @@ _mm_mask_store_ss (float * __W, __mmask8 __U, __m128 __A)
|
||||
static __inline__ void __DEFAULT_FN_ATTRS
|
||||
_mm_mask_store_sd (double * __W, __mmask8 __U, __m128d __A)
|
||||
{
|
||||
__builtin_ia32_storesd128_mask ((__v8df *)__W,
|
||||
__builtin_ia32_storesd128_mask ((__v8df *)__W,
|
||||
(__v8df) _mm512_castpd128_pd512(__A),
|
||||
(__mmask8) __U & 1);
|
||||
}
|
||||
@ -9606,7 +9610,7 @@ _mm_mask_cvtsd_ss (__m128 __W, __mmask8 __U, __m128 __A, __m128d __B)
|
||||
{
|
||||
return __builtin_ia32_cvtsd2ss_round_mask ((__v4sf)(__A),
|
||||
(__v2df)(__B),
|
||||
(__v4sf)(__W),
|
||||
(__v4sf)(__W),
|
||||
(__mmask8)(__U), _MM_FROUND_CUR_DIRECTION);
|
||||
}
|
||||
|
||||
@ -9615,7 +9619,7 @@ _mm_maskz_cvtsd_ss (__mmask8 __U, __m128 __A, __m128d __B)
|
||||
{
|
||||
return __builtin_ia32_cvtsd2ss_round_mask ((__v4sf)(__A),
|
||||
(__v2df)(__B),
|
||||
(__v4sf)_mm_setzero_ps(),
|
||||
(__v4sf)_mm_setzero_ps(),
|
||||
(__mmask8)(__U), _MM_FROUND_CUR_DIRECTION);
|
||||
}
|
||||
|
||||
@ -9680,7 +9684,7 @@ _mm_mask_cvtss_sd (__m128d __W, __mmask8 __U, __m128d __A, __m128 __B)
|
||||
return __builtin_ia32_cvtss2sd_round_mask((__v2df)(__A),
|
||||
(__v4sf)(__B),
|
||||
(__v2df)(__W),
|
||||
(__mmask8)(__U), _MM_FROUND_CUR_DIRECTION);
|
||||
(__mmask8)(__U), _MM_FROUND_CUR_DIRECTION);
|
||||
}
|
||||
|
||||
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
||||
@ -9688,8 +9692,8 @@ _mm_maskz_cvtss_sd (__mmask8 __U, __m128d __A, __m128 __B)
|
||||
{
|
||||
return __builtin_ia32_cvtss2sd_round_mask((__v2df)(__A),
|
||||
(__v4sf)(__B),
|
||||
(__v2df)_mm_setzero_pd(),
|
||||
(__mmask8)(__U), _MM_FROUND_CUR_DIRECTION);
|
||||
(__v2df)_mm_setzero_pd(),
|
||||
(__mmask8)(__U), _MM_FROUND_CUR_DIRECTION);
|
||||
}
|
||||
|
||||
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
||||
@ -9935,7 +9939,7 @@ static __inline__ double __DEFAULT_FN_ATTRS _mm512_reduce_mul_pd(__m512d __W) {
|
||||
}
|
||||
|
||||
// Vec512 - Vector with size 512.
|
||||
// Vec512Neutral - All vector elements set to the identity element.
|
||||
// Vec512Neutral - All vector elements set to the identity element.
|
||||
// Identity element: {+,0},{*,1},{&,0xFFFFFFFFFFFFFFFF},{|,0}
|
||||
// Operator - Can be one of following: +,*,&,|
|
||||
// Mask - Intrinsic Mask
|
||||
@ -9965,19 +9969,19 @@ _mm512_mask_reduce_mul_epi64(__mmask8 __M, __m512i __W) {
|
||||
|
||||
static __inline__ long long __DEFAULT_FN_ATTRS
|
||||
_mm512_mask_reduce_and_epi64(__mmask8 __M, __m512i __W) {
|
||||
_mm512_mask_reduce_operator_64bit(__W, _mm512_set1_epi64(0xFFFFFFFFFFFFFFFF),
|
||||
_mm512_mask_reduce_operator_64bit(__W, _mm512_set1_epi64(0xFFFFFFFFFFFFFFFF),
|
||||
&, __M, i, i, q);
|
||||
}
|
||||
|
||||
static __inline__ long long __DEFAULT_FN_ATTRS
|
||||
_mm512_mask_reduce_or_epi64(__mmask8 __M, __m512i __W) {
|
||||
_mm512_mask_reduce_operator_64bit(__W, _mm512_set1_epi64(0), |, __M,
|
||||
_mm512_mask_reduce_operator_64bit(__W, _mm512_set1_epi64(0), |, __M,
|
||||
i, i, q);
|
||||
}
|
||||
|
||||
static __inline__ double __DEFAULT_FN_ATTRS
|
||||
_mm512_mask_reduce_add_pd(__mmask8 __M, __m512d __W) {
|
||||
_mm512_mask_reduce_operator_64bit(__W, _mm512_set1_pd(0), +, __M,
|
||||
_mm512_mask_reduce_operator_64bit(__W, _mm512_set1_pd(0), +, __M,
|
||||
f, d, pd);
|
||||
}
|
||||
|
||||
@ -10039,17 +10043,17 @@ _mm512_reduce_add_epi32(__m512i __W) {
|
||||
_mm512_reduce_operator_32bit(__W, +, i, i);
|
||||
}
|
||||
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
_mm512_reduce_mul_epi32(__m512i __W) {
|
||||
_mm512_reduce_operator_32bit(__W, *, i, i);
|
||||
}
|
||||
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
_mm512_reduce_and_epi32(__m512i __W) {
|
||||
_mm512_reduce_operator_32bit(__W, &, i, i);
|
||||
}
|
||||
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
_mm512_reduce_or_epi32(__m512i __W) {
|
||||
_mm512_reduce_operator_32bit(__W, |, i, i);
|
||||
}
|
||||
@ -10065,7 +10069,7 @@ _mm512_reduce_mul_ps(__m512 __W) {
|
||||
}
|
||||
|
||||
// Vec512 - Vector with size 512.
|
||||
// Vec512Neutral - All vector elements set to the identity element.
|
||||
// Vec512Neutral - All vector elements set to the identity element.
|
||||
// Identity element: {+,0},{*,1},{&,0xFFFFFFFF},{|,0}
|
||||
// Operator - Can be one of following: +,*,&,|
|
||||
// Mask - Intrinsic Mask
|
||||
@ -10095,7 +10099,7 @@ _mm512_mask_reduce_mul_epi32( __mmask16 __M, __m512i __W) {
|
||||
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
_mm512_mask_reduce_and_epi32( __mmask16 __M, __m512i __W) {
|
||||
_mm512_mask_reduce_operator_32bit(__W, _mm512_set1_epi32(0xFFFFFFFF), &, __M,
|
||||
_mm512_mask_reduce_operator_32bit(__W, _mm512_set1_epi32(0xFFFFFFFF), &, __M,
|
||||
i, i, d);
|
||||
}
|
||||
|
||||
@ -10158,7 +10162,7 @@ _mm512_mask_reduce_mul_ps(__mmask16 __M, __m512 __W) {
|
||||
return Vec512[0]; \
|
||||
})
|
||||
|
||||
static __inline__ long long __DEFAULT_FN_ATTRS
|
||||
static __inline__ long long __DEFAULT_FN_ATTRS
|
||||
_mm512_reduce_max_epi64(__m512i __V) {
|
||||
_mm512_reduce_maxMin_64bit(__V, max_epi64, i, i);
|
||||
}
|
||||
@ -10168,7 +10172,7 @@ _mm512_reduce_max_epu64(__m512i __V) {
|
||||
_mm512_reduce_maxMin_64bit(__V, max_epu64, i, i);
|
||||
}
|
||||
|
||||
static __inline__ double __DEFAULT_FN_ATTRS
|
||||
static __inline__ double __DEFAULT_FN_ATTRS
|
||||
_mm512_reduce_max_pd(__m512d __V) {
|
||||
_mm512_reduce_maxMin_64bit(__V, max_pd, d, f);
|
||||
}
|
||||
@ -10183,7 +10187,7 @@ _mm512_reduce_min_epu64(__m512i __V) {
|
||||
_mm512_reduce_maxMin_64bit(__V, min_epu64, i, i);
|
||||
}
|
||||
|
||||
static __inline__ double __DEFAULT_FN_ATTRS
|
||||
static __inline__ double __DEFAULT_FN_ATTRS
|
||||
_mm512_reduce_min_pd(__m512d __V) {
|
||||
_mm512_reduce_maxMin_64bit(__V, min_pd, d, f);
|
||||
}
|
||||
|
@ -3590,7 +3590,8 @@ _mm_maskstore_ps(float *__p, __m128i __m, __m128 __a)
|
||||
static __inline void __DEFAULT_FN_ATTRS
|
||||
_mm256_stream_si256(__m256i *__a, __m256i __b)
|
||||
{
|
||||
__builtin_nontemporal_store((__v4di)__b, (__v4di*)__a);
|
||||
typedef __v4di __v4di_aligned __attribute__((aligned(32)));
|
||||
__builtin_nontemporal_store((__v4di_aligned)__b, (__v4di_aligned*)__a);
|
||||
}
|
||||
|
||||
/// \brief Moves double-precision values from a 256-bit vector of [4 x double]
|
||||
@ -3609,7 +3610,8 @@ _mm256_stream_si256(__m256i *__a, __m256i __b)
|
||||
static __inline void __DEFAULT_FN_ATTRS
|
||||
_mm256_stream_pd(double *__a, __m256d __b)
|
||||
{
|
||||
__builtin_nontemporal_store((__v4df)__b, (__v4df*)__a);
|
||||
typedef __v4df __v4df_aligned __attribute__((aligned(32)));
|
||||
__builtin_nontemporal_store((__v4df_aligned)__b, (__v4df_aligned*)__a);
|
||||
}
|
||||
|
||||
/// \brief Moves single-precision floating point values from a 256-bit vector
|
||||
@ -3629,7 +3631,8 @@ _mm256_stream_pd(double *__a, __m256d __b)
|
||||
static __inline void __DEFAULT_FN_ATTRS
|
||||
_mm256_stream_ps(float *__p, __m256 __a)
|
||||
{
|
||||
__builtin_nontemporal_store((__v8sf)__a, (__v8sf*)__p);
|
||||
typedef __v8sf __v8sf_aligned __attribute__((aligned(32)));
|
||||
__builtin_nontemporal_store((__v8sf_aligned)__a, (__v8sf_aligned*)__p);
|
||||
}
|
||||
|
||||
/* Create vectors */
|
||||
|
@ -33,6 +33,15 @@
|
||||
*/
|
||||
#if (defined(__APPLE__) || (defined(__MINGW32__) || defined(_MSC_VER))) && \
|
||||
__STDC_HOSTED__ && __has_include_next(<float.h>)
|
||||
|
||||
/* Prior to Apple's 10.7 SDK, float.h SDK header used to apply an extra level
|
||||
* of #include_next<float.h> to keep Metrowerks compilers happy. Avoid this
|
||||
* extra indirection.
|
||||
*/
|
||||
#ifdef __APPLE__
|
||||
#define _FLOAT_H_
|
||||
#endif
|
||||
|
||||
# include_next <float.h>
|
||||
|
||||
/* Undefine anything that we'll be redefining below. */
|
||||
|
@ -35,6 +35,14 @@ SourceLocation ScratchBuffer::getToken(const char *Buf, unsigned Len,
|
||||
const char *&DestPtr) {
|
||||
if (BytesUsed+Len+2 > ScratchBufSize)
|
||||
AllocScratchBuffer(Len+2);
|
||||
else {
|
||||
// Clear out the source line cache if it's already been computed.
|
||||
// FIXME: Allow this to be incrementally extended.
|
||||
auto *ContentCache = const_cast<SrcMgr::ContentCache *>(
|
||||
SourceMgr.getSLocEntry(SourceMgr.getFileID(BufferStartLoc))
|
||||
.getFile().getContentCache());
|
||||
ContentCache->SourceLineCache = nullptr;
|
||||
}
|
||||
|
||||
// Prefix the token with a \n, so that it looks like it is the first thing on
|
||||
// its own virtual line in caret diagnostics.
|
||||
|
@ -542,6 +542,9 @@ void Sema::getUndefinedButUsed(
|
||||
// __attribute__((weakref)) is basically a definition.
|
||||
if (ND->hasAttr<WeakRefAttr>()) continue;
|
||||
|
||||
if (isa<CXXDeductionGuideDecl>(ND))
|
||||
continue;
|
||||
|
||||
if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
|
||||
if (FD->isDefined())
|
||||
continue;
|
||||
|
@ -8288,7 +8288,7 @@ QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS,
|
||||
// type. Note that this is already done by non-compound assignments in
|
||||
// CheckAssignmentConstraints. If it's a scalar type, only bitcast for
|
||||
// <1 x T> -> T. The result is also a vector type.
|
||||
} else if (OtherType->isExtVectorType() ||
|
||||
} else if (OtherType->isExtVectorType() || OtherType->isVectorType() ||
|
||||
(OtherType->isScalarType() && VT->getNumElements() == 1)) {
|
||||
ExprResult *RHSExpr = &RHS;
|
||||
*RHSExpr = ImpCastExprToType(RHSExpr->get(), LHSType, CK_BitCast);
|
||||
|
@ -367,28 +367,45 @@ void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) {
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
VisitStmt(S);
|
||||
assert(Record.peekInt() == S->NumParams);
|
||||
Record.skipInts(1);
|
||||
auto *StoredStmts = S->getStoredStmts();
|
||||
for (unsigned i = 0;
|
||||
i < CoroutineBodyStmt::SubStmt::FirstParamMove + S->NumParams; ++i)
|
||||
StoredStmts[i] = Record.readSubStmt();
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitCoreturnStmt(CoreturnStmt *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
VisitStmt(S);
|
||||
S->CoreturnLoc = Record.readSourceLocation();
|
||||
for (auto &SubStmt: S->SubStmts)
|
||||
SubStmt = Record.readSubStmt();
|
||||
S->IsImplicit = Record.readInt() != 0;
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitCoawaitExpr(CoawaitExpr *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
void ASTStmtReader::VisitCoawaitExpr(CoawaitExpr *E) {
|
||||
VisitExpr(E);
|
||||
E->KeywordLoc = ReadSourceLocation();
|
||||
for (auto &SubExpr: E->SubExprs)
|
||||
SubExpr = Record.readSubStmt();
|
||||
E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt());
|
||||
E->setIsImplicit(Record.readInt() != 0);
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitDependentCoawaitExpr(DependentCoawaitExpr *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
void ASTStmtReader::VisitCoyieldExpr(CoyieldExpr *E) {
|
||||
VisitExpr(E);
|
||||
E->KeywordLoc = ReadSourceLocation();
|
||||
for (auto &SubExpr: E->SubExprs)
|
||||
SubExpr = Record.readSubStmt();
|
||||
E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt());
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitCoyieldExpr(CoyieldExpr *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
void ASTStmtReader::VisitDependentCoawaitExpr(DependentCoawaitExpr *E) {
|
||||
VisitExpr(E);
|
||||
E->KeywordLoc = ReadSourceLocation();
|
||||
for (auto &SubExpr: E->SubExprs)
|
||||
SubExpr = Record.readSubStmt();
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {
|
||||
@ -3947,6 +3964,29 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
|
||||
S = LambdaExpr::CreateDeserialized(Context, NumCaptures);
|
||||
break;
|
||||
}
|
||||
|
||||
case STMT_COROUTINE_BODY: {
|
||||
unsigned NumParams = Record[ASTStmtReader::NumStmtFields];
|
||||
S = CoroutineBodyStmt::Create(Context, Empty, NumParams);
|
||||
break;
|
||||
}
|
||||
|
||||
case STMT_CORETURN:
|
||||
S = new (Context) CoreturnStmt(Empty);
|
||||
break;
|
||||
|
||||
case EXPR_COAWAIT:
|
||||
S = new (Context) CoawaitExpr(Empty);
|
||||
break;
|
||||
|
||||
case EXPR_COYIELD:
|
||||
S = new (Context) CoyieldExpr(Empty);
|
||||
break;
|
||||
|
||||
case EXPR_DEPENDENT_COAWAIT:
|
||||
S = new (Context) DependentCoawaitExpr(Empty);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
// We hit a STMT_STOP, so we're done with this expression.
|
||||
|
@ -286,7 +286,7 @@ void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {
|
||||
}
|
||||
|
||||
// Outputs
|
||||
for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
|
||||
for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
|
||||
Record.AddStmt(S->getOutputExpr(I));
|
||||
Record.AddString(S->getOutputConstraint(I));
|
||||
}
|
||||
@ -300,29 +300,48 @@ void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {
|
||||
Code = serialization::STMT_MSASM;
|
||||
}
|
||||
|
||||
void ASTStmtWriter::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
void ASTStmtWriter::VisitCoroutineBodyStmt(CoroutineBodyStmt *CoroStmt) {
|
||||
VisitStmt(CoroStmt);
|
||||
Record.push_back(CoroStmt->getParamMoves().size());
|
||||
for (Stmt *S : CoroStmt->children())
|
||||
Record.AddStmt(S);
|
||||
Code = serialization::STMT_COROUTINE_BODY;
|
||||
}
|
||||
|
||||
void ASTStmtWriter::VisitCoreturnStmt(CoreturnStmt *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
VisitStmt(S);
|
||||
Record.AddSourceLocation(S->getKeywordLoc());
|
||||
Record.AddStmt(S->getOperand());
|
||||
Record.AddStmt(S->getPromiseCall());
|
||||
Record.push_back(S->isImplicit());
|
||||
Code = serialization::STMT_CORETURN;
|
||||
}
|
||||
|
||||
void ASTStmtWriter::VisitCoawaitExpr(CoawaitExpr *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
void ASTStmtWriter::VisitCoroutineSuspendExpr(CoroutineSuspendExpr *E) {
|
||||
VisitExpr(E);
|
||||
Record.AddSourceLocation(E->getKeywordLoc());
|
||||
for (Stmt *S : E->children())
|
||||
Record.AddStmt(S);
|
||||
Record.AddStmt(E->getOpaqueValue());
|
||||
}
|
||||
|
||||
void ASTStmtWriter::VisitDependentCoawaitExpr(DependentCoawaitExpr *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
void ASTStmtWriter::VisitCoawaitExpr(CoawaitExpr *E) {
|
||||
VisitCoroutineSuspendExpr(E);
|
||||
Record.push_back(E->isImplicit());
|
||||
Code = serialization::EXPR_COAWAIT;
|
||||
}
|
||||
|
||||
void ASTStmtWriter::VisitCoyieldExpr(CoyieldExpr *S) {
|
||||
// FIXME: Implement coroutine serialization.
|
||||
llvm_unreachable("unimplemented");
|
||||
void ASTStmtWriter::VisitCoyieldExpr(CoyieldExpr *E) {
|
||||
VisitCoroutineSuspendExpr(E);
|
||||
Code = serialization::EXPR_COYIELD;
|
||||
}
|
||||
|
||||
void ASTStmtWriter::VisitDependentCoawaitExpr(DependentCoawaitExpr *E) {
|
||||
VisitExpr(E);
|
||||
Record.AddSourceLocation(E->getKeywordLoc());
|
||||
for (Stmt *S : E->children())
|
||||
Record.AddStmt(S);
|
||||
Code = serialization::EXPR_DEPENDENT_COAWAIT;
|
||||
}
|
||||
|
||||
void ASTStmtWriter::VisitCapturedStmt(CapturedStmt *S) {
|
||||
|
@ -1,87 +0,0 @@
|
||||
// REQUIRES: mips-registered-target
|
||||
// RUN: %clang --target=mips64-unknown-linux -S -mmadd4 %s -o -| FileCheck %s -check-prefix=MADD4
|
||||
// RUN: %clang --target=mips64-unknown-linux -S -mno-madd4 %s -o -| FileCheck %s -check-prefix=NOMADD4
|
||||
// RUN: %clang --target=mips64-unknown-linux -S -mmadd4 -fno-honor-nans %s -o -| FileCheck %s -check-prefix=MADD4-NONAN
|
||||
// RUN: %clang --target=mips64-unknown-linux -S -mno-madd4 -fno-honor-nans %s -o -| FileCheck %s -check-prefix=NOMADD4-NONAN
|
||||
|
||||
float madd_s (float f, float g, float h)
|
||||
{
|
||||
return (f * g) + h;
|
||||
}
|
||||
// MADD4: madd.s
|
||||
// NOMADD4: mul.s
|
||||
// NOMADD4: add.s
|
||||
|
||||
float msub_s (float f, float g, float h)
|
||||
{
|
||||
return (f * g) - h;
|
||||
}
|
||||
// MADD4: msub.s
|
||||
// NOMADD4: mul.s
|
||||
// NOMADD4: sub.s
|
||||
|
||||
double madd_d (double f, double g, double h)
|
||||
{
|
||||
return (f * g) + h;
|
||||
}
|
||||
// MADD4: madd.d
|
||||
// NOMADD4: mul.d
|
||||
// NOMADD4: add.d
|
||||
|
||||
double msub_d (double f, double g, double h)
|
||||
{
|
||||
return (f * g) - h;
|
||||
}
|
||||
// MADD4: msub.d
|
||||
// NOMADD4: mul.d
|
||||
// NOMADD4: sub.d
|
||||
|
||||
|
||||
float nmadd_s (float f, float g, float h)
|
||||
{
|
||||
// FIXME: Zero has been explicitly placed to force generation of a positive
|
||||
// zero in IR until pattern used to match this instruction is changed to
|
||||
// comply with negative zero as well.
|
||||
return 0-((f * g) + h);
|
||||
}
|
||||
// MADD4-NONAN: nmadd.s
|
||||
// NOMADD4-NONAN: mul.s
|
||||
// NOMADD4-NONAN: add.s
|
||||
// NOMADD4-NONAN: sub.s
|
||||
|
||||
float nmsub_s (float f, float g, float h)
|
||||
{
|
||||
// FIXME: Zero has been explicitly placed to force generation of a positive
|
||||
// zero in IR until pattern used to match this instruction is changed to
|
||||
// comply with negative zero as well.
|
||||
return 0-((f * g) - h);
|
||||
}
|
||||
// MADD4-NONAN: nmsub.s
|
||||
// NOMADD4-NONAN: mul.s
|
||||
// NOMADD4-NONAN: sub.s
|
||||
// NOMADD4-NONAN: sub.s
|
||||
|
||||
double nmadd_d (double f, double g, double h)
|
||||
{
|
||||
// FIXME: Zero has been explicitly placed to force generation of a positive
|
||||
// zero in IR until pattern used to match this instruction is changed to
|
||||
// comply with negative zero as well.
|
||||
return 0-((f * g) + h);
|
||||
}
|
||||
// MADD4-NONAN: nmadd.d
|
||||
// NOMADD4-NONAN: mul.d
|
||||
// NOMADD4-NONAN: add.d
|
||||
// NOMADD4-NONAN: sub.d
|
||||
|
||||
double nmsub_d (double f, double g, double h)
|
||||
{
|
||||
// FIXME: Zero has been explicitly placed to force generation of a positive
|
||||
// zero in IR until pattern used to match this instruction is changed to
|
||||
// comply with negative zero as well.
|
||||
return 0-((f * g) - h);
|
||||
}
|
||||
// MADD4-NONAN: nmsub.d
|
||||
// NOMADD4-NONAN: mul.d
|
||||
// NOMADD4-NONAN: sub.d
|
||||
// NOMADD4-NONAN: sub.d
|
||||
|
11
test/CodeGen/pause.c
Normal file
11
test/CodeGen/pause.c
Normal file
@ -0,0 +1,11 @@
|
||||
// RUN: %clang_cc1 -ffreestanding %s -triple=i386-pc-win32 -target-feature -sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s
|
||||
// RUN: %clang_cc1 -ffreestanding %s -triple=i386-pc-win32 -target-feature +sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s
|
||||
|
||||
|
||||
#include <x86intrin.h>
|
||||
|
||||
void test_mm_pause() {
|
||||
// CHECK-LABEL: test_mm_pause
|
||||
// CHECK: call void @llvm.x86.sse2.pause()
|
||||
return _mm_pause();
|
||||
}
|
93
test/CodeGen/x86-nontemporal.c
Normal file
93
test/CodeGen/x86-nontemporal.c
Normal file
@ -0,0 +1,93 @@
|
||||
// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=CHECK
|
||||
// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=CHECK
|
||||
|
||||
// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -emit-llvm -o - -Wall -Werror -fmax-type-align=16 | FileCheck %s --check-prefix=CHECK
|
||||
// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -fno-signed-char -emit-llvm -o - -Wall -Werror -fmax-type-align=16 | FileCheck %s --check-prefix=CHECK
|
||||
|
||||
#include <x86intrin.h>
|
||||
|
||||
// (PR33830) Tests ensure the correct alignment of non-temporal load/stores on darwin targets where fmax-type-align is set to 16.
|
||||
|
||||
//
|
||||
// 128-bit vectors
|
||||
//
|
||||
|
||||
void test_mm_stream_pd(double* A, __m128d B) {
|
||||
// CHECK-LABEL: test_mm_stream_pd
|
||||
// CHECK: store <2 x double> %{{.*}}, <2 x double>* %{{.*}}, align 16, !nontemporal
|
||||
_mm_stream_pd(A, B);
|
||||
}
|
||||
|
||||
void test_mm_stream_ps(float* A, __m128 B) {
|
||||
// CHECK16-LABEL: test_mm_stream_ps
|
||||
// CHECK16: store <4 x float> %{{.*}}, <4 x float>* %{{.*}}, align 16, !nontemporal
|
||||
_mm_stream_ps(A, B);
|
||||
}
|
||||
|
||||
void test_mm_stream_si128(__m128i* A, __m128i B) {
|
||||
// CHECK-LABEL: test_mm_stream_si128
|
||||
// CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16, !nontemporal
|
||||
_mm_stream_si128(A, B);
|
||||
}
|
||||
|
||||
__m128i test_mm_stream_load_si128(__m128i const *A) {
|
||||
// CHECK-LABEL: test_mm_stream_load_si128
|
||||
// CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16, !nontemporal
|
||||
return _mm_stream_load_si128(A);
|
||||
}
|
||||
|
||||
//
|
||||
// 256-bit vectors
|
||||
//
|
||||
|
||||
void test_mm256_stream_pd(double* A, __m256d B) {
|
||||
// CHECK-LABEL: test_mm256_stream_pd
|
||||
// CHECK: store <4 x double> %{{.*}}, <4 x double>* %{{.*}}, align 32, !nontemporal
|
||||
_mm256_stream_pd(A, B);
|
||||
}
|
||||
|
||||
void test_mm256_stream_ps(float* A, __m256 B) {
|
||||
// CHECK-LABEL: test_mm256_stream_ps
|
||||
// CHECK: store <8 x float> %{{.*}}, <8 x float>* %{{.*}}, align 32, !nontemporal
|
||||
_mm256_stream_ps(A, B);
|
||||
}
|
||||
|
||||
void test_mm256_stream_si256(__m256i* A, __m256i B) {
|
||||
// CHECK-LABEL: test_mm256_stream_si256
|
||||
// CHECK: store <4 x i64> %{{.*}}, <4 x i64>* %{{.*}}, align 32, !nontemporal
|
||||
_mm256_stream_si256(A, B);
|
||||
}
|
||||
|
||||
__m256i test_mm256_stream_load_si256(__m256i const *A) {
|
||||
// CHECK-LABEL: test_mm256_stream_load_si256
|
||||
// CHECK: load <4 x i64>, <4 x i64>* %{{.*}}, align 32, !nontemporal
|
||||
return _mm256_stream_load_si256(A);
|
||||
}
|
||||
|
||||
//
|
||||
// 512-bit vectors
|
||||
//
|
||||
|
||||
void test_mm512_stream_pd(double* A, __m512d B) {
|
||||
// CHECK-LABEL: test_mm512_stream_pd
|
||||
// CHECK: store <8 x double> %{{.*}}, <8 x double>* %{{.*}}, align 64, !nontemporal
|
||||
_mm512_stream_pd(A, B);
|
||||
}
|
||||
|
||||
void test_mm512_stream_ps(float* A, __m512 B) {
|
||||
// CHECK-LABEL: test_mm512_stream_ps
|
||||
// CHECK: store <16 x float> %{{.*}}, <16 x float>* %{{.*}}, align 64, !nontemporal
|
||||
_mm512_stream_ps(A, B);
|
||||
}
|
||||
|
||||
void test_mm512_stream_si512(__m512i* A, __m512i B) {
|
||||
// CHECK-LABEL: test_mm512_stream_si512
|
||||
// CHECK: store <8 x i64> %{{.*}}, <8 x i64>* %{{.*}}, align 64, !nontemporal
|
||||
_mm512_stream_si512(A, B);
|
||||
}
|
||||
|
||||
__m512i test_mm512_stream_load_si512(void *A) {
|
||||
// CHECK-LABEL: test_mm512_stream_load_si512
|
||||
// CHECK: load <8 x i64>, <8 x i64>* %{{.*}}, align 64, !nontemporal
|
||||
return _mm512_stream_load_si512(A);
|
||||
}
|
@ -77,7 +77,9 @@
|
||||
// Check linking against correct startup code when (not) using PIE
|
||||
// RUN: %clang -no-canonical-prefixes -target i686-pc-openbsd %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=CHECK-PIE %s
|
||||
// RUN: %clang -no-canonical-prefixes -target i686-pc-openbsd %s -fno-pie %s -### 2>&1 \
|
||||
// RUN: %clang -no-canonical-prefixes -target i686-pc-openbsd -pie %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=CHECK-PIE-FLAG %s
|
||||
// RUN: %clang -no-canonical-prefixes -target i686-pc-openbsd -fno-pie %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=CHECK-PIE %s
|
||||
// RUN: %clang -no-canonical-prefixes -target i686-pc-openbsd -static %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=CHECK-STATIC-PIE %s
|
||||
@ -93,6 +95,7 @@
|
||||
// RUN: | FileCheck -check-prefix=CHECK-NOPIE %s
|
||||
// CHECK-PIE: "{{.*}}crt0.o"
|
||||
// CHECK-PIE-NOT: "-nopie"
|
||||
// CHECK-PIE-FLAG: "-pie"
|
||||
// CHECK-STATIC-PIE: "{{.*}}rcrt0.o"
|
||||
// CHECK-STATIC-PIE-NOT: "-nopie"
|
||||
// CHECK-NOPIE: "-nopie" "{{.*}}crt0.o"
|
||||
|
@ -232,3 +232,8 @@ void multiple_ranges(int a, int b) {
|
||||
b
|
||||
);
|
||||
}
|
||||
|
||||
#define pr33902_a(b) #b
|
||||
#define pr33902_c(d) _Pragma(pr33902_a(d))
|
||||
#define pr33902_e(f) pr33902_c(GCC warning #f)
|
||||
pr33902_e() pr33902_e()
|
||||
|
77
test/PCH/coroutines.cpp
Normal file
77
test/PCH/coroutines.cpp
Normal file
@ -0,0 +1,77 @@
|
||||
// Test this without pch.
|
||||
// RUN: %clang_cc1 -include %s -verify -std=c++1z -fcoroutines-ts %s
|
||||
|
||||
// Test with pch.
|
||||
// RUN: %clang_cc1 -std=c++1z -fcoroutines-ts -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -include-pch %t -verify -std=c++1z -fcoroutines-ts %s
|
||||
|
||||
#ifndef HEADER
|
||||
#define HEADER
|
||||
|
||||
namespace std::experimental {
|
||||
template <typename... T> struct coroutine_traits;
|
||||
|
||||
template <class Promise = void> struct coroutine_handle {
|
||||
coroutine_handle() = default;
|
||||
static coroutine_handle from_address(void *) noexcept;
|
||||
};
|
||||
template <> struct coroutine_handle<void> {
|
||||
static coroutine_handle from_address(void *) noexcept;
|
||||
coroutine_handle() = default;
|
||||
template <class PromiseType>
|
||||
coroutine_handle(coroutine_handle<PromiseType>) noexcept;
|
||||
};
|
||||
}
|
||||
|
||||
struct suspend_always {
|
||||
bool await_ready() noexcept;
|
||||
void await_suspend(std::experimental::coroutine_handle<>) noexcept;
|
||||
void await_resume() noexcept;
|
||||
};
|
||||
|
||||
template <typename... Args> struct std::experimental::coroutine_traits<void, Args...> {
|
||||
struct promise_type {
|
||||
void get_return_object() noexcept;
|
||||
suspend_always initial_suspend() noexcept;
|
||||
suspend_always final_suspend() noexcept;
|
||||
void return_void() noexcept;
|
||||
suspend_always yield_value(int) noexcept;
|
||||
promise_type();
|
||||
~promise_type() noexcept;
|
||||
void unhandled_exception() noexcept;
|
||||
};
|
||||
};
|
||||
|
||||
template <typename... Args> struct std::experimental::coroutine_traits<int, Args...> {
|
||||
struct promise_type {
|
||||
int get_return_object() noexcept;
|
||||
suspend_always initial_suspend() noexcept;
|
||||
suspend_always final_suspend() noexcept;
|
||||
void return_value(int) noexcept;
|
||||
promise_type();
|
||||
~promise_type() noexcept;
|
||||
void unhandled_exception() noexcept;
|
||||
};
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
void f(T x) { // checks coawait_expr and coroutine_body_stmt
|
||||
co_yield 42; // checks coyield_expr
|
||||
co_await x; // checks dependent_coawait
|
||||
co_return; // checks coreturn_stmt
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
int f2(T x) { // checks coawait_expr and coroutine_body_stmt
|
||||
co_return x; // checks coreturn_stmt with expr
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// expected-no-diagnostics
|
||||
void g() {
|
||||
f(suspend_always{});
|
||||
f2(42);
|
||||
}
|
||||
|
||||
#endif
|
@ -4686,16 +4686,6 @@
|
||||
// RUN: | FileCheck -match-full-lines -check-prefix MIPS-MSA %s
|
||||
// MIPS-MSA:#define __mips_msa 1
|
||||
//
|
||||
// RUN: %clang_cc1 -target-feature +nomadd4 \
|
||||
// RUN: -E -dM -triple=mips-none-none < /dev/null \
|
||||
// RUN: | FileCheck -match-full-lines -check-prefix MIPS-NOMADD4 %s
|
||||
// MIPS-NOMADD4:#define __mips_no_madd4 1
|
||||
//
|
||||
// RUN: %clang_cc1 \
|
||||
// RUN: -E -dM -triple=mips-none-none < /dev/null \
|
||||
// RUN: | FileCheck -match-full-lines -check-prefix MIPS-MADD4 %s
|
||||
// MIPS-MADD4-NOT:#define __mips_no_madd4 1
|
||||
//
|
||||
// RUN: %clang_cc1 -target-cpu mips32r3 -target-feature +nan2008 \
|
||||
// RUN: -E -dM -triple=mips-none-none < /dev/null \
|
||||
// RUN: | FileCheck -match-full-lines -check-prefix MIPS-NAN2008 %s
|
||||
|
@ -48,6 +48,9 @@ typedef float float2 __attribute__ ((vector_size (8)));
|
||||
typedef __attribute__((vector_size(8))) double float64x1_t;
|
||||
typedef __attribute__((vector_size(16))) double float64x2_t;
|
||||
float64x1_t vget_low_f64(float64x2_t __p0);
|
||||
typedef float float16 __attribute__((__vector_size__(16)));
|
||||
typedef signed int vSInt32 __attribute__((__vector_size__(16)));
|
||||
typedef unsigned int vUInt32 __attribute__((__vector_size__(16)));
|
||||
|
||||
void f4() {
|
||||
float2 f2;
|
||||
@ -73,3 +76,8 @@ void f5() {
|
||||
v = ptr; // expected-error-re {{assigning to 'short_sizeof_pointer' (vector of {{[0-9]+}} 'short' values) from incompatible type 'void *'}}
|
||||
ptr = v; // expected-error {{assigning to 'void *' from incompatible type 'short_sizeof_pointer'}}
|
||||
}
|
||||
|
||||
void f6(vSInt32 a0) {
|
||||
vUInt32 counter = (float16){0.0f, 0.0f, 0.0f, 0.0f}; // expected-warning {{incompatible vector types initializing 'vUInt32' (vector of 4 'unsigned int' values) with an expression of type 'float16' (vector of 4 'float' values)}}
|
||||
counter -= a0;
|
||||
}
|
||||
|
@ -1,4 +1,9 @@
|
||||
// RUN: %clang_cc1 -std=c++1z -verify %s
|
||||
// RUN: %clang_cc1 -std=c++1z -verify %s -DERRORS
|
||||
// RUN: %clang_cc1 -std=c++1z -verify %s -UERRORS
|
||||
|
||||
// This test is split into two because we only produce "undefined internal"
|
||||
// warnings if we didn't produce any errors.
|
||||
#if ERRORS
|
||||
|
||||
namespace std {
|
||||
using size_t = decltype(sizeof(0));
|
||||
@ -280,3 +285,21 @@ namespace tuple_tests {
|
||||
scoped_lock l = {};
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// expected-no-diagnostics
|
||||
namespace undefined_warnings {
|
||||
// Make sure we don't get an "undefined but used internal symbol" warning for the deduction guide here.
|
||||
namespace {
|
||||
template <typename T>
|
||||
struct TemplDObj {
|
||||
explicit TemplDObj(T func) noexcept {}
|
||||
};
|
||||
auto test1 = TemplDObj(0);
|
||||
|
||||
TemplDObj(float) -> TemplDObj<double>;
|
||||
auto test2 = TemplDObj(.0f);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user