<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi cfe-dev,<div class=""><br class=""></div><div class="">I have a project where I'm interested in parsing header files to correlate some elements within compiled programs (without symbols). The programs might not necessarily be from the native/default Clang architecture (though I'm happy to bail out if Clang doesn't know about it at all).</div><div class=""><br class=""></div><div class="">I'm linking directly against the Clang static libraries instead of libclang for this (since libclang doesn't leak LLVM and I'm interested in the LLVM-lowered representation of C types).</div><div class=""><br class=""></div><div class="">Looking at the libclang code, I was able to parse headers without significant problems. This is what I think is relevent from the code, and you can essentially assume that anything not show here only has default values:</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(101, 123, 131);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">const</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">char</span><span style="font-variant-ligatures: no-common-ligatures" class="">* clangParameters[] = {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(41, 161, 152);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">        </span></span><span style="font-variant-ligatures: no-common-ligatures" class="">"clang"</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">,</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(41, 161, 152);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">       </span></span><span style="font-variant-ligatures: no-common-ligatures" class="">"-fno-spell-checking"</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">,</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(101, 123, 131);" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>tempFilePath.</span><span style="font-variant-ligatures: no-common-ligatures; color: #6c71c4" class="">data</span><span style="font-variant-ligatures: no-common-ligatures" class="">(),</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(101, 123, 131);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">};</span></div></div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(108, 113, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">result-></span><span style="font-variant-ligatures: no-common-ligatures; color: #d33682" class="">tu</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">.</span><span style="font-variant-ligatures: no-common-ligatures" class="">reset</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #b58901" class="">ASTUnit</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">::</span><span style="font-variant-ligatures: no-common-ligatures" class="">LoadFromCommandLine</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">(</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(101, 123, 131);" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><span class="Apple-tab-span" style="white-space:pre">        </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #6c71c4" class="">begin</span><span style="font-variant-ligatures: no-common-ligatures" class="">(clangParameters),</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(101, 123, 131);" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><span class="Apple-tab-span" style="white-space:pre"> </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #6c71c4" class="">end</span><span style="font-variant-ligatures: no-common-ligatures" class="">(clangParameters),</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(101, 123, 131);" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><span class="Apple-tab-span" style="white-space:pre">   </span>pchContainerOperations,</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(101, 123, 131);" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><span class="Apple-tab-span" style="white-space:pre">     </span>diags,</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(108, 113, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">      </span></span><span style="font-variant-ligatures: no-common-ligatures" class="">getClangResourcesPath</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">(),</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">        </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">true</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">, </span><span style="font-variant-ligatures: no-common-ligatures" class="">// only local declarations</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">      </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">true</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">, </span><span style="font-variant-ligatures: no-common-ligatures" class="">// capture diagnostics</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(181, 137, 1);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">    </span></span><span style="font-variant-ligatures: no-common-ligatures" class="">vector</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><</span><span style="font-variant-ligatures: no-common-ligatures" class="">ASTUnit</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">::</span><span style="font-variant-ligatures: no-common-ligatures" class="">RemappedFile</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">>(),</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">  </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">false</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">, </span><span style="font-variant-ligatures: no-common-ligatures" class="">// remapped files keep original name</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">   </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #29a198" class="">0</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">, </span><span style="font-variant-ligatures: no-common-ligatures" class="">// do not precompile preamble</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(39, 139, 210);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">       </span></span><span style="font-variant-ligatures: no-common-ligatures" class="">TU_Complete</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">,</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">    </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">false</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">, </span><span style="font-variant-ligatures: no-common-ligatures" class="">// cache completion results</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">    </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">false</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">, </span><span style="font-variant-ligatures: no-common-ligatures" class="">// include comments in code completion</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre"> </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">false</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">, </span><span style="font-variant-ligatures: no-common-ligatures" class="">// allow PCH with errors</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">       </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">true</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">, </span><span style="font-variant-ligatures: no-common-ligatures" class="">// skip function bodies</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre"> </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">true</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">, </span><span style="font-variant-ligatures: no-common-ligatures" class="">// user files are volatile</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(147, 161, 161);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class=""><span class="Apple-tab-span" style="white-space:pre">      </span></span><span style="font-variant-ligatures: no-common-ligatures; color: #859901" class="">false</span><span style="font-variant-ligatures: no-common-ligatures; color: #657b83" class="">)); </span><span style="font-variant-ligatures: no-common-ligatures" class="">// for serialization</span></div></div><div class=""><br class=""></div><div class="">Problems start with name mangling: I develop on OS X and I'm interested in the mangled names of symbols on Linux right now. Not too surprisingly, this very vanilla Clang invocation mangles names for OS X (it prefixes C names with an underscore). (I create `<span style="color: rgb(181, 137, 1); font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">index</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(101, 123, 131);" class="">::</span><span style="color: rgb(181, 137, 1); font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">CodegenNameGenerator</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(101, 123, 131);" class=""> mangler(result-></span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(211, 54, 130);" class="">tu</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(101, 123, 131);" class="">-></span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(108, 113, 196);" class="">getASTContext</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(101, 123, 131);" class="">())</span>`, and then I get the name with `<span style="color: rgb(211, 54, 130); font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">mangler</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(101, 123, 131);" class="">.</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(108, 113, 196);" class="">getName</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(101, 123, 131);" class="">(fn)</span>`.) I tried adding the arguments "-triple", "x86_64-pc-linux" to the invocation (without changing anything else) but it would still get me OS X mangling. Any pointers?</div><div class=""><br class=""></div><div class="">Finally, I'll eventually want to lower Clang types to LLVM types. It looks like the CodeGenTypes class does that. Unfortunately, this class is not exposed in library headers, which leads me to believe that I'm not exactly supposed to go that route directly. Is there a good way to do it?</div><div class=""><br class=""></div><div class="">Thanks!</div><div class=""><div class="">
<br class="Apple-interchange-newline"><span style="color: rgb(0, 0, 0); font-family: 'Lucida Grande'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;" class="">FĂ©lix</span>
</div>
<br class=""></div></body></html>