diff options
Diffstat (limited to 'clang/lib/CodeGen/CGOpenMPRuntime.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGOpenMPRuntime.cpp | 132 |
1 files changed, 78 insertions, 54 deletions
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index f98339d472fa..8d67fe21367a 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -1238,7 +1238,7 @@ static llvm::Function *emitParallelOrTeamsOutlinedFunction( CGOpenMPOutlinedRegionInfo CGInfo(*CS, ThreadIDVar, CodeGen, InnermostKind, HasCancel, OutlinedHelperName); CodeGenFunction::CGCapturedStmtRAII CapInfoRAII(CGF, &CGInfo); - return CGF.GenerateOpenMPCapturedStmtFunction(*CS, D.getBeginLoc()); + return CGF.GenerateOpenMPCapturedStmtFunction(*CS, D); } std::string CGOpenMPRuntime::getOutlinedHelperName(StringRef Name) const { @@ -1845,11 +1845,11 @@ void CGOpenMPRuntime::emitIfClause(CodeGenFunction &CGF, const Expr *Cond, CGF.EmitBlock(ContBlock, /*IsFinished=*/true); } -void CGOpenMPRuntime::emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc, - llvm::Function *OutlinedFn, - ArrayRef<llvm::Value *> CapturedVars, - const Expr *IfCond, - llvm::Value *NumThreads) { +void CGOpenMPRuntime::emitParallelCall( + CodeGenFunction &CGF, SourceLocation Loc, llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, const Expr *IfCond, + llvm::Value *NumThreads, OpenMPNumThreadsClauseModifier NumThreadsModifier, + OpenMPSeverityClauseKind Severity, const Expr *Message) { if (!CGF.HaveInsertPoint()) return; llvm::Value *RTLoc = emitUpdateLocation(CGF, Loc); @@ -2372,9 +2372,8 @@ void CGOpenMPRuntime::emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc, void CGOpenMPRuntime::emitErrorCall(CodeGenFunction &CGF, SourceLocation Loc, Expr *ME, bool IsFatal) { - llvm::Value *MVL = - ME ? CGF.EmitStringLiteralLValue(cast<StringLiteral>(ME)).getPointer(CGF) - : llvm::ConstantPointerNull::get(CGF.VoidPtrTy); + llvm::Value *MVL = ME ? CGF.EmitScalarExpr(ME) + : llvm::ConstantPointerNull::get(CGF.VoidPtrTy); // Build call void __kmpc_error(ident_t *loc, int severity, const char // *message) llvm::Value *Args[] = { @@ -2699,18 +2698,54 @@ llvm::Value *CGOpenMPRuntime::emitForNext(CodeGenFunction &CGF, CGF.getContext().BoolTy, Loc); } -void CGOpenMPRuntime::emitNumThreadsClause(CodeGenFunction &CGF, - llvm::Value *NumThreads, - SourceLocation Loc) { +llvm::Value *CGOpenMPRuntime::emitMessageClause(CodeGenFunction &CGF, + const Expr *Message) { + if (!Message) + return llvm::ConstantPointerNull::get(CGF.VoidPtrTy); + return CGF.EmitScalarExpr(Message); +} + +llvm::Value * +CGOpenMPRuntime::emitMessageClause(CodeGenFunction &CGF, + const OMPMessageClause *MessageClause) { + return emitMessageClause( + CGF, MessageClause ? MessageClause->getMessageString() : nullptr); +} + +llvm::Value * +CGOpenMPRuntime::emitSeverityClause(OpenMPSeverityClauseKind Severity) { + // OpenMP 6.0, 10.4: "If no severity clause is specified then the effect is + // as if sev-level is fatal." + return llvm::ConstantInt::get(CGM.Int32Ty, + Severity == OMPC_SEVERITY_warning ? 1 : 2); +} + +llvm::Value * +CGOpenMPRuntime::emitSeverityClause(const OMPSeverityClause *SeverityClause) { + return emitSeverityClause(SeverityClause ? SeverityClause->getSeverityKind() + : OMPC_SEVERITY_unknown); +} + +void CGOpenMPRuntime::emitNumThreadsClause( + CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, + OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity, + const Expr *Message) { if (!CGF.HaveInsertPoint()) return; + llvm::SmallVector<llvm::Value *, 4> Args( + {emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc), + CGF.Builder.CreateIntCast(NumThreads, CGF.Int32Ty, /*isSigned*/ true)}); // Build call __kmpc_push_num_threads(&loc, global_tid, num_threads) - llvm::Value *Args[] = { - emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc), - CGF.Builder.CreateIntCast(NumThreads, CGF.Int32Ty, /*isSigned*/ true)}; - CGF.EmitRuntimeCall(OMPBuilder.getOrCreateRuntimeFunction( - CGM.getModule(), OMPRTL___kmpc_push_num_threads), - Args); + // or __kmpc_push_num_threads_strict(&loc, global_tid, num_threads, severity, + // messsage) if strict modifier is used. + RuntimeFunction FnID = OMPRTL___kmpc_push_num_threads; + if (Modifier == OMPC_NUMTHREADS_strict) { + FnID = OMPRTL___kmpc_push_num_threads_strict; + Args.push_back(emitSeverityClause(Severity)); + Args.push_back(emitMessageClause(CGF, Message)); + } + CGF.EmitRuntimeCall( + OMPBuilder.getOrCreateRuntimeFunction(CGM.getModule(), FnID), Args); } void CGOpenMPRuntime::emitProcBindClause(CodeGenFunction &CGF, @@ -3006,10 +3041,10 @@ emitProxyTaskFunction(CodeGenModule &CGM, SourceLocation Loc, CGF.GetAddrOfLocalVar(&TaskTypeArg), KmpTaskTWithPrivatesPtrQTy->castAs<PointerType>()); const auto *KmpTaskTWithPrivatesQTyRD = - cast<RecordDecl>(KmpTaskTWithPrivatesQTy->getAsTagDecl()); + KmpTaskTWithPrivatesQTy->castAsRecordDecl(); LValue Base = CGF.EmitLValueForField(TDBase, *KmpTaskTWithPrivatesQTyRD->field_begin()); - const auto *KmpTaskTQTyRD = cast<RecordDecl>(KmpTaskTQTy->getAsTagDecl()); + const auto *KmpTaskTQTyRD = KmpTaskTQTy->castAsRecordDecl(); auto PartIdFI = std::next(KmpTaskTQTyRD->field_begin(), KmpTaskTPartId); LValue PartIdLVal = CGF.EmitLValueForField(Base, *PartIdFI); llvm::Value *PartidParam = PartIdLVal.getPointer(CGF); @@ -3104,11 +3139,10 @@ static llvm::Value *emitDestructorsFunction(CodeGenModule &CGM, CGF.GetAddrOfLocalVar(&TaskTypeArg), KmpTaskTWithPrivatesPtrQTy->castAs<PointerType>()); const auto *KmpTaskTWithPrivatesQTyRD = - cast<RecordDecl>(KmpTaskTWithPrivatesQTy->getAsTagDecl()); + KmpTaskTWithPrivatesQTy->castAsRecordDecl(); auto FI = std::next(KmpTaskTWithPrivatesQTyRD->field_begin()); Base = CGF.EmitLValueForField(Base, *FI); - for (const auto *Field : - cast<RecordDecl>(FI->getType()->getAsTagDecl())->fields()) { + for (const auto *Field : FI->getType()->castAsRecordDecl()->fields()) { if (QualType::DestructionKind DtorKind = Field->getType().isDestructedType()) { LValue FieldLValue = CGF.EmitLValueForField(Base, Field); @@ -3212,7 +3246,7 @@ emitTaskPrivateMappingFunction(CodeGenModule &CGM, SourceLocation Loc, LValue Base = CGF.EmitLoadOfPointerLValue( CGF.GetAddrOfLocalVar(&TaskPrivatesArg), TaskPrivatesArg.getType()->castAs<PointerType>()); - const auto *PrivatesQTyRD = cast<RecordDecl>(PrivatesQTy->getAsTagDecl()); + const auto *PrivatesQTyRD = PrivatesQTy->castAsRecordDecl(); Counter = 0; for (const FieldDecl *Field : PrivatesQTyRD->fields()) { LValue FieldLVal = CGF.EmitLValueForField(Base, Field); @@ -3259,7 +3293,7 @@ static void emitPrivatesInit(CodeGenFunction &CGF, CGF.ConvertTypeForMem(SharedsTy)), SharedsTy); } - FI = cast<RecordDecl>(FI->getType()->getAsTagDecl())->field_begin(); + FI = FI->getType()->castAsRecordDecl()->field_begin(); for (const PrivateDataTy &Pair : Privates) { // Do not initialize private locals. if (Pair.second.isLocalPrivate()) { @@ -3655,7 +3689,7 @@ CGOpenMPRuntime::emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc, } KmpTaskTQTy = SavedKmpTaskTQTy; } - const auto *KmpTaskTQTyRD = cast<RecordDecl>(KmpTaskTQTy->getAsTagDecl()); + const auto *KmpTaskTQTyRD = KmpTaskTQTy->castAsRecordDecl(); // Build particular struct kmp_task_t for the given task. const RecordDecl *KmpTaskTWithPrivatesQTyRD = createKmpTaskTWithPrivatesRecordDecl(CGM, KmpTaskTQTy, Privates); @@ -3915,10 +3949,7 @@ CGOpenMPRuntime::emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc, // Fill the data in the resulting kmp_task_t record. // Copy shareds if there are any. Address KmpTaskSharedsPtr = Address::invalid(); - if (!SharedsTy->getAsStructureType() - ->getOriginalDecl() - ->getDefinitionOrSelf() - ->field_empty()) { + if (!SharedsTy->castAsRecordDecl()->field_empty()) { KmpTaskSharedsPtr = Address( CGF.EmitLoadOfScalar( CGF.EmitLValueForField( @@ -3948,11 +3979,8 @@ CGOpenMPRuntime::emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc, enum { Priority = 0, Destructors = 1 }; // Provide pointer to function with destructors for privates. auto FI = std::next(KmpTaskTQTyRD->field_begin(), Data1); - const RecordDecl *KmpCmplrdataUD = (*FI) - ->getType() - ->getAsUnionType() - ->getOriginalDecl() - ->getDefinitionOrSelf(); + const auto *KmpCmplrdataUD = (*FI)->getType()->castAsRecordDecl(); + assert(KmpCmplrdataUD->isUnion()); if (NeedsCleanup) { llvm::Value *DestructorFn = emitDestructorsFunction( CGM, Loc, KmpInt32Ty, KmpTaskTWithPrivatesPtrQTy, @@ -4032,8 +4060,7 @@ CGOpenMPRuntime::getDepobjElements(CodeGenFunction &CGF, LValue DepobjLVal, ASTContext &C = CGM.getContext(); QualType FlagsTy; getDependTypes(C, KmpDependInfoTy, FlagsTy); - RecordDecl *KmpDependInfoRD = - cast<RecordDecl>(KmpDependInfoTy->getAsTagDecl()); + auto *KmpDependInfoRD = KmpDependInfoTy->castAsRecordDecl(); QualType KmpDependInfoPtrTy = C.getPointerType(KmpDependInfoTy); LValue Base = CGF.EmitLoadOfPointerLValue( DepobjLVal.getAddress().withElementType( @@ -4061,8 +4088,7 @@ static void emitDependData(CodeGenFunction &CGF, QualType &KmpDependInfoTy, ASTContext &C = CGM.getContext(); QualType FlagsTy; getDependTypes(C, KmpDependInfoTy, FlagsTy); - RecordDecl *KmpDependInfoRD = - cast<RecordDecl>(KmpDependInfoTy->getAsTagDecl()); + auto *KmpDependInfoRD = KmpDependInfoTy->castAsRecordDecl(); llvm::Type *LLVMFlagsTy = CGF.ConvertTypeForMem(FlagsTy); OMPIteratorGeneratorScope IteratorScope( @@ -4333,8 +4359,7 @@ Address CGOpenMPRuntime::emitDepobjDependClause( unsigned NumDependencies = Dependencies.DepExprs.size(); QualType FlagsTy; getDependTypes(C, KmpDependInfoTy, FlagsTy); - RecordDecl *KmpDependInfoRD = - cast<RecordDecl>(KmpDependInfoTy->getAsTagDecl()); + auto *KmpDependInfoRD = KmpDependInfoTy->castAsRecordDecl(); llvm::Value *Size; // Define type kmp_depend_info[<Dependencies.size()>]; @@ -4442,8 +4467,7 @@ void CGOpenMPRuntime::emitUpdateClause(CodeGenFunction &CGF, LValue DepobjLVal, ASTContext &C = CGM.getContext(); QualType FlagsTy; getDependTypes(C, KmpDependInfoTy, FlagsTy); - RecordDecl *KmpDependInfoRD = - cast<RecordDecl>(KmpDependInfoTy->getAsTagDecl()); + auto *KmpDependInfoRD = KmpDependInfoTy->castAsRecordDecl(); llvm::Type *LLVMFlagsTy = CGF.ConvertTypeForMem(FlagsTy); llvm::Value *NumDeps; LValue Base; @@ -6203,7 +6227,7 @@ void CGOpenMPRuntime::emitTargetOutlinedFunctionHelper( CGOpenMPTargetRegionInfo CGInfo(CS, CodeGen, EntryFnName); CodeGenFunction::CGCapturedStmtRAII CapInfoRAII(CGF, &CGInfo); - return CGF.GenerateOpenMPCapturedStmtFunction(CS, D.getBeginLoc()); + return CGF.GenerateOpenMPCapturedStmtFunction(CS, D); }; cantFail(OMPBuilder.emitTargetRegionFunction( @@ -11319,7 +11343,7 @@ void CGOpenMPRuntime::emitDoacrossInit(CodeGenFunction &CGF, RD->completeDefinition(); KmpDimTy = C.getCanonicalTagType(RD); } else { - RD = cast<RecordDecl>(KmpDimTy->getAsTagDecl()); + RD = KmpDimTy->castAsRecordDecl(); } llvm::APInt Size(/*numBits=*/32, NumIterations.size()); QualType ArrayTy = C.getConstantArrayType(KmpDimTy, Size, nullptr, @@ -12125,12 +12149,11 @@ llvm::Function *CGOpenMPSIMDRuntime::emitTaskOutlinedFunction( llvm_unreachable("Not supported in SIMD-only mode"); } -void CGOpenMPSIMDRuntime::emitParallelCall(CodeGenFunction &CGF, - SourceLocation Loc, - llvm::Function *OutlinedFn, - ArrayRef<llvm::Value *> CapturedVars, - const Expr *IfCond, - llvm::Value *NumThreads) { +void CGOpenMPSIMDRuntime::emitParallelCall( + CodeGenFunction &CGF, SourceLocation Loc, llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, const Expr *IfCond, + llvm::Value *NumThreads, OpenMPNumThreadsClauseModifier NumThreadsModifier, + OpenMPSeverityClauseKind Severity, const Expr *Message) { llvm_unreachable("Not supported in SIMD-only mode"); } @@ -12233,9 +12256,10 @@ llvm::Value *CGOpenMPSIMDRuntime::emitForNext(CodeGenFunction &CGF, llvm_unreachable("Not supported in SIMD-only mode"); } -void CGOpenMPSIMDRuntime::emitNumThreadsClause(CodeGenFunction &CGF, - llvm::Value *NumThreads, - SourceLocation Loc) { +void CGOpenMPSIMDRuntime::emitNumThreadsClause( + CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, + OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity, + const Expr *Message) { llvm_unreachable("Not supported in SIMD-only mode"); } |
