aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2010-07-25 21:40:48 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2010-07-25 21:40:48 +0000
commit3c2d3016adec79c81c4efff64e208fd3ecdd92ae (patch)
treef0714e08926338ed0f209725321392749ff58545
parent7cb6bd70f9436f630a508ba017414ca2466eeb35 (diff)
Wrap bit mangling logic for DiagMappings in its own class so it doesn't leak
into other code. Make it an array instead of a constant-length vector. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109384 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/Diagnostic.h26
-rw-r--r--lib/Basic/Diagnostic.cpp7
2 files changed, 21 insertions, 12 deletions
diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h
index b09fd814b9..c67de985a0 100644
--- a/include/clang/Basic/Diagnostic.h
+++ b/include/clang/Basic/Diagnostic.h
@@ -213,8 +213,24 @@ private:
/// when the mapping was established as a user mapping. If the high bit is
/// clear, then the low bits are set to the default value, and should be
/// mapped with -pedantic, -Werror, etc.
+ class DiagMappings {
+ unsigned char Values[diag::DIAG_UPPER_LIMIT/2];
+
+ public:
+ DiagMappings() {
+ memset(Values, 0, diag::DIAG_UPPER_LIMIT/2);
+ }
+
+ void setMapping(diag::kind Diag, unsigned Map) {
+ size_t Shift = (Diag & 1)*4;
+ Values[Diag/2] = (Values[Diag/2] & ~(15 << Shift)) | (Map << Shift);
+ }
+
+ diag::Mapping getMapping(diag::kind Diag) const {
+ return (diag::Mapping)((Values[Diag/2] >> (Diag & 1)*4) & 15);
+ }
+ };
- typedef std::vector<unsigned char> DiagMappings;
mutable std::vector<DiagMappings> DiagMappingsStack;
/// ErrorOccurred / FatalErrorOccurred - This is set to true when an error or
@@ -539,17 +555,13 @@ private:
/// specified builtin diagnostic. This returns the high bit encoding, or zero
/// if the field is completely uninitialized.
diag::Mapping getDiagnosticMappingInfo(diag::kind Diag) const {
- const DiagMappings &currentMappings = DiagMappingsStack.back();
- return (diag::Mapping)((currentMappings[Diag/2] >> (Diag & 1)*4) & 15);
+ return DiagMappingsStack.back().getMapping(Diag);
}
void setDiagnosticMappingInternal(unsigned DiagId, unsigned Map,
bool isUser) const {
if (isUser) Map |= 8; // Set the high bit for user mappings.
- unsigned char &Slot = DiagMappingsStack.back()[DiagId/2];
- unsigned Shift = (DiagId & 1)*4;
- Slot &= ~(15 << Shift);
- Slot |= Map << Shift;
+ DiagMappingsStack.back().setMapping((diag::kind)DiagId, Map);
}
/// getDiagnosticLevel - This is an internal implementation helper used when
diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp
index 68548da0cb..f956f1aec8 100644
--- a/lib/Basic/Diagnostic.cpp
+++ b/lib/Basic/Diagnostic.cpp
@@ -334,11 +334,8 @@ void Diagnostic::Reset() {
DelayedDiagID = 0;
// Set all mappings to 'unset'.
- while (!DiagMappingsStack.empty())
- DiagMappingsStack.pop_back();
-
- DiagMappings BlankDiags(diag::DIAG_UPPER_LIMIT/2, 0);
- DiagMappingsStack.push_back(BlankDiags);
+ DiagMappingsStack.clear();
+ DiagMappingsStack.push_back(DiagMappings());
}
/// getDescription - Given a diagnostic ID, return a description of the