view gen/rttibuilder.h @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents 1609490c123f
children
line wrap: on
line source

#ifndef __LDC_GEN_RTTIBUILDER_H__
#define __LDC_GEN_RTTIBUILDER_H__

#include "llvm/Constant.h"
#include "llvm/ADT/SmallVector.h"

struct ClassDeclaration;
struct TypeClass;
struct Type;

struct IrStruct;

struct RTTIBuilder
{
    ClassDeclaration* base;
    TypeClass* basetype;
    IrStruct* baseir;

    // 10 is enough for any D1 TypeInfo
    // 14 is enough for any D1 ClassInfo
    llvm::SmallVector<llvm::Constant*, 14> inits;

    RTTIBuilder(ClassDeclaration* base_class);

    void push(llvm::Constant* C);
    void push_null(Type* T);
    void push_null_vp();
    void push_null_void_array();
    void push_uint(unsigned u);
    void push_size(uint64_t s);
    void push_string(const char* str);
    void push_typeinfo(Type* t);
    void push_classinfo(ClassDeclaration* cd);

    /// pushes the function pointer or a null void* if it cannot.
    void push_funcptr(FuncDeclaration* fd, Type* castto = NULL);

    /// pushes the array slice given.
    void push_array(uint64_t dim, llvm::Constant * ptr);

    /// pushes void[] slice, dim is used directly, ptr is cast to void* .
    void push_void_array(uint64_t dim, llvm::Constant* ptr);

    /// pushes void[] slice with data.
    /// CI is the constant initializer the array should point to, the length
    /// and ptr are resolved automatically
    void push_void_array(llvm::Constant* CI, Type* valtype, Dsymbol* mangle_sym);

    /// pushes valtype[] slice with data.
    /// CI is the constant initializer that .ptr should point to
    /// dim is .length member directly
    /// valtype provides the D element type, .ptr is cast to valtype->pointerTo()
    /// mangle_sym provides the mangle prefix for the symbol generated.
    void push_array(llvm::Constant* CI, uint64_t dim, Type* valtype, Dsymbol* mangle_sym);

    /// Creates the initializer constant and assigns it to the global.
    void finalize(IrGlobal* tid);

    /// Creates the initializer constant and assigns it to the global.
    llvm::Constant* get_constant();
};

#endif