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