Skip to content

Julia access to the libclang interface of the LLVM Clang compiler.

License

Notifications You must be signed in to change notification settings

vtjnash/CIndex.jl

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CIndex.jl provides a wrapping of libclang for the Julia language (http:https://julialang.org). The goal of CIndex.jl is to facilitate access to C and C++ source parse trees from Julia.

libclang is the stable interface to the Clang compiler from the LLVM project. libclang provides a C interface to a subset of Clang functionality, with a primary focus on exposing the C/C++/ObjC parser AST.

libclang API docs: http:https://clang.llvm.org/doxygen/group__CINDEX.html

Status

Preliminary. Most CXType, CXCursor, and C++ related functions are wrapped, and a few convenience functions are provided.

All testing and development so far has been on Ubuntu 12.04.1 (64-bit)

Installation

Clone this repository, and do the following (sh syntax):

export JULIAHOME=/path/to/julia
cd /location/of/CIndex.jl/lib
make

Usage

require("cindex")
using cindex

julia> tu = tu_init("Index.h")   # Initialize and parse Index.h
julia> topcu = tu_cursor(tu)     # get TU top cursor
julia> topcl = children(topcu)
julia> topcl.size
595

julia> cu = topcl[350]
julia> cu_kind(cu) == cindex.CurKind.FUNCTIONDECL
true
julia> name(topcl[350])
"clang_parseTranslationUnit(CXIndex, const char *, const char *const *, int, struct CXUnsavedFile *, unsigned int, unsigned int)"

See the examples/ and util/ folders for further usage scenarios. CIndex.jl is partially self-generating, including parsing of the enums (util/gencindex_h.jl)

There is a small convenience API exported by cindex:

tu_init     # init and parse file to TranslationUnit
tu_cursor   # get top cursor from TranslationUnit
children    # gets CXCursor children; accessed by ref.
cu_kind     # cindex.CurKind enum
ty_kind     # cindex.TypKind enum
name        # get the DisplayName of a CXCursor
spelling    # get spelling of a CXCursor or CXType
cu_file     # file in which cursor was declared
is_function # CXCursor or CXType
is_null     # CXCursor

For documentation of wrapped CIndex functions, see:

http:https://clang.llvm.org/doxygen/group__CINDEX.html

For a nice introduction to some capabilities and limitations (fewer now) of the libclang API, see this post:

http:https://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/

Prerequisites

libclang must be available as a shared library. libclang can optionally be built by the Julia build system by setting BUILD_LLVM_CLANG=1 in julia/deps/Makefile.

Implementation

Most libclang functions pass and return small structs by value. As Julia does not (yet) have full struct support, the current CIndex.jl implementation includes a C++ wrapper. clang functions are wrapped by a C++ function that memcpys data to/from a Julia-owned memory array (passed by pointer)

see src/cindex_base.jl and src/wrapcindex.h for generated wrappers.

Some functions are manually wrapped for convenience and ease of implementation, or to provide a more Julia-friendly API.

see src/cindex.jl and src/wrapcindex.cpp

License

CIndex.jl is licensed under the MIT license.

About

Julia access to the libclang interface of the LLVM Clang compiler.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Julia 87.3%
  • C 9.9%
  • C++ 2.8%