<div dir="ltr">Hi all,<div><br></div><div>I'm working on a project to use clang as a frontend to a model checking tool.</div><div><br></div><div>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?</div><div><br></div><div>For example, something as simples as:</div><div><div><div><br></div><div>int main(void)</div><div>{</div><div>  int a = x();</div><div>}</div></div><div><br></div><div>When using clangTool to generate the AST, it works fine if add something like -Dx=x1. The generated AST looks like: </div><div><br></div><div><div>FunctionDecl 0x3a8c290 </home/mramalho/main.c:2:1, line:5:1> line:2:5 main 'int (void)'</div><div>`-CompoundStmt 0x3a8c5c0 <line:3:1, line:5:1></div><div>  `-DeclStmt 0x3a8c5a8 <line:4:3, col:14></div><div>    `-VarDecl 0x3a8c3b8 <col:3, col:13> col:7 a 'int' cinit</div><div>      `-CallExpr 0x3a8c580 <<command line>:6:11, /home/mramalho/main.c:4:13> 'int'</div><div>        `-ImplicitCastExpr 0x3a8c568 <<command line>:6:11> 'int (*)()' <FunctionToPointerDecay></div><div><b>          `-DeclRefExpr 0x3a8c510 <col:11> 'int ()' Function 0x3a8c468 'x1' 'int ()'</b></div></div><div><br></div><div>But if I preprocess the file:</div><div><br></div><div><div>$ clang -E main.c > main.c.i</div><div><br></div><div><div># 1 "main.c"</div><div># 1 "<built-in>" 1</div><div># 1 "<built-in>" 3</div><div># 316 "<built-in>" 3</div><div># 1 "<command line>" 1</div><div># 1 "<built-in>" 2</div><div># 1 "main.c" 2</div><div><br></div><div>int main(void)</div><div>{</div><div>  int a = x();</div><div>}</div></div><div><br></div><div>and run with the same define -Dx=x1, the AST is:</div><div><br></div><div><div>FunctionDecl 0x2e583a0 <main.c:2:1, line:5:1> line:2:5 main 'int (void)'</div><div>`-CompoundStmt 0x2e586d0 <line:3:1, line:5:1></div><div>  `-DeclStmt 0x2e586b8 <line:4:3, col:14></div><div>    `-VarDecl 0x2e584c8 <col:3, col:13> col:7 a 'int' cinit</div><div>      `-CallExpr 0x2e58690 <col:11, col:13> 'int'</div><div>        `-ImplicitCastExpr 0x2e58678 <col:11> 'int (*)()' <FunctionToPointerDecay></div><div><b>          `-DeclRefExpr 0x2e58620 <col:11> 'int ()' Function 0x2e58578 'x' 'int ()'</b></div></div><div><br></div><div>I guess the preprocessor is not running, given the following message I get when directly using clang:</div><div><br></div></div><div><div>$ clang -E -Dx=x1 main.c.i</div><div>clang: warning: main.c.i: previously preprocessed input</div><div>clang: warning: argument unused during compilation: '-D x=x1'</div></div><div><br></div><div>Is there an option to force the preprocessor to run again? </div><div><br></div><div>Unfortunately, I need to change some function calls, even when the file is preprocessed.</div><div><br></div><div>Thank you,</div><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><br></div><div>Mikhail Ramalho.</div></div></div>
</div></div>