[cfe-dev] -rewrite-objc, C and blocks

Pierre Habouzit madcoder at madism.org
Fri Oct 1 10:54:57 PDT 2010


Well, there used to be a -rewrite-blocks and there is a commmit that
says that it's superseeded by -rewrite-objc.

Plus what my patch does is that if it's a c++ compiler that is used,
then the c++ code is used, else it tries to be c-compatible.

So would a pure C-to-C blocks rewriter (reintroducing -rewrite-blocks)
be accepted ? I'd like to avoid maintaining a custom patch forever :)

On Fri, Oct 01, 2010 at 09:00:57AM -0700, jahanian wrote:
> Concept is right. However, rewriter project was done for a specific purpose and generates c++ code 
> as the input might be objective-c++. It is best for you to use the rewrite-obj model and have you own
> -rewrite-block which generates c code.
> 
> - Fariborz
> 
> On Oct 1, 2010, at 3:16 AM, Pierre Habouzit wrote:
> 
> > I intended to use clang -rewrite-objc to be able to compile code using
> > blocks on targets unsupported by clang. I'm totally uninterested in the
> > ObjC rewriting, only the blocks one.
> > 
> > Sadly, this rewriting module rewrites to C++ even when the source code
> > in question is just plain old C.
> > 
> > I'm under the impression, that when the source code is C, only the fact
> > that clang is generating structs with constructors and RAII use of the
> > defined blocks. For example:
> > 
> >    struct __main_block_impl_0 {
> >      struct __block_impl impl;
> >      struct __main_block_desc_0* Desc;
> >      int a;
> >      __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _a, int flags=0) : a(_a) {
> >        impl.isa = &_NSConcreteStackBlock;
> >        impl.Flags = flags;
> >        impl.FuncPtr = fp;
> >        Desc = desc;
> >      }
> >    };
> > 
> >    [...]
> > 
> >    int main(void) {
> >        int a = 1;
> >        struct __Block_byref_c_0 c = {(void*)0,(struct __Block_byref_c_0 *)&c, 0, sizeof(struct __Block_byref_c_0), 1};
> > 
> >        int (*f)(int) = (int (*)(int))&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, a);
> >        [...]
> >    }
> > 
> > I'm under the impression that the following "rewrite" would be correct:
> > 
> >    struct __main_block_impl_0 {
> >      struct __block_impl impl;
> >      struct __main_block_desc_0* Desc;
> >      int a;
> >    #ifdef __cplusplus
> >      __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _a, int flags=0) : a(_a) {
> >        impl.isa = &_NSConcreteStackBlock;
> >        impl.Flags = flags;
> >        impl.FuncPtr = fp;
> >        Desc = desc;
> >      }
> >    #endif
> >    };
> >    #ifndef __cplusplus
> >    #define __main_block_impl_0(fp, desc, _a, flags) \
> >        ((struct __main_block_impl_0){               \
> >            .impl = {                                \
> >                .isa = &_NSConcreteStackBlock,       \
> >                .Flags = flags,                      \
> >                .FuncPtr = fp,                       \
> >            },                                       \
> >            .Desc = desc,                            \
> >            .a = (_a),                               \
> >        })
> >    #endif
> > 
> >    [...]
> > 
> >    int main(void) {
> >        int a = 1;
> >        struct __Block_byref_c_0 c = {(void*)0,(struct __Block_byref_c_0 *)&c, 0, sizeof(struct __Block_byref_c_0), 1};
> > 
> >        int (*f)(int) = (int (*)(int))&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, a);
> >        [...]
> >    }
> > 
> > 
> > Am I correct, or am I missing something obvious ?
> > 
> > 
> > -- 
> > ·O·  Pierre Habouzit
> > ··O                                                madcoder at debian.org
> > OOO                                                http://www.madism.org
> > _______________________________________________
> > cfe-dev mailing list
> > cfe-dev at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
> 

-- 
·O·  Pierre Habouzit
··O                                                madcoder at debian.org
OOO                                                http://www.madism.org



More information about the cfe-dev mailing list