diff options
author | Kevin Enderby <enderby@apple.com> | 2010-06-28 21:45:58 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2010-06-28 21:45:58 +0000 |
commit | f187ac5a23213f85c3c1f0f80b3592295ee6441d (patch) | |
tree | 92f3b045852ec88f84ca3d461e6d871f0cfba079 /lib/MC/MCParser/AsmParser.cpp | |
parent | 0dd3549edc91b50fba102a6b0473caf8d4cf6b70 (diff) | |
download | external_llvm-f187ac5a23213f85c3c1f0f80b3592295ee6441d.zip external_llvm-f187ac5a23213f85c3c1f0f80b3592295ee6441d.tar.gz external_llvm-f187ac5a23213f85c3c1f0f80b3592295ee6441d.tar.bz2 |
Added the darwin .secure_log_unique and .secure_log_reset directives.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107077 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCParser/AsmParser.cpp')
-rw-r--r-- | lib/MC/MCParser/AsmParser.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 4523eab..dea71dd 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -24,6 +24,7 @@ #include "llvm/MC/MCParser/MCParsedAsmOperand.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/SourceMgr.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetAsmParser.h" using namespace llvm; @@ -780,6 +781,10 @@ bool AsmParser::ParseStatement() { return ParseDirectiveDarwinDumpOrLoad(IDLoc, /*IsDump=*/true); if (IDVal == ".load") return ParseDirectiveDarwinDumpOrLoad(IDLoc, /*IsLoad=*/false); + if (IDVal == ".secure_log_unique") + return ParseDirectiveDarwinSecureLogUnique(IDLoc); + if (IDVal == ".secure_log_reset") + return ParseDirectiveDarwinSecureLogReset(IDLoc); // Look up the handler in the handler table, bool(AsmParser::*Handler)(StringRef, SMLoc) = DirectiveMap[IDVal]; @@ -1735,6 +1740,64 @@ bool AsmParser::ParseDirectiveDarwinDumpOrLoad(SMLoc IDLoc, bool IsDump) { return false; } +/// ParseDirectiveDarwinSecureLogUnique +/// ::= .secure_log_unique "log message" +bool AsmParser::ParseDirectiveDarwinSecureLogUnique(SMLoc IDLoc) { + std::string LogMessage; + + if (Lexer.isNot(AsmToken::String)) + LogMessage = ""; + else{ + LogMessage = getTok().getString(); + Lex(); + } + + if (Lexer.isNot(AsmToken::EndOfStatement)) + return TokError("unexpected token in '.secure_log_unique' directive"); + + if (getContext().getSecureLogUsed() != false) + return Error(IDLoc, ".secure_log_unique specified multiple times"); + + char *SecureLogFile = getContext().getSecureLogFile(); + if (SecureLogFile == NULL) + return Error(IDLoc, ".secure_log_unique used but AS_SECURE_LOG_FILE " + "environment variable unset."); + + raw_ostream *OS = getContext().getSecureLog(); + if (OS == NULL) { + std::string Err; + OS = new raw_fd_ostream(SecureLogFile, Err, raw_fd_ostream::F_Append); + if (!Err.empty()) { + delete OS; + return Error(IDLoc, Twine("can't open secure log file: ") + + SecureLogFile + " (" + Err + ")"); + } + getContext().setSecureLog(OS); + } + + int CurBuf = SrcMgr.FindBufferContainingLoc(IDLoc); + *OS << SrcMgr.getBufferInfo(CurBuf).Buffer->getBufferIdentifier() << ":" + << SrcMgr.FindLineNumber(IDLoc, CurBuf) << ":" + << LogMessage + "\n"; + + getContext().setSecureLogUsed(true); + + return false; +} + +/// ParseDirectiveDarwinSecureLogReset +/// ::= .secure_log_reset +bool AsmParser::ParseDirectiveDarwinSecureLogReset(SMLoc IDLoc) { + if (Lexer.isNot(AsmToken::EndOfStatement)) + return TokError("unexpected token in '.secure_log_reset' directive"); + + Lex(); + + getContext().setSecureLogUsed(false); + + return false; +} + /// ParseDirectiveIf /// ::= .if expression bool AsmParser::ParseDirectiveIf(SMLoc DirectiveLoc) { |