|
@@ -4615,8 +4615,36 @@ bool Sema::CheckCallingConvAttr(const ParsedAttr &Attrs, CallingConv &CC,
|
|
default: llvm_unreachable("unexpected attribute kind");
|
|
default: llvm_unreachable("unexpected attribute kind");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ TargetInfo::CallingConvCheckResult A = TargetInfo::CCCR_OK;
|
|
const TargetInfo &TI = Context.getTargetInfo();
|
|
const TargetInfo &TI = Context.getTargetInfo();
|
|
- TargetInfo::CallingConvCheckResult A = TI.checkCallingConvention(CC);
|
|
|
|
|
|
+ auto *Aux = Context.getAuxTargetInfo();
|
|
|
|
+ if (LangOpts.CUDA) {
|
|
|
|
+ auto CudaTarget = IdentifyCUDATarget(FD);
|
|
|
|
+ bool CheckHost = false, CheckDevice = false;
|
|
|
|
+ switch (CudaTarget) {
|
|
|
|
+ case CFT_HostDevice:
|
|
|
|
+ CheckHost = true;
|
|
|
|
+ CheckDevice = true;
|
|
|
|
+ break;
|
|
|
|
+ case CFT_Host:
|
|
|
|
+ CheckHost = true;
|
|
|
|
+ break;
|
|
|
|
+ case CFT_Device:
|
|
|
|
+ case CFT_Global:
|
|
|
|
+ CheckDevice = true;
|
|
|
|
+ break;
|
|
|
|
+ case CFT_InvalidTarget:
|
|
|
|
+ llvm_unreachable("unexpected cuda target");
|
|
|
|
+ }
|
|
|
|
+ auto *HostTI = LangOpts.CUDAIsDevice ? Aux : &TI;
|
|
|
|
+ auto *DeviceTI = LangOpts.CUDAIsDevice ? &TI : Aux;
|
|
|
|
+ if (CheckHost && HostTI)
|
|
|
|
+ A = HostTI->checkCallingConvention(CC);
|
|
|
|
+ if (A == TargetInfo::CCCR_OK && CheckDevice && DeviceTI)
|
|
|
|
+ A = DeviceTI->checkCallingConvention(CC);
|
|
|
|
+ } else {
|
|
|
|
+ A = TI.checkCallingConvention(CC);
|
|
|
|
+ }
|
|
if (A != TargetInfo::CCCR_OK) {
|
|
if (A != TargetInfo::CCCR_OK) {
|
|
if (A == TargetInfo::CCCR_Warning)
|
|
if (A == TargetInfo::CCCR_Warning)
|
|
Diag(Attrs.getLoc(), diag::warn_cconv_ignored) << Attrs;
|
|
Diag(Attrs.getLoc(), diag::warn_cconv_ignored) << Attrs;
|