diff options
author | rdivacky <rdivacky@FreeBSD.org> | 2010-02-16 09:31:36 +0000 |
---|---|---|
committer | rdivacky <rdivacky@FreeBSD.org> | 2010-02-16 09:31:36 +0000 |
commit | fd035e6496665b1f1197868e21cb0a4594e8db6e (patch) | |
tree | 53010172e19c77ea447bcd89e117cda052ab52e0 /lib/Lex | |
parent | 2fce988e86bc01829142e4362d4eff1af0925147 (diff) | |
download | FreeBSD-src-fd035e6496665b1f1197868e21cb0a4594e8db6e.zip FreeBSD-src-fd035e6496665b1f1197868e21cb0a4594e8db6e.tar.gz |
Update clang to r96341.
Diffstat (limited to 'lib/Lex')
-rw-r--r-- | lib/Lex/Lexer.cpp | 16 | ||||
-rw-r--r-- | lib/Lex/Makefile | 1 | ||||
-rw-r--r-- | lib/Lex/PPCaching.cpp | 2 | ||||
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 17 | ||||
-rw-r--r-- | lib/Lex/PPMacroExpansion.cpp | 38 | ||||
-rw-r--r-- | lib/Lex/Preprocessor.cpp | 2 |
6 files changed, 39 insertions, 37 deletions
diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index afd1ba8..3207062 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -985,10 +985,11 @@ bool Lexer::SkipBCPLComment(Token &Result, const char *CurPtr) { if (CurPtr == BufferEnd+1) { --CurPtr; break; } } while (C != '\n' && C != '\r'); - // Found but did not consume the newline. - if (PP && PP->HandleComment(Result, - SourceRange(getSourceLocation(BufferPtr), - getSourceLocation(CurPtr)))) { + // Found but did not consume the newline. Notify comment handlers about the + // comment unless we're in a #if 0 block. + if (PP && !isLexingRawMode() && + PP->HandleComment(Result, SourceRange(getSourceLocation(BufferPtr), + getSourceLocation(CurPtr)))) { BufferPtr = CurPtr; return true; // A token has to be returned. } @@ -1235,9 +1236,10 @@ bool Lexer::SkipBlockComment(Token &Result, const char *CurPtr) { C = *CurPtr++; } - if (PP && PP->HandleComment(Result, - SourceRange(getSourceLocation(BufferPtr), - getSourceLocation(CurPtr)))) { + // Notify comment handlers about the comment unless we're in a #if 0 block. + if (PP && !isLexingRawMode() && + PP->HandleComment(Result, SourceRange(getSourceLocation(BufferPtr), + getSourceLocation(CurPtr)))) { BufferPtr = CurPtr; return true; // A token has to be returned. } diff --git a/lib/Lex/Makefile b/lib/Lex/Makefile index a2437da..5090770 100644 --- a/lib/Lex/Makefile +++ b/lib/Lex/Makefile @@ -16,7 +16,6 @@ include $(LEVEL)/Makefile.config LIBRARYNAME := clangLex BUILD_ARCHIVE = 1 -CXXFLAGS = -fno-rtti ifeq ($(ARCH),PowerPC) CXXFLAGS += -maltivec diff --git a/lib/Lex/PPCaching.cpp b/lib/Lex/PPCaching.cpp index 7c3780f..6aeb6fa 100644 --- a/lib/Lex/PPCaching.cpp +++ b/lib/Lex/PPCaching.cpp @@ -91,7 +91,7 @@ const Token &Preprocessor::PeekAhead(unsigned N) { void Preprocessor::AnnotatePreviousCachedTokens(const Token &Tok) { assert(Tok.isAnnotation() && "Expected annotation token"); assert(CachedLexPos != 0 && "Expected to have some cached tokens"); - assert(CachedTokens[CachedLexPos-1].getLocation() == Tok.getAnnotationEndLoc() + assert(CachedTokens[CachedLexPos-1].getLastLoc() == Tok.getAnnotationEndLoc() && "The annotation should be until the most recent cached token"); // Start from the end of the cached tokens list and look for the token diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index b0e784b..4803c5a 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -1514,18 +1514,21 @@ void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef, // Check to see if this is the last token on the #if[n]def line. CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef"); + IdentifierInfo *MII = MacroNameTok.getIdentifierInfo(); + MacroInfo *MI = getMacroInfo(MII); + if (CurPPLexer->getConditionalStackDepth() == 0) { - // If the start of a top-level #ifdef, inform MIOpt. - if (!ReadAnyTokensBeforeDirective) { + // If the start of a top-level #ifdef and if the macro is not defined, + // inform MIOpt that this might be the start of a proper include guard. + // Otherwise it is some other form of unknown conditional which we can't + // handle. + if (!ReadAnyTokensBeforeDirective && MI == 0) { assert(isIfndef && "#ifdef shouldn't reach here"); - CurPPLexer->MIOpt.EnterTopLevelIFNDEF(MacroNameTok.getIdentifierInfo()); + CurPPLexer->MIOpt.EnterTopLevelIFNDEF(MII); } else CurPPLexer->MIOpt.EnterTopLevelConditional(); } - IdentifierInfo *MII = MacroNameTok.getIdentifierInfo(); - MacroInfo *MI = getMacroInfo(MII); - // If there is a macro, process it. if (MI) // Mark it used. MI->setIsUsed(true); @@ -1558,7 +1561,7 @@ void Preprocessor::HandleIfDirective(Token &IfToken, // If this condition is equivalent to #ifndef X, and if this is the first // directive seen, handle it for the multiple-include optimization. if (CurPPLexer->getConditionalStackDepth() == 0) { - if (!ReadAnyTokensBeforeDirective && IfNDefMacro) + if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue) CurPPLexer->MIOpt.EnterTopLevelIFNDEF(IfNDefMacro); else CurPPLexer->MIOpt.EnterTopLevelConditional(); diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 13aeb88..b97ab24 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -19,6 +19,7 @@ #include "clang/Basic/FileManager.h" #include "clang/Lex/LexDiagnostic.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/Support/raw_ostream.h" #include <cstdio> #include <ctime> using namespace clang; @@ -152,7 +153,7 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, MacroInfo *MI) { if (Callbacks) Callbacks->MacroExpands(Identifier, MI); - // If this is a macro exapnsion in the "#if !defined(x)" line for the file, + // If this is a macro expansion in the "#if !defined(x)" line for the file, // then the macro could expand to different things in other contexts, we need // to disable the optimization in this case. if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro(); @@ -627,7 +628,8 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { ++NumBuiltinMacroExpanded; - char TmpBuffer[100]; + llvm::SmallString<128> TmpBuffer; + llvm::raw_svector_ostream OS(TmpBuffer); // Set up the return result. Tok.setIdentifierInfo(0); @@ -652,9 +654,8 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc); // __LINE__ expands to a simple numeric value. - sprintf(TmpBuffer, "%u", PLoc.getLine()); + OS << PLoc.getLine(); Tok.setKind(tok::numeric_constant); - CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) { // C99 6.10.8: "__FILE__: The presumed name of the current source file (a // character string literal)". This can be affected by #line. @@ -671,10 +672,11 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { } // Escape this filename. Turn '\' -> '\\' '"' -> '\"' - std::string FN = PLoc.getFilename(); - FN = '"' + Lexer::Stringify(FN) + '"'; + llvm::SmallString<128> FN; + FN += PLoc.getFilename(); + Lexer::Stringify(FN); + OS << '"' << FN.str() << '"'; Tok.setKind(tok::string_literal); - CreateString(&FN[0], FN.size(), Tok, Tok.getLocation()); } else if (II == Ident__DATE__) { if (!DATELoc.isValid()) ComputeDATE_TIME(DATELoc, TIMELoc, *this); @@ -683,6 +685,7 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { Tok.setLocation(SourceMgr.createInstantiationLoc(DATELoc, Tok.getLocation(), Tok.getLocation(), Tok.getLength())); + return; } else if (II == Ident__TIME__) { if (!TIMELoc.isValid()) ComputeDATE_TIME(DATELoc, TIMELoc, *this); @@ -691,6 +694,7 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { Tok.setLocation(SourceMgr.createInstantiationLoc(TIMELoc, Tok.getLocation(), Tok.getLocation(), Tok.getLength())); + return; } else if (II == Ident__INCLUDE_LEVEL__) { // Compute the presumed include depth of this token. This can be affected // by GNU line markers. @@ -702,9 +706,8 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); // __INCLUDE_LEVEL__ expands to a simple numeric value. - sprintf(TmpBuffer, "%u", Depth); + OS << Depth; Tok.setKind(tok::numeric_constant); - CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); } else if (II == Ident__TIMESTAMP__) { // MSVC, ICC, GCC, VisualAge C++ extension. The generated string should be // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime. @@ -725,17 +728,13 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { } else { Result = "??? ??? ?? ??:??:?? ????\n"; } - TmpBuffer[0] = '"'; - unsigned Len = strlen(Result); - memcpy(TmpBuffer+1, Result, Len-1); // Copy string without the newline. - TmpBuffer[Len] = '"'; + // Surround the string with " and strip the trailing newline. + OS << '"' << llvm::StringRef(Result, strlen(Result)-1) << '"'; Tok.setKind(tok::string_literal); - CreateString(TmpBuffer, Len+1, Tok, Tok.getLocation()); } else if (II == Ident__COUNTER__) { // __COUNTER__ expands to a simple numeric value. - sprintf(TmpBuffer, "%u", CounterValue++); + OS << CounterValue++; Tok.setKind(tok::numeric_constant); - CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); } else if (II == Ident__has_feature || II == Ident__has_builtin) { // The argument to these two builtins should be a parenthesized identifier. @@ -770,9 +769,8 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { Value = HasFeature(*this, FeatureII); } - sprintf(TmpBuffer, "%d", (int)Value); + OS << (int)Value; Tok.setKind(tok::numeric_constant); - CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); } else if (II == Ident__has_include || II == Ident__has_include_next) { // The argument to these two builtins should be a parenthesized @@ -784,10 +782,10 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { IsValid = EvaluateHasInclude(Value, Tok, II, *this); else IsValid = EvaluateHasIncludeNext(Value, Tok, II, *this); - sprintf(TmpBuffer, "%d", (int)Value); + OS << (int)Value; Tok.setKind(tok::numeric_constant); - CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); } else { assert(0 && "Unknown identifier!"); } + CreateString(OS.str().data(), OS.str().size(), Tok, Tok.getLocation()); } diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 5689baa..df0e702 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -424,7 +424,7 @@ SourceLocation Preprocessor::AdvanceToTokenCharacter(SourceLocation TokStart, // advanced by 3 should return the location of b, not of \\. One compounding // detail of this is that the escape may be made by a trigraph. if (!Lexer::isObviouslySimpleCharacter(*TokPtr)) - PhysOffset = Lexer::SkipEscapedNewLines(TokPtr)-TokPtr; + PhysOffset += Lexer::SkipEscapedNewLines(TokPtr)-TokPtr; return TokStart.getFileLocWithOffset(PhysOffset); } |