<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<meta content="text/html; charset=UTF-8">
<div dir="ltr">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri,Helvetica,sans-serif,"EmojiFont","Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;">
<p>No concrete plan yet but it's something we'd definitely like to have. I haven't seen in detail how the "indexing while building" is going to work, maybe I missed it? I assume there will be some kind of indexer-agnostic hook in the same spirit of the refactoring
 work that was proposed. I'll keep an eye on this and make sure our efforts are compatible. In any case, I think there will be enough benefit to warrant major rewrites/refactorings if needed.</p>
<p><br>
</p>
<p>Marc-André<br>
</p>
<p><br>
</p>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b> Benjamin Kramer <benny.kra@gmail.com><br>
<b>Sent:</b> Wednesday, August 9, 2017 8:54:03 AM<br>
<b>To:</b> Marc-André Laperle<br>
<b>Cc:</b> via cfe-dev; zeratul976@hotmail.com; Doug Schaefer; Alex Lorenz; Duncan P. N. Exon Smith; Argyrios Kyrtzidis<br>
<b>Subject:</b> Re: [cfe-dev] Adding indexing support to Clangd</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt;">
<div class="PlainText">Awesome, indexing in clangd would be super cool. Do you have a plan on<br>
how to combine this with the "indexing while building" stuff Apple<br>
folks are going to contribute? That will be important when we want to<br>
use clangd with larger projects.<br>
<br>
On Tue, Aug 8, 2017 at 7:52 PM, Marc-André Laperle via cfe-dev<br>
<cfe-dev@lists.llvm.org> wrote:<br>
> Hi!<br>
><br>
><br>
> I want to give a little update on the indexing prototype for Clangd I've<br>
> been working on. I wanted to share the actual code on Github before I went<br>
> on vacation but I ran out of time! Sorry about that!<br>
><br>
><br>
> Here's a short summary of the several components there now and what's in<br>
> progress:<br>
><br>
><br>
> --ClangdIndexStorage--<br>
><br>
> malloc-like interface that allocates/frees data blocks of variable sizes on<br>
> disk. The blocks can contain ints, shorts, strings, pointers (i.e. file<br>
> offsets), etc. The data is cached in 4K pieces so that local and repeated<br>
> accesses are all done quickly, in memory.<br>
><br>
> Clangd mallocs and writes its index model objects using this.<br>
><br>
><br>
> --BTree--<br>
><br>
> A pretty classic BTree implementation. Used to speed up lookup (symbol<br>
> names, file names). It allocates its nodes using ClangdIndexStorage<br>
> therefore it is stored on disk. Keys are actually records in<br>
> ClangdIndexStorage so you can really think of the BTree as a collection of<br>
> sorted pointers (sorted according to a provided comparator).<br>
><br>
><br>
><br>
><br>
> The index model is not very rich yet but the idea is that lower level<br>
> building blocks (ClangdIndexStorage, BTree) will be there so that we can<br>
> start iterating.<br>
><br>
><br>
> --ClangdIndexFile--<br>
><br>
> Path + information about inclusion in order to be able to represent an<br>
> include graph.<br>
><br>
> The include graph is used to know which files need reindexing for example<br>
> when a header file changes and also which compilation database entry to use<br>
> when opening a header in the editor. The first source file including the<br>
> header file is used to look up the entry in the compilation database. This<br>
> will also be used for the "Include Browser" feature in the future.<br>
><br>
><br>
> --ClangdIndexSymbol--<br>
><br>
> USR + location (pointer to a ClangdIndexFile + start/end offsets)<br>
><br>
> This only represents definitions in source files for now. This is part of<br>
> the indexing-based feature to "Open Definition".<br>
><br>
> This is likely to have more changes to represent declaration vs definition,<br>
> references (Find references feature), call graph, etc.<br>
><br>
><br>
> --ClangdIndex--<br>
><br>
> Owns a BTree of ClangdIndexSymbol sorted by USR for fast lookup (used by<br>
> Open Definition for now). getSymbol(USR) returns a ClangdIndexSymbol.<br>
><br>
> Also owns a BTree of ClangdIndexFile sorted by Path for fast lookup. As<br>
> explained above, used to find proper compilation database entry and to react<br>
> to header changes. getFile(Path) returns a ClangdIndexFile.<br>
><br>
><br>
> # Building the index<br>
><br>
><br>
> When Clangd gets the initialize request from the client, it is given a<br>
> rootURI. It starts indexing each source files under this root, creating<br>
> ClangdIndexFiles and ClangdIndexSymbols. This is done with the help of<br>
> index::IndexDataConsumer.<br>
><br>
><br>
> At the moment, the main covered scenarios are building the index from<br>
> scratch and adding files. Support for modifying files and removing them is<br>
> not fully implemented yet (but this is a must of course!).<br>
><br>
><br>
> In case you are wondering, there is no fancy caching of headers or preamble<br>
> used while indexing, so the process is quite slow. I have been focusing on<br>
> the model and persistence of the index versus the input (parsing). This will<br>
> have to be addressed too.<br>
><br>
><br>
> # Examples of using the index<br>
><br>
><br>
> When the user does the "Open Declaration" command, it retrieves the<br>
> ClangdIndexSymbol from the ClangdIndex using the USR at the requested offset<br>
> (sped up by the BTree). The location of the ClangdIndexSymbol (if found) is<br>
> then returned to the editor.<br>
><br>
><br>
> When the user opens a header file, it retrieves the ClangdIndexFile from the<br>
> ClangdIndex using the path of the header (sped up by the BTree). Then it<br>
> recursively finds which file includes it until there is no more, at this<br>
> point chances are that this is a source file. Use this source file path to<br>
> find a potential entry in the compilation database (so that we gets proper<br>
> compiler flags, etc).<br>
><br>
><br>
><br>
><br>
><br>
> This is just to give you a taste of what I have in mind and what kind of<br>
> progress is being made. I'd like to have the "lower-level" parts ready for<br>
> review soon after I come back from vacation (Aug 24th). I was thinking that<br>
> ClangdIndexStorage and BTree can go in first as they are quite isolated and<br>
> unit-testable. The rest of the code will also be available on Github to show<br>
> more concrete usage of them if necessary.<br>
><br>
><br>
> Regards,<br>
><br>
> Marc-André<br>
><br>
> ________________________________<br>
> From: cfe-dev <cfe-dev-bounces@lists.llvm.org> on behalf of Vladimir<br>
> Voskresensky via cfe-dev <cfe-dev@lists.llvm.org><br>
> Sent: Thursday, June 1, 2017 3:10:55 PM<br>
> To: cfe-dev@lists.llvm.org<br>
><br>
> Subject: Re: [cfe-dev] Adding indexing support to Clangd<br>
><br>
><br>
><br>
><br>
> On 06/ 1/17 06:26 PM, Ilya Biryukov via cfe-dev wrote:<br>
><br>
> Other IDEs do that very similarly to CDT, AFAIK. Compromising correctness,<br>
> but getting better performance.<br>
> Reusing modules would be nice, and I wonder if it could also be made<br>
> transparent to the users of the tool (i.e. we could have an option 'pretend<br>
> these headers are modules every time you encounter them')<br>
> I would expect that to break on most projects, though. Not sure if people<br>
> would be willing to use something that spits tons of errors on them.<br>
> Interesting direction for prototyping...<br>
><br>
> As Doug mentioned, surprisingly the tricks with headers in the majority of<br>
> projects give pretty good results :-)<br>
><br>
> In NetBeans we have similar to CDT headers caching approach.<br>
><br>
> The only difference is that when we hit #include the second time we only<br>
> check if we can skip indexing,<br>
> But we always do "fair lightweight preprocessing" to keep fair context of<br>
> all possible inner #ifdef/#else/#define directives (because they might<br>
> affect the current file).<br>
> For that we use APT (Abstract Preprocessor Tree) per-file which is constant<br>
> for the file and is created once - similar to clang's PTH (Pre-Tokenized<br>
> headers).<br>
><br>
> Visiting file's APT we can produce different output based on input<br>
> preprocessor state.<br>
> It can be visited in "light" mode or "produce tokens" mode, but it is always<br>
> gives correct result from the strict compiler point of view.<br>
> We also do indexing in parallel and the APT (being immutable) is easily<br>
> shared by index-visitors from all threads.<br>
> Btw stat cache is also reused from all indexing threads with appropriate<br>
> synchronizations.<br>
><br>
> So in NetBeans we observe that using this tricks (which really looks like<br>
> multi-modules per header file) the majority of projects are in very good<br>
> accuracy + I can also confirm that it gives ~10x speedup.<br>
><br>
> Hope it helps,<br>
> Vladimir.<br>
><br>
><br>
> On Thu, Jun 1, 2017 at 5:14 PM, David Blaikie <dblaikie@gmail.com> wrote:<br>
>><br>
>> Not sure this has already been discussed, but would it be<br>
>> practical/reasonable to use Clang's modules support for this? Might keep the<br>
>> implementation much simpler - and perhaps provide an extra incentive for<br>
>> users to modularize their build/code which would help their actual build<br>
>> tymes (& heck, parsed modules could even potentially be reused between<br>
>> indexer and final build - making apparent build times /really/ fast)<br>
>><br>
>> On Thu, Jun 1, 2017 at 8:12 AM Doug Schaefer via cfe-dev<br>
>> <cfe-dev@lists.llvm.org> wrote:<br>
>>><br>
>>> I thought I’d chip in and describe Eclipse CDT’s strategy with header<br>
>>> caching. It’s actually a big cheat but the results have proven to be pretty<br>
>>> good.<br>
>>><br>
>>> CDT’s hack actually starts in the preprocessor. If we see a header file<br>
>>> has already been indexed, we skip including it. At the back end, we<br>
>>> seamlessly use the index or the current symbol table when doing symbol<br>
>>> lookup. Symbols that get missed because we skipped header files get picked<br>
>>> up out of the index instead. We also do that in the preprocessor to look up<br>
>>> missing macros out of the index when doing macro substitution.<br>
>>><br>
>>> The performance gains were about an order of magnitude and it magically<br>
>>> works most of the time with the main issue being header files that get<br>
>>> included multiple times affected by different macro values but the effects<br>
>>> of that haven’t been major.<br>
>>><br>
>>> With clang being a real compiler, I had my doubts that you could even do<br>
>>> something like this without adding hooks in places the front-end gang might<br>
>>> not like. Love to be proven wrong. It really is very hard to keep up with<br>
>>> the evolving C++ standard and we could sure use the help clangd could offer.<br>
>>><br>
>>> Hope that helps,<br>
>>> Doug.<br>
>>><br>
>>> From: cfe-dev <cfe-dev-bounces@lists.llvm.org> on behalf of Ilya Biryukov<br>
>>> via cfe-dev <cfe-dev@lists.llvm.org><br>
>>> Reply-To: Ilya Biryukov <ibiryukov@google.com><br>
>>> Date: Thursday, June 1, 2017 at 10:52 AM<br>
>>> To: Vladimir Voskresensky <vladimir.voskresensky@oracle.com><br>
>>> Cc: via cfe-dev <cfe-dev@lists.llvm.org><br>
>>><br>
>>> Subject: Re: [cfe-dev] Adding indexing support to Clangd<br>
>>><br>
>>> Thanks for the insights, I think I get the gist of the idea with the<br>
>>> "module" PCH.<br>
>>> One question is: what if the system headers are included after the user<br>
>>> includes? Then we abandon the PCH cache and run the parsing from scratch,<br>
>>> right?<br>
>>><br>
>>> FileSystemStatCache that is reused between compilation units? Sounds like<br>
>>> a low-hanging fruit for indexing, thanks.<br>
>>><br>
>>> On Thu, Jun 1, 2017 at 11:52 AM, Vladimir Voskresensky<br>
>>> <vladimir.voskresensky@oracle.com> wrote:<br>
>>>><br>
>>>> Hi Ilia,<br>
>>>><br>
>>>> Sorry for the late reply.<br>
>>>> Unfortunately mentioned hacks were done long time ago and I couldn't<br>
>>>> find the changes at the first glance :-(<br>
>>>><br>
>>>> But you can think about reusable chaned PCHs in the "module" way.<br>
>>>> Each system header is a module.<br>
>>>> There are special index_headers.c and index_headers.cpp files which<br>
>>>> includes all standard headers.<br>
>>>> These files are indexed first and create "module" per #include.<br>
>>>> Module is created once or several times if preprocessor contexts are<br>
>>>> very different like C vs. C++98 vs. C++14.<br>
>>>> Then reused.<br>
>>>> Of course it could compromise the accuracy, but for proof of concept was<br>
>>>> enough to see that expected indexing speed can be achieved theoretically.<br>
>>>><br>
>>>> Btw, another hint: implementing FileSystemStatCache gave the next<br>
>>>> visible speedup. Of course need to carefully invalidate/update it when file<br>
>>>> was modified in IDE or externally.<br>
>>>> So, finally we got just 2x slowdown, but the accuracy of "real"<br>
>>>> compiler. And then as you know we have started Clank :-)<br>
>>>><br>
>>>> Hope it helps,<br>
>>>> Vladimir.<br>
>>>><br>
>>>><br>
>>>> On 29.05.2017 11:58, Ilya Biryukov wrote:<br>
>>>><br>
>>>> Hi Vladimir,<br>
>>>><br>
>>>> Thanks for sharing your experience.<br>
>>>><br>
>>>>> We did such measurements when evaluated clang as a technology to be<br>
>>>>> used in NetBeans C/C++, I don't remember the exact absolute numbers now, but<br>
>>>>> the conclusion was:<br>
>>>>><br>
>>>>> to be on par with the existing NetBeans speed we have to use different<br>
>>>>> caching, otherwise it was like 10 times slower.<br>
>>>><br>
>>>> It's a good reason to focus on that issue from the very start than.<br>
>>>> Would be nice to have some exact measurements, though. (i.e. on LLVM).<br>
>>>> Just to know how slow exactly was it.<br>
>>>><br>
>>>>> +1. Btw, may be It is worth to set some expectations what is available<br>
>>>>> during and after initial index phase.<br>
>>>>> I.e. during initial phase you'd probably like to have navigation for<br>
>>>>> file opened in editor and can work in functions bodies.<br>
>>>><br>
>>>> We definitely want diagnostics/completions for the currently open file<br>
>>>> to be available. Good point, we definitely want to explicitly name the<br>
>>>> available features in the docs/discussions.<br>
>>>><br>
>>>>> As to initial indexing:<br>
>>>>> Using PTH (not PCH) gave significant speedup.<br>
>>>>><br>
>>>>> Skipping bodies gave significant speedup, but you miss the references<br>
>>>>> and later have to reindex bodies on demand.<br>
>>>>> Using chainged PCH gave the next visible speedup.<br>
>>>>><br>
>>>>> Of course we had to made some hacks for PCHs to be more often<br>
>>>>> "reusable" (comparing to strict compiler rule) and keep multiple versions.<br>
>>>>> In average 2: one for C and one for C++ parse context.<br>
>>>>> Also there is a difference between system headers and projects headers,<br>
>>>>> so systems' can be cached more aggressively.<br>
>>>><br>
>>>> Is this work open-source? The interesting part is how to "reuse" the PCH<br>
>>>> for a header that's included in a different order.<br>
>>>> I.e. is there a way to reuse some cached information(PCH, or anything<br>
>>>> else) for <map> and <vector> when parsing these two files:<br>
>>>> ```<br>
>>>> // foo.cpp<br>
>>>> #include <vector><br>
>>>> #include <map><br>
>>>> ...<br>
>>>><br>
>>>> // bar.cpp<br>
>>>> #include <map><br>
>>>> #include <vector><br>
>>>> ....<br>
>>>> ```<br>
>>>><br>
>>>> --<br>
>>>> Regards,<br>
>>>> Ilya Biryukov<br>
>>>><br>
>>>><br>
>>><br>
>>><br>
>>><br>
>>> --<br>
>>> Regards,<br>
>>> Ilya Biryukov<br>
>>><br>
>>> _______________________________________________<br>
>>> cfe-dev mailing list<br>
>>> cfe-dev@lists.llvm.org<br>
>>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" id="LPlnk18095" previewremoved="true">
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
<div id="LPBorder_GT_15023101281470.536794747968749" style="margin-bottom: 20px; overflow: auto; width: 100%; text-indent: 0px;">
<table id="LPContainer_15023101281400.34573586880836815" style="width: 90%; background-color: rgb(255, 255, 255); position: relative; overflow: auto; padding-top: 20px; padding-bottom: 20px; margin-top: 20px; border-top: 1px dotted rgb(200, 200, 200); border-bottom: 1px dotted rgb(200, 200, 200);" role="presentation" cellspacing="0">
<tbody>
<tr style="border-spacing: 0px;" valign="top">
<td id="TextCell_15023101281410.39054641597455775" style="vertical-align: top; position: relative; padding: 0px; display: table-cell;" colspan="2">
<div id="LPRemovePreviewContainer_15023101281410.346837753144559"></div>
<div id="LPExpandDescriptionContainer_15023101281410.5420088185176481"></div>
<div id="LPTitle_15023101281410.30416124038236547" style="top: 0px; color: rgb(210, 71, 38); font-weight: 400; font-size: 21px; font-family: "wf_segoe-ui_light","Segoe UI Light","Segoe WP Light","Segoe UI","Segoe WP",Tahoma,Arial,sans-serif; line-height: 21px;">
<a id="LPUrlAnchor_15023101281420.2734156092277834" style="text-decoration: none;" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">cfe-dev -- Clang Front End for LLVM Developers' List</a></div>
<div id="LPMetadata_15023101281420.06094032275510297" style="margin: 10px 0px 16px; color: rgb(102, 102, 102); font-weight: 400; font-family: "wf_segoe-ui_normal","Segoe UI","Segoe WP",Tahoma,Arial,sans-serif; font-size: 14px; line-height: 14px;">
lists.llvm.org</div>
<div id="LPDescription_15023101281420.1588345157282115" style="display: block; color: rgb(102, 102, 102); font-weight: 400; font-family: "wf_segoe-ui_normal","Segoe UI","Segoe WP",Tahoma,Arial,sans-serif; font-size: 14px; line-height: 20px; max-height: 100px; overflow: hidden;" altdesc="Subscribe to cfe-dev by filling out the following form. You will be sent email requesting confirmation, to prevent others from gratuitously subscribing you. This is a hidden list, which means that the list of members is available only to the list administrator.<br/><br/>If you choose not to enter a password, one will be automatically generated for you, and it will be sent to you once you've confirmed your subscription. You can always request a mail-back of your password when you edit your personal options. Once a month, your password will be emailed to you as a reminder.">
To see the collection of prior postings to the list, visit the cfe-dev Archives. Using cfe-dev: To post a message to all the list members, send email ...</div>
</td>
</tr>
</tbody>
</table>
</div>
<br>
><br>
><br>
><br>
><br>
> --<br>
> Regards,<br>
> Ilya Biryukov<br>
><br>
><br>
> _______________________________________________<br>
> cfe-dev mailing list<br>
> cfe-dev@lists.llvm.org<br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" id="LPlnk966284" previewremoved="true">
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
<div id="LPBorder_GT_15023101282430.36100010322394005" style="margin-bottom: 20px; overflow: auto; width: 100%; text-indent: 0px;">
<table id="LPContainer_15023101282400.8055970851259272" style="width: 90%; background-color: rgb(255, 255, 255); position: relative; overflow: auto; padding-top: 20px; padding-bottom: 20px; margin-top: 20px; border-top: 1px dotted rgb(200, 200, 200); border-bottom: 1px dotted rgb(200, 200, 200);" role="presentation" cellspacing="0">
<tbody>
<tr style="border-spacing: 0px;" valign="top">
<td id="TextCell_15023101282400.9256702177355222" style="vertical-align: top; position: relative; padding: 0px; display: table-cell;" colspan="2">
<div id="LPRemovePreviewContainer_15023101282400.018914313479271416"></div>
<div id="LPExpandDescriptionContainer_15023101282410.49316242953165557"></div>
<div id="LPTitle_15023101282410.7171356269266411" style="top: 0px; color: rgb(210, 71, 38); font-weight: 400; font-size: 21px; font-family: "wf_segoe-ui_light","Segoe UI Light","Segoe WP Light","Segoe UI","Segoe WP",Tahoma,Arial,sans-serif; line-height: 21px;">
<a id="LPUrlAnchor_15023101282410.9298549292629085" style="text-decoration: none;" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">cfe-dev -- Clang Front End for LLVM Developers' List</a></div>
<div id="LPMetadata_15023101282410.8562499700525248" style="margin: 10px 0px 16px; color: rgb(102, 102, 102); font-weight: 400; font-family: "wf_segoe-ui_normal","Segoe UI","Segoe WP",Tahoma,Arial,sans-serif; font-size: 14px; line-height: 14px;">
lists.llvm.org</div>
<div id="LPDescription_15023101282410.4362496879162233" style="display: block; color: rgb(102, 102, 102); font-weight: 400; font-family: "wf_segoe-ui_normal","Segoe UI","Segoe WP",Tahoma,Arial,sans-serif; font-size: 14px; line-height: 20px; max-height: 100px; overflow: hidden;" altdesc="Subscribe to cfe-dev by filling out the following form. You will be sent email requesting confirmation, to prevent others from gratuitously subscribing you. This is a hidden list, which means that the list of members is available only to the list administrator.<br/><br/>If you choose not to enter a password, one will be automatically generated for you, and it will be sent to you once you've confirmed your subscription. You can always request a mail-back of your password when you edit your personal options. Once a month, your password will be emailed to you as a reminder.">
To see the collection of prior postings to the list, visit the cfe-dev Archives. Using cfe-dev: To post a message to all the list members, send email ...</div>
</td>
</tr>
</tbody>
</table>
</div>
<br>
><br>
><br>
><br>
> _______________________________________________<br>
> cfe-dev mailing list<br>
> cfe-dev@lists.llvm.org<br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" id="LPlnk550609" previewremoved="true">
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
<div id="LPBorder_GT_15023101290640.8889947713721321" style="margin-bottom: 20px; overflow: auto; width: 100%; text-indent: 0px;">
<table id="LPContainer_15023101290620.8067476930338331" style="width: 90%; background-color: rgb(255, 255, 255); position: relative; overflow: auto; padding-top: 20px; padding-bottom: 20px; margin-top: 20px; border-top: 1px dotted rgb(200, 200, 200); border-bottom: 1px dotted rgb(200, 200, 200);" role="presentation" cellspacing="0">
<tbody>
<tr style="border-spacing: 0px;" valign="top">
<td id="TextCell_15023101290620.9796603798313431" style="vertical-align: top; position: relative; padding: 0px; display: table-cell;" colspan="2">
<div id="LPRemovePreviewContainer_15023101290620.020559812140527267"></div>
<div id="LPExpandDescriptionContainer_15023101290620.07515647179033214"></div>
<div id="LPTitle_15023101290620.8071502854096299" style="top: 0px; color: rgb(210, 71, 38); font-weight: 400; font-size: 21px; font-family: "wf_segoe-ui_light","Segoe UI Light","Segoe WP Light","Segoe UI","Segoe WP",Tahoma,Arial,sans-serif; line-height: 21px;">
<a id="LPUrlAnchor_15023101290630.6745953169364899" style="text-decoration: none;" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">cfe-dev -- Clang Front End for LLVM Developers' List</a></div>
<div id="LPMetadata_15023101290630.16021381641462962" style="margin: 10px 0px 16px; color: rgb(102, 102, 102); font-weight: 400; font-family: "wf_segoe-ui_normal","Segoe UI","Segoe WP",Tahoma,Arial,sans-serif; font-size: 14px; line-height: 14px;">
lists.llvm.org</div>
<div id="LPDescription_15023101290630.15000156895763628" style="display: block; color: rgb(102, 102, 102); font-weight: 400; font-family: "wf_segoe-ui_normal","Segoe UI","Segoe WP",Tahoma,Arial,sans-serif; font-size: 14px; line-height: 20px; max-height: 100px; overflow: hidden;" altdesc="Subscribe to cfe-dev by filling out the following form. You will be sent email requesting confirmation, to prevent others from gratuitously subscribing you. This is a hidden list, which means that the list of members is available only to the list administrator.<br/><br/>If you choose not to enter a password, one will be automatically generated for you, and it will be sent to you once you've confirmed your subscription. You can always request a mail-back of your password when you edit your personal options. Once a month, your password will be emailed to you as a reminder.">
To see the collection of prior postings to the list, visit the cfe-dev Archives. Using cfe-dev: To post a message to all the list members, send email ...</div>
</td>
</tr>
</tbody>
</table>
</div>
<br>
><br>
</div>
</span></font></div>
</body>
</html>