diff options
| author | Nico Weber <nicolasweber@gmx.de> | 2016-03-02 23:22:00 +0000 |
|---|---|---|
| committer | Nico Weber <nicolasweber@gmx.de> | 2016-03-02 23:22:00 +0000 |
| commit | 779355f96bd5e6bff40bae824f3f13ccbb30d018 (patch) | |
| tree | f8303aa2cdd6b397592c67d67b5244ce181a9628 /clang/lib | |
| parent | 8226fc482999342e899db0d046ad044ba2ada136 (diff) | |
| download | bcm5719-llvm-779355f96bd5e6bff40bae824f3f13ccbb30d018.tar.gz bcm5719-llvm-779355f96bd5e6bff40bae824f3f13ccbb30d018.zip | |
Serialize `pragma ms_struct` state.
pragma ms_struct has an effect on struct decls, and the effect is serialized
correctly already. But the "is ms_struct currently on" state wasn't before
this change.
This uses the same approach as `pragma clang optimize`: When writing a module,
the state isn't serialized, only when writing a pch file.
llvm-svn: 262539
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Parse/ParsePragma.cpp | 11 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 15 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 12 |
3 files changed, 29 insertions, 9 deletions
diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index a7ea206d09b..09c5d49a6ae 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -362,9 +362,8 @@ void Parser::HandlePragmaPack() { void Parser::HandlePragmaMSStruct() { assert(Tok.is(tok::annot_pragma_msstruct)); - Sema::PragmaMSStructKind Kind = - static_cast<Sema::PragmaMSStructKind>( - reinterpret_cast<uintptr_t>(Tok.getAnnotationValue())); + PragmaMSStructKind Kind = static_cast<PragmaMSStructKind>( + reinterpret_cast<uintptr_t>(Tok.getAnnotationValue())); Actions.ActOnPragmaMSStruct(Kind); ConsumeToken(); // The annotation token. } @@ -1063,8 +1062,8 @@ void PragmaPackHandler::HandlePragma(Preprocessor &PP, void PragmaMSStructHandler::HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, Token &MSStructTok) { - Sema::PragmaMSStructKind Kind = Sema::PMSST_OFF; - + PragmaMSStructKind Kind = PMSST_OFF; + Token Tok; PP.Lex(Tok); if (Tok.isNot(tok::identifier)) { @@ -1074,7 +1073,7 @@ void PragmaMSStructHandler::HandlePragma(Preprocessor &PP, SourceLocation EndLoc = Tok.getLocation(); const IdentifierInfo *II = Tok.getIdentifierInfo(); if (II->isStr("on")) { - Kind = Sema::PMSST_ON; + Kind = PMSST_ON; PP.Lex(Tok); } else if (II->isStr("off") || II->isStr("reset")) diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 4eef6cfbff4..57dc611c7e0 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -3217,6 +3217,14 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); break; + case MSSTRUCT_PRAGMA_OPTIONS: + if (Record.size() != 1) { + Error("invalid pragma ms_struct record"); + return Failure; + } + PragmaMSStructState = Record[0]; + break; + case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: for (unsigned I = 0, N = Record.size(); I != N; ++I) UnusedLocalTypedefNameCandidates.push_back( @@ -6998,10 +7006,12 @@ void ASTReader::UpdateSema() { SemaDeclRefs.clear(); } - // Update the state of 'pragma clang optimize'. Use the same API as if we had - // encountered the pragma in the source. + // Update the state of pragmas. Use the same API as if we had encountered the + // pragma in the source. if(OptimizeOffPragmaLocation.isValid()) SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation); + if (PragmaMSStructState != -1) + SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); } IdentifierInfo *ASTReader::get(StringRef Name) { @@ -8696,6 +8706,7 @@ ASTReader::ASTReader( Diags(PP.getDiagnostics()), SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr), ModuleMgr(PP.getFileManager(), PCHContainerRdr), ReadTimer(std::move(ReadTimer)), + PragmaMSStructState(-1), isysroot(isysroot), DisableValidation(DisableValidation), AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), AllowConfigurationMismatch(AllowConfigurationMismatch), diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 98ed1488d50..bef7fc267eb 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -960,6 +960,7 @@ void ASTWriter::WriteBlockInfoBlock() { RECORD(UNDEFINED_BUT_USED); RECORD(LATE_PARSED_TEMPLATE); RECORD(OPTIMIZE_PRAGMA_OPTIONS); + RECORD(MSSTRUCT_PRAGMA_OPTIONS); RECORD(UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES); RECORD(CXX_CTOR_INITIALIZERS_OFFSETS); RECORD(DELETE_EXPRS_TO_ANALYZE); @@ -3928,6 +3929,13 @@ void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) { Stream.EmitRecord(OPTIMIZE_PRAGMA_OPTIONS, Record); } +/// \brief Write the state of 'pragma ms_struct' at the end of the module. +void ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) { + RecordData Record; + Record.push_back(SemaRef.MSStructPragmaOn ? PMSST_ON : PMSST_OFF); + Stream.EmitRecord(MSSTRUCT_PRAGMA_OPTIONS, Record); +} + void ASTWriter::WriteModuleFileExtension(Sema &SemaRef, ModuleFileExtensionWriter &Writer) { // Enter the extension block. @@ -4605,8 +4613,10 @@ uint64_t ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot, WriteDeclReplacementsBlock(); WriteObjCCategories(); - if(!WritingModule) + if(!WritingModule) { WriteOptimizePragmaOptions(SemaRef); + WriteMSStructPragmaOptions(SemaRef); + } // Some simple statistics RecordData::value_type Record[] = { |

