<div dir="ltr">I'd recommend using <a href="http://clang.llvm.org/docs/LibTooling.html">http://clang.llvm.org/docs/LibTooling.html</a> instead of running on the preprocessed code.</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Dec 6, 2016 at 12:15 PM Frank Redeker via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello list,<br class="gmail_msg">
<br class="gmail_msg">
I am writing a tool to analyze C/C++ code written for a compiler for<br class="gmail_msg">
MCUs (e.g. a compiler from IAR Systems, Windriver, Cosmic, Keil)<br class="gmail_msg">
<br class="gmail_msg">
To create the input file for my analyzer I have to use the compilers<br class="gmail_msg">
preprocessor to handle the compiler specific command line options. The<br class="gmail_msg">
result of this step is an output file like this.<br class="gmail_msg">
<br class="gmail_msg">
# 1 "T://source.c"<br class="gmail_msg">
# 1 "D:\\Program_Files_32\\Windriver\\diab\\5.9.4.2\\include\\math.h" 1<br class="gmail_msg">
# 1 "D:\\Program_Files_32\\Windriver\\diab\\5.9.4.2\\include\\xmacros.h" 1<br class="gmail_msg">
# 1<br class="gmail_msg">
"D:\\Program_Files_32\\Windriver\\diab\\5.9.4.2\\include\\diab/xmacros.h" 1<br class="gmail_msg">
.<br class="gmail_msg">
.<br class="gmail_msg">
# 4 "D:\\Program_Files_32\\Windriver\\diab\\5.9.4.2\\include\\xmacros.h" 1<br class="gmail_msg">
# 4 "D:\\Program_Files_32\\Windriver\\diab\\5.9.4.2\\include\\math.h" 1<br class="gmail_msg">
.<br class="gmail_msg">
.<br class="gmail_msg">
extern long double double cosl_not_supported(void);<br class="gmail_msg">
<br class="gmail_msg">
inline long double cosl(long double)<br class="gmail_msg">
        {<br class="gmail_msg">
        return ( long_double_cosl_not_supported() );<br class="gmail_msg">
        }<br class="gmail_msg">
.<br class="gmail_msg">
.<br class="gmail_msg">
# 3 "T://source.c"<br class="gmail_msg">
<br class="gmail_msg">
int foo () {<br class="gmail_msg">
        return 1;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Inside my AST visitor if have a function like this that gets a FunctionDecl:<br class="gmail_msg">
<br class="gmail_msg">
void handleFunctionDecl (const * FunctionDecl) {<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
To check if the declaration is inside a system header I use the<br class="gmail_msg">
following code which works as expected:<br class="gmail_msg">
<br class="gmail_msg">
ASTContext &    context(decl->getASTContext());<br class="gmail_msg">
FullSourceLoc   location(context.getFullLoc(decl->getLocStart()));<br class="gmail_msg">
bool            in_system_header(false);<br class="gmail_msg">
<br class="gmail_msg">
if (location.isValid()) {<br class="gmail_msg">
   in_system_header = location.isInSystemHeader();<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
I also want to know the header file from wich the declaration comes and<br class="gmail_msg">
tried the following:<br class="gmail_msg">
<br class="gmail_msg">
ASTContext &      context(decl->getASTContext());<br class="gmail_msg">
SourceManager &   manager(context.getSourceManager());<br class="gmail_msg">
SourceLocation    location(decl->getLocStart());<br class="gmail_msg">
<br class="gmail_msg">
But `manager.getFilename(location)` always returns the name of the main<br class="gmail_msg">
file.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
So I want to ask if I am missing something in setting up the `ClangTool`<br class="gmail_msg">
that I am using to produce the ast? Or is there a trick to teach the<br class="gmail_msg">
SourceManager to return the name of the header file.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Here are the (simplified) steps to create the asts for analysis:<br class="gmail_msg">
<br class="gmail_msg">
vector<unique_ptr<ASTUnit>>            asts;<br class="gmail_msg">
CommonOptionsParser                    options_parser(...);<br class="gmail_msg">
ClangTool *                            tool     = new ClangTool(..);<br class="gmail_msg">
IntrusiveRefCntPtr<DiagnosticOptions>  options  = new DiagnosticOptions();<br class="gmail_msg">
ToolDiagnosticConsumer *               consumer = new<br class="gmail_msg">
ToolDiagnosticConsumer(&*options);<br class="gmail_msg">
<br class="gmail_msg">
tool->setDiagnosticConsumer(consumer);<br class="gmail_msg">
int result = tool->buildASTs(asts);<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Thanks<br class="gmail_msg">
<br class="gmail_msg">
Frank<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
cfe-dev mailing list<br class="gmail_msg">
<a href="mailto:cfe-dev@lists.llvm.org" class="gmail_msg" target="_blank">cfe-dev@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br class="gmail_msg">
</blockquote></div>