Skip to content

Commit 305b6b9

Browse files
committed
[OPENMP][CUDA]Do not emit warnings for variables in late-reported asm
statements. If the assembler instruction is not generated and the delayed diagnostic is emitted, we may end up with extra warning message for variables used in the asm statement. Since the asm statement is not built, the variables may be left non-referenced and it may produce a warning about a use of the non-initialized variables. llvm-svn: 354928
1 parent 938d3f4 commit 305b6b9

File tree

4 files changed

+69
-51
lines changed

4 files changed

+69
-51
lines changed

clang/lib/Sema/SemaStmtAsm.cpp

+60-42
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,15 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
262262
OutputName = Names[i]->getName();
263263

264264
TargetInfo::ConstraintInfo Info(Literal->getString(), OutputName);
265-
if (!Context.getTargetInfo().validateOutputConstraint(Info))
266-
return StmtResult(targetDiag(Literal->getBeginLoc(),
267-
diag::err_asm_invalid_output_constraint)
268-
<< Info.getConstraintStr());
265+
if (!Context.getTargetInfo().validateOutputConstraint(Info)) {
266+
targetDiag(Literal->getBeginLoc(),
267+
diag::err_asm_invalid_output_constraint)
268+
<< Info.getConstraintStr();
269+
return new (Context)
270+
GCCAsmStmt(Context, AsmLoc, IsSimple, IsVolatile, NumOutputs,
271+
NumInputs, Names, Constraints, Exprs.data(), AsmString,
272+
NumClobbers, Clobbers, RParenLoc);
273+
}
269274

270275
ExprResult ER = CheckPlaceholderExpr(Exprs[i]);
271276
if (ER.isInvalid())
@@ -318,10 +323,15 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
318323
}
319324

320325
unsigned Size = Context.getTypeSize(OutputExpr->getType());
321-
if (!Context.getTargetInfo().validateOutputSize(Literal->getString(), Size))
322-
return StmtResult(targetDiag(OutputExpr->getBeginLoc(),
323-
diag::err_asm_invalid_output_size)
324-
<< Info.getConstraintStr());
326+
if (!Context.getTargetInfo().validateOutputSize(Literal->getString(),
327+
Size)) {
328+
targetDiag(OutputExpr->getBeginLoc(), diag::err_asm_invalid_output_size)
329+
<< Info.getConstraintStr();
330+
return new (Context)
331+
GCCAsmStmt(Context, AsmLoc, IsSimple, IsVolatile, NumOutputs,
332+
NumInputs, Names, Constraints, Exprs.data(), AsmString,
333+
NumClobbers, Clobbers, RParenLoc);
334+
}
325335
}
326336

327337
SmallVector<TargetInfo::ConstraintInfo, 4> InputConstraintInfos;
@@ -337,9 +347,12 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
337347
TargetInfo::ConstraintInfo Info(Literal->getString(), InputName);
338348
if (!Context.getTargetInfo().validateInputConstraint(OutputConstraintInfos,
339349
Info)) {
340-
return StmtResult(targetDiag(Literal->getBeginLoc(),
341-
diag::err_asm_invalid_input_constraint)
342-
<< Info.getConstraintStr());
350+
targetDiag(Literal->getBeginLoc(), diag::err_asm_invalid_input_constraint)
351+
<< Info.getConstraintStr();
352+
return new (Context)
353+
GCCAsmStmt(Context, AsmLoc, IsSimple, IsVolatile, NumOutputs,
354+
NumInputs, Names, Constraints, Exprs.data(), AsmString,
355+
NumClobbers, Clobbers, RParenLoc);
343356
}
344357

345358
ExprResult ER = CheckPlaceholderExpr(Exprs[i]);
@@ -423,10 +436,14 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
423436

424437
StringRef Clobber = Literal->getString();
425438

426-
if (!Context.getTargetInfo().isValidClobber(Clobber))
427-
return StmtResult(targetDiag(Literal->getBeginLoc(),
428-
diag::err_asm_unknown_register_name)
429-
<< Clobber);
439+
if (!Context.getTargetInfo().isValidClobber(Clobber)) {
440+
targetDiag(Literal->getBeginLoc(), diag::err_asm_unknown_register_name)
441+
<< Clobber;
442+
return new (Context)
443+
GCCAsmStmt(Context, AsmLoc, IsSimple, IsVolatile, NumOutputs,
444+
NumInputs, Names, Constraints, Exprs.data(), AsmString,
445+
NumClobbers, Clobbers, RParenLoc);
446+
}
430447
}
431448

432449
GCCAsmStmt *NS =
@@ -437,10 +454,11 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
437454
// have.
438455
SmallVector<GCCAsmStmt::AsmStringPiece, 8> Pieces;
439456
unsigned DiagOffs;
440-
if (unsigned DiagID = NS->AnalyzeAsmString(Pieces, Context, DiagOffs))
441-
return StmtResult(
442-
targetDiag(getLocationOfStringLiteralByte(AsmString, DiagOffs), DiagID)
443-
<< AsmString->getSourceRange());
457+
if (unsigned DiagID = NS->AnalyzeAsmString(Pieces, Context, DiagOffs)) {
458+
targetDiag(getLocationOfStringLiteralByte(AsmString, DiagOffs), DiagID)
459+
<< AsmString->getSourceRange();
460+
return NS;
461+
}
444462

445463
// Validate constraints and modifiers.
446464
for (unsigned i = 0, e = Pieces.size(); i != e; ++i) {
@@ -496,27 +514,29 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
496514
TargetInfo::ConstraintInfo &Info = OutputConstraintInfos[i];
497515
StringRef ConstraintStr = Info.getConstraintStr();
498516
unsigned AltCount = ConstraintStr.count(',') + 1;
499-
if (NumAlternatives == ~0U)
517+
if (NumAlternatives == ~0U) {
500518
NumAlternatives = AltCount;
501-
else if (NumAlternatives != AltCount)
502-
return StmtResult(
503-
targetDiag(NS->getOutputExpr(i)->getBeginLoc(),
504-
diag::err_asm_unexpected_constraint_alternatives)
505-
<< NumAlternatives << AltCount);
519+
} else if (NumAlternatives != AltCount) {
520+
targetDiag(NS->getOutputExpr(i)->getBeginLoc(),
521+
diag::err_asm_unexpected_constraint_alternatives)
522+
<< NumAlternatives << AltCount;
523+
return NS;
524+
}
506525
}
507526
SmallVector<size_t, 4> InputMatchedToOutput(OutputConstraintInfos.size(),
508527
~0U);
509528
for (unsigned i = 0, e = InputConstraintInfos.size(); i != e; ++i) {
510529
TargetInfo::ConstraintInfo &Info = InputConstraintInfos[i];
511530
StringRef ConstraintStr = Info.getConstraintStr();
512531
unsigned AltCount = ConstraintStr.count(',') + 1;
513-
if (NumAlternatives == ~0U)
532+
if (NumAlternatives == ~0U) {
514533
NumAlternatives = AltCount;
515-
else if (NumAlternatives != AltCount)
516-
return StmtResult(
517-
targetDiag(NS->getInputExpr(i)->getBeginLoc(),
518-
diag::err_asm_unexpected_constraint_alternatives)
519-
<< NumAlternatives << AltCount);
534+
} else if (NumAlternatives != AltCount) {
535+
targetDiag(NS->getInputExpr(i)->getBeginLoc(),
536+
diag::err_asm_unexpected_constraint_alternatives)
537+
<< NumAlternatives << AltCount;
538+
return NS;
539+
}
520540

521541
// If this is a tied constraint, verify that the output and input have
522542
// either exactly the same type, or that they are int/ptr operands with the
@@ -534,11 +554,10 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
534554
targetDiag(NS->getInputExpr(i)->getBeginLoc(),
535555
diag::err_asm_input_duplicate_match)
536556
<< TiedTo;
537-
return StmtResult(
538-
targetDiag(
539-
NS->getInputExpr(InputMatchedToOutput[TiedTo])->getBeginLoc(),
540-
diag::note_asm_input_duplicate_first)
541-
<< TiedTo);
557+
targetDiag(NS->getInputExpr(InputMatchedToOutput[TiedTo])->getBeginLoc(),
558+
diag::note_asm_input_duplicate_first)
559+
<< TiedTo;
560+
return NS;
542561
}
543562
InputMatchedToOutput[TiedTo] = i;
544563

@@ -623,19 +642,18 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
623642
continue;
624643
}
625644

626-
return StmtResult(targetDiag(InputExpr->getBeginLoc(),
627-
diag::err_asm_tying_incompatible_types)
628-
<< InTy << OutTy << OutputExpr->getSourceRange()
629-
<< InputExpr->getSourceRange());
645+
targetDiag(InputExpr->getBeginLoc(), diag::err_asm_tying_incompatible_types)
646+
<< InTy << OutTy << OutputExpr->getSourceRange()
647+
<< InputExpr->getSourceRange();
648+
return NS;
630649
}
631650

632651
// Check for conflicts between clobber list and input or output lists
633652
SourceLocation ConstraintLoc =
634653
getClobberConflictLocation(Exprs, Constraints, Clobbers, NumClobbers,
635654
Context.getTargetInfo(), Context);
636655
if (ConstraintLoc.isValid())
637-
return StmtResult(
638-
targetDiag(ConstraintLoc, diag::error_inoutput_conflict_with_clobber));
656+
targetDiag(ConstraintLoc, diag::error_inoutput_conflict_with_clobber);
639657

640658
return NS;
641659
}

clang/test/OpenMP/nvptx_asm_delayed_diags.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// RUN: %clang_cc1 -fopenmp -x c -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc
2-
// RUN: %clang_cc1 -verify -fopenmp -x c -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -fsyntax-only
3-
// RUN: %clang_cc1 -verify -DDIAGS -DIMMEDIATE -fopenmp -x c -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -fsyntax-only
4-
// RUN: %clang_cc1 -verify -DDIAGS -DDELAYED -fopenmp -x c -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -fsyntax-only
2+
// RUN: %clang_cc1 -verify -fopenmp -x c -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -fsyntax-only -Wuninitialized
3+
// RUN: %clang_cc1 -verify -DDIAGS -DIMMEDIATE -fopenmp -x c -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -fsyntax-only -Wuninitialized
4+
// RUN: %clang_cc1 -verify -DDIAGS -DDELAYED -fopenmp -x c -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -fsyntax-only -Wuninitialized
55
// REQUIRES: x86-registered-target
66
// REQUIRES: nvptx-registered-target
77

clang/test/Sema/asm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ void fn6() {
249249
int a;
250250
__asm__(""
251251
: "=rm"(a), "=rm"(a)
252-
: "11m"(a)) // expected-error {{invalid input constraint '11m' in asm}}
252+
: "11m"(a)); // expected-error {{invalid input constraint '11m' in asm}}
253253
}
254254

255255
// PR14269

clang/test/SemaCUDA/asm_delayed_diags.cu

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
// RUN: %clang_cc1 -fsyntax-only -verify %s -DHOST -triple x86_64-unknown-linux-gnu
2-
// RUN: %clang_cc1 -fsyntax-only -verify %s -DHOST -DHOST_USED -triple x86_64-unknown-linux-gnu
3-
// RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -verify %s -DDEVICE_NOT_USED -triple nvptx-unknown-cuda
4-
// RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -verify %s -DDEVICE -triple nvptx-unknown-cuda
5-
// RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -verify %s -DDEVICE -DDEVICE_USED -triple nvptx-unknown-cuda
1+
// RUN: %clang_cc1 -fsyntax-only -verify %s -DHOST -triple x86_64-unknown-linux-gnu -Wuninitialized
2+
// RUN: %clang_cc1 -fsyntax-only -verify %s -DHOST -DHOST_USED -triple x86_64-unknown-linux-gnu -Wuninitialized
3+
// RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -verify %s -DDEVICE_NOT_USED -triple nvptx-unknown-cuda -Wuninitialized
4+
// RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -verify %s -DDEVICE -triple nvptx-unknown-cuda -Wuninitialized
5+
// RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -verify %s -DDEVICE -DDEVICE_USED -triple nvptx-unknown-cuda -Wuninitialized
66

77
// REQUIRES: x86-registered-target
88
// REQUIRES: nvptx-registered-target

0 commit comments

Comments
 (0)