[cfe-commits] r64892 - in /cfe/trunk: Driver/RewriteObjC.cpp include/clang/AST/Expr.h lib/AST/Expr.cpp lib/AST/StmtSerialization.cpp lib/Sema/SemaExpr.cpp lib/Sema/SemaExprObjC.cpp

Chris Lattner sabre at nondot.org
Tue Feb 17 21:49:12 PST 2009


Author: lattner
Date: Tue Feb 17 23:49:11 2009
New Revision: 64892

URL: http://llvm.org/viewvc/llvm-project?rev=64892&view=rev
Log:
change the StringLiteral AST node to track all of the SourceLocations of 
the various PPTokens that are pasted together to make it.  In the course
of working on this, I discovered ParseObjCStringLiteral which needs some
work.  I'll tackle it next.

Modified:
    cfe/trunk/Driver/RewriteObjC.cpp
    cfe/trunk/include/clang/AST/Expr.h
    cfe/trunk/lib/AST/Expr.cpp
    cfe/trunk/lib/AST/StmtSerialization.cpp
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/lib/Sema/SemaExprObjC.cpp

Modified: cfe/trunk/Driver/RewriteObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteObjC.cpp?rev=64892&r1=64891&r2=64892&view=diff

==============================================================================
--- cfe/trunk/Driver/RewriteObjC.cpp (original)
+++ cfe/trunk/Driver/RewriteObjC.cpp Tue Feb 17 23:49:11 2009
@@ -1736,7 +1736,7 @@
   Context->getObjCEncodingForType(Exp->getEncodedType(), StrEncoding);
   Expr *Replacement = new (Context) StringLiteral(*Context,StrEncoding.c_str(),
                                         StrEncoding.length(), false, StrType, 
-                                        SourceLocation(), SourceLocation());
+                                        SourceLocation());
   ReplaceStmt(Exp, Replacement);
   
   // Replace this subexpr in the parent.
@@ -1754,8 +1754,7 @@
   SelExprs.push_back(new (Context) StringLiteral((*Context), 
                                        Exp->getSelector().getAsString().c_str(),
                                        Exp->getSelector().getAsString().size(),
-                                       false, argType, SourceLocation(),
-                                       SourceLocation()));
+                                       false, argType, SourceLocation()));
   CallExpr *SelExp = SynthesizeCallToFunctionDecl(SelGetUidFunctionDecl,
                                                  &SelExprs[0], SelExprs.size());
   ReplaceStmt(Exp, SelExp);
@@ -2293,8 +2292,7 @@
       ClsExprs.push_back(new (Context) StringLiteral(*Context,
                                         SuperDecl->getIdentifier()->getName(), 
                                         SuperDecl->getIdentifier()->getLength(),
-                                        false, argType, SourceLocation(),
-                                        SourceLocation()));
+                                        false, argType, SourceLocation()));
       CallExpr *Cls = SynthesizeCallToFunctionDecl(GetMetaClassFunctionDecl,
                                                    &ClsExprs[0], 
                                                    ClsExprs.size());
@@ -2346,8 +2344,7 @@
       ClsExprs.push_back(new (Context) StringLiteral(*Context,
                                            clsName->getName(), 
                                            clsName->getLength(),
-                                           false, argType, SourceLocation(),
-                                           SourceLocation()));
+                                           false, argType, SourceLocation()));
       CallExpr *Cls = SynthesizeCallToFunctionDecl(GetClassFunctionDecl,
                                                    &ClsExprs[0], 
                                                    ClsExprs.size());
@@ -2377,8 +2374,7 @@
       ClsExprs.push_back(new (Context) StringLiteral(*Context, 
                                         SuperDecl->getIdentifier()->getName(), 
                                         SuperDecl->getIdentifier()->getLength(),
-                                        false, argType, SourceLocation(),
-                                        SourceLocation()));
+                                        false, argType, SourceLocation()));
       CallExpr *Cls = SynthesizeCallToFunctionDecl(GetClassFunctionDecl,
                                                    &ClsExprs[0], 
                                                    ClsExprs.size());
@@ -2436,8 +2432,7 @@
   SelExprs.push_back(new (Context) StringLiteral(*Context, 
                                        Exp->getSelector().getAsString().c_str(),
                                        Exp->getSelector().getAsString().size(),
-                                       false, argType, SourceLocation(),
-                                       SourceLocation()));
+                                       false, argType, SourceLocation()));
   CallExpr *SelExp = SynthesizeCallToFunctionDecl(SelGetUidFunctionDecl,
                                                  &SelExprs[0], SelExprs.size());
   MsgExprs.push_back(SelExp);
@@ -2605,8 +2600,7 @@
                        StringLiteral(*Context,
                                 Exp->getProtocol()->getNameAsCString(),
                                 strlen(Exp->getProtocol()->getNameAsCString()),
-                                false, argType, SourceLocation(),
-                                       SourceLocation()));
+                                false, argType, SourceLocation()));
   CallExpr *ProtoExp = SynthesizeCallToFunctionDecl(GetProtocolFunctionDecl,
                                                     &ProtoExprs[0], 
                                                     ProtoExprs.size());

Modified: cfe/trunk/include/clang/AST/Expr.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=64892&r1=64891&r2=64892&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/Expr.h (original)
+++ cfe/trunk/include/clang/AST/Expr.h Tue Feb 17 23:49:11 2009
@@ -480,22 +480,33 @@
   const char *StrData;
   unsigned ByteLength;
   bool IsWide;
-  // if the StringLiteral was composed using token pasting, both locations
+  // If the StringLiteral was composed using token pasting, both locations
   // are needed. If not (the common case), firstTokLoc == lastTokLoc.
-  // FIXME: if space becomes an issue, we should create a sub-class.
-  SourceLocation firstTokLoc, lastTokLoc;
+  unsigned NumConcatenated;
+  SourceLocation TokLocs[1];
 public:
-  StringLiteral(ASTContext& C, const char *strData, unsigned byteLength,
-                bool Wide, QualType t, SourceLocation b, SourceLocation e);
+  StringLiteral(ASTContext &C, const char *StrData, unsigned ByteLength,
+                bool Wide, QualType t, SourceLocation Loc);
+  StringLiteral(ASTContext &C, const char *StrData, unsigned ByteLength,
+                bool Wide, QualType t, SourceLocation *Loc, unsigned NumStrs);
   
-  void Destroy(ASTContext& C);
+  void Destroy(ASTContext &C);
   
   const char *getStrData() const { return StrData; }
   unsigned getByteLength() const { return ByteLength; }
   bool isWide() const { return IsWide; }
+  
+  /// getNumConcatenated - Get the number of string literal tokens that were
+  /// concatenated in translation phase #6 to form this string literal.
+  unsigned getNumConcatenated() const { return NumConcatenated; }
+  
+  SourceLocation getStrTokenLoc(unsigned TokNum) const {
+    assert(TokNum < NumConcatenated && "Invalid tok number");
+    return TokLocs[TokNum];
+  }
 
   virtual SourceRange getSourceRange() const { 
-    return SourceRange(firstTokLoc,lastTokLoc); 
+    return SourceRange(TokLocs[0], TokLocs[NumConcatenated-1]); 
   }
   static bool classof(const Stmt *T) { 
     return T->getStmtClass() == StringLiteralClass; 

Modified: cfe/trunk/lib/AST/Expr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=64892&r1=64891&r2=64892&view=diff

==============================================================================
--- cfe/trunk/lib/AST/Expr.cpp (original)
+++ cfe/trunk/lib/AST/Expr.cpp Tue Feb 17 23:49:11 2009
@@ -39,20 +39,36 @@
 
 
 StringLiteral::StringLiteral(ASTContext& C, const char *strData,
-                             unsigned byteLength, bool Wide, QualType t,
-                             SourceLocation firstLoc,
-                             SourceLocation lastLoc) : 
-  Expr(StringLiteralClass, t) {
+                             unsigned byteLength, bool Wide, QualType Ty,
+                             SourceLocation Loc) : 
+    Expr(StringLiteralClass, Ty) {
   // OPTIMIZE: could allocate this appended to the StringLiteral.
   char *AStrData = new (C, 1) char[byteLength];
   memcpy(AStrData, strData, byteLength);
   StrData = AStrData;
   ByteLength = byteLength;
   IsWide = Wide;
-  firstTokLoc = firstLoc;
-  lastTokLoc = lastLoc;
+  TokLocs[0] = Loc;
+  NumConcatenated = 1;
 }
 
+StringLiteral::StringLiteral(ASTContext &C, const char *strData, 
+                             unsigned byteLength, bool Wide, QualType Ty,
+                             SourceLocation *Loc, unsigned NumStrs) : 
+    Expr(StringLiteralClass, Ty) {
+  // OPTIMIZE: could allocate this appended to the StringLiteral.
+  char *AStrData = new (C, 1) char[byteLength];
+  memcpy(AStrData, strData, byteLength);
+  StrData = AStrData;
+  ByteLength = byteLength;
+  IsWide = Wide;
+  TokLocs[0] = Loc[0];
+  NumConcatenated = NumStrs;
+  if (NumStrs != 1)
+    memcpy(&TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1));
+}
+
+
 void StringLiteral::Destroy(ASTContext &C) {
   C.Deallocate(const_cast<char*>(StrData));
   this->~StringLiteral();

Modified: cfe/trunk/lib/AST/StmtSerialization.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtSerialization.cpp?rev=64892&r1=64891&r2=64892&view=diff

==============================================================================
--- cfe/trunk/lib/AST/StmtSerialization.cpp (original)
+++ cfe/trunk/lib/AST/StmtSerialization.cpp Tue Feb 17 23:49:11 2009
@@ -955,8 +955,7 @@
 
 void StringLiteral::EmitImpl(Serializer& S) const {
   S.Emit(getType());
-  S.Emit(firstTokLoc);
-  S.Emit(lastTokLoc);
+  assert(0 && "Unimpl loc serialization");
   S.EmitBool(isWide());
   S.Emit(getByteLength());
 
@@ -966,13 +965,14 @@
 
 StringLiteral* StringLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
   QualType t = QualType::ReadVal(D);
-  SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
-  SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
+  assert(0 && "Unimpl loc serialization");
+  //SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
+  //SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
   bool isWide = D.ReadBool();
   unsigned ByteLength = D.ReadInt();
   
   StringLiteral* sl = new (C, llvm::alignof<StringLiteral>())
-    StringLiteral(C, NULL, 0, isWide, t, firstTokLoc, lastTokLoc);
+    StringLiteral(C, NULL, 0, isWide, t, SourceLocation());
 
   char* StrData = new (C, llvm::alignof<char>()) char[ByteLength];
   for (unsigned i = 0; i < ByteLength; ++i)

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=64892&r1=64891&r2=64892&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Feb 17 23:49:11 2009
@@ -352,13 +352,17 @@
   StrTy = Context.getConstantArrayType(StrTy,
                                    llvm::APInt(32, Literal.GetStringLength()+1),
                                        ArrayType::Normal, 0);
-
+  // Allocate enough space for the StringLiteral plus an array of locations for
+  // any concatenated strings.
+  void *Mem = Context.Allocate(sizeof(StringLiteral)+
+                               sizeof(SourceLocation)*(NumStringToks-1));
+  
   // Pass &StringTokLocs[0], StringTokLocs.size() to factory!
-  return Owned(new (Context) StringLiteral(Context, Literal.GetString(), 
-                                 Literal.GetStringLength(),
-                                 Literal.AnyWide, StrTy,
-                                 StringToks[0].getLocation(),
-                                 StringToks[NumStringToks-1].getLocation()));
+  return Owned(new (Mem) StringLiteral(Context, Literal.GetString(), 
+                                       Literal.GetStringLength(),
+                                       Literal.AnyWide, StrTy,
+                                       &StringTokLocs[0],
+                                       StringTokLocs.size()));
 }
 
 /// ShouldSnapshotBlockValueReference - Return true if a reference inside of

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=64892&r1=64891&r2=64892&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Tue Feb 17 23:49:11 2009
@@ -29,10 +29,12 @@
     unsigned Length = 0;
     for (unsigned i = 0; i < NumStrings; i++)
       Length += static_cast<StringLiteral *>(Strings[i])->getByteLength();
-    char *strBuf = new char [Length];
+    
+    // FIXME: This should not be allocated by SEMA!
+    char *strBuf = new char[Length];
     char *p = strBuf;
     bool isWide = false;
-    for (unsigned i = 0; i < NumStrings; i++) {
+    for (unsigned i = 0; i != NumStrings; ++i) {
       S = static_cast<StringLiteral *>(Strings[i]);
       if (S->isWide())
         isWide = true;
@@ -40,9 +42,10 @@
       p += S->getByteLength();
       S->Destroy(Context);
     }
-    S = new (Context, 8) StringLiteral(Context, strBuf, Length, isWide,
-                                       Context.getPointerType(Context.CharTy),
-                                       AtLoc, EndLoc);
+    // FIXME: PASS LOCATIONS PROPERLY.
+    S = new (Context) StringLiteral(Context, strBuf, Length, isWide,
+                                    Context.getPointerType(Context.CharTy),
+                                    AtLoc);
   }
   
   if (CheckBuiltinCFStringArgument(S))





More information about the cfe-commits mailing list