diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2014-05-06 10:08:46 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2014-05-06 10:08:46 +0000 |
commit | 9959db5fa9d4972b6f5510344d502ff4932b0c0e (patch) | |
tree | f9022d5800c5e078854567445218a23710ff1cba /clang/lib/Sema | |
parent | fdce7cea931fc6fcb995a1193b3ae7f78a913f0d (diff) | |
download | bcm5719-llvm-9959db5fa9d4972b6f5510344d502ff4932b0c0e.tar.gz bcm5719-llvm-9959db5fa9d4972b6f5510344d502ff4932b0c0e.zip |
[OPENMP] Initial codegen for '#pragma omp parallel'
llvm-svn: 208077
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 45 | ||||
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 72 | ||||
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 19 |
3 files changed, 116 insertions, 20 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 441fc56a7fc..219ad074ce5 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1,4 +1,4 @@ -//===--- SemaOpenMP.cpp - Semantic Analysis for OpenMP constructs ----------===// +//===--- SemaOpenMP.cpp - Semantic Analysis for OpenMP constructs ---------===// // // The LLVM Compiler Infrastructure // @@ -12,13 +12,15 @@ /// //===----------------------------------------------------------------------===// -#include "clang/Basic/OpenMPKinds.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclOpenMP.h" #include "clang/AST/StmtCXX.h" #include "clang/AST/StmtOpenMP.h" #include "clang/AST/StmtVisitor.h" +#include "clang/Basic/OpenMPKinds.h" +#include "clang/Lex/Preprocessor.h" #include "clang/Sema/Initialization.h" #include "clang/Sema/Lookup.h" #include "clang/Sema/Scope.h" @@ -669,6 +671,36 @@ public: }; } +void Sema::ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, SourceLocation Loc, + Scope *CurScope) { + switch (DKind) { + case OMPD_parallel: { + QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1); + QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty); + Sema::CapturedParamNameType Params[3] = { + std::make_pair(".global_tid.", KmpInt32PtrTy), + std::make_pair(".bound_tid.", KmpInt32PtrTy), + std::make_pair(StringRef(), QualType()) // __context with shared vars + }; + ActOnCapturedRegionStart(Loc, CurScope, CR_OpenMP, Params); + break; + } + case OMPD_simd: { + Sema::CapturedParamNameType Params[1] = { + std::make_pair(StringRef(), QualType()) // __context with shared vars + }; + ActOnCapturedRegionStart(Loc, CurScope, CR_OpenMP, Params); + break; + } + case OMPD_threadprivate: + case OMPD_task: + llvm_unreachable("OpenMP Directive is not allowed"); + case OMPD_unknown: + case NUM_OPENMP_DIRECTIVES: + llvm_unreachable("Unknown OpenMP directive"); + } +} + StmtResult Sema::ActOnOpenMPExecutableDirective(OpenMPDirectiveKind Kind, ArrayRef<OMPClause *> Clauses, Stmt *AStmt, @@ -725,6 +757,15 @@ StmtResult Sema::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) { + assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); + CapturedStmt *CS = cast<CapturedStmt>(AStmt); + // 1.2.2 OpenMP Language Terminology + // Structured block - An executable statement with a single entry at the + // top and a single exit at the bottom. + // The point of exit cannot be a branch out of the structured block. + // longjmp() and throw() must not violate the entry/exit criteria. + CS->getCapturedDecl()->setNothrow(); + getCurFunction()->setHasBranchProtectedScope(); return Owned(OMPParallelDirective::Create(Context, StartLoc, EndLoc, diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 35461143807..056b93dc86e 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -3322,20 +3322,9 @@ Sema::CreateCapturedStmtRecordDecl(CapturedDecl *&CD, SourceLocation Loc, RD->setImplicit(); RD->startDefinition(); + assert(NumParams > 0 && "CapturedStmt requires context parameter"); CD = CapturedDecl::Create(Context, CurContext, NumParams); DC->addDecl(CD); - - // Build the context parameter - assert(NumParams > 0 && "CapturedStmt requires context parameter"); - DC = CapturedDecl::castToDeclContext(CD); - IdentifierInfo *VarName = &Context.Idents.get("__context"); - QualType ParamType = Context.getPointerType(Context.getTagDeclType(RD)); - ImplicitParamDecl *Param - = ImplicitParamDecl::Create(Context, DC, Loc, VarName, ParamType); - DC->addDecl(Param); - - CD->setContextParam(Param); - return RD; } @@ -3367,9 +3356,62 @@ static void buildCapturedStmtCaptureList( void Sema::ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope, CapturedRegionKind Kind, unsigned NumParams) { - CapturedDecl *CD = 0; + CapturedDecl *CD = nullptr; RecordDecl *RD = CreateCapturedStmtRecordDecl(CD, Loc, NumParams); + // Build the context parameter + DeclContext *DC = CapturedDecl::castToDeclContext(CD); + IdentifierInfo *ParamName = &Context.Idents.get("__context"); + QualType ParamType = Context.getPointerType(Context.getTagDeclType(RD)); + ImplicitParamDecl *Param + = ImplicitParamDecl::Create(Context, DC, Loc, ParamName, ParamType); + DC->addDecl(Param); + + CD->setContextParam(0, Param); + + // Enter the capturing scope for this captured region. + PushCapturedRegionScope(CurScope, CD, RD, Kind); + + if (CurScope) + PushDeclContext(CurScope, CD); + else + CurContext = CD; + + PushExpressionEvaluationContext(PotentiallyEvaluated); +} + +void Sema::ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope, + CapturedRegionKind Kind, + ArrayRef<CapturedParamNameType> Params) { + CapturedDecl *CD = nullptr; + RecordDecl *RD = CreateCapturedStmtRecordDecl(CD, Loc, Params.size()); + + // Build the context parameter + DeclContext *DC = CapturedDecl::castToDeclContext(CD); + bool ContextIsFound = false; + unsigned ParamNum = 0; + for (ArrayRef<CapturedParamNameType>::iterator I = Params.begin(), + E = Params.end(); + I != E; ++I, ++ParamNum) { + if (I->second.isNull()) { + assert(!ContextIsFound && + "null type has been found already for '__context' parameter"); + IdentifierInfo *ParamName = &Context.Idents.get("__context"); + QualType ParamType = Context.getPointerType(Context.getTagDeclType(RD)); + ImplicitParamDecl *Param + = ImplicitParamDecl::Create(Context, DC, Loc, ParamName, ParamType); + DC->addDecl(Param); + CD->setContextParam(ParamNum, Param); + ContextIsFound = true; + } else { + IdentifierInfo *ParamName = &Context.Idents.get(I->first); + ImplicitParamDecl *Param + = ImplicitParamDecl::Create(Context, DC, Loc, ParamName, I->second); + DC->addDecl(Param); + CD->setParam(ParamNum, Param); + } + } + assert(ContextIsFound && "no null type for '__context' parameter"); // Enter the capturing scope for this captured region. PushCapturedRegionScope(CurScope, CD, RD, Kind); @@ -3390,8 +3432,8 @@ void Sema::ActOnCapturedRegionError() { Record->setInvalidDecl(); SmallVector<Decl*, 4> Fields(Record->fields()); - ActOnFields(/*Scope=*/0, Record->getLocation(), Record, Fields, - SourceLocation(), SourceLocation(), /*AttributeList=*/0); + ActOnFields(/*Scope=*/nullptr, Record->getLocation(), Record, Fields, + SourceLocation(), SourceLocation(), /*AttributeList=*/nullptr); PopDeclContext(); PopFunctionScopeInfo(); diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 29bfcd45370..17642722b81 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6326,7 +6326,7 @@ TreeTransform<Derived>::TransformOMPExecutableDirective( TClauses.push_back(Clause); } else { - TClauses.push_back(0); + TClauses.push_back(nullptr); } } if (!D->getAssociatedStmt()) { @@ -9911,9 +9911,22 @@ template<typename Derived> StmtResult TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { SourceLocation Loc = S->getLocStart(); - unsigned NumParams = S->getCapturedDecl()->getNumParams(); + CapturedDecl *CD = S->getCapturedDecl(); + unsigned NumParams = CD->getNumParams(); + unsigned ContextParamPos = CD->getContextParamPosition(); + SmallVector<Sema::CapturedParamNameType, 4> Params; + for (unsigned I = 0; I < NumParams; ++I) { + if (I != ContextParamPos) { + Params.push_back( + std::make_pair( + CD->getParam(I)->getName(), + getDerived().TransformType(CD->getParam(I)->getType()))); + } else { + Params.push_back(std::make_pair(StringRef(), QualType())); + } + } getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/0, - S->getCapturedRegionKind(), NumParams); + S->getCapturedRegionKind(), Params); StmtResult Body = getDerived().TransformStmt(S->getCapturedStmt()); if (Body.isInvalid()) { |