LLVM API Documentation

llvm::TypeBuilder< T, cross_compilable > Class Template Reference

#include <TypeBuilder.h>

Inheritance diagram for llvm::TypeBuilder< T, cross_compilable >:
Inheritance graph
[legend]

Detailed Description

template<typename T, bool cross_compilable>
class llvm::TypeBuilder< T, cross_compilable >

TypeBuilder - This provides a uniform API for looking up types known at compile time. To support cross-compilation, we define a series of tag types in the llvm::types namespace, like i<N>, ieee_float, ppc_fp128, etc. TypeBuilder<T, false> allows T to be any of these, a native C type (whose size may depend on the host compiler), or a pointer, function, or struct type built out of these. TypeBuilder<T, true> removes native C types from this set to guarantee that its result is suitable for cross-compilation. We define the primitive types, pointer types, and functions up to 5 arguments here, but to use this class with your own types, you'll need to specialize it. For example, say you want to call a function defined externally as:

struct MyType { int32 a; int32 *b; void *array[1]; // Intended as a flexible array. }; int8 AFunction(struct MyType *value);

You'll want to use Function::Create(TypeBuilder<types::i<8>(MyType*), true>::get(), ...) to declare the function, but when you first try this, your compiler will complain that TypeBuilder<MyType, true>::get() doesn't exist. To fix this, write:

namespace llvm { template<bool xcompile> class TypeBuilder<MyType, xcompile> { public: static StructType *get(LLVMContext &Context) { If you cache this result, be sure to cache it separately for each LLVMContext. return StructType::get( TypeBuilder<types::i<32>, xcompile>::get(Context), TypeBuilder<types::i<32>*, xcompile>::get(Context), TypeBuilder<types::i<8>*[], xcompile>::get(Context), NULL); }

You may find this a convenient place to put some constants to help with getelementptr. They don't have any effect on the operation of TypeBuilder. enum Fields { FIELD_A, FIELD_B, FIELD_ARRAY }; } } // namespace llvm

TypeBuilder cannot handle recursive types or types you only know at runtime. If you try to give it a recursive type, it will deadlock, infinitely recurse, or do something similarly undesirable.

Definition at line 77 of file TypeBuilder.h.


The documentation for this class was generated from the following file: