[cfe-dev] relating preprocessing information to syntax trees

Chris Lattner clattner at apple.com
Sun Apr 12 16:31:52 PDT 2009


On Apr 10, 2009, at 8:56 AM, Dietmar Ebner wrote:
> Hi,
>
> On 4/10/09 6:47 AM, Chris Lattner wrote:
>> On Apr 9, 2009, at 11:42 AM, Dietmar Ebner wrote:
>>> I'm thus looking for a proper way to relate preprocessing  
>>> information
>>> such as define or include directives and pragmas to nodes in the  
>>> syntax
>>> tree. A quick hack would be to use the annotated source locations,  
>>> but I
>>> don't particularly like this solution. Any advice would be greatly
>>> appreciated. Sorry if this is a trivial question, I'm fairly new to
>>> clang.
>> I'm not sure exactly what you are asking for. Instead of a general
>> question, can you ask about a specific feature?
> Sure. My pass is implemented as an ASTConsumer by processing  
> declarations passed to HandleTopLevelDecl(). I'm looking for a way  
> to annotate declarations with preprocessor directives that are  
> located immediately before them in the original source code, e.g., for
>    #include "foo.h"
>    void foo() {}
> I would like to create a term that looks roughly like this:
>    function_declaration(
>        function_parameter_list([], <...>),
>        function_definition(basic_block([]), <...>),
>        function_declaration_annotation(
>            function_type(type_void, <...>),
>            foo,
>            declaration_modifier(<...>),
>  -->       preprocessing_info(
>  -->           [cpreprocessorIncludeDeclaration(
>  -->                '#include "foo.h"\n',
>  -->                 before,
>  -->                 file_info('foo.c',1,1)
>                 )])))
>
> I'm at a point where the AST is available, i.e., the lexer and the  
> parser already did their job. I had a quick look at some examples  
> such as the HTMLRewriter and they seem to instantiate their own  
> lexer and process the token stream. I was wondering if, given an  
> AST, there is a way to query the preprocessor directives already  
> processed so far, e.g., can I find out that there was the include  
> directive for foo.h when processing the declaration for foo()?

One relatively straight-forward way to implement this is to implement  
PPCallbacks when parsing the file.  This interface gets notified when  
a #include or #define is seen.  It can just push directives seen onto  
a list.  When your ASTConsumer sees a decl, it would just associate  
all directives in the list with the declaration it just saw.

-Chris



More information about the cfe-dev mailing list