[cfe-commits] r118303 - in /cfe/trunk: include/clang/Basic/Diagnostic.h include/clang/Serialization/ASTBitCodes.h include/clang/Serialization/ASTReader.h include/clang/Serialization/ASTWriter.h lib/Serialization/ASTReader.cpp lib/Serialization/ASTWriter.cpp test/PCH/pragma-diag.c
Argyrios Kyrtzidis
akyrtzi at gmail.com
Fri Nov 5 15:10:19 PDT 2010
Author: akirtzidis
Date: Fri Nov 5 17:10:18 2010
New Revision: 118303
URL: http://llvm.org/viewvc/llvm-project?rev=118303&view=rev
Log:
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.
Added:
cfe/trunk/test/PCH/pragma-diag.c
Modified:
cfe/trunk/include/clang/Basic/Diagnostic.h
cfe/trunk/include/clang/Serialization/ASTBitCodes.h
cfe/trunk/include/clang/Serialization/ASTReader.h
cfe/trunk/include/clang/Serialization/ASTWriter.h
cfe/trunk/lib/Serialization/ASTReader.cpp
cfe/trunk/lib/Serialization/ASTWriter.cpp
Modified: cfe/trunk/include/clang/Basic/Diagnostic.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=118303&r1=118302&r2=118303&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/Diagnostic.h (original)
+++ cfe/trunk/include/clang/Basic/Diagnostic.h Fri Nov 5 17:10:18 2010
@@ -640,6 +640,9 @@
/// \returns true if the diagnostic was emitted, false if it was
/// suppressed.
bool ProcessDiag();
+
+ friend class ASTReader;
+ friend class ASTWriter;
};
//===----------------------------------------------------------------------===//
Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=118303&r1=118302&r2=118303&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Fri Nov 5 17:10:18 2010
@@ -341,7 +341,10 @@
/// \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.
Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=118303&r1=118302&r2=118303&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTReader.h Fri Nov 5 17:10:18 2010
@@ -570,6 +570,9 @@
//@}
+ /// \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 @@
/// \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;
Modified: cfe/trunk/include/clang/Serialization/ASTWriter.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=118303&r1=118302&r2=118303&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTWriter.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTWriter.h Fri Nov 5 17:10:18 2010
@@ -304,6 +304,7 @@
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);
Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=118303&r1=118302&r2=118303&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Fri Nov 5 17:10:18 2010
@@ -2130,6 +2130,18 @@
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 @@
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 @@
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;
Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=118303&r1=118302&r2=118303&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri Nov 5 17:10:18 2010
@@ -1441,6 +1441,19 @@
}
}
+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 @@
WriteIdentifierTable(PP);
WriteTypeDeclOffsets();
+ WriteUserDiagnosticMappings(Context.getDiagnostics());
// Write the C++ base-specifier set offsets.
if (!CXXBaseSpecifiersOffsets.empty()) {
@@ -2635,6 +2649,9 @@
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.
Added: cfe/trunk/test/PCH/pragma-diag.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/pragma-diag.c?rev=118303&view=auto
==============================================================================
--- cfe/trunk/test/PCH/pragma-diag.c (added)
+++ cfe/trunk/test/PCH/pragma-diag.c Fri Nov 5 17:10:18 2010
@@ -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
More information about the cfe-commits
mailing list