From: Fariborz Jahanian Date: Wed, 14 Nov 2012 23:11:38 +0000 (+0000) Subject: objective-C blocks: under cc1 flag -encode-extended-block-signature, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=06cffc0511ba76d979fad9ef6944e685936b62f0;p=clang objective-C blocks: under cc1 flag -encode-extended-block-signature, generate expanded signature encoding to include types as we already do this for protocol method lists. // rdar://12109031 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167997 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def index 7e255c2102..e72a36878e 100644 --- a/include/clang/Basic/LangOptions.def +++ b/include/clang/Basic/LangOptions.def @@ -104,6 +104,7 @@ LANGOPT(FastMath , 1, 0, "__FAST_MATH__ predefined macro") LANGOPT(FiniteMathOnly , 1, 0, "__FINITE_MATH_ONLY__ predefined macro") BENIGN_LANGOPT(ObjCGCBitmapPrint , 1, 0, "printing of GC's bitmap layout for __weak/__strong ivars") +BENIGN_LANGOPT(ObjCExtendedBlockEncode , 1, 0, "Do extended encoding of block type signature") BENIGN_LANGOPT(AccessControl , 1, 1, "C++ access control") LANGOPT(CharIsSigned , 1, 1, "signed char") diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 77ba17a2b4..7d437a6f31 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -929,6 +929,8 @@ def print_file_name_EQ : Joined<["-", "--"], "print-file-name=">, HelpText<"Print the full library path of ">, MetaVarName<"">; def print_ivar_layout : Flag<["-"], "print-ivar-layout">, Flags<[CC1Option]>, HelpText<"Enable Objective-C Ivar layout bitmap print trace">; +def encode_extended_block_sig : Flag<["-"], "encode-extended-block-signature">, Flags<[CC1Option]>, + HelpText<"Enable encoding of the extended block type signature">; def print_libgcc_file_name : Flag<["-", "--"], "print-libgcc-file-name">, HelpText<"Print the library path for \"libgcc.a\"">; def print_multi_directory : Flag<["-", "--"], "print-multi-directory">; diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 7b61c25b1d..d5107b07c0 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -4511,7 +4511,13 @@ std::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const { QualType BlockTy = Expr->getType()->getAs()->getPointeeType(); // Encode result type. - getObjCEncodingForType(BlockTy->getAs()->getResultType(), S); + if (getLangOpts().ObjCExtendedBlockEncode) + getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None, + BlockTy->getAs()->getResultType(), + S, true /*Extended*/); + else + getObjCEncodingForType(BlockTy->getAs()->getResultType(), + S); // Compute size of all parameters. // Start with computing size of a pointer in number of bytes. // FIXME: There might(should) be a better way of doing this computation! @@ -4546,7 +4552,11 @@ std::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const { PType = PVDecl->getType(); } else if (PType->isFunctionType()) PType = PVDecl->getType(); - getObjCEncodingForType(PType, S); + if (getLangOpts().ObjCExtendedBlockEncode) + getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None, PType, + S, true /*Extended*/); + else + getObjCEncodingForType(PType, S); S += charUnitsToString(ParmOffset); ParmOffset += getObjCEncodingTypeSize(PType); } diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 8baad79835..31dcb23c49 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1113,6 +1113,8 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, if (Args.hasArg(OPT_print_ivar_layout)) Opts.ObjCGCBitmapPrint = 1; + if (Args.hasArg(OPT_encode_extended_block_sig)) + Opts.ObjCExtendedBlockEncode = 1; if (Args.hasArg(OPT_fno_constant_cfstrings)) Opts.NoConstantCFStrings = 1; diff --git a/test/CodeGenObjC/extended-block-signature-encode.m b/test/CodeGenObjC/extended-block-signature-encode.m new file mode 100644 index 0000000000..11d57847ac --- /dev/null +++ b/test/CodeGenObjC/extended-block-signature-encode.m @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -fblocks -triple x86_64-apple-darwin -encode-extended-block-signature -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fblocks -triple x86_64-apple-darwin -emit-llvm %s -o - | FileCheck %s -check-prefix=BRIEF +// rdar://12109031 + +@class NSString, NSArray; + +typedef NSString*(^BBB)(NSArray*); + +int main () +{ + BBB b1; + ^(BBB arg1, double arg2){ return b1; }(0, 3.14); +} +// CHECK: @{{.*}} = private unnamed_addr constant [64 x i8] c"@?<@\22NSString\22@?@\22NSArray\22>24@?0@?<@\22NSString\22@?@\22NSArray\22>8d16\00" +// CHECK-BRIEF: @{{.*}} = private unnamed_addr constant [14 x i8] c"@?24@?0@?8d16\00"