[LLVMdev] Lost in the documentation

Gordon Henriksen gordonhenriksen at mac.com
Tue Apr 29 06:46:35 PDT 2008

On 2008-04-29, at 08:41, Hendrik Boom wrote:

> On Mon, 28 Apr 2008 17:54:31 -0400, Gordon Henriksen wrote:
>> On Apr 28, 2008, at 17:32, Hendrik Boom wrote:
>>> In http://llvm.org/docs/FAQ.html, when taking about writing a  
>>> compiler
>>> that uses LLVM (at least I think that's what the FAQ question is
>>> asking),
>>> the FAQ recommends
>>>> #  Call into the LLVM libraries code using your language's FFI
>>>> (foreign
>>>> function interface).
>>>>   * for: best tracks changes to the LLVM IR, .ll syntax, and .bc
>>>>          format
>>>>   * for: enables running LLVM optimization passes without a
>>>>          emit/parse overhead
>>>>   * for: adapts well to a JIT context
>>>>   * against: lots of ugly glue code to write
>>> Now, which particular libraries would that be
>> With the exception of the 'util' and 'tools' directories, the entire
>> LLVM source tree consists of libraries.
> Indeed, quite a lot of them.  Most of them appear to be internal.  
> I'm trying to identify the ones that are intended for use by LLVM  
> users.

include/llvm is all public (modulo some implementation details as  
required by the nature of C++). Private includes are in lib. But  
realize that not all users are front-end compilers. A back-end code  
generator is also a user of the framework; as is an IR optimization or  
analysis. The C++ interfaces support all of these clients equally.

VMCore and BitWriter are the libraries absolutely necessary for any  
static compiler that outputs bitcode. You'll likely want Analysis for  
the verifier; and Target for memory layout information. That's the  

> I have to say I missed the crucial paragraph:
> : If you go with the first option, the C bindings in include/llvm-c
> : should help a lot, since most languages have strong support for
> : interfacing with C. The most common hurdle with calling C from  
> managed
> : code is interfacing with the garbage collector. The C interface was
> : designed to require very little memory management, and so is
> : straightforward in this regard.
> Evidently I have to go look in include/llvm-c, since I stronlgly  
> suspect
> you didn't go to the trouble of writng a C wrapper for anything that
> wasn't needed by an LLVM user.  Anything internal you'd have left in  
> C++.
> So the API for a C++ *user* could be described as "those parts of the
> internals API that happen to be used in implementing llvm-c.

That's a rather poor definition. Only bindings for such features as  
have been required are authored. Still, if this helps you make sense  
of the framework, then that's fantastic; but remember that it is an  
imperfect rule.

Using the C bindings, it's still very important to understand the  
underlying C++ object model; otherwise, the type rules for the  
bindings will appear to be rather capricious.

> Putting this together with the tutorial, http://llvm.org/docs/tutorial/ 
> ,
> which uses CAML instead of C, I think I may be able to get a clue.

If you're not using ocaml, the C++ tutorial (the first one on that  
page) is probably more pertinent, even if you do intend to use the C  
bindings. Searching the implementation of the bindings (lib/VMCore/ 
Core.cpp, etc.) is helpful for "going backwards" from C++ to C once  
you begin to understand the object model.

>>> where are their API(s) documented?
>> http://llvm.org/docs/
>> http://llvm.org/doxygen/
>> http://llvm.org/docs/tutorial/
>> etc etc etc.
>> — Gordon
> The doxygen page describes the complete internal structure of LLVM.   
> It
> explicitly says,
> ; This documentation describes the internal software that makes up  
> ; not the external use of LLVM. There are no instructions here on  
> how to
> ; use LLVM, only the APIs that make up the software. For usage
> ; instructions, please see the programmer's guide or reference manual.
> I haven't yet found a "programmer's guide".


— Gordon

More information about the llvm-dev mailing list