diff options
Diffstat (limited to 'lib/Serialization/ASTReaderStmt.cpp')
| -rw-r--r-- | lib/Serialization/ASTReaderStmt.cpp | 145 | 
1 files changed, 140 insertions, 5 deletions
| diff --git a/lib/Serialization/ASTReaderStmt.cpp b/lib/Serialization/ASTReaderStmt.cpp index e1357ba5e696..1115e8fd4f45 100644 --- a/lib/Serialization/ASTReaderStmt.cpp +++ b/lib/Serialization/ASTReaderStmt.cpp @@ -25,6 +25,7 @@ using namespace clang::serialization;  namespace clang {    class ASTStmtReader : public StmtVisitor<ASTStmtReader> { +    friend class OMPClauseReader;      typedef ASTReader::RecordData RecordData;      ASTReader &Reader; @@ -382,6 +383,7 @@ void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) {  void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {    VisitStmt(S); +  ++Idx;    S->setCapturedDecl(ReadDeclAs<CapturedDecl>(Record, Idx));    S->setCapturedRegionKind(static_cast<CapturedRegionKind>(Record[Idx++]));    S->setCapturedRecordDecl(ReadDeclAs<RecordDecl>(Record, Idx)); @@ -723,7 +725,6 @@ void ASTStmtReader::VisitInitListExpr(InitListExpr *E) {    } else      E->ArrayFillerOrUnionFieldInit = ReadDeclAs<FieldDecl>(Record, Idx);    E->sawArrayRangeDesignator(Record[Idx++]); -  E->setInitializesStdInitializerList(Record[Idx++]);    unsigned NumInits = Record[Idx++];    E->reserveInits(Reader.getContext(), NumInits);    if (isArrayFiller) { @@ -834,6 +835,7 @@ void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {    E->setRHS(Reader.ReadSubExpr());    E->setBuiltinLoc(ReadSourceLocation(Record, Idx));    E->setRParenLoc(ReadSourceLocation(Record, Idx)); +  E->setIsConditionTrue(Record[Idx++]);  }  void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) { @@ -847,11 +849,19 @@ void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {    unsigned NumExprs = Record[Idx++];    while (NumExprs--)      Exprs.push_back(Reader.ReadSubExpr()); -  E->setExprs(Reader.getContext(), Exprs.data(), Exprs.size()); +  E->setExprs(Reader.getContext(), Exprs);    E->setBuiltinLoc(ReadSourceLocation(Record, Idx));    E->setRParenLoc(ReadSourceLocation(Record, Idx));  } +void ASTStmtReader::VisitConvertVectorExpr(ConvertVectorExpr *E) { +  VisitExpr(E); +  E->BuiltinLoc = ReadSourceLocation(Record, Idx); +  E->RParenLoc = ReadSourceLocation(Record, Idx); +  E->TInfo = GetTypeSourceInfo(Record, Idx); +  E->SrcExpr = Reader.ReadSubExpr(); +} +  void ASTStmtReader::VisitBlockExpr(BlockExpr *E) {    VisitExpr(E);    E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx)); @@ -1190,7 +1200,7 @@ void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {    E->setListInitialization(Record[Idx++]);    E->setRequiresZeroInitialization(Record[Idx++]);    E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]); -  E->ParenRange = ReadSourceRange(Record, Idx); +  E->ParenOrBraceRange = ReadSourceRange(Record, Idx);  }  void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { @@ -1205,6 +1215,7 @@ void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) {    unsigned NumArrayIndexVars = Record[Idx++];    E->IntroducerRange = ReadSourceRange(Record, Idx);    E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record[Idx++]); +  E->CaptureDefaultLoc = ReadSourceLocation(Record, Idx);    E->ExplicitParams = Record[Idx++];    E->ExplicitResultType = Record[Idx++];    E->ClosingBrace = ReadSourceLocation(Record, Idx); @@ -1227,6 +1238,12 @@ void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) {    }  } +void +ASTStmtReader::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) { +  VisitExpr(E); +  E->SubExpr = Reader.ReadSubExpr(); +} +  void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {    VisitExplicitCastExpr(E);    SourceRange R = ReadSourceRange(Record, Idx); @@ -1254,7 +1271,7 @@ void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {  void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {    VisitExplicitCastExpr(E); -  E->setTypeBeginLoc(ReadSourceLocation(Record, Idx)); +  E->setLParenLoc(ReadSourceLocation(Record, Idx));    E->setRParenLoc(ReadSourceLocation(Record, Idx));  } @@ -1576,6 +1593,7 @@ void ASTStmtReader::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {  void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {    VisitExpr(E);    E->Temporary = Reader.ReadSubExpr(); +  E->ExtendingDecl = ReadDeclAs<ValueDecl>(Record, Idx);  }  void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) { @@ -1650,11 +1668,114 @@ void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {  }  //===----------------------------------------------------------------------===// +// OpenMP Clauses. +//===----------------------------------------------------------------------===// + +namespace clang { +class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { +  ASTStmtReader *Reader; +  ASTContext &Context; +  const ASTReader::RecordData &Record; +  unsigned &Idx; +public: +  OMPClauseReader(ASTStmtReader *R, ASTContext &C, +                  const ASTReader::RecordData &Record, unsigned &Idx) +    : Reader(R), Context(C), Record(Record), Idx(Idx) { } +#define OPENMP_CLAUSE(Name, Class)    \ +  void Visit##Class(Class *S); +#include "clang/Basic/OpenMPKinds.def" +  OMPClause *readClause(); +}; +} + +OMPClause *OMPClauseReader::readClause() { +  OMPClause *C; +  switch (Record[Idx++]) { +  case OMPC_default: +    C = new (Context) OMPDefaultClause(); +    break; +  case OMPC_private: +    C = OMPPrivateClause::CreateEmpty(Context, Record[Idx++]); +    break; +  case OMPC_firstprivate: +    C = OMPFirstprivateClause::CreateEmpty(Context, Record[Idx++]); +    break; +  case OMPC_shared: +    C = OMPSharedClause::CreateEmpty(Context, Record[Idx++]); +    break; +  } +  Visit(C); +  C->setLocStart(Reader->ReadSourceLocation(Record, Idx)); +  C->setLocEnd(Reader->ReadSourceLocation(Record, Idx)); + +  return C; +} + +void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { +  C->setDefaultKind( +       static_cast<OpenMPDefaultClauseKind>(Record[Idx++])); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +  C->setDefaultKindKwLoc(Reader->ReadSourceLocation(Record, Idx)); +} + +void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +  unsigned NumVars = C->varlist_size(); +  SmallVector<Expr *, 16> Vars; +  Vars.reserve(NumVars); +  for (unsigned i = 0; i != NumVars; ++i) +    Vars.push_back(Reader->Reader.ReadSubExpr()); +  C->setVarRefs(Vars); +} + +void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +  unsigned NumVars = C->varlist_size(); +  SmallVector<Expr *, 16> Vars; +  Vars.reserve(NumVars); +  for (unsigned i = 0; i != NumVars; ++i) +    Vars.push_back(Reader->Reader.ReadSubExpr()); +  C->setVarRefs(Vars); +} + +void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +  unsigned NumVars = C->varlist_size(); +  SmallVector<Expr *, 16> Vars; +  Vars.reserve(NumVars); +  for (unsigned i = 0; i != NumVars; ++i) +    Vars.push_back(Reader->Reader.ReadSubExpr()); +  C->setVarRefs(Vars); +} + +//===----------------------------------------------------------------------===// +// OpenMP Directives. +//===----------------------------------------------------------------------===// +void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective *E) { +  VisitStmt(E); +  ++Idx; +  E->setLocStart(ReadSourceLocation(Record, Idx)); +  E->setLocEnd(ReadSourceLocation(Record, Idx)); +  OMPClauseReader ClauseReader(this, Reader.getContext(), Record, Idx); +  SmallVector<OMPClause *, 5> Clauses; +  for (unsigned i = 0; i < E->getNumClauses(); ++i) +    Clauses.push_back(ClauseReader.readClause()); +  E->setClauses(Clauses); +  E->setAssociatedStmt(Reader.ReadSubStmt()); +} + +void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) { +  VisitOMPExecutableDirective(D); +} + +//===----------------------------------------------------------------------===//  // ASTReader Implementation  //===----------------------------------------------------------------------===//  Stmt *ASTReader::ReadStmt(ModuleFile &F) {    switch (ReadingKind) { +  case Read_None: +    llvm_unreachable("should not call this when not reading anything");    case Read_Decl:    case Read_Type:      return ReadStmtFromStream(F); @@ -1815,7 +1936,7 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {      case STMT_CAPTURED:        S = CapturedStmt::CreateDeserialized(Context, -                                           Record[ASTStmtReader::NumExprFields]); +                                           Record[ASTStmtReader::NumStmtFields]);        break;      case EXPR_PREDEFINED: @@ -2004,6 +2125,10 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {        S = new (Context) ShuffleVectorExpr(Empty);        break; +    case EXPR_CONVERT_VECTOR: +      S = new (Context) ConvertVectorExpr(Empty); +      break; +      case EXPR_BLOCK:        S = new (Context) BlockExpr(Empty);        break; @@ -2115,6 +2240,12 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {                                                DeclarationNameInfo(),                                                0);        break; +    case STMT_OMP_PARALLEL_DIRECTIVE: +      S = +        OMPParallelDirective::CreateEmpty(Context, +                                          Record[ASTStmtReader::NumStmtFields], +                                          Empty); +      break;      case EXPR_CXX_OPERATOR_CALL:        S = new (Context) CXXOperatorCallExpr(Context, Empty); @@ -2160,6 +2291,10 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {        S = new (Context) UserDefinedLiteral(Context, Empty);        break; +    case EXPR_CXX_STD_INITIALIZER_LIST: +      S = new (Context) CXXStdInitializerListExpr(Empty); +      break; +      case EXPR_CXX_BOOL_LITERAL:        S = new (Context) CXXBoolLiteralExpr(Empty);        break; | 
