Read/write from/to PCH the diagnostic mappings that the user set so that e.g. #pragma clang diagnostic can be used in a PCH.

Fixes rdar://8435969.

llvm-svn: 118303
This commit is contained in:
Argyrios Kyrtzidis 2010-11-05 22:10:18 +00:00
parent d87ea457bb
commit 452707c125
7 changed files with 72 additions and 1 deletions

View File

@ -640,6 +640,9 @@ private:
/// \returns true if the diagnostic was emitted, false if it was
/// suppressed.
bool ProcessDiag();
friend class ASTReader;
friend class ASTWriter;
};
//===----------------------------------------------------------------------===//

View File

@ -341,7 +341,10 @@ namespace clang {
/// \brief Record code for the table of offsets to CXXBaseSpecifier
/// sets.
CXX_BASE_SPECIFIER_OFFSETS = 37
CXX_BASE_SPECIFIER_OFFSETS = 37,
/// \brief Record code for diagnostic mappings specified by the user.
DIAG_USER_MAPPINGS = 38
};
/// \brief Record types used within a source manager block.

View File

@ -570,6 +570,9 @@ private:
//@}
/// \brief Diagnostic IDs and their mappings that the user changed.
llvm::SmallVector<uint64_t, 8> UserDiagMappings;
/// \brief The original file name that was used to build the primary AST file,
/// which may have been modified for relocatable-pch support.
std::string OriginalFileName;
@ -849,6 +852,8 @@ public:
/// \brief Read preprocessed entities into the
virtual void ReadPreprocessedEntities();
void ReadUserDiagnosticMappings(Diagnostic &Diag);
/// \brief Returns the number of source locations found in the chain.
unsigned getTotalNumSLocs() const {
return TotalNumSLocEntries;

View File

@ -304,6 +304,7 @@ private:
const Preprocessor &PP,
const char* isysroot);
void WritePreprocessor(const Preprocessor &PP);
void WriteUserDiagnosticMappings(const Diagnostic &Diag);
void WriteType(QualType T);
uint64_t WriteDeclContextLexicalBlock(ASTContext &Context, DeclContext *DC);
uint64_t WriteDeclContextVisibleBlock(ASTContext &Context, DeclContext *DC);

View File

@ -2130,6 +2130,18 @@ ASTReader::ReadASTBlock(PerFileData &F) {
F.CXXBaseSpecifiersOffsets = (const uint32_t *)BlobStart;
break;
}
case DIAG_USER_MAPPINGS:
if (Record.size() % 2 != 0) {
Error("invalid DIAG_USER_MAPPINGS block in AST file");
return Failure;
}
if (UserDiagMappings.empty())
UserDiagMappings.swap(Record);
else
UserDiagMappings.insert(UserDiagMappings.end(),
Record.begin(), Record.end());
break;
}
First = false;
}
@ -2457,6 +2469,8 @@ void ASTReader::InitializeContext(ASTContext &Ctx) {
if (SpecialTypes[SPECIAL_TYPE_INT128_INSTALLED])
Context->setInt128Installed();
ReadUserDiagnosticMappings(Context->getDiagnostics());
}
/// \brief Retrieve the name of the original source file name
@ -2623,6 +2637,15 @@ void ASTReader::ReadPreprocessedEntities() {
ReadDefinedMacros();
}
void ASTReader::ReadUserDiagnosticMappings(Diagnostic &Diag) {
unsigned Idx = 0;
while (Idx < UserDiagMappings.size()) {
unsigned DiagID = UserDiagMappings[Idx++];
unsigned Map = UserDiagMappings[Idx++];
Diag.setDiagnosticMappingInternal(DiagID, Map, /*isUser=*/true);
}
}
/// \brief Get the correct cursor and offset for loading a type.
ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
PerFileData *F = 0;

View File

@ -1441,6 +1441,19 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP) {
}
}
void ASTWriter::WriteUserDiagnosticMappings(const Diagnostic &Diag) {
RecordData Record;
for (unsigned i = 0; i != diag::DIAG_UPPER_LIMIT; ++i) {
diag::Mapping Map = Diag.getDiagnosticMappingInfo(i);
if (Map & 0x8) { // user mapping.
Record.push_back(i);
Record.push_back(Map & 0x7);
}
}
Stream.EmitRecord(DIAG_USER_MAPPINGS, Record);
}
//===----------------------------------------------------------------------===//
// Type Serialization
//===----------------------------------------------------------------------===//
@ -2402,6 +2415,7 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
WriteIdentifierTable(PP);
WriteTypeDeclOffsets();
WriteUserDiagnosticMappings(Context.getDiagnostics());
// Write the C++ base-specifier set offsets.
if (!CXXBaseSpecifiersOffsets.empty()) {
@ -2635,6 +2649,9 @@ void ASTWriter::WriteASTChain(Sema &SemaRef, MemorizeStatCalls *StatCalls,
WriteReferencedSelectorsPool(SemaRef);
WriteIdentifierTable(PP);
WriteTypeDeclOffsets();
// FIXME: For chained PCH only write the new mappings (we currently
// write all of them again).
WriteUserDiagnosticMappings(Context.getDiagnostics());
/// Build a record containing first declarations from a chained PCH and the
/// most recent declarations in this AST that they point to.

View File

@ -0,0 +1,19 @@
// Test this without pch.
// RUN: %clang_cc1 %s -include %s -verify -fsyntax-only
// Test with pch.
// RUN: %clang_cc1 %s -emit-pch -o %t
// RUN: %clang_cc1 %s -include-pch %t -verify -fsyntax-only
#ifndef HEADER
#define HEADER
#pragma clang diagnostic ignored "-Wtautological-compare"
#else
void f() {
int b = b==b;
}
#endif