[cfe-dev] Defines in preprocessed files

Mikhail Ramalho via cfe-dev cfe-dev at lists.llvm.org
Mon Jan 25 11:58:21 PST 2016


Hi all,

I'm working on a project to use clang as a frontend to a model checking
tool.

It's almost done but I'm now facing a problem that I couldn't find a
solution: How to force the preprocessor to run in already preprocessed
files?

For example, something as simples as:

int main(void)
{
  int a = x();
}

When using clangTool to generate the AST, it works fine if add something
like -Dx=x1. The generated AST looks like:

FunctionDecl 0x3a8c290 </home/mramalho/main.c:2:1, line:5:1> line:2:5 main
'int (void)'
`-CompoundStmt 0x3a8c5c0 <line:3:1, line:5:1>
  `-DeclStmt 0x3a8c5a8 <line:4:3, col:14>
    `-VarDecl 0x3a8c3b8 <col:3, col:13> col:7 a 'int' cinit
      `-CallExpr 0x3a8c580 <<command line>:6:11,
/home/mramalho/main.c:4:13> 'int'
        `-ImplicitCastExpr 0x3a8c568 <<command line>:6:11> 'int (*)()'
<FunctionToPointerDecay>
*          `-DeclRefExpr 0x3a8c510 <col:11> 'int ()' Function 0x3a8c468
'x1' 'int ()'*

But if I preprocess the file:

$ clang -E main.c > main.c.i

# 1 "main.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 316 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.c" 2

int main(void)
{
  int a = x();
}

and run with the same define -Dx=x1, the AST is:

FunctionDecl 0x2e583a0 <main.c:2:1, line:5:1> line:2:5 main 'int (void)'
`-CompoundStmt 0x2e586d0 <line:3:1, line:5:1>
  `-DeclStmt 0x2e586b8 <line:4:3, col:14>
    `-VarDecl 0x2e584c8 <col:3, col:13> col:7 a 'int' cinit
      `-CallExpr 0x2e58690 <col:11, col:13> 'int'
        `-ImplicitCastExpr 0x2e58678 <col:11> 'int (*)()'
<FunctionToPointerDecay>
*          `-DeclRefExpr 0x2e58620 <col:11> 'int ()' Function 0x2e58578 'x'
'int ()'*

I guess the preprocessor is not running, given the following message I get
when directly using clang:

$ clang -E -Dx=x1 main.c.i
clang: warning: main.c.i: previously preprocessed input
clang: warning: argument unused during compilation: '-D x=x1'

Is there an option to force the preprocessor to run again?

Unfortunately, I need to change some function calls, even when the file is
preprocessed.

Thank you,

-- 

Mikhail Ramalho.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160125/12e91ac8/attachment.html>


More information about the cfe-dev mailing list