To Dodji Seketeli:
Thanks, I will republish my libcpp patch later.

2012/6/4 Dodji Seketeli <do...@redhat.com>:
> Hello YunFeng,
>
> Thank you for taking the time to work on this.  I cannot accept or
> deny your patches, but I thought I could maybe comment on some parts
> of them.
>
> First, IMHO, some of the new plugin events you are proposing to add to
> libcpp seem to make sense, at least so that people can write
> etags/ctags-like cross-reference tools like the one you are proposing.
>
> For now, I will not comment on the choices you've made for the
> cross-reference tool itself, even though they are interesting to see,
> at least to understand why you need the libcpp events you are
> proposing.
>
> Thus, I'll start with the libcpp changes.
>
> [...]
>
>> diff -upr .pc/symdb_enhance_libcpp/libcpp/directives.c libcpp/directives.c
>
> [...]
>
>> @@ -492,6 +492,8 @@ _cpp_handle_directive (cpp_reader *pfile
>>    else if (skip == 0)
>>      _cpp_backup_tokens (pfile, 1);
>>
>> +  if (pfile->cb.end_directive)
>> +    pfile->cb.end_directive (pfile);
>
> It seems to me that there are possibly several places where we handle
> directives.  In those places, the function start_directive and
> end_directive are called.  So IMHO, it would seems more appropriate
> and maintainable to call pfile->cb.start_directive in the
> start_directive function, and likewise, call pfile->cg.end_directive
> in the end_directive function.
>
> You would then remove the call below from _cpp_lex_token:
>
> @@ -1886,6 +1889,8 @@ _cpp_lex_token (cpp_reader *pfile)
>          handles the directive as normal.  */
>           && pfile->state.parsing_args != 1)
>         {
> +          if (pfile->cb.start_directive)
> +        pfile->cb.start_directive (pfile, result);
>           if (_cpp_handle_directive (pfile, result->flags & PREV_WHITE))
>         {
>           if (pfile->directive_result.type == CPP_PADDING)
>
> [...]
>
>
>> +++ libcpp/include/cpplib.h    2012-05-25 14:56:56.745507332 +0800
>> @@ -218,10 +218,10 @@ struct GTY(()) cpp_identifier {
>>         node;
>>  };
>>
>> -/* A preprocessing token.  This has been carefully packed and should
>> -   occupy 16 bytes on 32-bit hosts and 24 bytes on 64-bit hosts.  */
>> +/* A preprocessing token. */
>>  struct GTY(()) cpp_token {
>>    source_location src_loc;    /* Location of first char of token.  */
>> +  int file_offset;
>
> Enlarging this struct that is *widely* used might not be accepted by
> the maintainers, because of the memory toll it takes.  Or you'd need
> to prove that you cannot do otherwise.
>
> So why is this file_offset member needed?
>
> From the rest of the patch, it looks like you are using it to store
> the offset of the token, from the beginning of its line.  What is the
> difference between that, and the column number of the token, as you
> could get by calling linemap_expand_location on the src_loc of the
> token, effectively doing away with this new file_offset member?  Note
> that the linemap_expand_location call was introduced in 4.7.
>
> [...]
>
>> +++ libcpp/macro.c    2012-05-25 14:56:56.749508416 +0800
>> @@ -1029,9 +1029,13 @@ enter_macro_context (cpp_reader *pfile,
>>            if (pragma_buff)
>>          _cpp_release_buff (pfile, pragma_buff);
>>
>> +          if (pfile->cb.macro_end_arg)
>> +        pfile->cb.macro_end_arg (pfile, true);
>
> Presumably, if we reach this point, I believe it means there was no
> argument to what seemed to be a function-like macro.  Was it?
>
> Thus, I don't understand why calling this pfile->cb.macro_end_arg call
> achieves.  Actually, I think I don't understand the meaning of that
> event callback, to begin with.  I have read and re-read the comment
> below:
>
>> @@ -522,6 +522,24 @@ struct cpp_callbacks
>>       be expanded.  */
>
> [...]
>
>> +  /* Called when a function-like macro stops collecting macro parameters,
>> +   * cancel = true, macro expansion is canceled. */
>> +  void (*macro_end_arg) (cpp_reader *, bool cancel);
>
> and I don't understand why you need the information conveyed by this
> macro_end_arg event.
>
> Maybe if you put the call to macro_start_expand in this
> enter_macro_context function only after we are sure we are going to
> actually proceed with the expansion ....
>
>>            return 0;
>>          }
>
> ... here, then you wouldn't need the macro_end_arg at all.  Would that
> make sense?
>
>>        if (macro->paramc > 0)
>>          replace_args (pfile, node, macro,
>>                (macro_arg *) buff->base,
>> @@ -2263,6 +2267,8 @@ cpp_get_token_1 (cpp_reader *pfile, sour
>>        if (pfile->context->c.macro)
>>          ++num_expanded_macros_counter;
>>        _cpp_pop_context (pfile);
>> +      if (pfile->cb.macro_end_expand)
>> +        pfile->cb.macro_end_expand (pfile);
>
> _cpp_pop_context is really the function that marks the end of a given
> macro expansion, especially when the predicate in_macro_expansion_p
> (introduced recently in trunk for gcc 4.8) returns true.
>
> So IMHO, I seems more maintainable to move the call to
> pfile->cb.macro_end_expand in _cpp_pop_context.
>
>>        if (pfile->state.in_directive)
>>          continue;
>>        result = &pfile->avoid_paste;
>> @@ -2321,8 +2327,14 @@ cpp_get_token_1 (cpp_reader *pfile, sour
>>          }
>>          }
>>        else
>> -        ret = enter_macro_context (pfile, node, result,
>> -                       virt_loc);
>> +          {
>> +           if (pfile->cb.macro_start_expand)
>> +         pfile->cb.macro_start_expand (pfile, result, node);
>> +       ret = enter_macro_context (pfile, node, result, virt_loc);
>
> IMHO, it's more maintainable to put the call to
> pfile->cb.macro_start_expand inside enter_macro_context, as that is
> the function that really triggers the macro expansion.
>
>> +     if (ret == 0 && pfile->cb.macro_end_expand)
>> +       /* macro expansion is canceled. */
>> +       pfile->cb.macro_end_expand (pfile);
>> +         }
>
> Note that if you move the call to pfile->cb.macro_end_expand into the
> _cpp_pop_context function as suggested earlier, you can just remove it
> from here.
>
> Thank you.
>
> --
>                Dodji

Reply via email to