diff options
author | Aaron Ballman <aaron@aaronballman.com> | 2013-06-04 02:07:14 +0000 |
---|---|---|
committer | Aaron Ballman <aaron@aaronballman.com> | 2013-06-04 02:07:14 +0000 |
commit | 5d041beb4e86787b55236d9cf3259fef17423323 (patch) | |
tree | 46144479da4a0e132dce4655e9335e23b482dd0d /clang/lib/Frontend/PrintPreprocessedOutput.cpp | |
parent | 60c4118c88d27b67235ecf3994560bc784f9150e (diff) | |
download | bcm5719-llvm-5d041beb4e86787b55236d9cf3259fef17423323.tar.gz bcm5719-llvm-5d041beb4e86787b55236d9cf3259fef17423323.zip |
Adding support for MSVC #pragma detect_mismatch functionality by emitting a FAILIFMISMATCH linker command into the object file.
llvm-svn: 183178
Diffstat (limited to 'clang/lib/Frontend/PrintPreprocessedOutput.cpp')
-rw-r--r-- | clang/lib/Frontend/PrintPreprocessedOutput.cpp | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/clang/lib/Frontend/PrintPreprocessedOutput.cpp b/clang/lib/Frontend/PrintPreprocessedOutput.cpp index 9fd36494358..83b2a271ec3 100644 --- a/clang/lib/Frontend/PrintPreprocessedOutput.cpp +++ b/clang/lib/Frontend/PrintPreprocessedOutput.cpp @@ -140,6 +140,9 @@ public: virtual void PragmaCaptured(SourceLocation Loc, StringRef Str); virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind, const std::string &Str); + virtual void PragmaDetectMismatch(SourceLocation Loc, + const std::string &Name, + const std::string &Value); virtual void PragmaMessage(SourceLocation Loc, StringRef Namespace, PragmaMessageKind Kind, StringRef Str); virtual void PragmaDebug(SourceLocation Loc, StringRef DebugType); @@ -382,16 +385,8 @@ void PrintPPOutputPPCallbacks::MacroUndefined(const Token &MacroNameTok, setEmittedDirectiveOnThisLine(); } -void PrintPPOutputPPCallbacks::PragmaComment(SourceLocation Loc, - const IdentifierInfo *Kind, +static void outputPrintable(llvm::raw_ostream& OS, const std::string &Str) { - startNewLineIfNeeded(); - MoveToLine(Loc); - OS << "#pragma comment(" << Kind->getName(); - - if (!Str.empty()) { - OS << ", \""; - for (unsigned i = 0, e = Str.size(); i != e; ++i) { unsigned char Char = Str[i]; if (isPrintable(Char) && Char != '\\' && Char != '"') @@ -402,6 +397,18 @@ void PrintPPOutputPPCallbacks::PragmaComment(SourceLocation Loc, << (char)('0'+ ((Char >> 3) & 7)) << (char)('0'+ ((Char >> 0) & 7)); } +} + +void PrintPPOutputPPCallbacks::PragmaComment(SourceLocation Loc, + const IdentifierInfo *Kind, + const std::string &Str) { + startNewLineIfNeeded(); + MoveToLine(Loc); + OS << "#pragma comment(" << Kind->getName(); + + if (!Str.empty()) { + OS << ", \""; + outputPrintable(OS, Str); OS << '"'; } @@ -409,6 +416,19 @@ void PrintPPOutputPPCallbacks::PragmaComment(SourceLocation Loc, setEmittedDirectiveOnThisLine(); } +void PrintPPOutputPPCallbacks::PragmaDetectMismatch(SourceLocation Loc, + const std::string &Name, + const std::string &Value) { + startNewLineIfNeeded(); + MoveToLine(Loc); + OS << "#pragma detect_mismatch(\"" << Name << '"'; + outputPrintable(OS, Name); + OS << "\", \""; + outputPrintable(OS, Value); + OS << "\")"; + setEmittedDirectiveOnThisLine(); +} + void PrintPPOutputPPCallbacks::PragmaMessage(SourceLocation Loc, StringRef Namespace, PragmaMessageKind Kind, @@ -430,16 +450,7 @@ void PrintPPOutputPPCallbacks::PragmaMessage(SourceLocation Loc, break; } - for (unsigned i = 0, e = Str.size(); i != e; ++i) { - unsigned char Char = Str[i]; - if (isPrintable(Char) && Char != '\\' && Char != '"') - OS << (char)Char; - else // Output anything hard as an octal escape. - OS << '\\' - << (char)('0'+ ((Char >> 6) & 7)) - << (char)('0'+ ((Char >> 3) & 7)) - << (char)('0'+ ((Char >> 0) & 7)); - } + outputPrintable(OS, Str); OS << '"'; if (Kind == PMK_Message) OS << ')'; |