@@ -1845,11 +1845,11 @@ void CGOpenMPRuntime::emitIfClause(CodeGenFunction &CGF, const Expr *Cond,
1845
1845
CGF.EmitBlock(ContBlock, /*IsFinished=*/true);
1846
1846
}
1847
1847
1848
- void CGOpenMPRuntime::emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
1849
- llvm::Function *OutlinedFn,
1850
- ArrayRef<llvm::Value *> CapturedVars,
1851
- const Expr *IfCond ,
1852
- llvm::Value *NumThreads ) {
1848
+ void CGOpenMPRuntime::emitParallelCall(
1849
+ CodeGenFunction &CGF, SourceLocation Loc, llvm::Function *OutlinedFn,
1850
+ ArrayRef<llvm::Value *> CapturedVars, const Expr *IfCond ,
1851
+ llvm::Value *NumThreads, OpenMPNumThreadsClauseModifier NumThreadsModifier ,
1852
+ OpenMPSeverityClauseKind Severity, const Expr *Message ) {
1853
1853
if (!CGF.HaveInsertPoint())
1854
1854
return;
1855
1855
llvm::Value *RTLoc = emitUpdateLocation(CGF, Loc);
@@ -2372,9 +2372,8 @@ void CGOpenMPRuntime::emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
2372
2372
2373
2373
void CGOpenMPRuntime::emitErrorCall(CodeGenFunction &CGF, SourceLocation Loc,
2374
2374
Expr *ME, bool IsFatal) {
2375
- llvm::Value *MVL =
2376
- ME ? CGF.EmitStringLiteralLValue(cast<StringLiteral>(ME)).getPointer(CGF)
2377
- : llvm::ConstantPointerNull::get(CGF.VoidPtrTy);
2375
+ llvm::Value *MVL = ME ? CGF.EmitScalarExpr(ME)
2376
+ : llvm::ConstantPointerNull::get(CGF.VoidPtrTy);
2378
2377
// Build call void __kmpc_error(ident_t *loc, int severity, const char
2379
2378
// *message)
2380
2379
llvm::Value *Args[] = {
@@ -2699,18 +2698,54 @@ llvm::Value *CGOpenMPRuntime::emitForNext(CodeGenFunction &CGF,
2699
2698
CGF.getContext().BoolTy, Loc);
2700
2699
}
2701
2700
2702
- void CGOpenMPRuntime::emitNumThreadsClause(CodeGenFunction &CGF,
2703
- llvm::Value *NumThreads,
2704
- SourceLocation Loc) {
2701
+ llvm::Value *CGOpenMPRuntime::emitMessageClause(CodeGenFunction &CGF,
2702
+ const Expr *Message) {
2703
+ if (!Message)
2704
+ return llvm::ConstantPointerNull::get(CGF.VoidPtrTy);
2705
+ return CGF.EmitScalarExpr(Message);
2706
+ }
2707
+
2708
+ llvm::Value *
2709
+ CGOpenMPRuntime::emitMessageClause(CodeGenFunction &CGF,
2710
+ const OMPMessageClause *MessageClause) {
2711
+ return emitMessageClause(
2712
+ CGF, MessageClause ? MessageClause->getMessageString() : nullptr);
2713
+ }
2714
+
2715
+ llvm::Value *
2716
+ CGOpenMPRuntime::emitSeverityClause(OpenMPSeverityClauseKind Severity) {
2717
+ // OpenMP 6.0, 10.4: "If no severity clause is specified then the effect is
2718
+ // as if sev-level is fatal."
2719
+ return llvm::ConstantInt::get(CGM.Int32Ty,
2720
+ Severity == OMPC_SEVERITY_warning ? 1 : 2);
2721
+ }
2722
+
2723
+ llvm::Value *
2724
+ CGOpenMPRuntime::emitSeverityClause(const OMPSeverityClause *SeverityClause) {
2725
+ return emitSeverityClause(SeverityClause ? SeverityClause->getSeverityKind()
2726
+ : OMPC_SEVERITY_unknown);
2727
+ }
2728
+
2729
+ void CGOpenMPRuntime::emitNumThreadsClause(
2730
+ CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc,
2731
+ OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity,
2732
+ const Expr *Message) {
2705
2733
if (!CGF.HaveInsertPoint())
2706
2734
return;
2735
+ llvm::SmallVector<llvm::Value *, 4> Args(
2736
+ {emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
2737
+ CGF.Builder.CreateIntCast(NumThreads, CGF.Int32Ty, /*isSigned*/ true)});
2707
2738
// Build call __kmpc_push_num_threads(&loc, global_tid, num_threads)
2708
- llvm::Value *Args[] = {
2709
- emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
2710
- CGF.Builder.CreateIntCast(NumThreads, CGF.Int32Ty, /*isSigned*/ true)};
2711
- CGF.EmitRuntimeCall(OMPBuilder.getOrCreateRuntimeFunction(
2712
- CGM.getModule(), OMPRTL___kmpc_push_num_threads),
2713
- Args);
2739
+ // or __kmpc_push_num_threads_strict(&loc, global_tid, num_threads, severity,
2740
+ // messsage) if strict modifier is used.
2741
+ RuntimeFunction FnID = OMPRTL___kmpc_push_num_threads;
2742
+ if (Modifier == OMPC_NUMTHREADS_strict) {
2743
+ FnID = OMPRTL___kmpc_push_num_threads_strict;
2744
+ Args.push_back(emitSeverityClause(Severity));
2745
+ Args.push_back(emitMessageClause(CGF, Message));
2746
+ }
2747
+ CGF.EmitRuntimeCall(
2748
+ OMPBuilder.getOrCreateRuntimeFunction(CGM.getModule(), FnID), Args);
2714
2749
}
2715
2750
2716
2751
void CGOpenMPRuntime::emitProcBindClause(CodeGenFunction &CGF,
@@ -12114,12 +12149,11 @@ llvm::Function *CGOpenMPSIMDRuntime::emitTaskOutlinedFunction(
12114
12149
llvm_unreachable("Not supported in SIMD-only mode");
12115
12150
}
12116
12151
12117
- void CGOpenMPSIMDRuntime::emitParallelCall(CodeGenFunction &CGF,
12118
- SourceLocation Loc,
12119
- llvm::Function *OutlinedFn,
12120
- ArrayRef<llvm::Value *> CapturedVars,
12121
- const Expr *IfCond,
12122
- llvm::Value *NumThreads) {
12152
+ void CGOpenMPSIMDRuntime::emitParallelCall(
12153
+ CodeGenFunction &CGF, SourceLocation Loc, llvm::Function *OutlinedFn,
12154
+ ArrayRef<llvm::Value *> CapturedVars, const Expr *IfCond,
12155
+ llvm::Value *NumThreads, OpenMPNumThreadsClauseModifier NumThreadsModifier,
12156
+ OpenMPSeverityClauseKind Severity, const Expr *Message) {
12123
12157
llvm_unreachable("Not supported in SIMD-only mode");
12124
12158
}
12125
12159
@@ -12222,9 +12256,10 @@ llvm::Value *CGOpenMPSIMDRuntime::emitForNext(CodeGenFunction &CGF,
12222
12256
llvm_unreachable("Not supported in SIMD-only mode");
12223
12257
}
12224
12258
12225
- void CGOpenMPSIMDRuntime::emitNumThreadsClause(CodeGenFunction &CGF,
12226
- llvm::Value *NumThreads,
12227
- SourceLocation Loc) {
12259
+ void CGOpenMPSIMDRuntime::emitNumThreadsClause(
12260
+ CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc,
12261
+ OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity,
12262
+ const Expr *Message) {
12228
12263
llvm_unreachable("Not supported in SIMD-only mode");
12229
12264
}
12230
12265
0 commit comments