[cfe-commits] r43665 - in /cfe/trunk: AST/ASTContext.cpp Driver/RewriteTest.cpp Parse/ParseObjc.cpp Sema/Sema.h Sema/SemaExpr.cpp include/clang/AST/ASTContext.h include/clang/AST/Expr.h include/clang/Parse/Action.h include/clang/Parse/Parser.h
Chris Lattner
clattner at apple.com
Sun Nov 4 11:29:42 PST 2007
Hey Steve,
Did you mean to add HandleObjcMetaDataEmission back? If not, please
remove it.
-Chris
On Nov 3, 2007, at 4:27 AM, Steve Naroff wrote:
> Author: snaroff
> Date: Sat Nov 3 06:27:19 2007
> New Revision: 43665
>
> URL: http://llvm.org/viewvc/llvm-project?rev=43665&view=rev
> Log:
>
> Implement rewrite rules for ObjC string constants.
>
>
> Modified:
> cfe/trunk/AST/ASTContext.cpp
> cfe/trunk/Driver/RewriteTest.cpp
> cfe/trunk/Parse/ParseObjc.cpp
> cfe/trunk/Sema/Sema.h
> cfe/trunk/Sema/SemaExpr.cpp
> cfe/trunk/include/clang/AST/ASTContext.h
> cfe/trunk/include/clang/AST/Expr.h
> cfe/trunk/include/clang/Parse/Action.h
> cfe/trunk/include/clang/Parse/Parser.h
>
> Modified: cfe/trunk/AST/ASTContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/AST/ASTContext.cpp?rev=43665&r1=43664&r2=43665&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/AST/ASTContext.cpp (original)
> +++ cfe/trunk/AST/ASTContext.cpp Sat Nov 3 06:27:19 2007
> @@ -861,23 +861,20 @@
> QualType ASTContext::getCFConstantStringType() {
> if (!CFConstantStringTypeDecl) {
> CFConstantStringTypeDecl = new RecordDecl(Decl::Struct,
> SourceLocation(),
> -
> &Idents.get("__builtin_CFString"),
> +
> &Idents.get("NSConstantString"),
> 0);
> -
> - QualType FieldTypes[4];
> + QualType FieldTypes[3];
>
> // const int *isa;
> FieldTypes[0] =
> getPointerType(IntTy.getQualifiedType(QualType::Const));
> - // int flags;
> - FieldTypes[1] = IntTy;
> // const char *str;
> - FieldTypes[2] =
> getPointerType(CharTy.getQualifiedType(QualType::Const));
> + FieldTypes[1] =
> getPointerType(CharTy.getQualifiedType(QualType::Const));
> // long length;
> - FieldTypes[3] = LongTy;
> + FieldTypes[2] = LongTy;
> // Create fields
> - FieldDecl *FieldDecls[4];
> + FieldDecl *FieldDecls[3];
>
> - for (unsigned i = 0; i < 4; ++i)
> + for (unsigned i = 0; i < 3; ++i)
> FieldDecls[i] = new FieldDecl(SourceLocation(), 0,
> FieldTypes[i]);
>
> CFConstantStringTypeDecl->defineBody(FieldDecls, 4);
>
> Modified: cfe/trunk/Driver/RewriteTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteTest.cpp?rev=43665&r1=43664&r2=43665&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/Driver/RewriteTest.cpp (original)
> +++ cfe/trunk/Driver/RewriteTest.cpp Sat Nov 3 06:27:19 2007
> @@ -39,6 +39,10 @@
> FunctionDecl *GetClassFunctionDecl;
> FunctionDecl *SelGetUidFunctionDecl;
>
> + // ObjC string constant support.
> + FileVarDecl *ConstantStringClassReference;
> + RecordDecl *NSStringRecord;
> +
> static const int OBJC_ABI_VERSION =7 ;
> public:
> void Initialize(ASTContext &context, unsigned mainFileID) {
> @@ -48,6 +52,8 @@
> MsgSendFunctionDecl = 0;
> GetClassFunctionDecl = 0;
> SelGetUidFunctionDecl = 0;
> + ConstantStringClassReference = 0;
> + NSStringRecord = 0;
> Rewrite.setSourceMgr(Context->SourceMgr);
> }
>
> @@ -73,12 +79,14 @@
> Stmt *RewriteFunctionBody(Stmt *S);
> Stmt *RewriteAtEncode(ObjCEncodeExpr *Exp);
> Stmt *RewriteMessageExpr(ObjCMessageExpr *Exp);
> + Stmt *RewriteObjCStringLiteral(ObjCStringLiteral *Exp);
> CallExpr *SynthesizeCallToFunctionDecl(FunctionDecl *FD,
> Expr **args, unsigned
> nargs);
> void SynthMsgSendFunctionDecl();
> void SynthGetClassFunctionDecl();
>
> // Metadata emission.
> + void HandleObjcMetaDataEmission();
> void RewriteObjcClassMetaData(ObjcImplementationDecl *IDecl,
> std::string &Result);
>
> @@ -125,6 +133,12 @@
> // Look for built-in declarations that we need to refer during the
> rewrite.
> if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
> RewriteFunctionDecl(FD);
> + } else if (FileVarDecl *FVD = dyn_cast<FileVarDecl>(D)) {
> + // declared in <Foundation/NSString.h>
> + if (strcmp(FVD->getName(), "_NSConstantStringClassReference")
> == 0) {
> + ConstantStringClassReference = FVD;
> + return;
> + }
> } else if (ObjcInterfaceDecl *MD = dyn_cast<ObjcInterfaceDecl>(D)) {
> RewriteInterfaceDecl(MD);
> } else if (ObjcCategoryDecl *CD = dyn_cast<ObjcCategoryDecl>(D)) {
> @@ -161,17 +175,11 @@
> // Get the top-level buffer that this corresponds to.
> RewriteTabs();
>
> - // Rewrite Objective-c meta data*
> - std::string ResultStr;
> - WriteObjcMetaData(ResultStr);
> - // For now just print the string out.
> - printf("%s", ResultStr.c_str());
> -
> // Get the buffer corresponding to MainFileID. If we haven't
> changed it, then
> // we are done.
> if (const RewriteBuffer *RewriteBuf =
> Rewrite.getRewriteBufferFor(MainFileID)) {
> - printf("Changed:\n");
> + //printf("Changed:\n");
> std::string S(RewriteBuf->begin(), RewriteBuf->end());
> printf("%s\n", S.c_str());
> } else {
> @@ -180,6 +188,16 @@
>
> }
>
> +/// HandleObjcMetaDataEmission - main routine to generate objective-
> c's
> +/// metadata.
> +void RewriteTest::HandleObjcMetaDataEmission() {
> + // Rewrite Objective-c meta data*
> + std::string ResultStr;
> + WriteObjcMetaData(ResultStr);
> + // For now just print the string out.
> + printf("%s", ResultStr.c_str());
> +}
> +
> //
> =
> =
> =
> ----------------------------------------------------------------------=
> ==//
> // Syntactic (non-AST) Rewriting Code
> //
> =
> =
> =
> ----------------------------------------------------------------------=
> ==//
> @@ -364,6 +382,9 @@
> // Handle specific things.
> if (ObjCEncodeExpr *AtEncode = dyn_cast<ObjCEncodeExpr>(S))
> return RewriteAtEncode(AtEncode);
> +
> + if (ObjCStringLiteral *AtString = dyn_cast<ObjCStringLiteral>(S))
> + return RewriteObjCStringLiteral(AtString);
>
> if (ObjCMessageExpr *MessExpr = dyn_cast<ObjCMessageExpr>(S)) {
> // Before we rewrite it, put the original message expression in
> a comment.
> @@ -492,7 +513,7 @@
>
> void RewriteTest::RewriteFunctionDecl(FunctionDecl *FD) {
> // declared in <objc/objc.h>
> - if (strcmp(FD->getName(), "sel_getUid") == 0) {
> + if (strcmp(FD->getName(), "sel_registerName") == 0) {
> SelGetUidFunctionDecl = FD;
> return;
> }
> @@ -536,8 +557,52 @@
> FunctionDecl::Extern,
> false, 0);
> }
>
> +Stmt *RewriteTest::RewriteObjCStringLiteral(ObjCStringLiteral *Exp) {
> + assert(ConstantStringClassReference && "Can't find constant
> string reference");
> + llvm::SmallVector<Expr*, 4> InitExprs;
> +
> + // Synthesize "(Class)&_NSConstantStringClassReference"
> + DeclRefExpr *ClsRef = new DeclRefExpr(ConstantStringClassReference,
> +
> ConstantStringClassReference->getType(),
> + SourceLocation());
> + QualType expType = Context->getPointerType(ClsRef->getType());
> + UnaryOperator *Unop = new UnaryOperator(ClsRef,
> UnaryOperator::AddrOf,
> + expType, SourceLocation());
> + CastExpr *cast = new CastExpr(Context->getObjcClassType(), Unop,
> + SourceLocation());
> + InitExprs.push_back(cast); // set the 'isa'.
> + InitExprs.push_back(Exp->getString()); // set "char *bytes".
> + unsigned IntSize = static_cast<unsigned>(
> + Context->getTypeSize(Context->IntTy, Exp->getLocStart()));
> + llvm::APInt IntVal(IntSize, Exp->getString()->getByteLength());
> + IntegerLiteral *len = new IntegerLiteral(IntVal, Context->IntTy,
> + Exp->getLocStart());
> + InitExprs.push_back(len); // set "int numBytes".
> +
> + // struct NSConstantString
> + QualType CFConstantStrType = Context->getCFConstantStringType();
> + // (struct NSConstantString) { <exprs from above> }
> + InitListExpr *ILE = new InitListExpr(SourceLocation(),
> + &InitExprs[0],
> InitExprs.size(),
> + SourceLocation());
> + CompoundLiteralExpr *StrRep = new
> CompoundLiteralExpr(CFConstantStrType, ILE);
> + // struct NSConstantString *
> + expType = Context->getPointerType(StrRep->getType());
> + Unop = new UnaryOperator(StrRep, UnaryOperator::AddrOf, expType,
> + SourceLocation());
> + // struct NSString *
> + if (!NSStringRecord)
> + NSStringRecord = new RecordDecl(Decl::Struct, SourceLocation(),
> + &Context-
> >Idents.get("NSString"), 0);
> + expType = Context->getPointerType(Context-
> >getTagDeclType(NSStringRecord));
> + cast = new CastExpr(expType, Unop, SourceLocation());
> + Rewrite.ReplaceStmt(Exp, cast);
> + delete Exp;
> + return StrRep;
> +}
> +
> Stmt *RewriteTest::RewriteMessageExpr(ObjCMessageExpr *Exp) {
> - assert(SelGetUidFunctionDecl && "Can't find sel_getUid() decl");
> + assert(SelGetUidFunctionDecl && "Can't find sel_registerName()
> decl");
> if (!MsgSendFunctionDecl)
> SynthMsgSendFunctionDecl();
> if (!GetClassFunctionDecl)
> @@ -561,7 +626,7 @@
> } else // instance message.
> MsgExprs.push_back(Exp->getReceiver());
>
> - // Create a call to sel_getUid("selName"), it will be the 2nd
> argument.
> + // Create a call to sel_registerName("selName"), it will be the
> 2nd argument.
> llvm::SmallVector<Expr*, 8> SelExprs;
> QualType argType = Context->getPointerType(Context->CharTy);
> SelExprs.push_back(new StringLiteral(Exp-
> >getSelector().getName().c_str(),
>
> Modified: cfe/trunk/Parse/ParseObjc.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Parse/ParseObjc.cpp?rev=43665&r1=43664&r2=43665&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/Parse/ParseObjc.cpp (original)
> +++ cfe/trunk/Parse/ParseObjc.cpp Sat Nov 3 06:27:19 2007
> @@ -1155,7 +1155,7 @@
> switch (Tok.getKind()) {
> case tok::string_literal: // primary-expression: string-literal
> case tok::wide_string_literal:
> - return ParsePostfixExpressionSuffix(ParseObjCStringLiteral());
> + return
> ParsePostfixExpressionSuffix(ParseObjCStringLiteral(AtLoc));
> default:
> break;
> }
> @@ -1285,12 +1285,12 @@
> &KeyExprs[0]);
> }
>
> -Parser::ExprResult Parser::ParseObjCStringLiteral() {
> +Parser::ExprResult Parser::ParseObjCStringLiteral(SourceLocation
> AtLoc) {
> ExprResult Res = ParseStringLiteralExpression();
>
> if (Res.isInvalid) return Res;
>
> - return Actions.ParseObjCStringLiteral(Res.Val);
> + return Actions.ParseObjCStringLiteral(AtLoc, Res.Val);
> }
>
> /// objc-encode-expression:
>
> Modified: cfe/trunk/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/Sema.h?rev=43665&r1=43664&r2=43665&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/Sema/Sema.h (original)
> +++ cfe/trunk/Sema/Sema.h Sat Nov 3 06:27:19 2007
> @@ -454,7 +454,8 @@
> tok::TokenKind Kind);
>
> // ParseObjCStringLiteral - Parse Objective-C string literals.
> - virtual ExprResult ParseObjCStringLiteral(ExprTy *string);
> + virtual ExprResult ParseObjCStringLiteral(SourceLocation AtLoc,
> + ExprTy *string);
> virtual ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc,
> SourceLocation
> EncodeLoc,
> SourceLocation
> LParenLoc,
>
> Modified: cfe/trunk/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaExpr.cpp?rev=43665&r1=43664&r2=43665&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/Sema/SemaExpr.cpp Sat Nov 3 06:27:19 2007
> @@ -1929,7 +1929,8 @@
> }
>
> // TODO: Move this to SemaObjC.cpp
> -Sema::ExprResult Sema::ParseObjCStringLiteral(ExprTy *string) {
> +Sema::ExprResult Sema::ParseObjCStringLiteral(SourceLocation AtLoc,
> + ExprTy *string) {
> StringLiteral* S = static_cast<StringLiteral *>(string);
>
> if (CheckBuiltinCFStringArgument(S))
> @@ -1949,7 +1950,7 @@
> }
> QualType t = Context.getObjcConstantStringInterface();
> t = Context.getPointerType(t);
> - return new ObjCStringLiteral(S, t);
> + return new ObjCStringLiteral(S, t, AtLoc);
> }
>
> Sema::ExprResult Sema::ParseObjCEncodeExpression(SourceLocation AtLoc,
>
> Modified: cfe/trunk/include/clang/AST/ASTContext.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=43665&r1=43664&r2=43665&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/AST/ASTContext.h (original)
> +++ cfe/trunk/include/clang/AST/ASTContext.h Sat Nov 3 06:27:19 2007
> @@ -178,8 +178,8 @@
> /// defined in <stddef.h>. Pointer - pointer requires this (C99
> 6.5.6p9).
> QualType getPointerDiffType() const;
>
> - // getCFConstantStringType - Return the type used for constant
> CFStrings.
> - // CURRENTLY UNUSED (10/15/07). ObjCStringLiteral now uses the
> hook below.
> + // getCFConstantStringType - Return the C structure type used to
> represent
> + // constant CFStrings.
> QualType getCFConstantStringType();
>
> // This setter/getter represents the ObjC type for an
> NSConstantString.
>
> Modified: cfe/trunk/include/clang/AST/Expr.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=43665&r1=43664&r2=43665&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/AST/Expr.h (original)
> +++ cfe/trunk/include/clang/AST/Expr.h Sat Nov 3 06:27:19 2007
> @@ -1062,16 +1062,17 @@
> /// i.e. @"foo".
> class ObjCStringLiteral : public Expr {
> StringLiteral *String;
> + SourceLocation AtLoc;
> public:
> - ObjCStringLiteral(StringLiteral *SL, QualType T)
> - : Expr(ObjCStringLiteralClass, T), String(SL) {}
> + ObjCStringLiteral(StringLiteral *SL, QualType T, SourceLocation L)
> + : Expr(ObjCStringLiteralClass, T), String(SL), AtLoc(L) {}
>
> StringLiteral* getString() { return String; }
>
> const StringLiteral* getString() const { return String; }
>
> virtual SourceRange getSourceRange() const {
> - return String->getSourceRange();
> + return SourceRange(AtLoc, String->getLocEnd());
> }
>
> static bool classof(const Stmt *T) {
>
> Modified: cfe/trunk/include/clang/Parse/Action.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=43665&r1=43664&r2=43665&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/Parse/Action.h (original)
> +++ cfe/trunk/include/clang/Parse/Action.h Sat Nov 3 06:27:19 2007
> @@ -612,7 +612,8 @@
>
>
> //===----------------------- Obj-C Expressions
> --------------------------===//
> - virtual ExprResult ParseObjCStringLiteral(ExprTy *string) {
> + virtual ExprResult ParseObjCStringLiteral(SourceLocation AtLoc,
> + ExprTy *string) {
> return 0;
> }
>
>
> Modified: cfe/trunk/include/clang/Parse/Parser.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=43665&r1=43664&r2=43665&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/Parse/Parser.h (original)
> +++ cfe/trunk/include/clang/Parse/Parser.h Sat Nov 3 06:27:19 2007
> @@ -362,7 +362,7 @@
> //
> =
> =
> =--------------------------------------------------------------------
> ===//
> // Objective-C Expressions
> ExprResult ParseObjCAtExpression(SourceLocation AtLocation);
> - ExprResult ParseObjCStringLiteral();
> + ExprResult ParseObjCStringLiteral(SourceLocation AtLoc);
> ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc);
> ExprResult ParseObjCSelectorExpression(SourceLocation AtLoc);
> ExprResult ParseObjCProtocolExpression(SourceLocation AtLoc);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list