r246193 - [CUDA] Check register names on appropriate side of cuda compilation only.
Artem Belevich via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 27 12:54:22 PDT 2015
Author: tra
Date: Thu Aug 27 14:54:21 2015
New Revision: 246193
URL: http://llvm.org/viewvc/llvm-project?rev=246193&view=rev
Log:
[CUDA] Check register names on appropriate side of cuda compilation only.
Differential Revision: http://reviews.llvm.org/D11950
Modified:
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/lib/Sema/SemaStmtAsm.cpp
cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=246193&r1=246192&r2=246193&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Aug 27 14:54:21 2015
@@ -5998,7 +5998,8 @@ Sema::ActOnVariableDeclarator(Scope *S,
break;
case SC_Register:
// Local Named register
- if (!Context.getTargetInfo().isValidGCCRegisterName(Label))
+ if (!Context.getTargetInfo().isValidGCCRegisterName(Label) &&
+ DeclAttrsMatchCUDAMode(getLangOpts(), getCurFunctionDecl()))
Diag(E->getExprLoc(), diag::err_asm_unknown_register_name) << Label;
break;
case SC_Static:
@@ -6009,7 +6010,8 @@ Sema::ActOnVariableDeclarator(Scope *S,
}
} else if (SC == SC_Register) {
// Global Named register
- if (!Context.getTargetInfo().isValidGCCRegisterName(Label))
+ if (!Context.getTargetInfo().isValidGCCRegisterName(Label) &&
+ DeclAttrsMatchCUDAMode(getLangOpts(), NewVD))
Diag(E->getExprLoc(), diag::err_asm_unknown_register_name) << Label;
if (!R->isIntegralType(Context) && !R->isPointerType()) {
Diag(D.getLocStart(), diag::err_asm_bad_register_type);
Modified: cfe/trunk/lib/Sema/SemaStmtAsm.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmtAsm.cpp?rev=246193&r1=246192&r2=246193&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaStmtAsm.cpp (original)
+++ cfe/trunk/lib/Sema/SemaStmtAsm.cpp Thu Aug 27 14:54:21 2015
@@ -155,8 +155,14 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceL
// The parser verifies that there is a string literal here.
assert(AsmString->isAscii());
- bool ValidateConstraints =
- DeclAttrsMatchCUDAMode(getLangOpts(), getCurFunctionDecl());
+ // If we're compiling CUDA file and function attributes indicate that it's not
+ // for this compilation side, skip all the checks.
+ if (!DeclAttrsMatchCUDAMode(getLangOpts(), getCurFunctionDecl())) {
+ GCCAsmStmt *NS = new (Context) GCCAsmStmt(
+ Context, AsmLoc, IsSimple, IsVolatile, NumOutputs, NumInputs, Names,
+ Constraints, Exprs.data(), AsmString, NumClobbers, Clobbers, RParenLoc);
+ return NS;
+ }
for (unsigned i = 0; i != NumOutputs; i++) {
StringLiteral *Literal = Constraints[i];
@@ -167,8 +173,7 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceL
OutputName = Names[i]->getName();
TargetInfo::ConstraintInfo Info(Literal->getString(), OutputName);
- if (ValidateConstraints &&
- !Context.getTargetInfo().validateOutputConstraint(Info))
+ if (!Context.getTargetInfo().validateOutputConstraint(Info))
return StmtError(Diag(Literal->getLocStart(),
diag::err_asm_invalid_output_constraint)
<< Info.getConstraintStr());
@@ -247,8 +252,7 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceL
InputName = Names[i]->getName();
TargetInfo::ConstraintInfo Info(Literal->getString(), InputName);
- if (ValidateConstraints &&
- !Context.getTargetInfo().validateInputConstraint(
+ if (!Context.getTargetInfo().validateInputConstraint(
OutputConstraintInfos.data(), NumOutputs, Info)) {
return StmtError(Diag(Literal->getLocStart(),
diag::err_asm_invalid_input_constraint)
Modified: cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu?rev=246193&r1=246192&r2=246193&view=diff
==============================================================================
--- cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu (original)
+++ cfe/trunk/test/SemaCUDA/asm-constraints-mixed.cu Thu Aug 27 14:54:21 2015
@@ -1,15 +1,39 @@
+// REQUIRES: x86-registered-target
+// REQUIRES: nvptx-registered-target
// RUN: %clang_cc1 -triple nvptx-unknown-cuda -fsyntax-only -fcuda-is-device -verify %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only -verify %s
-// expected-no-diagnostics
+
+__attribute__((device)) register long global_dev_reg asm("r0");
+__attribute__((device)) register long
+ global_dev_hreg asm("rax"); // device-side error
+
+register long global_host_reg asm("rax");
+register long global_host_dreg asm("r0"); // host-side error
__attribute__((device)) void df() {
+ register long local_dev_reg asm("r0");
+ register long local_host_reg asm("rax"); // device-side error
short h;
// asm with PTX constraints. Some of them are PTX-specific.
- __asm__("dont care" : "=h"(h): "f"(0.0), "d"(0.0), "h"(0), "r"(0), "l"(0));
+ __asm__("dont care" : "=h"(h) : "f"(0.0), "d"(0.0), "h"(0), "r"(0), "l"(0));
}
void hf() {
+ register long local_dev_reg asm("r0"); // host-side error
+ register long local_host_reg asm("rax");
int a;
- // Asm with x86 constraints that are not supported by PTX.
- __asm__("dont care" : "=a"(a): "a"(0), "b"(0), "c"(0));
+ // Asm with x86 constraints and registers that are not supported by PTX.
+ __asm__("dont care" : "=a"(a) : "a"(0), "b"(0), "c"(0) : "flags");
}
+
+// Check errors in named register variables.
+// We should only see errors relevant to current compilation mode.
+#if defined(__CUDA_ARCH__)
+// Device-side compilation:
+// expected-error at 8 {{unknown register name 'rax' in asm}}
+// expected-error at 15 {{unknown register name 'rax' in asm}}
+#else
+// Host-side compilation:
+// expected-error at 11 {{unknown register name 'r0' in asm}}
+// expected-error at 22 {{unknown register name 'r0' in asm}}
+#endif
More information about the cfe-commits
mailing list